From 9adea693823dedc39c31ab2b525ac8c1334f657d Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 5 Nov 2024 11:18:40 -0600 Subject: [PATCH 001/215] add pyproject.toml, with pixi as project management tool. add pixi.lock --- pixi.lock | 7505 ++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 90 + 2 files changed, 7595 insertions(+) create mode 100644 pixi.lock create mode 100644 pyproject.toml diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000000..9903807088 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,7505 @@ +version: 5 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.3-py312h58c1407_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.23.4-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - pypi: . + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.3-hf95d169_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.3-hac325c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_hbf64a52_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.3-hf78d878_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.1.3-py312hfc93d17_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py312h3d0f464_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.23.4-py312h669792a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312hb553811_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + - pypi: . + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1010.6-hf7b29d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.3-default_h01e2e8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.3-default_h89fcaf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.3-h2621db8_21.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.3-h54d7cd3_21.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.3-h33d20e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.3-hccb7791_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-hf3baa6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.3-default_h01e2e8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.3-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.3-haf57ff0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.4-h8424949_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.3-hb52a8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.3-he407fa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.3-h33d20e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.1.3-py312h94ee1e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py312h0bf5046_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.23.4-py312he431725_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + - pypi: . + dev: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.3-default_hb5137d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.3-default_h9c6a7e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.3-ha7bfdaf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py312h7900ff3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.0.1-py312h0a6c937_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpich-4.2.3-h670b19f_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlopt-2.8.0-py312h69683c5_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.3-py312h58c1407_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.23.4-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.0.2-py312h91f0f75_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.0-h6e8976b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - pypi: . + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312h5861a67_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.0-py312h2a50410_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.4-py312hbe3f5e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.54.1-py312hbe3f5e4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py312hc5c4d5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.3-hf95d169_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.22-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.3-hac325c4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_hbf64a52_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.3-hf78d878_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312hbe3f5e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.9.2-py312hb401068_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.9.2-py312h30cc4df_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/mpi4py-4.0.1-py312h017ff69_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/mpich-4.2.3-ha850315_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nlopt-2.8.0-py312h314ef60_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.1.3-py312hfc93d17_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.0.0-py312h66fe14f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py312h3d0f464_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py312hb401068_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.23.4-py312h669792a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312hb553811_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.14.1-py312h888eae2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.1-py312hb553811_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py312hc5c4d5f_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py312h3d0f464_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h00291cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h7122b0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + - pypi: . + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1010.6-hf7b29d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.3-default_h01e2e8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.3-default_h89fcaf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.3-h2621db8_21.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.3-h54d7cd3_21.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.3-h33d20e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.3-hccb7791_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.0-py312h4721b07_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.4-py312ha0ccf2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.54.1-py312ha0ccf2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.7-py312h6142ec9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-hf3baa6d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.3-default_h01e2e8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.3-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.3-haf57ff0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.4-h8424949_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.3-hb52a8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.3-he407fa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.3-h33d20e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312ha0ccf2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.9.2-py312h1f38498_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.9.2-py312h9bd0bc6_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi4py-4.0.1-py312h5450814_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpich-4.2.3-he5dbaa7_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlopt-2.8.0-py312h857dc0a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.1.3-py312h94ee1e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py312h0bf5046_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py312h81bd7bf_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.23.4-py312he431725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.14.1-py312h20deb59_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.1-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py312h6142ec9_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py312h0bf5046_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + - pypi: . +packages: +- kind: conda + name: _libgcc_mutex + version: '0.1' + build: conda_forge + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_gnu + build_number: 16 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- kind: conda + name: alabaster + version: 1.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda + sha256: a9e1092725561d9bff12d3a4d3bb46c43d3d0db3cbb2c63c9025d1c77e84840c + md5: 7d78a232029458d0077ede6cda30ed0c + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/alabaster?source=hash-mapping + size: 18522 + timestamp: 1722035895436 +- kind: conda + name: alsa-lib + version: 1.2.12 + build: h4ab18f5_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda + sha256: 64b95dd06d7ca6b54cea03b02da8f1657b9899ca376d0ca7b47823064f55fb16 + md5: 7ed427f0871fd41cb1d9c17727c17589 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + license_family: GPL + purls: [] + size: 555868 + timestamp: 1718118368236 +- kind: conda + name: annotated-types + version: 0.7.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + sha256: 668f0825b6c18e4012ca24a0070562b6ec801ebc7008228a428eb52b4038873f + md5: 7e9f4612544c8edbfd6afad17f1bd045 + depends: + - python >=3.7 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types?source=hash-mapping + size: 18235 + timestamp: 1716290348421 +- kind: conda + name: anyio + version: 4.6.2.post1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda + sha256: 4b54b7ce79d818e3cce54ae4d552dba51b7afac160ceecdefd04b3917a37c502 + md5: 688697ec5e9588bdded167d19577625b + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.9 + - sniffio >=1.1 + - typing_extensions >=4.1 + constrains: + - uvloop >=0.21.0b1 + - trio >=0.26.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/anyio?source=hash-mapping + size: 109864 + timestamp: 1728935803440 +- kind: conda + name: babel + version: 2.14.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda + sha256: 8584e3da58e92b72641c89ff9b98c51f0d5dbe76e527867804cbdf03ac91d8e6 + md5: 9669586875baeced8fc30c0826c3270e + depends: + - python >=3.7 + - pytz + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/babel?source=hash-mapping + size: 7609750 + timestamp: 1702422720584 +- kind: conda + name: brotli + version: 1.1.0 + build: h00291cd_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda + sha256: 624954bc08b3d7885a58c7d547282cfb9a201ce79b748b358f801de53e20f523 + md5: 2db0c38a7f2321c5bdaf32b181e832c7 + depends: + - __osx >=10.13 + - brotli-bin 1.1.0 h00291cd_2 + - libbrotlidec 1.1.0 h00291cd_2 + - libbrotlienc 1.1.0 h00291cd_2 + license: MIT + license_family: MIT + purls: [] + size: 19450 + timestamp: 1725267851605 +- kind: conda + name: brotli + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda + sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b + md5: 98514fe74548d768907ce7a13f680e8f + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.1.0 hb9d3cd8_2 + - libbrotlidec 1.1.0 hb9d3cd8_2 + - libbrotlienc 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19264 + timestamp: 1725267697072 +- kind: conda + name: brotli + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hd74edd7_2.conda + sha256: a086f36ff68d6e30da625e910547f6211385246fb2474b144ac8c47c32254576 + md5: 215e3dc8f2f837906d066e7f01aa77c0 + depends: + - __osx >=11.0 + - brotli-bin 1.1.0 hd74edd7_2 + - libbrotlidec 1.1.0 hd74edd7_2 + - libbrotlienc 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + purls: [] + size: 19588 + timestamp: 1725268044856 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: h00291cd_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda + sha256: 642a8492491109fd8270c1e2c33b18126712df0cedb94aaa2b1c6b02505a4bfa + md5: 049933ecbf552479a12c7917f0a4ce59 + depends: + - __osx >=10.13 + - libbrotlidec 1.1.0 h00291cd_2 + - libbrotlienc 1.1.0 h00291cd_2 + license: MIT + license_family: MIT + purls: [] + size: 16643 + timestamp: 1725267837325 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + sha256: 261364d7445513b9a4debc345650fad13c627029bfc800655a266bf1e375bc65 + md5: c63b5e52939e795ba8d26e35d767a843 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.1.0 hb9d3cd8_2 + - libbrotlienc 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 18881 + timestamp: 1725267688731 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hd74edd7_2.conda + sha256: 28f1af63b49fddf58084fb94e5512ad46e9c453eb4be1d97449c67059e5b0680 + md5: b8512db2145dc3ae8d86cdc21a8d421e + depends: + - __osx >=11.0 + - libbrotlidec 1.1.0 hd74edd7_2 + - libbrotlienc 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + purls: [] + size: 16772 + timestamp: 1725268026061 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py312h2ec8cdc_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 349867 + timestamp: 1725267732089 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py312h5861a67_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312h5861a67_2.conda + sha256: 265764ff4ad9e5cfefe7ea85c53d95157bf16ac2c0e5f190c528e4c9c0c1e2d0 + md5: b95025822e43128835826ec0cc45a551 + depends: + - __osx >=10.13 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h00291cd_2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 363178 + timestamp: 1725267893889 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py312hde4cb15_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 339360 + timestamp: 1725268143995 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h4bc722e_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h99b78c6_7 + build_number: 7 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- kind: conda + name: bzip2 + version: 1.0.8 + build: hfdf4475_7 + build_number: 7 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 134188 + timestamp: 1720974491916 +- kind: conda + name: ca-certificates + version: 2024.8.30 + build: h8857fd0_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + sha256: 593f302d0f44c2c771e1614ee6d56fffdc7d616e6f187669c8b0e34ffce3e1ae + md5: b7e5424e7f06547a903d28e4651dbb21 + license: ISC + purls: [] + size: 158665 + timestamp: 1725019059295 +- kind: conda + name: ca-certificates + version: 2024.8.30 + build: hbcca054_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea + md5: c27d1c142233b5bc9ca570c6e2e0c244 + license: ISC + purls: [] + size: 159003 + timestamp: 1725018903918 +- kind: conda + name: ca-certificates + version: 2024.8.30 + build: hf0a4a13_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 + md5: 40dec13fd8348dbe303e57be74bd3d35 + license: ISC + purls: [] + size: 158482 + timestamp: 1725019034582 +- kind: conda + name: cairo + version: 1.18.0 + build: hebfffa5_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda + sha256: aee5b9e6ef71cdfb2aee9beae3ea91910ca761c01c0ef32052e3f94a252fa173 + md5: fceaedf1cdbcb02df9699a0d9b005292 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libgcc-ng >=12 + - libglib >=2.80.3,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.43.2,<1.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + - zlib + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 983604 + timestamp: 1721138900054 +- kind: conda + name: cctools_osx-arm64 + version: '1010.6' + build: hf7b29d9_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1010.6-hf7b29d9_1.conda + sha256: 631d79130770aff0a2ed0c0cd94480eb0d7c7a3ea1a963896781eaa09e482b8d + md5: 7d7fbb4d88bc05ef54a00bc63d0a0b1d + depends: + - __osx >=11.0 + - ld64_osx-arm64 >=951.9,<951.10.0a0 + - libcxx + - libllvm19 >=19.1.0,<19.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 19.1.* + - sigtool + constrains: + - cctools 1010.6.* + - ld64 951.9.* + - clang 19.1.* + license: APSL-2.0 + license_family: Other + purls: [] + size: 1090810 + timestamp: 1727792802809 +- kind: conda + name: certifi + version: 2024.8.30 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + sha256: 7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f + md5: 12f7d00853807b0531775e9be891cb11 + depends: + - python >=3.7 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 163752 + timestamp: 1725278204397 +- kind: conda + name: cffi + version: 1.17.1 + build: py312h06ac9bb_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 294403 + timestamp: 1725560714366 +- kind: conda + name: cffi + version: 1.17.1 + build: py312h0fad829_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- kind: conda + name: cffi + version: 1.17.1 + build: py312hf857d28_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda + sha256: 94fe49aed25d84997e2630d6e776a75ee2a85bd64f258702c57faa4fe2986902 + md5: 5bbc69b8194fedc2792e451026cac34f + depends: + - __osx >=10.13 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 282425 + timestamp: 1725560725144 +- kind: conda + name: cfgv + version: 3.3.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c + md5: ebb5f5f7dc4f1a3780ef7ea7738db08c + depends: + - python >=3.6.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfgv?source=hash-mapping + size: 10788 + timestamp: 1629909423398 +- kind: conda + name: charset-normalizer + version: 3.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda + sha256: 1873ac45ea61f95750cb0b4e5e675d1c5b3def937e80c7eebb19297f76810be8 + md5: a374efa97290b8799046df7c5ca17164 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47314 + timestamp: 1728479405343 +- kind: conda + name: clang + version: 19.1.3 + build: default_h89fcaf4_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.3-default_h89fcaf4_0.conda + sha256: acc2c659ffc6f578eebe1bedeb7b9a7f9a9f9a133096e8f0b1216729a69bc73f + md5: df839a29b07bb96b55e00782d77f4e15 + depends: + - clang-19 19.1.3 default_h01e2e8e_0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 23757 + timestamp: 1730332237764 +- kind: conda + name: clang-19 + version: 19.1.3 + build: default_h01e2e8e_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.3-default_h01e2e8e_0.conda + sha256: 6443261d1f1598da2f8ba911fba441b679d81753538f0a3836797e91287c0181 + md5: b1fd7dfbd07bc77edc8b82fd8463e46a + depends: + - __osx >=11.0 + - libclang-cpp19.1 19.1.3 default_h01e2e8e_0 + - libcxx >=19.1.3 + - libllvm19 >=19.1.3,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 764341 + timestamp: 1730332071458 +- kind: conda + name: clang_impl_osx-arm64 + version: 19.1.3 + build: h2621db8_21 + build_number: 21 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.3-h2621db8_21.conda + sha256: 6100729d28fac534205e67bb6e0479b407717860b2c51d03fda0a48e4ed92b25 + md5: ce2c99fd4582b2330bba009e14411f7b + depends: + - cctools_osx-arm64 + - clang 19.1.3.* + - compiler-rt 19.1.3.* + - ld64_osx-arm64 + - llvm-tools 19.1.3.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17637 + timestamp: 1730374941777 +- kind: conda + name: clang_osx-arm64 + version: 19.1.3 + build: h54d7cd3_21 + build_number: 21 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.3-h54d7cd3_21.conda + sha256: 16be9f4e0ca9fb2c58483a34b1b238f281bc2719cdcc5c1f83bda7df0bd89e44 + md5: d29908c941fbc5f59993bf3c40dcd111 + depends: + - clang_impl_osx-arm64 19.1.3 h2621db8_21 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 20676 + timestamp: 1730374945600 +- kind: conda + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 25170 + timestamp: 1666700778190 +- kind: conda + name: compiler-rt + version: 19.1.3 + build: h33d20e1_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.3-h33d20e1_0.conda + sha256: e20f1d770e8f77e86852132826cdf8bd853fece1680197ba8f1834356c0f53c0 + md5: e46d9cd5017fecc134f04848b194cef3 + depends: + - __osx >=11.0 + - clang 19.1.3.* + - compiler-rt_osx-arm64 19.1.3.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 96853 + timestamp: 1730361087214 +- kind: conda + name: compiler-rt_osx-arm64 + version: 19.1.3 + build: hccb7791_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.3-hccb7791_0.conda + sha256: b917cf852d306d3882e4194f1e40cea50e74948fe1fa99411c43349cc93dfe0e + md5: 67aef6fe3a99aad428b159e737a31018 + depends: + - clang 19.1.3.* + constrains: + - clangxx 19.1.3 + - compiler-rt 19.1.3 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 10703896 + timestamp: 1730361057691 +- kind: conda + name: contourpy + version: 1.3.0 + build: py312h2a50410_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.0-py312h2a50410_2.conda + sha256: 74d690a3e7721002d0e44f728abb656b0e8a9c6e409fbe56f26a94161133810b + md5: c9dfef12c2aea745b81857e8b8fcffd3 + depends: + - __osx >=10.13 + - libcxx >=17 + - numpy >=1.23 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 260990 + timestamp: 1729602628652 +- kind: conda + name: contourpy + version: 1.3.0 + build: py312h4721b07_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.0-py312h4721b07_2.conda + sha256: 1452b38f34d4b7803c21d6d908793fbb2975da591e780d099c25bc773e9f0da3 + md5: 3bb511fda97b3dbe459a2e67e5d185d6 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.23 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 250676 + timestamp: 1729602748580 +- kind: conda + name: contourpy + version: 1.3.0 + build: py312h68727a3_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda + sha256: 777ff055866872f45f0f8d2ad17a0c42f3c63463f8c1da9d75fa5b1652940b50 + md5: ff28f374b31937c048107521c814791e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.23 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 276004 + timestamp: 1727293728397 +- kind: conda + name: coverage + version: 7.6.4 + build: py312h178313f_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py312h178313f_0.conda + sha256: 62ef1654898b67a1aae353c8910323c803db0dcf0c117d5796eb1cfb03a2d777 + md5: a32fbd2322865ac80c7db74c553f5306 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 363969 + timestamp: 1729610283175 +- kind: conda + name: coverage + version: 7.6.4 + build: py312ha0ccf2a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.4-py312ha0ccf2a_0.conda + sha256: 4211bf3f5a2f9f45fbf7c73e40dfb6ad84f6123bbf77c3bee5ca04b85c8c400f + md5: ff7f61eae0c3bc906a37f0804208fd46 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 362479 + timestamp: 1729610313800 +- kind: conda + name: coverage + version: 7.6.4 + build: py312hbe3f5e4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.4-py312hbe3f5e4_0.conda + sha256: 59c715b5cea39fbcad43dc2000380a67ef904d3dfa6954d5af57fb23e71f7c29 + md5: 686d7971e78e94af94af94713853be60 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 362509 + timestamp: 1729610208953 +- kind: conda + name: cycler + version: 0.12.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 + md5: 5cd86562580f274031ede6aa6aa24441 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cycler?source=hash-mapping + size: 13458 + timestamp: 1696677888423 +- kind: conda + name: cyrus-sasl + version: 2.1.27 + build: h54b06d7_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda + sha256: d2ea5e52da745c4249e1a818095a28f9c57bd4df22cbfc645352defa468e86c2 + md5: dce22f70b4e5a407ce88f2be046f4ceb + depends: + - krb5 >=1.21.1,<1.22.0a0 + - libgcc-ng >=12 + - libntlm + - libstdcxx-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause-Attribution + license_family: BSD + purls: [] + size: 219527 + timestamp: 1690061203707 +- kind: conda + name: dbus + version: 1.13.6 + build: h5008d03_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + md5: ecfff944ba3960ecb334b9a2663d708d + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 618596 + timestamp: 1640112124844 +- kind: conda + name: distlib + version: 0.3.9 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda + sha256: 300b2e714f59403df0560174f5ef6c19db8b4a3b74a7244862cf771f07dee8fb + md5: fe521c1608280cc2803ebd26dc252212 + depends: + - python 2.7|>=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=hash-mapping + size: 276214 + timestamp: 1728557312342 +- kind: conda + name: docutils + version: 0.21.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda + sha256: 362bfe3afaac18298c48c0c6a935641544077ce5105a42a2d8ebe750ad07c574 + md5: e8cd5d629f65bdf0f3bb312cde14659e + depends: + - python >=3.9 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + purls: + - pkg:pypi/docutils?source=hash-mapping + size: 403226 + timestamp: 1713930478970 +- kind: conda + name: double-conversion + version: 3.3.0 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda + sha256: 9eee491a73b67fd64379cf715f85f8681568ebc1f02f9e11b4c50d46a3323544 + md5: c2f83a5ddadadcdb08fe05863295ee97 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 78645 + timestamp: 1686489937183 +- kind: conda + name: exceptiongroup + version: 1.2.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + sha256: e0edd30c4b7144406bb4da975e6bb97d6bc9c0e999aa4efe66ae108cada5d5b5 + md5: d02ae936e42063ca46af6cdad2dbd1e0 + depends: + - python >=3.7 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 20418 + timestamp: 1720869435725 +- kind: conda + name: expat + version: 2.6.3 + build: h5888daf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda + sha256: 65bd479c75ce876f26600cb230d6ebc474086e31fa384af9b4282b36842ed7e2 + md5: 6595440079bed734b113de44ffd3cd0a + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat 2.6.3 h5888daf_0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 137891 + timestamp: 1725568750673 +- kind: conda + name: filelock + version: 3.16.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + sha256: 1da766da9dba05091af87977922fe60dc7464091a9ccffb3765d403189d39be4 + md5: 916f8ec5dd4128cd5f207a3c4c07b2c6 + depends: + - python >=3.7 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17357 + timestamp: 1726613593584 +- kind: conda + name: flake8 + version: 7.1.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda + sha256: c513c6db311641dc50dfadbc49c8edea105ec18fee350149543b49f7970c3962 + md5: a25e5df6b26be3c2d64be307c1ef0b37 + depends: + - mccabe >=0.7.0,<0.8.0 + - pycodestyle >=2.12.0,<2.13.0 + - pyflakes >=3.2.0,<3.3.0 + - python >=3.8.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/flake8?source=hash-mapping + size: 111109 + timestamp: 1722878963477 +- kind: conda + name: font-ttf-dejavu-sans-mono + version: '2.37' + build: hab24e00_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 397370 + timestamp: 1566932522327 +- kind: conda + name: font-ttf-inconsolata + version: '3.000' + build: h77eed37_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + purls: [] + size: 96530 + timestamp: 1620479909603 +- kind: conda + name: font-ttf-source-code-pro + version: '2.038' + build: h77eed37_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + purls: [] + size: 700814 + timestamp: 1620479612257 +- kind: conda + name: font-ttf-ubuntu + version: '0.83' + build: h77eed37_3 + build_number: 3 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + purls: [] + size: 1620504 + timestamp: 1727511233259 +- kind: conda + name: fontconfig + version: 2.15.0 + build: h7e30c49_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 265599 + timestamp: 1730283881107 +- kind: conda + name: fonts-conda-ecosystem + version: '1' + build: '0' + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3667 + timestamp: 1566974674465 +- kind: conda + name: fonts-conda-forge + version: '1' + build: '0' + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4102 + timestamp: 1566932280397 +- kind: conda + name: fonttools + version: 4.54.1 + build: py312h178313f_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda + sha256: 45f405d6d1ef528226c20b681373db0bdb79cc70fec1e495003247b0d3d00140 + md5: bbbf5fa5cab622c33907bc8d7eeea9f7 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=13 + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2827447 + timestamp: 1729530553018 +- kind: conda + name: fonttools + version: 4.54.1 + build: py312ha0ccf2a_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.54.1-py312ha0ccf2a_1.conda + sha256: 7db92b5980ac60c362d2c7fa9c75c21578b0ebe58a23ba6e123f47d4d3baca53 + md5: 1d203fe9d62f4d2fea1c955d77bc642a + depends: + - __osx >=11.0 + - brotli + - munkres + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2730304 + timestamp: 1729530557674 +- kind: conda + name: fonttools + version: 4.54.1 + build: py312hbe3f5e4_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.54.1-py312hbe3f5e4_1.conda + sha256: bec969c41482df669dcc17e8450693d206e0c155c46c47924ceb634f766df180 + md5: e58d62085d1b304863373b89caf8f5d4 + depends: + - __osx >=10.13 + - brotli + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2727792 + timestamp: 1729530530279 +- kind: conda + name: freetype + version: 2.12.1 + build: h267a509_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: GPL-2.0-only OR FTL + purls: [] + size: 634972 + timestamp: 1694615932610 +- kind: conda + name: freetype + version: 2.12.1 + build: h60636b9_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda + sha256: b292cf5a25f094eeb4b66e37d99a97894aafd04a5683980852a8cbddccdc8e4e + md5: 25152fce119320c980e5470e64834b50 + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: GPL-2.0-only OR FTL + purls: [] + size: 599300 + timestamp: 1694616137838 +- kind: conda + name: freetype + version: 2.12.1 + build: hadb7bae_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: GPL-2.0-only OR FTL + purls: [] + size: 596430 + timestamp: 1694616332835 +- kind: conda + name: graphite2 + version: 1.3.13 + build: h59595ed_1003 + build_number: 1003 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add + md5: f87c7b7c2cb45f323ffbce941c78ab7c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 96855 + timestamp: 1711634169756 +- kind: conda + name: h2 + version: 4.1.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a + md5: b748fbf7060927a6e82df7cb5ee8f097 + depends: + - hpack >=4.0,<5 + - hyperframe >=6.0,<7 + - python >=3.6.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 46754 + timestamp: 1634280590080 +- kind: conda + name: harfbuzz + version: 9.0.0 + build: hda332d3_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda + sha256: 973afa37840b4e55e2540018902255cfb0d953aaed6353bb83a4d120f5256767 + md5: 76b32dcf243444aea9c6b804bcfa40b8 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=75.1,<76.0a0 + - libgcc-ng >=12 + - libglib >=2.80.3,<3.0a0 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 1603653 + timestamp: 1721186240105 +- kind: conda + name: hpack + version: 4.0.0 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 + md5: 914d6646c4dbb1fd3ff539830a12fd71 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 25341 + timestamp: 1598856368685 +- kind: conda + name: hyperframe + version: 6.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 + md5: 9f765cbfab6870c8435b9eefecd7a1f4 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 14646 + timestamp: 1619110249723 +- kind: conda + name: icu + version: '75.1' + build: he02047a_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- kind: conda + name: icu + version: '75.1' + build: hfee45f7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 11857802 + timestamp: 1720853997952 +- kind: conda + name: identify + version: 2.6.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda + sha256: dc752392f327e64e32bc3122758b2d8951aec9d6e6aa888463c73d18a10e3c56 + md5: 43f629202f9eec21be5f71171fb5daf8 + depends: + - python >=3.6 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=hash-mapping + size: 78078 + timestamp: 1726369674008 +- kind: conda + name: idna + version: '3.10' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda + sha256: 8c57fd68e6be5eecba4462e983aed7e85761a519aab80e834bbd7794d4b545b2 + md5: 7ba2ede0e7c795ff95088daf0dc59753 + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49837 + timestamp: 1726459583613 +- kind: conda + name: imagesize + version: 1.4.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 + md5: 7de5386c8fea29e76b303f37dde4c352 + depends: + - python >=3.4 + license: MIT + license_family: MIT + purls: + - pkg:pypi/imagesize?source=hash-mapping + size: 10164 + timestamp: 1656939625410 +- kind: conda + name: importlib-metadata + version: 8.5.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c + md5: 54198435fce4d64d8a89af22573012a8 + depends: + - python >=3.8 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 28646 + timestamp: 1726082927916 +- kind: conda + name: iniconfig + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 + md5: f800d2da156d08e289b14e87e43c1ae5 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=hash-mapping + size: 11101 + timestamp: 1673103208955 +- kind: conda + name: jinja2 + version: 3.1.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d + md5: 7b86ecb7d3557821c649b3c31e3eb9f2 + depends: + - markupsafe >=2.0 + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + size: 111565 + timestamp: 1715127275924 +- kind: conda + name: keyutils + version: 1.6.1 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- kind: conda + name: kiwisolver + version: 1.4.7 + build: py312h6142ec9_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.7-py312h6142ec9_0.conda + sha256: 056a2cc3b6c07c79719cb8f2eda09408fca137b49fe46f919ef14247caa6f0e9 + md5: ea8a65d24baad7ed822ab7f07f19e105 + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 60966 + timestamp: 1725459569843 +- kind: conda + name: kiwisolver + version: 1.4.7 + build: py312h68727a3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda + sha256: d752c53071ee5d712baa9742dd1629e60388c5ce4ab11d4e73a1690443e41769 + md5: 444266743652a4f1538145e9362f6d3b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 70922 + timestamp: 1725459412788 +- kind: conda + name: kiwisolver + version: 1.4.7 + build: py312hc5c4d5f_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py312hc5c4d5f_0.conda + sha256: 87470d7eed470c01efa19dd0d5a2eca9149afa1176d1efc50c475b3b81df62c1 + md5: 7b72389a8a3ba350285f86933ab85da0 + depends: + - __osx >=10.13 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 62176 + timestamp: 1725459509941 +- kind: conda + name: krb5 + version: 1.21.3 + build: h659f571_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- kind: conda + name: latexcodec + version: 2.0.1 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + sha256: 5210d31c8f2402dd1ad1b3edcf7a53292b9da5de20cd14d9c243dbf9278b1c4f + md5: 8d67904973263afd2985ba56aa2d6bb4 + depends: + - python + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/latexcodec?source=hash-mapping + size: 18212 + timestamp: 1592937373647 +- kind: conda + name: lcms2 + version: '2.16' + build: ha0e7c42_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 + md5: 66f6c134e76fe13cce8a9ea5814b5dd5 + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 211959 + timestamp: 1701647962657 +- kind: conda + name: lcms2 + version: '2.16' + build: ha2f27b4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda + sha256: 222ebc0a55544b9922f61e75015d02861e65b48f12113af41d48ba0814e14e4e + md5: 1442db8f03517834843666c422238c9b + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 224432 + timestamp: 1701648089496 +- kind: conda + name: lcms2 + version: '2.16' + build: hb7c19ff_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 + md5: 51bb7010fc86f70eee639b4bb7a894f5 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 245247 + timestamp: 1701647787198 +- kind: conda + name: ld64_osx-arm64 + version: '951.9' + build: hf3baa6d_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-hf3baa6d_1.conda + sha256: e9818467d8bac0afecb6f4ad3a5c975b8ead2c115af5c8a0ac8db500f9d3f1fe + md5: c80468b5863ac35ca5d2ea6df427d0c1 + depends: + - __osx >=11.0 + - libcxx + - libllvm19 >=19.1.0,<19.2.0a0 + - sigtool + - tapi >=1300.6.5,<1301.0a0 + constrains: + - ld 951.9.* + - cctools 1010.6.* + - cctools_osx-arm64 1010.6.* + - clang >=19.1.0,<20.0a0 + license: APSL-2.0 + license_family: Other + purls: [] + size: 1010000 + timestamp: 1727792742169 +- kind: conda + name: ld_impl_linux-64 + version: '2.43' + build: h712a8e2_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 669211 + timestamp: 1729655358674 +- kind: conda + name: lerc + version: 4.0.0 + build: h27087fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 281798 + timestamp: 1657977462600 +- kind: conda + name: lerc + version: 4.0.0 + build: h9a09cb3_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 215721 + timestamp: 1657977558796 +- kind: conda + name: lerc + version: 4.0.0 + build: hb486fe8_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 + sha256: e41790fc0f4089726369b3c7f813117bbc14b533e0ed8b94cf75aba252e82497 + md5: f9d6a4c82889d5ecedec1d90eb673c55 + depends: + - libcxx >=13.0.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 290319 + timestamp: 1657977526749 +- kind: conda + name: libblas + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + sha256: d6d12dc437d060f838820e9e61bf73baab651f91935ac594cf10beb9ef1b4450 + md5: 8ea26d42ca88ec5258802715fe1ee10b + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - liblapack 3.9.0 25_linux64_openblas + - libcblas 3.9.0 25_linux64_openblas + - blas * openblas + - liblapacke 3.9.0 25_linux64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15677 + timestamp: 1729642900350 +- kind: conda + name: libblas + version: 3.9.0 + build: 25_osx64_openblas + build_number: 25 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda + sha256: 1b22b5322a311a775bca637b26317645cf07e35f125cede9278c6c45db6e7105 + md5: da0a6f87958893e1d2e2bbc7e7a6541f + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - liblapack 3.9.0 25_osx64_openblas + - liblapacke 3.9.0 25_osx64_openblas + - blas * openblas + - libcblas 3.9.0 25_osx64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15952 + timestamp: 1729643159199 +- kind: conda + name: libblas + version: 3.9.0 + build: 25_osxarm64_openblas + build_number: 25 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda + sha256: f1fb9a11af0b2878bd8804b4c77d3733c40076218bcbdb35f575b1c0c9fddf11 + md5: f8cf4d920ff36ce471619010eff59cac + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - blas * openblas + - liblapack 3.9.0 25_osxarm64_openblas + - liblapacke 3.9.0 25_osxarm64_openblas + - libcblas 3.9.0 25_osxarm64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15913 + timestamp: 1729643265495 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: h00291cd_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda + sha256: b377056470a9fb4a100aa3c51b3581aab6496ba84d21cd99bcc1d5ef0359b1b6 + md5: 58f2c4bdd56c46cc7451596e4ae68e0b + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 67267 + timestamp: 1725267768667 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 68426 + timestamp: 1725267943211 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: h00291cd_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda + sha256: 4d49ea72e2f44d2d7a8be5472e4bd0bc2c6b89c55569de2c43576363a0685c0c + md5: 34709a1f5df44e054c4a12ab536c5459 + depends: + - __osx >=10.13 + - libbrotlicommon 1.1.0 h00291cd_2 + license: MIT + license_family: MIT + purls: [] + size: 29872 + timestamp: 1725267807289 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + purls: [] + size: 28378 + timestamp: 1725267980316 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: h00291cd_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda + sha256: 477d236d389473413a1ccd2bec1b66b2f1d2d7d1b4a57bb56421b7b611a56cd1 + md5: 691f0dcb36f1ae67f5c489f20ae987ea + depends: + - __osx >=10.13 + - libbrotlicommon 1.1.0 h00291cd_2 + license: MIT + license_family: MIT + purls: [] + size: 296353 + timestamp: 1725267822076 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: hd74edd7_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + license: MIT + license_family: MIT + purls: [] + size: 279644 + timestamp: 1725268003553 +- kind: conda + name: libcblas + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + sha256: ab87b0477078837c91d9cda62a9faca18fba7c57cc77aa779ae24b3ac783b5dd + md5: 5dbd1b0fc0d01ec5e0e1fbe667281a11 + depends: + - libblas 3.9.0 25_linux64_openblas + constrains: + - liblapack 3.9.0 25_linux64_openblas + - blas * openblas + - liblapacke 3.9.0 25_linux64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15613 + timestamp: 1729642905619 +- kind: conda + name: libcblas + version: 3.9.0 + build: 25_osx64_openblas + build_number: 25 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda + sha256: b04ae297aa5396df3135514866db72845b111c92524570f923625473f11cfbe2 + md5: ab304b75ea67f850cf7adf9156e3f62f + depends: + - libblas 3.9.0 25_osx64_openblas + constrains: + - liblapack 3.9.0 25_osx64_openblas + - liblapacke 3.9.0 25_osx64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15842 + timestamp: 1729643166929 +- kind: conda + name: libcblas + version: 3.9.0 + build: 25_osxarm64_openblas + build_number: 25 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda + sha256: d9fa5b6b11252132a3383bbf87bd2f1b9d6248bef1b7e113c2a8ae41b0376218 + md5: 4df0fae81f0b5bf47d48c882b086da11 + depends: + - libblas 3.9.0 25_osxarm64_openblas + constrains: + - blas * openblas + - liblapack 3.9.0 25_osxarm64_openblas + - liblapacke 3.9.0 25_osxarm64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15837 + timestamp: 1729643270793 +- kind: conda + name: libclang-cpp19.1 + version: 19.1.3 + build: default_h01e2e8e_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.3-default_h01e2e8e_0.conda + sha256: 9e33d0ef238953184dd524f0b2b6cae6c9efff86239e25ee86aa755a5b0ef619 + md5: d7b46054f23ed0af6f95f9835ffa0d90 + depends: + - __osx >=11.0 + - libcxx >=19.1.3 + - libllvm19 >=19.1.3,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 13674917 + timestamp: 1730331708484 +- kind: conda + name: libclang-cpp19.1 + version: 19.1.3 + build: default_hb5137d0_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.3-default_hb5137d0_0.conda + sha256: 576c1826a91f93ef7c433fc6481334d21177996bd72ff6901f58fae8f6a765db + md5: 311e6a1d041db3d6a8a8437750d4234f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libllvm19 >=19.1.3,<19.2.0a0 + - libstdcxx >=13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 20548148 + timestamp: 1730335997703 +- kind: conda + name: libclang13 + version: 19.1.3 + build: default_h9c6a7e4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.3-default_h9c6a7e4_0.conda + sha256: 7537cfefd76ffb0208484a2dc7d35d3752c6c42c80edabbc5f0dcae354d4b41e + md5: b8a8cd77810b20754f358f2327812552 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libllvm19 >=19.1.3,<19.2.0a0 + - libstdcxx >=13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 11827604 + timestamp: 1730336232401 +- kind: conda + name: libcups + version: 2.3.3 + build: h4637d8d_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 + md5: d4529f4dff3057982a7617c7ac58fde3 + depends: + - krb5 >=1.21.1,<1.22.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4519402 + timestamp: 1689195353551 +- kind: conda + name: libcxx + version: 19.1.3 + build: ha82da77_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.3-ha82da77_0.conda + sha256: 6d062760c6439e75b9a44d800d89aff60fe3441998d87506c62dc94c50412ef4 + md5: bf691071fba4734984231617783225bc + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 520771 + timestamp: 1730314603920 +- kind: conda + name: libcxx + version: 19.1.3 + build: hf95d169_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.3-hf95d169_0.conda + sha256: 466f259bb13a8058fef28843977c090d21ad337b71a842ccc0407bccf8d27011 + md5: 86801fc56d4641e3ef7a63f5d996b960 + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 528991 + timestamp: 1730314340106 +- kind: conda + name: libdeflate + version: '1.22' + build: h00291cd_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.22-h00291cd_0.conda + sha256: 681035346974c3315685dc40898e26f65f1c00cbb0b5fd80cc2599e207a34b31 + md5: a15785ccc62ae2a8febd299424081efb + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 70407 + timestamp: 1728177128525 +- kind: conda + name: libdeflate + version: '1.22' + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda + sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 + md5: b422943d5d772b7cc858b36ad2a92db5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 72242 + timestamp: 1728177071251 +- kind: conda + name: libdeflate + version: '1.22' + build: hd74edd7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda + sha256: 3552894ca62bebc33d05982937cda25a4fa19e56a82af2ff20944ff4c2532fda + md5: 2d3e3f3d8ab315748420ef58d5a3ae0f + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 54089 + timestamp: 1728177149927 +- kind: conda + name: libdrm + version: 2.4.123 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda + sha256: 5f274243fc7480b721a4ed6623c72d07b86a508a1363a85f0f16451ab655ace8 + md5: ee605e794bdc14e2b7f84c4faa0d8c2c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=13 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + purls: [] + size: 303108 + timestamp: 1724719521496 +- kind: conda + name: libedit + version: 3.1.20191231 + build: he28a2e2_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf + md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 + depends: + - libgcc-ng >=7.5.0 + - ncurses >=6.2,<7.0.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 123878 + timestamp: 1597616541093 +- kind: conda + name: libegl + version: 1.7.0 + build: ha4b6fd6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_1.conda + sha256: e64388e983cf14354b70fe908ca3943f2481ea63df8a4de5e4d418dc2addd38e + md5: 38a5cd3be5fb620b48069e27285f1a44 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_1 + license: LicenseRef-libglvnd + purls: [] + size: 44620 + timestamp: 1727968589748 +- kind: pypi + name: libensemble + version: 1.4.2+dev + path: . + sha256: 97a293c0deb2efb8e70565d867429996dff1ab2068f0b9e09ef8b39bd3d69934 + requires_python: '>=3.9' + editable: true +- kind: conda + name: libexpat + version: 2.6.3 + build: h5888daf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda + sha256: 4bb47bb2cd09898737a5211e2992d63c555d63715a07ba56eae0aff31fb89c22 + md5: 59f4c43bb1b5ef1c71946ff2cbf59524 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.3.* + license: MIT + license_family: MIT + purls: [] + size: 73616 + timestamp: 1725568742634 +- kind: conda + name: libexpat + version: 2.6.3 + build: hac325c4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.3-hac325c4_0.conda + sha256: dd22dffad6731c352f4c14603868c9cce4d3b50ff5ff1e50f416a82dcb491947 + md5: c1db99b0a94a2f23bd6ce39e2d314e07 + depends: + - __osx >=10.13 + constrains: + - expat 2.6.3.* + license: MIT + license_family: MIT + purls: [] + size: 70517 + timestamp: 1725568864316 +- kind: conda + name: libexpat + version: 2.6.3 + build: hf9b8971_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda + sha256: 5cbe5a199fba14ade55457a468ce663aac0b54832c39aa54470b3889b4c75c4a + md5: 5f22f07c2ab2dea8c66fe9585a062c96 + depends: + - __osx >=11.0 + constrains: + - expat 2.6.3.* + license: MIT + license_family: MIT + purls: [] + size: 63895 + timestamp: 1725568783033 +- kind: conda + name: libffi + version: 3.4.2 + build: h0d85af4_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + md5: ccb34fb14960ad8b125962d3d79b31a9 + license: MIT + license_family: MIT + purls: [] + size: 51348 + timestamp: 1636488394370 +- kind: conda + name: libffi + version: 3.4.2 + build: h3422bc3_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- kind: conda + name: libffi + version: 3.4.2 + build: h7f98852_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 58292 + timestamp: 1636488182923 +- kind: conda + name: libgcc + version: 14.2.0 + build: h77fa898_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 848745 + timestamp: 1729027721139 +- kind: conda + name: libgcc-ng + version: 14.2.0 + build: h69a702a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54142 + timestamp: 1729027726517 +- kind: conda + name: libgfortran + version: 5.0.0 + build: 13_2_0_h97931a8_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + sha256: 4874422e567b68334705c135c17e5acdca1404de8255673ce30ad3510e00be0d + md5: 0b6e23a012ee7a9a5f6b244f5a92c1d5 + depends: + - libgfortran5 13.2.0 h2873a65_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110106 + timestamp: 1707328956438 +- kind: conda + name: libgfortran + version: 5.0.0 + build: 13_2_0_hd922786_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- kind: conda + name: libgfortran + version: 14.2.0 + build: h69a702a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 + md5: f1fd30127802683586f768875127a987 + depends: + - libgfortran5 14.2.0 hd5240d6_1 + constrains: + - libgfortran-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53997 + timestamp: 1729027752995 +- kind: conda + name: libgfortran5 + version: 13.2.0 + build: h2873a65_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + sha256: da3db4b947e30aec7596a3ef92200d17e774cccbbf7efc47802529a4ca5ca31b + md5: e4fb4d23ec2870ff3c40d10afe305aec + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1571379 + timestamp: 1707328880361 +- kind: conda + name: libgfortran5 + version: 13.2.0 + build: hf226fd6_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- kind: conda + name: libgfortran5 + version: 14.2.0 + build: hd5240d6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + sha256: d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d + md5: 9822b874ea29af082e5d36098d25427d + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1462645 + timestamp: 1729027735353 +- kind: conda + name: libgl + version: 1.7.0 + build: ha4b6fd6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda + sha256: 2de573a2231d0ffa13242e274d33b7bae88fb0a178392fd4a03cf803a47e4051 + md5: 204892bce2e44252b5cf272712f10bdd + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_1 + - libglx 1.7.0 ha4b6fd6_1 + license: LicenseRef-libglvnd + purls: [] + size: 134476 + timestamp: 1727968620103 +- kind: conda + name: libglib + version: 2.82.2 + build: h2ff4ddf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 + md5: 13e8e54035ddd2b91875ba399f0f7c04 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.44,<10.45.0a0 + constrains: + - glib 2.82.2 *_0 + license: LGPL-2.1-or-later + purls: [] + size: 3931898 + timestamp: 1729191404130 +- kind: conda + name: libglvnd + version: 1.7.0 + build: ha4b6fd6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda + sha256: 67942c2b6e4ddb705640b5db962e678f17d8305df5c1633e939cef1158a95058 + md5: 1ece2ccb1dc8c68639712b05e0fae070 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + purls: [] + size: 132216 + timestamp: 1727968577428 +- kind: conda + name: libglx + version: 1.7.0 + build: ha4b6fd6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda + sha256: facc239145719034f7b8815d9630032e701d26534dae28303cdbae8b19590a82 + md5: 80a57756c545ad11f9847835aa21e6b2 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_1 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + purls: [] + size: 77902 + timestamp: 1727968607539 +- kind: conda + name: libgomp + version: 14.2.0 + build: h77fa898_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 460992 + timestamp: 1729027639220 +- kind: conda + name: libiconv + version: '1.17' + build: h0d3ecfb_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 + md5: 69bda57310071cf6d2b86caf11573d2d + license: LGPL-2.1-only + purls: [] + size: 676469 + timestamp: 1702682458114 +- kind: conda + name: libiconv + version: '1.17' + build: hd590300_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 + md5: d66573916ffcf376178462f1b61c941e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + purls: [] + size: 705775 + timestamp: 1702682170569 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: h0dc2134_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda + sha256: d9572fd1024adc374aae7c247d0f29fdf4b122f1e3586fe62acc18067f40d02f + md5: 72507f8e3961bc968af17435060b6dd6 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 579748 + timestamp: 1694475265912 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 547541 + timestamp: 1694475104253 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 618575 + timestamp: 1694474974816 +- kind: conda + name: liblapack + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + sha256: 9d1ff017714edb2d84868f0f931a4a0e7c289a971062b2ac66cfc8145df7e20e + md5: 4dc03a53fc69371a6158d0ed37214cd3 + depends: + - libblas 3.9.0 25_linux64_openblas + constrains: + - liblapacke 3.9.0 25_linux64_openblas + - libcblas 3.9.0 25_linux64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15608 + timestamp: 1729642910812 +- kind: conda + name: liblapack + version: 3.9.0 + build: 25_osx64_openblas + build_number: 25 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda + sha256: 2a9a6143d103e7e21511cbf439521645bdd506bfabfcac9d6398dd0562c6905c + md5: dda0e24b4605ebbd381e48606a107bed + depends: + - libblas 3.9.0 25_osx64_openblas + constrains: + - liblapacke 3.9.0 25_osx64_openblas + - blas * openblas + - libcblas 3.9.0 25_osx64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15852 + timestamp: 1729643174413 +- kind: conda + name: liblapack + version: 3.9.0 + build: 25_osxarm64_openblas + build_number: 25 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda + sha256: fdd742407672a9af20e70764550cf18b3ab67f12e48bf04163b90492fbc401e7 + md5: 19bbddfec972d401838330453186108d + depends: + - libblas 3.9.0 25_osxarm64_openblas + constrains: + - blas * openblas + - liblapacke 3.9.0 25_osxarm64_openblas + - libcblas 3.9.0 25_osxarm64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15823 + timestamp: 1729643275943 +- kind: conda + name: libllvm19 + version: 19.1.3 + build: ha7bfdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.3-ha7bfdaf_0.conda + sha256: 44502d37011472549367110a58ea78ff6c627f9436d1e4ebb5b34f80763dbf2a + md5: 8bd654307c455162668cd66e36494000 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 40124530 + timestamp: 1730301303455 +- kind: conda + name: libllvm19 + version: 19.1.3 + build: haf57ff0_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.3-haf57ff0_0.conda + sha256: 174e24adb8bf5e55c6871057c6ac6aace11a043afd0528a7314c4f641c176444 + md5: 25dd0e37da590d639d35e1b6a66a4a96 + depends: + - __osx >=11.0 + - libcxx >=17 + - libxml2 >=2.13.4,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 26881534 + timestamp: 1730291029268 +- kind: conda + name: libnsl + version: 2.0.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- kind: conda + name: libntlm + version: '1.4' + build: h7f98852_1002 + build_number: 1002 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 + sha256: 63244b73156033ea3b7c2a1581526e79b4670349d64b15f645dcdb12de441d1a + md5: e728e874159b042d92b90238a3cb0dc2 + depends: + - libgcc-ng >=9.3.0 + license: LGPL-2.1-or-later + purls: [] + size: 33201 + timestamp: 1609781914458 +- kind: conda + name: libopenblas + version: 0.3.28 + build: openmp_hbf64a52_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_hbf64a52_1.conda + sha256: cef5856952688ce9303f85f5bc62c99e8c2256b4c679f63afdfb381f222e90c7 + md5: cd2c572c02a73b88c4d378eb31110e85 + depends: + - __osx >=10.13 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + license: BSD-3-Clause + purls: [] + size: 6165715 + timestamp: 1730773348340 +- kind: conda + name: libopenblas + version: 0.3.28 + build: openmp_hf332438_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + sha256: 62bb669c37a845129096f73d446cdb6bb170e4927f2fea2b661329680dbbc373 + md5: 40803a48d947c8639da6704e9a44d3ce + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + license: BSD-3-Clause + purls: [] + size: 4165774 + timestamp: 1730772154295 +- kind: conda + name: libopenblas + version: 0.3.28 + build: pthreads_h94d23a6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe + md5: 62857b389e42b36b686331bec0922050 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + license: BSD-3-Clause + purls: [] + size: 5578513 + timestamp: 1730772671118 +- kind: conda + name: libopengl + version: 1.7.0 + build: ha4b6fd6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_1.conda + sha256: b367afa1b63462b7bd64101dc8156470e9932a3f703c3423be26dd5a539a2ec2 + md5: e12057a66af8f2a38a839754ca4481e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_1 + license: LicenseRef-libglvnd + purls: [] + size: 50219 + timestamp: 1727968613527 +- kind: conda + name: libpciaccess + version: '0.18' + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda + sha256: c0a30ac74eba66ea76a4f0a39acc7833f5ed783a632ca3bb6665b2d81aabd2fb + md5: 48f4330bfcd959c3cfb704d424903c82 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 28361 + timestamp: 1707101388552 +- kind: conda + name: libpng + version: 1.6.44 + build: h4b8f8c9_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda + sha256: 12b44e58f8832798d7a5c0a7480c95e905dbd6c3558dec09739062411f9e08d1 + md5: f32ac2c8dd390dbf169f550887ed09d9 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 268073 + timestamp: 1726234803010 +- kind: conda + name: libpng + version: 1.6.44 + build: hadc24fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda + sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 + md5: f4cc49d7aa68316213e4b12be35308d1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 290661 + timestamp: 1726234747153 +- kind: conda + name: libpng + version: 1.6.44 + build: hc14010f_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + sha256: 38f8759a3eb8060deabd4db41f0f023514d853e46ddcbd0ba21768fc4e563bb1 + md5: fb36e93f0ea6a6f5d2b99984f34b049e + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 263385 + timestamp: 1726234714421 +- kind: conda + name: libpq + version: '17.0' + build: h04577a9_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda + sha256: 2f7e72e32f495cfb0492b8091d97dbe1c0700428fe167f3a781bb46e88dee4e5 + md5: 392cae2a58fbcb9db8c2147c6d6d1620 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - openldap >=2.6.8,<2.7.0a0 + - openssl >=3.3.2,<4.0a0 + license: PostgreSQL + purls: [] + size: 2602277 + timestamp: 1729085182543 +- kind: conda + name: libsqlite + version: 3.47.0 + build: h2f8c449_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + sha256: a0f7381c867898a45018b1e5cf1aca68659d292d58252e8f489a4270b010fed8 + md5: af445c495253a871c3d809e1199bb12b + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 915300 + timestamp: 1730208101739 +- kind: conda + name: libsqlite + version: 3.47.0 + build: hadc24fc_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 + md5: b6f02b52a174e612e89548f4663ce56a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 875349 + timestamp: 1730208050020 +- kind: conda + name: libsqlite + version: 3.47.0 + build: hbaaea75_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + sha256: 5a96caa566c11e5a5ebdcdb86a0759a7fb27d3c5f42e6a0fd0d6023c1e935d9e + md5: 07a14fbe439eef078cc479deca321161 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 837683 + timestamp: 1730208293578 +- kind: conda + name: libstdcxx + version: 14.2.0 + build: hc0a3c3a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 + md5: 234a5554c53625688d51062645337328 + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3893695 + timestamp: 1729027746910 +- kind: conda + name: libstdcxx-ng + version: 14.2.0 + build: h4852527_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 + md5: 8371ac6457591af2cf6159439c1fd051 + depends: + - libstdcxx 14.2.0 hc0a3c3a_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54105 + timestamp: 1729027780628 +- kind: conda + name: libtiff + version: 4.7.0 + build: h583c2ba_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda + sha256: 4d58c695dfed6f308d0fd3ff552e0078bb98bc0be2ea0bf55820eb6e86fa5355 + md5: 4b78bcdcc8780cede8b3d090deba874d + depends: + - __osx >=10.13 + - lerc >=4.0.0,<5.0a0 + - libcxx >=17 + - libdeflate >=1.22,<1.23.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + purls: [] + size: 395980 + timestamp: 1728232302162 +- kind: conda + name: libtiff + version: 4.7.0 + build: he137b08_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda + sha256: 9890121db85f6ef463fe12eb04ef1471176e3ef3b5e2d62e8d6dac713df00df4 + md5: 63872517c98aa305da58a757c443698e + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.22,<1.23.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + purls: [] + size: 428156 + timestamp: 1728232228989 +- kind: conda + name: libtiff + version: 4.7.0 + build: hfce79cd_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda + sha256: 97ba24c74750b6e731b3fe0d2a751cda6148b4937d2cc3f72d43bf7b3885c39d + md5: b9abf45f7c64caf3303725f1aa0e9a4d + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=17 + - libdeflate >=1.22,<1.23.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + purls: [] + size: 366323 + timestamp: 1728232400072 +- kind: conda + name: libuuid + version: 2.38.1 + build: h0b41bf4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- kind: conda + name: libwebp-base + version: 1.4.0 + build: h10d778d_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda + sha256: 7bafd8f4c637778cd0aa390bf3a894feef0e1fcf6ea6000c7ffc25c4c5a65538 + md5: b2c0047ea73819d992484faacbbe1c24 + constrains: + - libwebp 1.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 355099 + timestamp: 1713200298965 +- kind: conda + name: libwebp-base + version: 1.4.0 + build: h93a5062_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda + sha256: 0d4bad713a512d79bfeb4d61821f447afab8b0792aca823f505ce6b195e9fde5 + md5: c0af0edfebe780b19940e94871f1a765 + constrains: + - libwebp 1.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 287750 + timestamp: 1713200194013 +- kind: conda + name: libwebp-base + version: 1.4.0 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda + sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f + md5: b26e8aa824079e1be0294e7152ca4559 + depends: + - libgcc-ng >=12 + constrains: + - libwebp 1.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438953 + timestamp: 1713199854503 +- kind: conda + name: libxcb + version: 1.17.0 + build: h8a09558_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- kind: conda + name: libxcb + version: 1.17.0 + build: hdb1d25a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 323658 + timestamp: 1727278733917 +- kind: conda + name: libxcb + version: 1.17.0 + build: hf1f96e2_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda + sha256: 8896cd5deff6f57d102734f3e672bc17120613647288f9122bec69098e839af7 + md5: bbeca862892e2898bdb45792a61c4afc + depends: + - __osx >=10.13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 323770 + timestamp: 1727278927545 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- kind: conda + name: libxkbcommon + version: 1.7.0 + build: h2c5496b_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda + sha256: 6804c2a7062d10de6f159f7106dc45ebccc8d42bfb925f7919e26e567fa6da6b + md5: e2eaefa4de2b7237af7c907b8bbc760a + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - libxml2 >=2.12.7,<3.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.11,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + purls: [] + size: 593336 + timestamp: 1718819935698 +- kind: conda + name: libxml2 + version: 2.13.4 + build: h8424949_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.4-h8424949_2.conda + sha256: 51048cd9d4d7ab3ab440bac01d1db8193ae1bd3e9502cdf6792a69c792fec2e5 + md5: 3f0764c38bc02720231d49d6035531f2 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 572400 + timestamp: 1730356085177 +- kind: conda + name: libxml2 + version: 2.13.4 + build: hb346dea_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_2.conda + sha256: a111cb7f2deb6e20ebb475e8426ce5291451476f55f0dec6c220aa51e5a5784f + md5: 69b90b70c434b916abf5a1d5ee5d55fb + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 690019 + timestamp: 1730355770718 +- kind: conda + name: libxslt + version: 1.1.39 + build: h76b75d6_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda + sha256: 684e9b67ef7b9ca0ca993762eeb39705ec58e2e7f958555c758da7ef416db9f3 + md5: e71f31f8cfb0a91439f2086fc8aa0461 + depends: + - libgcc-ng >=12 + - libxml2 >=2.12.1,<3.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 254297 + timestamp: 1701628814990 +- kind: conda + name: libzlib + version: 1.3.1 + build: h8359307_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- kind: conda + name: libzlib + version: 1.3.1 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- kind: conda + name: libzlib + version: 1.3.1 + build: hd23fc13_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 57133 + timestamp: 1727963183990 +- kind: conda + name: llvm-openmp + version: 19.1.3 + build: hb52a8e5_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.3-hb52a8e5_0.conda + sha256: 49a8940e727aa82ee034fa9a60b3fcababec41b3192d955772aab635a5374b82 + md5: dd695d23e78d1ca4fecce969b1e1db61 + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.3|19.1.3.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 280488 + timestamp: 1730364082380 +- kind: conda + name: llvm-openmp + version: 19.1.3 + build: hf78d878_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.3-hf78d878_0.conda + sha256: 3d28e9938ab1400322ba76968cdbee035009d611bbee94ec6b38a154551954b4 + md5: 18a8498d57d871da066beaa09263a638 + depends: + - __osx >=10.13 + constrains: + - openmp 19.1.3|19.1.3.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 305524 + timestamp: 1730364180247 +- kind: conda + name: llvm-tools + version: 19.1.3 + build: h33d20e1_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.3-h33d20e1_0.conda + sha256: 38936860554eaf27c2e61d65e7f120abf66e59a22a4808413eb72151fa831b18 + md5: 62c9438f3cfa5cf08b6f244d926d6485 + depends: + - __osx >=11.0 + - libllvm19 19.1.3 haf57ff0_0 + - llvm-tools-19 19.1.3 he407fa0_0 + constrains: + - llvmdev 19.1.3 + - clang 19.1.3 + - llvm 19.1.3 + - clang-tools 19.1.3 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 87828 + timestamp: 1730291457622 +- kind: conda + name: llvm-tools-19 + version: 19.1.3 + build: he407fa0_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.3-he407fa0_0.conda + sha256: 19b6708194555f98c6f5673c8d0578bc8ed260e5764bad301ce872cac95acee2 + md5: 510011573240bb7e0bba0d23f37860eb + depends: + - __osx >=11.0 + - libcxx >=17 + - libllvm19 19.1.3 haf57ff0_0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 15968990 + timestamp: 1730291403428 +- kind: conda + name: markdown-it-py + version: 3.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 + md5: 93a8e71256479c62074356ef6ebf501b + depends: + - mdurl >=0.1,<1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + size: 64356 + timestamp: 1686175179621 +- kind: conda + name: markupsafe + version: 3.0.2 + build: py312h178313f_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda + sha256: 15f14ab429c846aacd47fada0dc4f341d64491e097782830f0906d00cb7b48b6 + md5: a755704ea0e2503f8c227d84829a8e81 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24878 + timestamp: 1729351558563 +- kind: conda + name: markupsafe + version: 3.0.2 + build: py312ha0ccf2a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312ha0ccf2a_0.conda + sha256: 360e958055f35e5087942b9c499eaafae984a951b84cf354ef7481a2806f340d + md5: c6ff9f291d011c9d4f0b840f49435c64 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 24495 + timestamp: 1729351534830 +- kind: conda + name: markupsafe + version: 3.0.2 + build: py312hbe3f5e4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312hbe3f5e4_0.conda + sha256: b2fb54718159055fdf89da7d9f0c6743ef84b31960617a56810920d17616d944 + md5: c6238833d7dc908ec295bc490b80d845 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + size: 23889 + timestamp: 1729351468966 +- kind: conda + name: matplotlib + version: 3.9.2 + build: py312h1f38498_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.9.2-py312h1f38498_1.conda + sha256: 6fb7dd99a9706290aa653afda9ce7d70c4218325cfb1670683c2ea74a220d8e5 + md5: 9b1d61b4967cbfcd4f97a5f6a2fc01bd + depends: + - matplotlib-base >=3.9.2,<3.9.3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 8924 + timestamp: 1726165048680 +- kind: conda + name: matplotlib + version: 3.9.2 + build: py312h7900ff3_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py312h7900ff3_1.conda + sha256: 36eba5fde11962133b469c4121d83e26fba48654ee8f5753e5ffaf36d8631c47 + md5: 07d5646ea9f22f4b1c46c2947d1b2f58 + depends: + - matplotlib-base >=3.9.2,<3.9.3.0a0 + - pyside6 >=6.7.2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 8821 + timestamp: 1726164949072 +- kind: conda + name: matplotlib + version: 3.9.2 + build: py312hb401068_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.9.2-py312hb401068_1.conda + sha256: 91866c86a6e5609a132902077b6d1dc322a1bba7dd85dcea4d0bbfbdf5748437 + md5: 522402426e34fce47653fd99ffc40a22 + depends: + - matplotlib-base >=3.9.2,<3.9.3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 8847 + timestamp: 1726165120341 +- kind: conda + name: matplotlib-base + version: 3.9.2 + build: py312h30cc4df_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.9.2-py312h30cc4df_1.conda + sha256: 2f8f222cebd8c5aa3d3878496bdfb976acedf7aad0cf4abce1c919d03b57c7ee + md5: 0cca3ae643d5cbfe380fda45bd55e001 + depends: + - __osx >=10.13 + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - kiwisolver >=1.3.1 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.23 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 7678288 + timestamp: 1726165095191 +- kind: conda + name: matplotlib-base + version: 3.9.2 + build: py312h9bd0bc6_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.9.2-py312h9bd0bc6_1.conda + sha256: b3289cea8de29ba5b9fb437d3e4e32d2cbf88998890378a4e729c5be08e1ba41 + md5: b6a861da93e2f4fcecdb01ff7b8fc160 + depends: + - __osx >=11.0 + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - kiwisolver >=1.3.1 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.23 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 7790076 + timestamp: 1726165022207 +- kind: conda + name: matplotlib-base + version: 3.9.2 + build: py312hd3ec401_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda + sha256: 3efd50d9b7b0f1b30611585810d4ae7566d7c860c101f47ec9372f6d4a80d040 + md5: 2f4f3854f23be30de29e9e4d39758349 + depends: + - __glibc >=2.17,<3.0.a0 + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - kiwisolver >=1.3.1 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.23 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 7892651 + timestamp: 1726164930325 +- kind: conda + name: mccabe + version: 0.7.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 + sha256: 0466ad9490b761e9a8c57fab574fc099136b45fa19a0746ce33acdeb2a84766b + md5: 34fc335fc50eef0b5ea708f2b5f54e0c + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mccabe?source=hash-mapping + size: 10909 + timestamp: 1643049714491 +- kind: conda + name: mdurl + version: 0.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 + md5: 776a8dd9e824f77abac30e6ef43a8f7a + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14680 + timestamp: 1704317789138 +- kind: conda + name: mock + version: 5.1.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda + sha256: c83ca0a2f3bdcaa3cec5d7b5c796748f66de530f7a2f1bdb27d3de424fb5b304 + md5: 926c67c0310094cf421ad13f7d3f38e5 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/mock?source=hash-mapping + size: 33581 + timestamp: 1689092227859 +- kind: conda + name: mpi + version: 1.0.1 + build: mpich + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda + sha256: eacc189267202669a1c5c849dcca2298f41acb3918f05cf912d7d61ee7176fac + md5: 1052de900d672ec8b3713b8e300a8f06 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6522 + timestamp: 1727683134241 +- kind: conda + name: mpi4py + version: 4.0.1 + build: py312h017ff69_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/mpi4py-4.0.1-py312h017ff69_0.conda + sha256: 34643576ee47c882e98362c8ed68867fe0b2ec6a4ceae3c51e72d926bc39f5be + md5: bf13ed584249c31155d8e6ebeb768437 + depends: + - __osx >=10.13 + - mpich >=4.2.3,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpi4py?source=hash-mapping + size: 750411 + timestamp: 1728738887286 +- kind: conda + name: mpi4py + version: 4.0.1 + build: py312h0a6c937_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.0.1-py312h0a6c937_0.conda + sha256: 77686b61cff83b5110b48b38d175e349a985d5a8a38b4f6e43f45b724a592630 + md5: 2ef9b8f9fc61ed32eec530e4e5855804 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - mpich >=4.2.3,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpi4py?source=hash-mapping + size: 863274 + timestamp: 1728738980690 +- kind: conda + name: mpi4py + version: 4.0.1 + build: py312h5450814_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/mpi4py-4.0.1-py312h5450814_0.conda + sha256: fa3c1298781eb3e794a821314ad60444ecb174bd2f44031969e7de96308f3804 + md5: 0b6f0d22c2a9e77d0833043e8e8abf13 + depends: + - __osx >=11.0 + - mpich >=4.2.3,<5.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpi4py?source=hash-mapping + size: 711309 + timestamp: 1728738936102 +- kind: conda + name: mpich + version: 4.2.3 + build: h670b19f_100 + build_number: 100 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mpich-4.2.3-h670b19f_100.conda + sha256: 185c8ba393d559cdc92d5668efc0c47b3228b15e9047288d791eaf9097330f10 + md5: f20c61baae087e5092819cfed55ea861 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - libstdcxx >=13 + - mpi 1.0.* mpich + license: LicenseRef-MPICH + license_family: Other + purls: [] + size: 13759543 + timestamp: 1727948359420 +- kind: conda + name: mpich + version: 4.2.3 + build: ha850315_100 + build_number: 100 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/mpich-4.2.3-ha850315_100.conda + sha256: b36604abd043ac83a41604e1b6af4e3fe6440df7bb4c5408f363bb9c9fc88841 + md5: b445812dc66fde076abd10c243662882 + depends: + - __osx >=10.13 + - libcxx >=17 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - mpi 1.0.* mpich + license: LicenseRef-MPICH + license_family: Other + purls: [] + size: 9212936 + timestamp: 1727948164224 +- kind: conda + name: mpich + version: 4.2.3 + build: he5dbaa7_100 + build_number: 100 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/mpich-4.2.3-he5dbaa7_100.conda + sha256: 3953146b98e9557ad825c6ab55c847a418717aed6e5b5fe3be846b6fd1f8858a + md5: e990510083600bc61e3c9a5615dcd412 + depends: + - __osx >=11.0 + - libcxx >=17 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - mpi 1.0.* mpich + license: LicenseRef-MPICH + license_family: Other + purls: [] + size: 5754558 + timestamp: 1727948143763 +- kind: conda + name: mpmath + version: 1.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda + sha256: a4f025c712ec1502a55c471b56a640eaeebfce38dd497d5a1a33729014cac47a + md5: dbf6e2d89137da32fa6670f3bffc024e + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + size: 438339 + timestamp: 1678228210181 +- kind: conda + name: munkres + version: 1.1.4 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 + md5: 2ba8498c1018c1e9c61eb99b973dfe19 + depends: + - python + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/munkres?source=hash-mapping + size: 12452 + timestamp: 1600387789153 +- kind: conda + name: mysql-common + version: 9.0.1 + build: h266115a_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda + sha256: bf0c230c35ca70e2c98530eb064a99f0c4d4596793a0be3ca8a3cbd92094ef82 + md5: 85c0dc0bcd110c998b01856975486ee7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 649443 + timestamp: 1729804130603 +- kind: conda + name: mysql-libs + version: 9.0.1 + build: he0572af_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda + sha256: e376189cd11304f4089971b372dac8a1cbbab6eacda8ca978ead2c220d16b8a4 + md5: 57a9e7ee3c0840d3c8c9012473978629 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - mysql-common 9.0.1 h266115a_2 + - openssl >=3.3.2,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 1372671 + timestamp: 1729804203990 +- kind: conda + name: ncurses + version: '6.5' + build: h7bae524_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc + md5: cb2b0ea909b97b3d70cd3921d1445e1a + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 802321 + timestamp: 1724658775723 +- kind: conda + name: ncurses + version: '6.5' + build: he02047a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 889086 + timestamp: 1724658547447 +- kind: conda + name: ncurses + version: '6.5' + build: hf036a51_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af + md5: e102bbf8a6ceeaf429deab8032fc8977 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + purls: [] + size: 822066 + timestamp: 1724658603042 +- kind: conda + name: nlopt + version: 2.8.0 + build: py312h314ef60_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/nlopt-2.8.0-py312h314ef60_2.conda + sha256: 489006fc82a81927c085918f27cdcb21fcea155b23b0fa1e09e79d1ab8a14aeb + md5: c348dd603f53faa384fee46aa00e8273 + depends: + - __osx >=10.13 + - libcxx >=17 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LGPL-2.1-or-later + purls: + - pkg:pypi/nlopt?source=hash-mapping + size: 385554 + timestamp: 1725348701333 +- kind: conda + name: nlopt + version: 2.8.0 + build: py312h69683c5_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/nlopt-2.8.0-py312h69683c5_2.conda + sha256: 22a30934649cabd7b20a9f17062543ca610c0e3840c7679999b7299ed2be073c + md5: 8582b8ef6a808ace0bfb83213ac54d54 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LGPL-2.1-or-later + purls: + - pkg:pypi/nlopt?source=hash-mapping + size: 402249 + timestamp: 1725348631250 +- kind: conda + name: nlopt + version: 2.8.0 + build: py312h857dc0a_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/nlopt-2.8.0-py312h857dc0a_2.conda + sha256: 93cc96f7f885b719639c4f3c0de0f4c35c8228865e1a7adb01126f1da9fa5a6c + md5: 43ff4f0c457575783aefdaeda1356c64 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: LGPL-2.1-or-later + purls: + - pkg:pypi/nlopt?source=hash-mapping + size: 322857 + timestamp: 1725348697612 +- kind: conda + name: nodeenv + version: 1.9.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda + sha256: 85ee07342ab055dc081f3de8292c5e7195e43e046db9c5750f242f928f6bb8f2 + md5: dfe0528d0f1c16c1f7c528ea5536ab30 + depends: + - python 2.7|>=3.7 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + size: 34489 + timestamp: 1717585382642 +- kind: conda + name: numpy + version: 2.1.3 + build: py312h58c1407_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.3-py312h58c1407_0.conda + sha256: e4c14f71588a5627a6935d3e7d9ca78a8387229ec8ebc91616b0988ce57ba0dc + md5: dfdbc12e6d81889ba4c494a23f23eba8 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8388631 + timestamp: 1730588649810 +- kind: conda + name: numpy + version: 2.1.3 + build: py312h94ee1e1_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.1.3-py312h94ee1e1_0.conda + sha256: cd287b6c270ee8af77d200c46d56fdfe1e2a9deeff68044439718b8d073214dd + md5: a2af54c86582e08718805c69af737897 + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 6398123 + timestamp: 1730588490904 +- kind: conda + name: numpy + version: 2.1.3 + build: py312hfc93d17_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.1.3-py312hfc93d17_0.conda + sha256: 2f120e958da2d6ab7e4785a42515b4f65f70422b8b722e1a75654962fcfb26e9 + md5: 011118baf131914d1cb48e07317f0946 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=18 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7538388 + timestamp: 1730588494493 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h488ebb8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 + md5: 7f2e286780f072ed750df46dc2631138 + depends: + - libgcc-ng >=12 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 341592 + timestamp: 1709159244431 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h7310d3a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda + sha256: dc9c405119b9b54f8ca5984da27ba498bd848ab4f0f580da6f293009ca5adc13 + md5: 05a14cc9d725dd74995927968d6547e3 + depends: + - libcxx >=16 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 331273 + timestamp: 1709159538792 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h9f1df11_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda + sha256: 472d6eaffc1996e6af35ec8e91c967f472a536a470079bfa56383cc0dbf4d463 + md5: 5029846003f0bc14414b9128a1f7c84b + depends: + - libcxx >=16 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 316603 + timestamp: 1709159627299 +- kind: conda + name: openldap + version: 2.6.8 + build: hedd0468_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda + sha256: 902652f7a106caa6ea9db2c44118078e23a499bf091ce8ea01d8498c156e8219 + md5: dcd0ed5147d8876b0848a552b416ce76 + depends: + - cyrus-sasl >=2.1.27,<3.0a0 + - krb5 >=1.21.2,<1.22.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.0,<4.0a0 + license: OLDAP-2.8 + license_family: BSD + purls: [] + size: 780492 + timestamp: 1716377814828 +- kind: conda + name: openssl + version: 3.3.2 + build: h8359307_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + sha256: 940fa01c4dc6152158fe8943e05e55a1544cab639df0994e3b35937839e4f4d1 + md5: 1773ebccdc13ec603356e8ff1db9e958 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2882450 + timestamp: 1725410638874 +- kind: conda + name: openssl + version: 3.3.2 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda + sha256: cee91036686419f6dd6086902acf7142b4916e1c4ba042e9ca23e151da012b6d + md5: 4d638782050ab6faa27275bed57e9b4e + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2891789 + timestamp: 1725410790053 +- kind: conda + name: openssl + version: 3.3.2 + build: hd23fc13_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda + sha256: 2b75d4b56e45992adf172b158143742daeb316c35274b36f385ccb6644e93268 + md5: 2ff47134c8e292868a4609519b1ea3b6 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2544654 + timestamp: 1725410973572 +- kind: conda + name: packaging + version: '24.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + sha256: 36aca948219e2c9fdd6d80728bcc657519e02f06c2703d8db3446aec67f51d81 + md5: cbe1bb1f21567018ce595d9c2be0f0db + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 50290 + timestamp: 1718189540074 +- kind: conda + name: pcre2 + version: '10.44' + build: hba22ea6_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d + md5: df359c09c41cd186fffb93a2d87aa6f5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 952308 + timestamp: 1723488734144 +- kind: conda + name: pillow + version: 11.0.0 + build: py312h66fe14f_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.0.0-py312h66fe14f_0.conda + sha256: 5e531eded0bb784c745abe3a1187c6c33478e153755bf8a8496aebff60801150 + md5: 1e49b81b5aae7af9d74bcdac0cd0d174 + depends: + - __osx >=10.13 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42189378 + timestamp: 1729065985392 +- kind: conda + name: pillow + version: 11.0.0 + build: py312h7b63e92_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda + sha256: 13a464bea02c0df0199c20ef6bad24a6bc336aaf55bf8d6a133d0fe664463224 + md5: 385f46a4df6f97892503a841121a9acf + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41948418 + timestamp: 1729065846594 +- kind: conda + name: pillow + version: 11.0.0 + build: py312haf37ca6_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda + sha256: 727b4c3faecdb6f6809cf20c5f32d2df4af34e0d5b9146b7588383bcba7990e8 + md5: dc9b51fbd2b6f7fea9b5123458864dbb + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41737424 + timestamp: 1729065920347 +- kind: conda + name: pip + version: 24.3.1 + build: pyh8b19718_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 + md5: 5dd546fe99b44fda83963d15f84263b7 + depends: + - python >=3.8,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=hash-mapping + size: 1243168 + timestamp: 1730203795600 +- kind: conda + name: pixman + version: 0.43.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda + sha256: 366d28e2a0a191d6c535e234741e0cd1d94d713f76073d8af4a5ccb2a266121e + md5: 71004cbf7924e19c02746ccde9fd7123 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 386826 + timestamp: 1706549500138 +- kind: conda + name: platformdirs + version: 4.3.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda + sha256: c81bdeadc4adcda216b2c7b373f0335f5c78cc480d1d55d10f21823590d7e46f + md5: fd8f2b18b65bbf62e8f653100690c8d2 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20625 + timestamp: 1726613611845 +- kind: conda + name: pluggy + version: 1.5.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 + md5: d3483c8fc2dc2cc3f5cf43e26d60cabf + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping + size: 23815 + timestamp: 1713667175451 +- kind: conda + name: pre-commit + version: 4.0.1 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda + sha256: 2490b18ec802d8f085f2de8298a3d275451f7db17769353080dfb121fe386675 + md5: 5971cc64048943605f352f7f8612de6c + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.9 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit?source=hash-mapping + size: 194633 + timestamp: 1728420305558 +- kind: conda + name: psutil + version: 6.1.0 + build: py312h0bf5046_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py312h0bf5046_0.conda + sha256: 143a40f9c72d803744ebd6a60801c5cd17af152b293f8d59e90111ce62b53569 + md5: 61566f5c6e1d29d1d12882eb93e28532 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 493431 + timestamp: 1729847279283 +- kind: conda + name: psutil + version: 6.1.0 + build: py312h3d0f464_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py312h3d0f464_0.conda + sha256: a2c2d8a8665cce8a1c2b186b2580e1ef3e3414aa67b2d48ac46f0582434910c3 + md5: 1df95544dc6aeb33af591146f44d9293 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 493463 + timestamp: 1729847222797 +- kind: conda + name: psutil + version: 6.1.0 + build: py312h66e93f0_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda + sha256: 0f309b435174e037d5cfe5ed26c1c5ad8152c68cfe61af17709ec31ec3d9f096 + md5: 0524eb91d3d78d76d671c6e3cd7cee82 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 488462 + timestamp: 1729847159916 +- kind: conda + name: pthread-stubs + version: '0.4' + build: h00291cd_1002 + build_number: 1002 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda + sha256: 05944ca3445f31614f8c674c560bca02ff05cb51637a96f665cb2bbe496099e5 + md5: 8bcf980d2c6b17094961198284b8e862 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 8364 + timestamp: 1726802331537 +- kind: conda + name: pthread-stubs + version: '0.4' + build: hb9d3cd8_1002 + build_number: 1002 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- kind: conda + name: pthread-stubs + version: '0.4' + build: hd74edd7_1002 + build_number: 1002 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 8381 + timestamp: 1726802424786 +- kind: conda + name: pybtex + version: 0.24.0 + build: pyhd8ed1ab_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 + sha256: 258fbf46050bbd51fbaa504116e56e8f3064156f0e08cad4e2fec97f5f29e6dc + md5: 2099b86a7399c44c0c61cdb6de6915ba + depends: + - latexcodec >=1.0.4 + - python >=3.6 + - pyyaml >=3.01 + - setuptools + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex?source=hash-mapping + size: 72866 + timestamp: 1638467164424 +- kind: conda + name: pybtex-docutils + version: 1.0.3 + build: py312h7900ff3_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_2.conda + sha256: bf9c8f4c5282d46ce54bd2c6837fa5ff7a1c112382be3d13a7a0ae038d92b7c7 + md5: 0472f87b9dc0b1db7b501f4d814ba90b + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 16629 + timestamp: 1725691821342 +- kind: conda + name: pybtex-docutils + version: 1.0.3 + build: py312h81bd7bf_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py312h81bd7bf_2.conda + sha256: 246ff1b7cd335a5ffb60f180426d1f7c75b7abd04e8a54dfb95ac499b5bb8307 + md5: 573f5bef5c0b4ea1405e78e941a29284 + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 17243 + timestamp: 1725691887793 +- kind: conda + name: pybtex-docutils + version: 1.0.3 + build: py312hb401068_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py312hb401068_2.conda + sha256: b2668b6b195c2fbcdffddb98ebb489e77b21b96d35056a2f5eb6e36b7b3a3fbf + md5: 5becc4ce9642b93f69bcf091ce1f8104 + depends: + - docutils >=0.14 + - pybtex >=0.16 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + size: 16678 + timestamp: 1725691864150 +- kind: conda + name: pycodestyle + version: 2.12.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda + sha256: ca548aa380edcc1a6e96893c0d870de9e22a7b0d4619ffa426875e6443a2044f + md5: 72453e39709f38d0494d096bb5f678b7 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pycodestyle?source=hash-mapping + size: 34215 + timestamp: 1722846854518 +- kind: conda + name: pycparser + version: '2.22' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 + md5: 844d9eb3b43095b031874477f7d70088 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser?source=hash-mapping + size: 105098 + timestamp: 1711811634025 +- kind: conda + name: pydantic + version: 2.9.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda + sha256: 1b7b0dc9f6af4da156bf22b0263be70829364a08145c696d3670facff2f6441a + md5: 1eb533bb8eb2199e3fef3e4aa147319f + depends: + - annotated-types >=0.6.0 + - pydantic-core 2.23.4 + - python >=3.7 + - typing-extensions >=4.6.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic?source=hash-mapping + size: 300649 + timestamp: 1726601202431 +- kind: conda + name: pydantic-core + version: 2.23.4 + build: py312h12e396e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.23.4-py312h12e396e_0.conda + sha256: 365fde689865087b2a9da636f36678bd59617b324ce7a538b4806e90602b20f1 + md5: 0845ab52d4ea209049129a6a91bc74ba + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1611784 + timestamp: 1726525286507 +- kind: conda + name: pydantic-core + version: 2.23.4 + build: py312h669792a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.23.4-py312h669792a_0.conda + sha256: 46b17406772d7403ce454c1005e493a2723a189403dd2a70a3566ac4b1f82a4a + md5: 14806afd8ed78812d83e8b9ea4b549c0 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1535259 + timestamp: 1726525537029 +- kind: conda + name: pydantic-core + version: 2.23.4 + build: py312he431725_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.23.4-py312he431725_0.conda + sha256: d6edd3d0f9e701c8299519d412ad3dc900c7d893a134f2582203cf43585decca + md5: 3148052477686acc581b20a34b478eeb + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1431747 + timestamp: 1726525575527 +- kind: conda + name: pyflakes + version: 3.2.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda + sha256: b1582410fcfa30b3597629e39b688ead87833c4a64f7c4637068f80aa1411d49 + md5: 0cf7fef6aa123df28adb21a590065e3d + depends: + - python ==2.7.*|>=3.5 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyflakes?source=hash-mapping + size: 58654 + timestamp: 1704424729210 +- kind: conda + name: pygments + version: 2.18.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b + md5: b7f5c092b8f9800150d998a71b76d5a1 + depends: + - python >=3.8 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 879295 + timestamp: 1714846885370 +- kind: conda + name: pyparsing + version: 3.2.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda + sha256: b846e3965cd106438cf0b9dc0de8d519670ac065f822a7d66862e9423e0229cb + md5: 035c17fbf099f50ff60bf2eb303b0a83 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=hash-mapping + size: 92444 + timestamp: 1728880549923 +- kind: conda + name: pyside6 + version: 6.8.0.2 + build: py312h91f0f75_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.0.2-py312h91f0f75_0.conda + sha256: 16309c16764c45e147f2eabbb6a064ac3e3d17e7e1b49110b14e13a8ed631276 + md5: ec3da81d5f9d3612b227e09a650f7bf2 + depends: + - __glibc >=2.17,<3.0.a0 + - libclang13 >=19.1.2 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libopengl >=1.7.0,<2.0a0 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - libxslt >=1.1.39,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - qt6-main 6.8.0.* + - qt6-main >=6.8.0,<6.9.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/pyside6?source=hash-mapping + - pkg:pypi/shiboken6?source=hash-mapping + size: 10839502 + timestamp: 1730212750602 +- kind: conda + name: pysocks + version: 1.7.1 + build: pyha2e5f31_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + md5: 2a7de29fb590ca14b5243c4c812c8025 + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 18981 + timestamp: 1661604969727 +- kind: conda + name: pytest + version: 8.3.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 + md5: c03d61f31f38fdb9facf70c29958bf7a + depends: + - colorama + - exceptiongroup >=1.0.0rc8 + - iniconfig + - packaging + - pluggy <2,>=1.5 + - python >=3.8 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 258293 + timestamp: 1725977334143 +- kind: conda + name: pytest-cov + version: 5.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda + sha256: 218306243faf3c36347131c2b36bb189daa948ac2e92c7ab52bb26cc8c157b3c + md5: c54c0107057d67ddf077751339ec2c63 + depends: + - coverage >=5.2.1 + - pytest >=4.6 + - python >=3.8 + - toml + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-cov?source=hash-mapping + size: 25507 + timestamp: 1711411153367 +- kind: conda + name: pytest-timeout + version: 2.3.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda + sha256: 501e2417f23596815aeb41ad3bc69016a59c9f5dab62860b8be41e006d538fe8 + md5: 27860d8e6cc9e14da4ea900788693e40 + depends: + - pytest >=7.0.0 + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-timeout?source=hash-mapping + size: 19397 + timestamp: 1712277747247 +- kind: conda + name: python + version: 3.12.7 + build: h739c21a_0_cpython + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda + sha256: 45d7ca2074aa92594bd2f91a9003b338cc1df8a46b9492b7fc8167110783c3ef + md5: e0d82e57ebb456077565e6d82cd4a323 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 12975439 + timestamp: 1728057819519 +- kind: conda + name: python + version: 3.12.7 + build: h8f8b54e_0_cpython + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda + sha256: 28172d94f7193c5075c0fc3c4b1bb617c512ffc991f4e2af0dbb6a2916872b76 + md5: 7f81191b1ca1113e694e90e15c27a12f + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 13761315 + timestamp: 1728058247482 +- kind: conda + name: python + version: 3.12.7 + build: hc5c86c4_0_cpython + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda + sha256: 674be31ff152d9f0e0fe16959a45e3803a730fc4f54d87df6a9ac4e6a698c41d + md5: 0515111a9cdf69f83278f7c197db9807 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 31574780 + timestamp: 1728059777603 +- kind: conda + name: python-dateutil + version: 2.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: 2cf4264fffb9e6eff6031c5b6884d61c + depends: + - python >=3.7 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222742 + timestamp: 1709299922152 +- kind: conda + name: python_abi + version: '3.12' + build: 5_cp312 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- kind: conda + name: python_abi + version: '3.12' + build: 5_cp312 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda + sha256: 4da26c7508d5bc5d8621e84dc510284402239df56aab3587a7d217de9d3c806d + md5: c34dd4920e0addf7cfcc725809f25d8e + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6312 + timestamp: 1723823137004 +- kind: conda + name: python_abi + version: '3.12' + build: 5_cp312 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6278 + timestamp: 1723823099686 +- kind: conda + name: pytz + version: '2024.2' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda + sha256: 81c16d9183bb4a6780366ce874e567ee5fc903722f85b2f8d1d9479ef1dafcc9 + md5: 260009d03c9d5c0f111904d851f053dc + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 186995 + timestamp: 1726055625738 +- kind: conda + name: pyyaml + version: 6.0.2 + build: py312h024a12e_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda + sha256: b06f1c15fb39695bbf707ae8fb554b9a77519af577b5556784534c7db10b52e3 + md5: 1ee23620cf46cb15900f70a1300bae55 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 187143 + timestamp: 1725456547263 +- kind: conda + name: pyyaml + version: 6.0.2 + build: py312h66e93f0_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda + sha256: a60705971e958724168f2ebbb8ed4853067f1d3f7059843df3903e3092bbcffa + md5: 549e5930e768548a89c23f595dac5a95 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206553 + timestamp: 1725456256213 +- kind: conda + name: pyyaml + version: 6.0.2 + build: py312hb553811_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312hb553811_1.conda + sha256: 455ce40588b35df654cb089d29cc3f0d3c78365924ffdfc6ee93dba80cea5f33 + md5: 66514594817d51c78db7109a23ad322f + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 189347 + timestamp: 1725456465705 +- kind: conda + name: qhull + version: '2020.2' + build: h3c5361c_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda + sha256: 79d804fa6af9c750e8b09482559814ae18cd8df549ecb80a4873537a5a31e06e + md5: dd1ea9ff27c93db7c01a7b7656bd4ad4 + depends: + - __osx >=10.13 + - libcxx >=16 + license: LicenseRef-Qhull + purls: [] + size: 528122 + timestamp: 1720814002588 +- kind: conda + name: qhull + version: '2020.2' + build: h420ef59_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 + md5: 6483b1f59526e05d7d894e466b5b6924 + depends: + - __osx >=11.0 + - libcxx >=16 + license: LicenseRef-Qhull + purls: [] + size: 516376 + timestamp: 1720814307311 +- kind: conda + name: qhull + version: '2020.2' + build: h434a139_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc + md5: 353823361b1d27eb3960efb076dfcaf6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + purls: [] + size: 552937 + timestamp: 1720813982144 +- kind: conda + name: qt6-main + version: 6.8.0 + build: h6e8976b_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.0-h6e8976b_0.conda + sha256: f21949a55d07f72f910b0256401ae7b666d04810d110236aee86063da7babc51 + md5: 6d1c5d2d904d24c17cbb538a95855a4e + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.12,<1.3.0a0 + - dbus >=1.13.6,<2.0a0 + - double-conversion >=3.3.0,<3.4.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - harfbuzz >=9.0.0,<10.0a0 + - icu >=75.1,<76.0a0 + - krb5 >=1.21.3,<1.22.0a0 + - libclang-cpp19.1 >=19.1.0,<19.2.0a0 + - libclang13 >=19.1.0 + - libcups >=2.3.3,<2.4.0a0 + - libdrm >=2.4.123,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libgcc >=13 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.82.1,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libllvm19 >=19.1.0,<19.2.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libpq >=17.0,<18.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libxkbcommon >=1.7.0,<2.0a0 + - libxml2 >=2.12.7,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - mysql-libs >=9.0.1,<9.1.0a0 + - openssl >=3.3.2,<4.0a0 + - pcre2 >=10.44,<10.45.0a0 + - wayland >=1.23.1,<2.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + - xcb-util-cursor >=0.1.5,<0.2.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxcomposite >=0.4.6,<1.0a0 + - xorg-libxcursor >=1.2.2,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + - xorg-libxxf86vm >=1.1.5,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - qt 6.8.0 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + size: 51315820 + timestamp: 1728406028 +- kind: conda + name: readline + version: '8.2' + build: h8228510_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- kind: conda + name: readline + version: '8.2' + build: h92ec313_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 250351 + timestamp: 1679532511311 +- kind: conda + name: readline + version: '8.2' + build: h9e318b2_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + md5: f17f77f2acf4d344734bda76829ce14e + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 255870 + timestamp: 1679532707590 +- kind: conda + name: requests + version: 2.32.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda + sha256: 5845ffe82a6fa4d437a2eae1e32a1ad308d7ad349f61e337c0a890fe04c513cc + md5: 5ede4753180c7a550a443c430dc8ab52 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.8 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 58810 + timestamp: 1717057174842 +- kind: conda + name: rich + version: 13.9.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 + md5: bcf8cc8924b5d20ead3d122130b8320b + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.8 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 185481 + timestamp: 1730592349978 +- kind: conda + name: scipy + version: 1.14.1 + build: py312h20deb59_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.14.1-py312h20deb59_1.conda + sha256: 1a4d655609bad7dbdbe9f44ba37fd100d01fb8e4e7060dfaed3c4a044ab40052 + md5: c60ad657cccb6c2b97513f87ae27f47a + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=17 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.3 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 15132713 + timestamp: 1729481799441 +- kind: conda + name: scipy + version: 1.14.1 + build: py312h62794b6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda + sha256: d069a64edade554261672d8febf4756aeb56a6cb44bd91844eaa944e5d9f4eb9 + md5: b43233a9e2f62fb94affe5607ea79473 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - numpy <2.3 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 17622722 + timestamp: 1729481826601 +- kind: conda + name: scipy + version: 1.14.1 + build: py312h888eae2_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.14.1-py312h888eae2_1.conda + sha256: 5a28ea91c935513e6c5f64baac5a02ce43d9ba183b98e20127220b207ec96529 + md5: ee7a4ffe9742d2df44caa858b36814b8 + depends: + - __osx >=10.13 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=17 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.3 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 16032291 + timestamp: 1729481615781 +- kind: conda + name: setuptools + version: 75.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + sha256: a36d020b9f32fc3f1a6488a1c4a9c13988c6468faf6895bf30ca69521a61230e + md5: 2ce9825396daf72baabaade36cee16da + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 779561 + timestamp: 1730382173961 +- kind: conda + name: sigtool + version: 0.1.3 + build: h44b9a77_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + sha256: 70791ae00a3756830cb50451db55f63e2a42a2fa2a8f1bab1ebd36bbb7d55bff + md5: 4a2cac04f86a4540b8c9b8d8f597848f + depends: + - openssl >=3.0.0,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 210264 + timestamp: 1643442231687 +- kind: conda + name: six + version: 1.16.0 + build: pyh6c4a22f_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + md5: e5f25f8dbc060e9a8d912e432202afc2 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 14259 + timestamp: 1620240338595 +- kind: conda + name: sniffio + version: 1.3.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + sha256: bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b + md5: 490730480d76cf9c8f8f2849719c6e2b + depends: + - python >=3.7 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sniffio?source=hash-mapping + size: 15064 + timestamp: 1708953086199 +- kind: conda + name: snowballstemmer + version: 2.2.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 + sha256: a0fd916633252d99efb6223b1050202841fa8d2d53dacca564b0ed77249d3228 + md5: 4d22a9315e78c6827f806065957d566e + depends: + - python >=2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/snowballstemmer?source=hash-mapping + size: 58824 + timestamp: 1637143137377 +- kind: conda + name: sphinx + version: 8.1.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda + sha256: e9e3eaa7277934ba20314ffb92c941c4ec12c0c440e608b7b495c5ce579af1f7 + md5: 05706dd5a145a9c91861495cd435409a + depends: + - alabaster >=0.7.14 + - babel >=2.13 + - colorama >=0.4.6 + - docutils >=0.20,<0.22 + - imagesize >=1.3 + - jinja2 >=3.1 + - packaging >=23.0 + - pygments >=2.17 + - python >=3.10 + - requests >=2.30.0 + - snowballstemmer >=2.2 + - sphinxcontrib-applehelp >=1.0.7 + - sphinxcontrib-devhelp >=1.0.6 + - sphinxcontrib-htmlhelp >=2.0.6 + - sphinxcontrib-jsmath >=1.0.1 + - sphinxcontrib-qthelp >=1.0.6 + - sphinxcontrib-serializinghtml >=1.1.9 + - tomli >=2.0 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinx?source=hash-mapping + size: 1401233 + timestamp: 1728874101851 +- kind: conda + name: sphinx-copybutton + version: 0.5.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda + sha256: 7ea21f009792e7c69612ddba367afe0412b3fdff2e92f439e8cd222de4b40bfe + md5: ac832cc43adc79118cf6e23f1f9b8995 + depends: + - python >=3 + - sphinx >=1.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sphinx-copybutton?source=hash-mapping + size: 17801 + timestamp: 1681468271927 +- kind: conda + name: sphinx-design + version: 0.6.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda + sha256: 3db5d78271e3b0761db591111153f80428733972cab0bfdcf24b352133c85de9 + md5: db0f1eb28b6df3a11e89437597309009 + depends: + - python >=3.9 + - sphinx >=6,<9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sphinx-design?source=hash-mapping + size: 916271 + timestamp: 1724519188841 +- kind: conda + name: sphinx_rtd_theme + version: 3.0.1 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda + sha256: b81e8b0a66dcff33f308909940c9127e51536b99a51167f3e7266e65e3473f7d + md5: 740536f8a54250b1964e494c0bf5c9c3 + depends: + - docutils >0.18,<0.22 + - python >=3.8 + - sphinx >=6,<9 + - sphinxcontrib-jquery >=4,<5 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sphinx-rtd-theme?source=hash-mapping + size: 4630230 + timestamp: 1730015354284 +- kind: conda + name: sphinxcontrib-applehelp + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda + sha256: 8ac476358cf26098e3a360b2a9037bd809243f72934c103953e25f4fda4b9f31 + md5: 9075bd8c033f0257122300db914e49c9 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-applehelp?source=hash-mapping + size: 29617 + timestamp: 1722244567894 +- kind: conda + name: sphinxcontrib-bibtex + version: 2.6.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda + sha256: 49bac08adb8ae32197c7b9b13219f91332b60e69771122f870c79abcf5611a55 + md5: 2925be8d19542dd116775f1b9c55bb50 + depends: + - docutils >=0.8,!=0.18.*,!=0.19.* + - importlib-metadata >=3.6 + - pybtex >=0.24 + - pybtex-docutils >=1.0.0 + - python >=3.7 + - sphinx >=3.5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-bibtex?source=hash-mapping + size: 32362 + timestamp: 1726176560542 +- kind: conda + name: sphinxcontrib-devhelp + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda + sha256: 6790efe55f168816dfc9c14235054d5156e5150d28546c5baf2ff4973eff8f6b + md5: b3bcc38c471ebb738854f52a36059b48 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-devhelp?source=hash-mapping + size: 24138 + timestamp: 1722245127289 +- kind: conda + name: sphinxcontrib-htmlhelp + version: 2.1.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda + sha256: 55e14b77ed786ab6ff752b8d75f8448536f385ed250f432bd408d2eff5ea4a9e + md5: e25640d692c02e8acfff0372f547e940 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-htmlhelp?source=hash-mapping + size: 32798 + timestamp: 1722248429933 +- kind: conda + name: sphinxcontrib-jquery + version: '4.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda + sha256: 2e5f16a2d58f9a31443ffbb8ce3852cfccf533a6349045828cd2e994ef0679ca + md5: 914897066d5873acfb13e75705276ad1 + depends: + - python >=2.7 + - sphinx >=1.8 + license: 0BSD AND MIT + purls: + - pkg:pypi/sphinxcontrib-jquery?source=hash-mapping + size: 112985 + timestamp: 1678809100921 +- kind: conda + name: sphinxcontrib-jsmath + version: 1.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda + sha256: d4337d83b8edba688547766fc80f1ac86d6ec86ceeeda93f376acc04079c5ce2 + md5: da1d979339e2714c30a8e806a33ec087 + depends: + - python >=3.5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-jsmath?source=hash-mapping + size: 10431 + timestamp: 1691604844204 +- kind: conda + name: sphinxcontrib-qthelp + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda + sha256: 7ae639b729844de2ec74dbaf1acccc14843868a82fa46cd2ceb735bc8266af5b + md5: d6e5ea5fe00164ac6c2dcc5d76a42192 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-qthelp?source=hash-mapping + size: 26794 + timestamp: 1722245959953 +- kind: conda + name: sphinxcontrib-serializinghtml + version: 1.1.10 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda + sha256: bf80e4c0ff97d5e8e5f6db0831ba60007e820a3a438e8f1afd868aa516d67d6f + md5: e507335cb4ca9cff4c3d0fa9cdab255e + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-serializinghtml?source=hash-mapping + size: 28776 + timestamp: 1705118378942 +- kind: conda + name: sphinxcontrib-spelling + version: 4.3.0 + build: py_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 + sha256: f42a8bca7367bb87dd9148727439e549c50b3053b633e399e4848763bc6cded6 + md5: 4d07af45dbfeadfb1f890283b2f13453 + depends: + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-spelling?source=hash-mapping + size: 12351 + timestamp: 1561960104955 +- kind: conda + name: tapi + version: 1300.6.5 + build: h03f4b80_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda + sha256: 37cd4f62ec023df8a6c6f9f6ffddde3d6620a83cbcab170a8fff31ef944402e5 + md5: b703bc3e6cba5943acf0e5f987b5d0e2 + depends: + - __osx >=11.0 + - libcxx >=17.0.0.a0 + - ncurses >=6.5,<7.0a0 + license: NCSA + license_family: MIT + purls: [] + size: 207679 + timestamp: 1725491499758 +- kind: conda + name: tk + version: 8.6.13 + build: h1abcd95_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + md5: bf830ba5afc507c6232d4ef0fb1a882d + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3270220 + timestamp: 1699202389792 +- kind: conda + name: tk + version: 8.6.13 + build: h5083fa2_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- kind: conda + name: tk + version: 8.6.13 + build: noxft_h4845f30_101 + build_number: 101 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- kind: conda + name: toml + version: 0.10.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + sha256: f0f3d697349d6580e4c2f35ba9ce05c65dc34f9f049e85e45da03800b46139c1 + md5: f832c45a477c78bebd107098db465095 + depends: + - python >=2.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/toml?source=hash-mapping + size: 18433 + timestamp: 1604308660817 +- kind: conda + name: tomli + version: 2.0.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + sha256: 5e742ba856168b606ac3c814d247657b1c33b8042371f1a08000bdc5075bc0cc + md5: e977934e00b355ff55ed154904044727 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping + size: 18203 + timestamp: 1727974767524 +- kind: conda + name: tornado + version: 6.4.1 + build: py312h024a12e_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.1-py312h024a12e_1.conda + sha256: 5eefede1d8a2f55892bc582dbcb574b1806f19bc1e3939ce56b79721b9406db7 + md5: 967bc97bb9e258993289546479af971f + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841722 + timestamp: 1724956439106 +- kind: conda + name: tornado + version: 6.4.1 + build: py312h66e93f0_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda + sha256: c0c9cc7834e8f43702956afaa5af7b0639c4835c285108a43e6b91687ce53ab8 + md5: af648b62462794649066366af4ecd5b0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 837665 + timestamp: 1724956252424 +- kind: conda + name: tornado + version: 6.4.1 + build: py312hb553811_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.1-py312hb553811_1.conda + sha256: 67711e308059fd4fd9ce2389b155ffcc52723d202b78cdfa01e7d6a3d42725b5 + md5: 479bb06cef210f968f20866277acd8b9 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 841028 + timestamp: 1724956347530 +- kind: conda + name: typing-extensions + version: 4.12.2 + build: hd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + sha256: d3b9a8ed6da7c9f9553c5fd8a4fca9c3e0ab712fa5f497859f82337d67533b73 + md5: 52d648bd608f5737b123f510bb5514b5 + depends: + - typing_extensions 4.12.2 pyha770c72_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10097 + timestamp: 1717802659025 +- kind: conda + name: typing_extensions + version: 4.12.2 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb + md5: ebe6952715e1d5eb567eeebf25250fa7 + depends: + - python >=3.8 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39888 + timestamp: 1717802653893 +- kind: conda + name: tzdata + version: 2024b + build: hc8b5060_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + purls: [] + size: 122354 + timestamp: 1728047496079 +- kind: conda + name: ukkonen + version: 1.0.1 + build: py312h6142ec9_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py312h6142ec9_5.conda + sha256: 1e4452b4a12d8a69c237f14b876fbf0cdc456914170b49ba805779c749c31eca + md5: 2b485a809d1572cbe7f0ad9ee107e4b0 + depends: + - __osx >=11.0 + - cffi + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13605 + timestamp: 1725784243533 +- kind: conda + name: ukkonen + version: 1.0.1 + build: py312h68727a3_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda + sha256: 9fb020083a7f4fee41f6ece0f4840f59739b3e249f157c8a407bb374ffb733b5 + md5: f9664ee31aed96c85b7319ab0a693341 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13904 + timestamp: 1725784191021 +- kind: conda + name: ukkonen + version: 1.0.1 + build: py312hc5c4d5f_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py312hc5c4d5f_5.conda + sha256: f6433143294c1ca52410bf8bbca6029a04f2061588d32e6d2b67c7fd886bc4e0 + md5: f270aa502d8817e9cb3eb33541f78418 + depends: + - __osx >=10.13 + - cffi + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13031 + timestamp: 1725784199719 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py312h0bf5046_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py312h0bf5046_1.conda + sha256: 236961004c088f190d8b27863b2898f1d43c2d5dc769f135abdacc644b033fab + md5: eda2082df9c9c6259af246424b7f3db1 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 372492 + timestamp: 1729704995151 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py312h3d0f464_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py312h3d0f464_1.conda + sha256: e1d8da8eed41f5479eacff7d4b42ad69e8476eb370dcebd3ffff26819a7da4ea + md5: f4627b5e2f46389140760303124b4c49 + depends: + - __osx >=10.13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 364385 + timestamp: 1729704742038 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py312h66e93f0_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda + sha256: 1fcba6d363d901d9a06381e1aee2d5634f82389965dd7a339f19b3ae81ce6da0 + md5: 588486a61153f94c7c13816f7069e440 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 368550 + timestamp: 1729704685856 +- kind: conda + name: urllib3 + version: 2.2.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda + sha256: b6bb34ce41cd93956ad6eeee275ed52390fb3788d6c75e753172ea7ac60b66e5 + md5: 6b55867f385dd762ed99ea687af32a69 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.8 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 98076 + timestamp: 1726496531769 +- kind: conda + name: virtualenv + version: 20.27.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda + sha256: 189b935224732267df10dc116bce0835bd76fcdb20c30f560591c92028d513b0 + md5: dae21509d62aa7bf676279ced3edcb3f + depends: + - distlib <1,>=0.3.7 + - filelock <4,>=3.12.2 + - platformdirs <5,>=3.9.1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=hash-mapping + size: 2965442 + timestamp: 1730204927840 +- kind: conda + name: wayland + version: 1.23.1 + build: h3e06ad9_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + sha256: 0884b2023a32d2620192cf2e2fc6784b8d1e31cf9f137e49e00802d4daf7d1c1 + md5: 0a732427643ae5e0486a727927791da1 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=13 + - libstdcxx-ng >=13 + license: MIT + license_family: MIT + purls: [] + size: 321561 + timestamp: 1724530461598 +- kind: conda + name: wheel + version: 0.44.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + sha256: d828764736babb4322b8102094de38074dedfc71f5ff405c9dfee89191c14ebc + md5: d44e3b085abcaef02983c6305b84b584 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=hash-mapping + size: 58585 + timestamp: 1722797131787 +- kind: conda + name: xcb-util + version: 0.4.1 + build: hb711507_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda + sha256: 416aa55d946ce4ab173ab338796564893a2f820e80e04e098ff00c25fb981263 + md5: 8637c3e5821654d0edf97e2b0404b443 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 19965 + timestamp: 1718843348208 +- kind: conda + name: xcb-util-cursor + version: 0.1.5 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda + sha256: c7b35db96f6e32a9e5346f97adc968ef2f33948e3d7084295baebc0e33abdd5b + md5: eb44b3b6deb1cab08d72cb61686fe64c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.13 + - libxcb >=1.16,<2.0.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 20296 + timestamp: 1726125844850 +- kind: conda + name: xcb-util-image + version: 0.4.0 + build: hb711507_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7 + md5: a0901183f08b6c7107aab109733a3c91 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + license: MIT + license_family: MIT + purls: [] + size: 24551 + timestamp: 1718880534789 +- kind: conda + name: xcb-util-keysyms + version: 0.4.1 + build: hb711507_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + sha256: 546e3ee01e95a4c884b6401284bb22da449a2f4daf508d038fdfa0712fe4cc69 + md5: ad748ccca349aec3e91743e08b5e2b50 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 14314 + timestamp: 1718846569232 +- kind: conda + name: xcb-util-renderutil + version: 0.3.10 + build: hb711507_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + sha256: 2d401dadc43855971ce008344a4b5bd804aca9487d8ebd83328592217daca3df + md5: 0e0cbe0564d03a99afd5fd7b362feecd + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 16978 + timestamp: 1718848865819 +- kind: conda + name: xcb-util-wm + version: 0.4.2 + build: hb711507_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + sha256: 31d44f297ad87a1e6510895740325a635dd204556aa7e079194a0034cdd7e66a + md5: 608e0ef8256b81d04456e8d211eee3e8 + depends: + - libgcc-ng >=12 + - libxcb >=1.16,<2.0.0a0 + license: MIT + license_family: MIT + purls: [] + size: 51689 + timestamp: 1718844051451 +- kind: conda + name: xkeyboard-config + version: '2.43' + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + sha256: 0d89b5873515a1f05d311f37ea4e087bbccc0418afa38f2f6189e97280db3179 + md5: f725c7425d6d7c15e31f3b99a88ea02f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 389475 + timestamp: 1727840188958 +- kind: conda + name: xorg-libice + version: 1.1.1 + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda + sha256: ec276da68d1c4a3d34a63195b35ca5b248d4aff0812464dcd843d74649b5cec4 + md5: 19608a9656912805b2b9a2f6bd257b04 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 58159 + timestamp: 1727531850109 +- kind: conda + name: xorg-libsm + version: 1.2.4 + build: he73a12e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda + sha256: 70e903370977d44c9120a5641ab563887bd48446e9ef6fc2a3f5f60531c2cd6c + md5: 05a8ea5f446de33006171a7afe6ae857 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 27516 + timestamp: 1727634669421 +- kind: conda + name: xorg-libx11 + version: 1.8.10 + build: h4f16b4b_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda + sha256: c4650634607864630fb03696474a0535f6fce5fda7d81a6462346e071b53dfa7 + md5: 0b666058a179b744a622d0a4a0c56353 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + - xorg-xorgproto + license: MIT + license_family: MIT + purls: [] + size: 838308 + timestamp: 1727356837875 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: h00291cd_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h00291cd_1.conda + sha256: 96177823ec38336b0f4b7e7c2413da61f8d008d800cc4a5b8ad21f9128fb7de0 + md5: c6cc91149a08402bbb313c5dc0142567 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 13176 + timestamp: 1727034772877 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda + sha256: 532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6 + md5: 77cbc488235ebbaab2b6e912d3934bae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 14679 + timestamp: 1727034741045 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: hd74edd7_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda + sha256: 7113618021cf6c80831a429b2ebb9d639f3c43cf7fe2257d235dc6ae0ab43289 + md5: 7e0125f8fb619620a0011dc9297e2493 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 13515 + timestamp: 1727034783560 +- kind: conda + name: xorg-libxcomposite + version: 0.4.6 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f + md5: d3c295b50f092ab525ffe3c2aa4b7413 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13603 + timestamp: 1727884600744 +- kind: conda + name: xorg-libxcursor + version: 1.2.2 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.2-hb9d3cd8_0.conda + sha256: 7262935568963836efd05e0c68d5c787246578465b7a66c8bd7f0ba361d6a105 + md5: bb2638cd7fbdd980b1cff9a99a6c1fa8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 31804 + timestamp: 1727796817007 +- kind: conda + name: xorg-libxdamage + version: 1.1.6 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 + md5: b5fcc7172d22516e1f965490e65e33a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 13217 + timestamp: 1727891438799 +- kind: conda + name: xorg-libxdmcp + version: 1.1.5 + build: h00291cd_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda + sha256: bb4d1ef9cafef535494adf9296130b6193b3a44375883185b5167de03eb1ac7f + md5: 9f438e1b6f4e73fd9e6d78bfe7c36743 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + size: 18465 + timestamp: 1727794980957 +- kind: conda + name: xorg-libxdmcp + version: 1.1.5 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- kind: conda + name: xorg-libxdmcp + version: 1.1.5 + build: hd74edd7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 18487 + timestamp: 1727795205022 +- kind: conda + name: xorg-libxext + version: 1.3.6 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 50060 + timestamp: 1727752228921 +- kind: conda + name: xorg-libxfixes + version: 6.0.1 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 19575 + timestamp: 1727794961233 +- kind: conda + name: xorg-libxi + version: 1.8.2 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a + md5: 17dcc85db3c7886650b8908b183d6876 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + purls: [] + size: 47179 + timestamp: 1727799254088 +- kind: conda + name: xorg-libxrandr + version: 1.5.4 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + sha256: ac0f037e0791a620a69980914a77cb6bb40308e26db11698029d6708f5aa8e0d + md5: 2de7f99d6581a4a7adbff607b5c278ca + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + purls: [] + size: 29599 + timestamp: 1727794874300 +- kind: conda + name: xorg-libxrender + version: 0.9.11 + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda + sha256: f1217e902c0b1d8bc5d3ce65e483ebf38b049c823c9117b7198cfb16bd2b9143 + md5: a7a49a8b85122b49214798321e2e96b4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-xorgproto + license: MIT + license_family: MIT + purls: [] + size: 37780 + timestamp: 1727529943015 +- kind: conda + name: xorg-libxtst + version: 1.2.5 + build: hb9d3cd8_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a + md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 32808 + timestamp: 1727964811275 +- kind: conda + name: xorg-libxxf86vm + version: 1.1.5 + build: hb9d3cd8_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda + sha256: 0b8f062a5b4a2c3833267285b7d41b3542f54d2c935c86ca98504c3e5296354c + md5: 7da9007c0582712c4bad4131f89c8372 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 18072 + timestamp: 1728920051869 +- kind: conda + name: xorg-xorgproto + version: '2024.1' + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda + sha256: 1316680be6edddee0156b86ec1102fc8286f51c1a5440366ed1db596a2dc3731 + md5: 7c21106b851ec72c037b162c216d8f05 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 565425 + timestamp: 1726846388217 +- kind: conda + name: xz + version: 5.2.6 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 418368 + timestamp: 1660346797927 +- kind: conda + name: xz + version: 5.2.6 + build: h57fd34a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec + md5: 39c6b54e94014701dd157f4f576ed211 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 235693 + timestamp: 1660346961024 +- kind: conda + name: xz + version: 5.2.6 + build: h775f41a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 + md5: a72f9d4ea13d55d745ff1ed594747f10 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 238119 + timestamp: 1660346964847 +- kind: conda + name: yaml + version: 0.2.5 + build: h0d85af4_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + sha256: 5301417e2c8dea45b401ffee8df3957d2447d4ce80c83c5ff151fc6bfe1c4148 + md5: d7e08fcf8259d742156188e8762b4d20 + license: MIT + license_family: MIT + purls: [] + size: 84237 + timestamp: 1641347062780 +- kind: conda + name: yaml + version: 0.2.5 + build: h3422bc3_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- kind: conda + name: yaml + version: 0.2.5 + build: h7f98852_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- kind: conda + name: zipp + version: 3.20.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + sha256: 1e84fcfa41e0afdd87ff41e6fbb719c96a0e098c1f79be342293ab0bd8dea322 + md5: 4daaed111c05672ae669f7036ee5bba3 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21409 + timestamp: 1726248679175 +- kind: conda + name: zlib + version: 1.3.1 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- kind: conda + name: zstandard + version: 0.23.0 + build: py312h15fbf35_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 330788 + timestamp: 1725305806565 +- kind: conda + name: zstandard + version: 0.23.0 + build: py312h7122b0e_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h7122b0e_1.conda + sha256: 2685dde42478fae0780fba5d1f8a06896a676ae105f215d32c9f9e76f3c6d8fd + md5: bd132ba98f3fc0a6067f355f8efe4cb6 + depends: + - __osx >=10.13 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 410873 + timestamp: 1725305688706 +- kind: conda + name: zstandard + version: 0.23.0 + build: py312hef9b889_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 419552 + timestamp: 1725305670210 +- kind: conda + name: zstd + version: 1.5.6 + build: h915ae27_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + sha256: efa04a98cb149643fa54c4dad5a0179e36a5fbc88427ea0eec88ceed87fd0f96 + md5: 4cb2cd56f039b129bb0e491c1164167e + depends: + - __osx >=10.9 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 498900 + timestamp: 1714723303098 +- kind: conda + name: zstd + version: 1.5.6 + build: ha6fb4c9_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 +- kind: conda + name: zstd + version: 1.5.6 + build: hb46c0d2_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 405089 + timestamp: 1714723101397 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000..bd032b8394 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,90 @@ +[project] + +authors = [{name = "Jeffrey Larson"}, {name = "Stephen Hudson"}, + {name = "Stefan M. Wild"}, {name = "David Bindel"}, + {name = "John-Luke Navarro"}] + +dependencies = [] +description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." +name = "libensemble" +requires-python = ">=3.9" +license = {file = "LICENSE"} +readme = "README.rst" + +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: POSIX :: Linux", + "Operating System :: Unix", + "Operating System :: MacOS", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: Implementation :: CPython", + "Topic :: Scientific/Engineering", + "Topic :: Software Development :: Libraries :: Python Modules", +] +version = "1.4.2+dev" + +[project.urls] +Documentation = "https://libensemble.readthedocs.io/en/main/" +Repository = "https://github.com/Libensemble/libensemble" +Issues = "https://github.com/Libensemble/libensemble/issues" + +[build-system] +build-backend = "setuptools.build_meta" +requires = ["setuptools"] + +[tool.pixi.project] +channels = ["conda-forge"] +platforms = ["osx-arm64", "linux-64", "osx-64"] + +[tool.pixi.pypi-dependencies] +libensemble = { path = ".", editable = true } + +[tool.pixi.environments] +default = [] +dev = ["dev"] + +[tool.pixi.feature.dev.dependencies] +mpi = ">=1.0.1,<2" +mpich = ">=4.2.3,<5" +mpi4py = ">=4.0.1,<5" +flake8 = ">=7.1.1,<8" +coverage = ">=7.6.4,<8" +pytest = ">=8.3.3,<9" +pytest-cov = ">=5.0.0,<6" +pytest-timeout = ">=2.3.1,<3" +mock = ">=5.1.0,<6" +python-dateutil = ">=2.9.0,<3" +anyio = ">=4.6.2.post1,<5" +matplotlib = ">=3.9.2,<4" +mpmath = ">=1.3.0,<2" +rich = ">=13.9.3,<14" +sphinx = ">=8.1.3,<9" +sphinxcontrib-bibtex = ">=2.6.3,<3" +sphinxcontrib-spelling = ">=4.3.0,<5" +sphinx-design = ">=0.6.1,<0.7" +sphinx_rtd_theme = ">=3.0.1,<4" +sphinx-copybutton = ">=0.5.2,<0.6" +pre-commit = ">=4.0.1,<5" +nlopt = ">=2.8.0,<3" +scipy = ">=1.14.1,<2" + +[tool.pixi.dependencies] +python = ">=3.9,<=3.12.7" +pip = ">=24.3.1,<25" +setuptools = ">=75.1.0,<76" +numpy = ">=1.21,<3" +pydantic = ">=1.10,<3" +pyyaml = ">=6.0,<7" +tomli = ">=1.2.1,<3" +psutil = ">=5.9.4,<7" + +[tool.pixi.target.osx-arm64.dependencies] +clang_osx-arm64 = ">=19.1.2,<20" From b10c99edb5d1e780ec6b710e68c20adf016ee5d3 Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 5 Nov 2024 11:35:57 -0600 Subject: [PATCH 002/215] add necessary deps to normal dependency tag so pip should work. remove setup.py --- pyproject.toml | 7 ++- setup.py | 114 ------------------------------------------------- 2 files changed, 6 insertions(+), 115 deletions(-) delete mode 100644 setup.py diff --git a/pyproject.toml b/pyproject.toml index bd032b8394..464bfce93e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,9 @@ authors = [{name = "Jeffrey Larson"}, {name = "Stephen Hudson"}, {name = "Stefan M. Wild"}, {name = "David Bindel"}, {name = "John-Luke Navarro"}] -dependencies = [] +dependencies = [">=3.9,<=3.12.7", "pip>=24.3.1,<25", "setuptools>=75.1.0,<76", "numpy>=1.21,<3", + "psutil>=5.9.4,<7", "pydantic>=1.10.12,<3", "pyyaml>=6.0,<7", "tomli>=1.2.1,<3"] + description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." name = "libensemble" requires-python = ">=3.9" @@ -88,3 +90,6 @@ psutil = ">=5.9.4,<7" [tool.pixi.target.osx-arm64.dependencies] clang_osx-arm64 = ">=19.1.2,<20" + +[tool.pixi.target.linux-64.dependencies] +gpcam = ">=8.1.6,<9" diff --git a/setup.py b/setup.py deleted file mode 100644 index cb45a9b614..0000000000 --- a/setup.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# This is for setting up libEnsemble, license and details can be -# found at https://github.com/Libensemble/libensemble/ - -"""libEnsemble - -libEnsemble is a Python toolkit for coordinating workflows of asynchronous -and dynamic ensembles of calculations. - -libEnsemble can help users take advantage of massively parallel resources to -solve design, decision, and inference problems and expand the class of -problems that can benefit from increased parallelism. - -""" - -from pathlib import Path - -from setuptools import setup -from setuptools.command.test import test as TestCommand - -exec(open("libensemble/version.py").read()) - - -class Run_TestSuite(TestCommand): - def run_tests(self): - import os - import sys - - py_version = sys.version_info[0] - print("Python version from setup.py is", py_version) - run_string = "libensemble/tests/run-tests.sh -p " + str(py_version) - os.system(run_string) - - -class ToxTest(TestCommand): - user_options = [] - - def initialize_options(self): - TestCommand.initialize_options(self) - - def run_tests(self): - import tox - - tox.cmdline() - - -setup( - name="libensemble", - version=__version__, - description="Library to coordinate the concurrent evaluation of dynamic ensembles of calculations", - long_description=Path("README.rst").read_text(encoding="utf-8"), - url="https://github.com/Libensemble/libensemble", - author="Jeffrey Larson, Stephen Hudson, Stefan M. Wild, David Bindel and John-Luke Navarro", - author_email="libensemble@lists.mcs.anl.gov", - license="BSD 3-clause", - packages=[ - "libensemble", - "libensemble.gen_funcs", - "libensemble.sim_funcs", - "libensemble.sim_funcs.branin", - "libensemble.alloc_funcs", - "libensemble.tests", - "libensemble.comms", - "libensemble.utils", - "libensemble.tools", - "libensemble.tools.live_data", - "libensemble.executors", - "libensemble.resources", - "libensemble.tests.unit_tests", - "libensemble.tests.regression_tests", - ], - install_requires=["numpy>=1.21", "psutil>=5.9.4", "pydantic>=1.10", "tomli>=1.2.1", "pyyaml>=6.0"], - # numpy - oldest working version. psutil - oldest working version. - # pyyaml - oldest working version. - # If run tests through setup.py - downloads these but does not install - tests_require=[ - "pytest>=3.1", - "pytest-cov>=2.5", - "pytest-pep8>=1.0", - "pytest-timeout", - "mock", - ], - extras_require={ - "docs": [ - "autodoc_pydantic", - "sphinx<9", - "sphinx_design", - "sphinx_rtd_theme", - "sphinxcontrib-bibtex", - "sphinxcontrib-spelling", - "sphinx-copybutton", - ], - }, - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: BSD License", - "Natural Language :: English", - "Operating System :: POSIX :: Linux", - "Operating System :: Unix", - "Operating System :: MacOS", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: Implementation :: CPython", - "Topic :: Scientific/Engineering", - "Topic :: Software Development :: Libraries :: Python Modules", - ], - cmdclass={"test": Run_TestSuite, "tox": ToxTest}, -) From 640923f2f658942538b1fd7f0e70741e59eddfe1 Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 5 Nov 2024 11:38:07 -0600 Subject: [PATCH 003/215] typo --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 464bfce93e..c0dcbef81f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ authors = [{name = "Jeffrey Larson"}, {name = "Stephen Hudson"}, {name = "Stefan M. Wild"}, {name = "David Bindel"}, {name = "John-Luke Navarro"}] -dependencies = [">=3.9,<=3.12.7", "pip>=24.3.1,<25", "setuptools>=75.1.0,<76", "numpy>=1.21,<3", +dependencies = ["python>=3.9,<=3.12.7", "pip>=24.3.1,<25", "setuptools>=75.1.0,<76", "numpy>=1.21,<3", "psutil>=5.9.4,<7", "pydantic>=1.10.12,<3", "pyyaml>=6.0,<7", "tomli>=1.2.1,<3"] description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." From ae1c3c2df44602d8f82b8ea53889f88ca545e2bf Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 5 Nov 2024 11:41:16 -0600 Subject: [PATCH 004/215] specify to setuptools the libensemble src dir --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index c0dcbef81f..688fcd54cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,9 @@ Issues = "https://github.com/Libensemble/libensemble/issues" build-backend = "setuptools.build_meta" requires = ["setuptools"] +[tool.setuptools.packages.find] +where = ["libensemble"] + [tool.pixi.project] channels = ["conda-forge"] platforms = ["osx-arm64", "linux-64", "osx-64"] From cf501b6baeb35b3c72dcb93a731568a3432d2623 Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 5 Nov 2024 11:43:33 -0600 Subject: [PATCH 005/215] python/pip shouldn't need to be specified as pypi packages --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 688fcd54cb..40ee1b8cf8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ authors = [{name = "Jeffrey Larson"}, {name = "Stephen Hudson"}, {name = "Stefan M. Wild"}, {name = "David Bindel"}, {name = "John-Luke Navarro"}] -dependencies = ["python>=3.9,<=3.12.7", "pip>=24.3.1,<25", "setuptools>=75.1.0,<76", "numpy>=1.21,<3", +dependencies = ["setuptools>=75.1.0,<76", "numpy>=1.21,<3", "psutil>=5.9.4,<7", "pydantic>=1.10.12,<3", "pyyaml>=6.0,<7", "tomli>=1.2.1,<3"] description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." From ba563de7ad389079740cccedbcfcfddf56677f70 Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 5 Nov 2024 11:44:12 -0600 Subject: [PATCH 006/215] put back pip --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 40ee1b8cf8..47faf3e796 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ authors = [{name = "Jeffrey Larson"}, {name = "Stephen Hudson"}, {name = "Stefan M. Wild"}, {name = "David Bindel"}, {name = "John-Luke Navarro"}] -dependencies = ["setuptools>=75.1.0,<76", "numpy>=1.21,<3", +dependencies = ["pip>=24.3.1,<25", "setuptools>=75.1.0,<76", "numpy>=1.21,<3", "psutil>=5.9.4,<7", "pydantic>=1.10.12,<3", "pyyaml>=6.0,<7", "tomli>=1.2.1,<3"] description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." From 76ab6aa9555e6697c24c3cb8fc18f1cbf74a8a36 Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 5 Nov 2024 13:59:07 -0600 Subject: [PATCH 007/215] fix setuptools packaging target --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 47faf3e796..3024dd150b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,10 +40,11 @@ Issues = "https://github.com/Libensemble/libensemble/issues" [build-system] build-backend = "setuptools.build_meta" -requires = ["setuptools"] +requires = ["setuptools", "wheel"] [tool.setuptools.packages.find] -where = ["libensemble"] +where = ["."] +include = ["libensemble*"] [tool.pixi.project] channels = ["conda-forge"] From e5487aed8891b38a43fd4a3f5c8972d0ddcf8a84 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 6 Nov 2024 09:13:40 -0600 Subject: [PATCH 008/215] we still need a minimal 2-line setup.py for package building. tiny adjusts --- .flake8 | 3 --- .gitignore | 1 + MANIFEST.in | 1 + docs/dev_guide/release_management/release_process.rst | 2 +- setup.py | 3 +++ 5 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 setup.py diff --git a/.flake8 b/.flake8 index d49bc0d3bc..5dabea081d 100644 --- a/.flake8 +++ b/.flake8 @@ -46,6 +46,3 @@ per-file-ignores = libensemble/tests/functionality_tests/test_active_persistent_worker_abort.py:E402 libensemble/tests/unit_tests/test_persistent_aposmm.py:E402 libensemble/tests/unit_tests/RENAME_test_persistent_aposmm.py:E402 - - # Allow undefined name '__version__' - setup.py:F821 diff --git a/.gitignore b/.gitignore index 828a6fff61..c6bd3c0ddc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ dist/ .spyproject/ .hypothesis +.pixi diff --git a/MANIFEST.in b/MANIFEST.in index 4127196957..c67c0b894c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ +include pyproject.toml include setup.py include *.cfg include *.rst diff --git a/docs/dev_guide/release_management/release_process.rst b/docs/dev_guide/release_management/release_process.rst index fa3427f9c7..60d5b80cd6 100644 --- a/docs/dev_guide/release_management/release_process.rst +++ b/docs/dev_guide/release_management/release_process.rst @@ -21,7 +21,7 @@ Before release - Year in ``LICENSE`` is checked for correctness. (Note: The year generated in docs by ``docs/conf.py`` should be automatic). -- ``setup.py`` and ``libensemble/__init__.py`` are checked to ensure all +- ``pyproject.toml`` and ``libensemble/__init__.py`` are checked to ensure all information is up to date. - Update ``.wci.yml`` in root directory (version, date and any other diff --git a/setup.py b/setup.py new file mode 100644 index 0000000000..606849326a --- /dev/null +++ b/setup.py @@ -0,0 +1,3 @@ +from setuptools import setup + +setup() From 393f9d41e8097a7fe5e290c3151dfd46b980e457 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 6 Nov 2024 09:17:22 -0600 Subject: [PATCH 009/215] move .black and .typos.toml config to pyproject.toml --- .black | 12 ------------ .typos.toml | 21 --------------------- pyproject.toml | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 33 deletions(-) delete mode 100644 .black delete mode 100644 .typos.toml diff --git a/.black b/.black deleted file mode 100644 index 718d6bded9..0000000000 --- a/.black +++ /dev/null @@ -1,12 +0,0 @@ -[tool.black] -line-length = 120 -target-version = ['py37', 'py38', 'py39', 'py310'] -force-exclude = ''' -( - /( - | \.git - | \.github - )/ - | libensemble/files/to/avoid -) -''' diff --git a/.typos.toml b/.typos.toml deleted file mode 100644 index 6f83997492..0000000000 --- a/.typos.toml +++ /dev/null @@ -1,21 +0,0 @@ -[default] -extend-ignore-identifiers-re = [ - ".*NDArray.*", - "8ba9de56.*" -] - -[default.extend-words] -als = "als" -datas = "datas" -numer = "numer" -inout = "inout" -arange = "arange" -wrk = "wrk" -EOF = "EOF" -HPE = "HPE" -RO = "RO" -lst = "lst" -noy = "noy" - -[files] -extend-exclude = ["*.bib", "*.xml", "docs/nitpicky"] diff --git a/pyproject.toml b/pyproject.toml index 3024dd150b..4a67361687 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,3 +97,38 @@ clang_osx-arm64 = ">=19.1.2,<20" [tool.pixi.target.linux-64.dependencies] gpcam = ">=8.1.6,<9" + +[tool.black] +line-length = 120 +target-version = ['py39', 'py310', 'py311', 'py312'] +force-exclude = ''' +( + /( + | \.git + | \.github + )/ + | libensemble/files/to/avoid +) +''' + +[tool.typos.default] +extend-ignore-identifiers-re = [ + ".*NDArray.*", + "8ba9de56.*" +] + +[tool.typos.default.extend-words] +als = "als" +datas = "datas" +numer = "numer" +inout = "inout" +arange = "arange" +wrk = "wrk" +EOF = "EOF" +HPE = "HPE" +RO = "RO" +lst = "lst" +noy = "noy" + +[tool.typos.files] +extend-exclude = ["*.bib", "*.xml", "docs/nitpicky"] From 759cb3a5b45c8bb0505770b06f1d11a078721cbd Mon Sep 17 00:00:00 2001 From: Stephen Hudson Date: Mon, 16 Dec 2024 17:03:22 -0600 Subject: [PATCH 010/215] Add +dev --- libensemble/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libensemble/version.py b/libensemble/version.py index aa56ed4042..a5467c834a 100644 --- a/libensemble/version.py +++ b/libensemble/version.py @@ -1 +1 @@ -__version__ = "1.4.3" +__version__ = "1.4.3+dev" From 6e8665a35319dd0c003a1e99183d42336493f344 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 17 Dec 2024 11:29:55 -0600 Subject: [PATCH 011/215] Noting that scipy.special has been tried --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index bad6e4246d..54cc30aa14 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -52,6 +52,7 @@ def __getattr__(cls, name): "scipy.sparse", "scipy.spatial", "scipy.spatial.distance", + # "scipy.special", # Adding this raises many more errors "scipy.stats", "surmise.calibration", "surmise.emulation", From 395371e377fffca0f32e76f44e106a24e4d325ea Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 17 Dec 2024 11:56:17 -0600 Subject: [PATCH 012/215] Use autodoc_mock_imports --- docs/conf.py | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 54cc30aa14..abd7fd4ecc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,32 +30,18 @@ class Mock(MagicMock): def __getattr__(cls, name): return MagicMock() +autodoc_mock_imports = ["balsam", "IPython", "matplotlib", "scipy", "surmise"] MOCK_MODULES = [ "argparse", "dfols", - "IPython", - "IPython.display", - "IPython.core", - "IPython.core.pylabtools", "math", - "matplotlib", - "matplotlib.pyplot", "mpi4py", "mpmath", "nlopt", "PETSc", "petsc4py", "psutil", - "scipy", - "scipy.io", - "scipy.sparse", - "scipy.spatial", - "scipy.spatial.distance", - # "scipy.special", # Adding this raises many more errors - "scipy.stats", - "surmise.calibration", - "surmise.emulation", "Tasmanian", ] @@ -132,7 +118,6 @@ def __getattr__(cls, name): autodoc_pydantic_model_show_json = False -autodoc_mock_imports = ["balsam"] extlinks = { "duref": ("http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html#%s", ""), "durole": ("http://docutils.sourceforge.net/docs/ref/rst/" "roles.html#%s", ""), From 038635e691d1c8bcc4482e887e88a4a93fa593bc Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 17 Dec 2024 12:44:11 -0600 Subject: [PATCH 013/215] Set default path inside function --- libensemble/tools/tools.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libensemble/tools/tools.py b/libensemble/tools/tools.py index 5458069673..730ed4b3d8 100644 --- a/libensemble/tools/tools.py +++ b/libensemble/tools/tools.py @@ -84,7 +84,9 @@ def _get_shortname(calling_file): # =================== save libE output to pickle and np ======================== -def save_libE_output(H, persis_info, calling_file, nworkers, dest_path=os.getcwd(), mess="Run completed"): +Here’s the modified function header and logic to set dest_path to os.getcwd() if it is None: + +def save_libE_output(H, persis_info, calling_file, nworkers, dest_path=None, mess="Run completed"): """ Writes out history array and persis_info to files. @@ -121,6 +123,9 @@ def save_libE_output(H, persis_info, calling_file, nworkers, dest_path=os.getcwd A message to print/log when saving the file. """ + if dest_path is None: + dest_path = os.getcwd() + short_name = _get_shortname(calling_file) prob_str = "length=" + str(len(H)) + "_evals=" + str(sum(H["sim_ended"])) + "_workers=" + str(nworkers) From 8be3b1b19e5a67681b72945fd88fcc80b1c3938d Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 17 Dec 2024 13:19:38 -0600 Subject: [PATCH 014/215] Ensure Ax gen is documented --- docs/conf.py | 2 +- libensemble/gen_funcs/persistent_ax_multitask.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index abd7fd4ecc..d45b03a4fb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,7 +30,7 @@ class Mock(MagicMock): def __getattr__(cls, name): return MagicMock() -autodoc_mock_imports = ["balsam", "IPython", "matplotlib", "scipy", "surmise"] +autodoc_mock_imports = ["ax", "balsam", "IPython", "matplotlib", "pandas", "scipy", "surmise"] MOCK_MODULES = [ "argparse", diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 06c3ea7bbd..077ee348ef 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -41,6 +41,7 @@ from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG from libensemble.tools.persistent_support import PersistentSupport +__all__ = ["persistent_gp_mt_ax_gen_f"] def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): """ From 76546eb2bee56e6a51d85929a53e5f3081d01563 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 17 Dec 2024 13:31:26 -0600 Subject: [PATCH 015/215] Add doc of gpCAM --- docs/conf.py | 2 +- docs/examples/gen_funcs.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index d45b03a4fb..17dc692c41 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,7 +30,7 @@ class Mock(MagicMock): def __getattr__(cls, name): return MagicMock() -autodoc_mock_imports = ["ax", "balsam", "IPython", "matplotlib", "pandas", "scipy", "surmise"] +autodoc_mock_imports = ["ax", "balsam", "gpcam", "IPython", "matplotlib", "pandas", "scipy", "surmise"] MOCK_MODULES = [ "argparse", diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 8e5af973b1..8aec195260 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -18,5 +18,6 @@ Generator Functions fd_param_finder surmise ax_multitask + gpcam .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples From 82be572807dcb6299d2ff7e20209547e10da19dd Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 17 Dec 2024 13:39:48 -0600 Subject: [PATCH 016/215] Fix formatting --- libensemble/gen_funcs/persistent_ax_multitask.py | 1 + 1 file changed, 1 insertion(+) diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 077ee348ef..7f61104762 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -43,6 +43,7 @@ __all__ = ["persistent_gp_mt_ax_gen_f"] + def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): """ Create a Gaussian Process model for multi-task optimization From 4e424610763ae5e96ba4cbb8376834508d425e2f Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 17 Dec 2024 13:45:39 -0600 Subject: [PATCH 017/215] Remove comment --- libensemble/tools/tools.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/libensemble/tools/tools.py b/libensemble/tools/tools.py index 730ed4b3d8..8dc629c8ad 100644 --- a/libensemble/tools/tools.py +++ b/libensemble/tools/tools.py @@ -83,9 +83,6 @@ def _get_shortname(calling_file): # =================== save libE output to pickle and np ======================== - -Here’s the modified function header and logic to set dest_path to os.getcwd() if it is None: - def save_libE_output(H, persis_info, calling_file, nworkers, dest_path=None, mess="Run completed"): """ Writes out history array and persis_info to files. From 04b07c2e4cca8b0073a86a854b1fa746f1a2a55a Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 19 Dec 2024 13:33:58 -0600 Subject: [PATCH 018/215] remove pixi.lock. will investigate git-lfs solution in the future --- pixi.lock | 7505 ----------------------------------------------------- 1 file changed, 7505 deletions(-) delete mode 100644 pixi.lock diff --git a/pixi.lock b/pixi.lock deleted file mode 100644 index 9903807088..0000000000 --- a/pixi.lock +++ /dev/null @@ -1,7505 +0,0 @@ -version: 5 -environments: - default: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.3-py312h58c1407_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.23.4-py312h12e396e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - - pypi: . - osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.3-hf95d169_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.3-hac325c4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_hbf64a52_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.3-hf78d878_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.1.3-py312hfc93d17_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py312h3d0f464_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.23.4-py312h669792a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312hb553811_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 - - pypi: . - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1010.6-hf7b29d9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.3-default_h01e2e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.3-default_h89fcaf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.3-h2621db8_21.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.3-h54d7cd3_21.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.3-h33d20e1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.3-hccb7791_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-hf3baa6d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.3-default_h01e2e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.3-ha82da77_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.3-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.4-h8424949_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.3-hb52a8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.3-he407fa0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.3-h33d20e1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.1.3-py312h94ee1e1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py312h0bf5046_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.23.4-py312he431725_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - - pypi: . - dev: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py312h178313f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.3-default_hb5137d0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.3-default_h9c6a7e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.3-ha7bfdaf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py312h7900ff3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.0.1-py312h0a6c937_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpich-4.2.3-h670b19f_100.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlopt-2.8.0-py312h69683c5_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.3-py312h58c1407_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.23.4-py312h12e396e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.0.2-py312h91f0f75_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.0-h6e8976b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - - pypi: . - osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312h5861a67_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.0-py312h2a50410_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.4-py312hbe3f5e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.54.1-py312hbe3f5e4_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py312hc5c4d5f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.3-hf95d169_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.22-h00291cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.3-hac325c4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_hbf64a52_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.3-hf78d878_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312hbe3f5e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.9.2-py312hb401068_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.9.2-py312h30cc4df_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/mpi4py-4.0.1-py312h017ff69_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/mpich-4.2.3-ha850315_100.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/nlopt-2.8.0-py312h314ef60_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.1.3-py312hfc93d17_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.0.0-py312h66fe14f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py312h3d0f464_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py312hb401068_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.23.4-py312h669792a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312hb553811_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.14.1-py312h888eae2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.1-py312hb553811_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py312hc5c4d5f_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py312h3d0f464_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h00291cd_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h7122b0e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - - pypi: . - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1010.6-hf7b29d9_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.3-default_h01e2e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.3-default_h89fcaf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.3-h2621db8_21.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.3-h54d7cd3_21.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.3-h33d20e1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.3-hccb7791_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.0-py312h4721b07_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.4-py312ha0ccf2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.54.1-py312ha0ccf2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.7-py312h6142ec9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-hf3baa6d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.3-default_h01e2e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.3-ha82da77_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.3-haf57ff0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.4-h8424949_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.3-hb52a8e5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.3-he407fa0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.3-h33d20e1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312ha0ccf2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.9.2-py312h1f38498_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.9.2-py312h9bd0bc6_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi4py-4.0.1-py312h5450814_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpich-4.2.3-he5dbaa7_100.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlopt-2.8.0-py312h857dc0a_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.1.3-py312h94ee1e1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py312h0bf5046_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py312h81bd7bf_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.23.4-py312he431725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.14.1-py312h20deb59_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.1-py312h024a12e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py312h6142ec9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py312h0bf5046_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - - pypi: . -packages: -- kind: conda - name: _libgcc_mutex - version: '0.1' - build: conda_forge - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 -- kind: conda - name: _openmp_mutex - version: '4.5' - build: 2_gnu - build_number: 16 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 23621 - timestamp: 1650670423406 -- kind: conda - name: alabaster - version: 1.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda - sha256: a9e1092725561d9bff12d3a4d3bb46c43d3d0db3cbb2c63c9025d1c77e84840c - md5: 7d78a232029458d0077ede6cda30ed0c - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/alabaster?source=hash-mapping - size: 18522 - timestamp: 1722035895436 -- kind: conda - name: alsa-lib - version: 1.2.12 - build: h4ab18f5_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda - sha256: 64b95dd06d7ca6b54cea03b02da8f1657b9899ca376d0ca7b47823064f55fb16 - md5: 7ed427f0871fd41cb1d9c17727c17589 - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - license_family: GPL - purls: [] - size: 555868 - timestamp: 1718118368236 -- kind: conda - name: annotated-types - version: 0.7.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda - sha256: 668f0825b6c18e4012ca24a0070562b6ec801ebc7008228a428eb52b4038873f - md5: 7e9f4612544c8edbfd6afad17f1bd045 - depends: - - python >=3.7 - - typing-extensions >=4.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/annotated-types?source=hash-mapping - size: 18235 - timestamp: 1716290348421 -- kind: conda - name: anyio - version: 4.6.2.post1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - sha256: 4b54b7ce79d818e3cce54ae4d552dba51b7afac160ceecdefd04b3917a37c502 - md5: 688697ec5e9588bdded167d19577625b - depends: - - exceptiongroup >=1.0.2 - - idna >=2.8 - - python >=3.9 - - sniffio >=1.1 - - typing_extensions >=4.1 - constrains: - - uvloop >=0.21.0b1 - - trio >=0.26.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/anyio?source=hash-mapping - size: 109864 - timestamp: 1728935803440 -- kind: conda - name: babel - version: 2.14.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda - sha256: 8584e3da58e92b72641c89ff9b98c51f0d5dbe76e527867804cbdf03ac91d8e6 - md5: 9669586875baeced8fc30c0826c3270e - depends: - - python >=3.7 - - pytz - - setuptools - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/babel?source=hash-mapping - size: 7609750 - timestamp: 1702422720584 -- kind: conda - name: brotli - version: 1.1.0 - build: h00291cd_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda - sha256: 624954bc08b3d7885a58c7d547282cfb9a201ce79b748b358f801de53e20f523 - md5: 2db0c38a7f2321c5bdaf32b181e832c7 - depends: - - __osx >=10.13 - - brotli-bin 1.1.0 h00291cd_2 - - libbrotlidec 1.1.0 h00291cd_2 - - libbrotlienc 1.1.0 h00291cd_2 - license: MIT - license_family: MIT - purls: [] - size: 19450 - timestamp: 1725267851605 -- kind: conda - name: brotli - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda - sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b - md5: 98514fe74548d768907ce7a13f680e8f - depends: - - __glibc >=2.17,<3.0.a0 - - brotli-bin 1.1.0 hb9d3cd8_2 - - libbrotlidec 1.1.0 hb9d3cd8_2 - - libbrotlienc 1.1.0 hb9d3cd8_2 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 19264 - timestamp: 1725267697072 -- kind: conda - name: brotli - version: 1.1.0 - build: hd74edd7_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hd74edd7_2.conda - sha256: a086f36ff68d6e30da625e910547f6211385246fb2474b144ac8c47c32254576 - md5: 215e3dc8f2f837906d066e7f01aa77c0 - depends: - - __osx >=11.0 - - brotli-bin 1.1.0 hd74edd7_2 - - libbrotlidec 1.1.0 hd74edd7_2 - - libbrotlienc 1.1.0 hd74edd7_2 - license: MIT - license_family: MIT - purls: [] - size: 19588 - timestamp: 1725268044856 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: h00291cd_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda - sha256: 642a8492491109fd8270c1e2c33b18126712df0cedb94aaa2b1c6b02505a4bfa - md5: 049933ecbf552479a12c7917f0a4ce59 - depends: - - __osx >=10.13 - - libbrotlidec 1.1.0 h00291cd_2 - - libbrotlienc 1.1.0 h00291cd_2 - license: MIT - license_family: MIT - purls: [] - size: 16643 - timestamp: 1725267837325 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda - sha256: 261364d7445513b9a4debc345650fad13c627029bfc800655a266bf1e375bc65 - md5: c63b5e52939e795ba8d26e35d767a843 - depends: - - __glibc >=2.17,<3.0.a0 - - libbrotlidec 1.1.0 hb9d3cd8_2 - - libbrotlienc 1.1.0 hb9d3cd8_2 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 18881 - timestamp: 1725267688731 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: hd74edd7_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hd74edd7_2.conda - sha256: 28f1af63b49fddf58084fb94e5512ad46e9c453eb4be1d97449c67059e5b0680 - md5: b8512db2145dc3ae8d86cdc21a8d421e - depends: - - __osx >=11.0 - - libbrotlidec 1.1.0 hd74edd7_2 - - libbrotlienc 1.1.0 hd74edd7_2 - license: MIT - license_family: MIT - purls: [] - size: 16772 - timestamp: 1725268026061 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py312h2ec8cdc_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda - sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f - md5: b0b867af6fc74b2a0aa206da29c0f3cf - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 hb9d3cd8_2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/brotli?source=hash-mapping - size: 349867 - timestamp: 1725267732089 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py312h5861a67_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312h5861a67_2.conda - sha256: 265764ff4ad9e5cfefe7ea85c53d95157bf16ac2c0e5f190c528e4c9c0c1e2d0 - md5: b95025822e43128835826ec0cc45a551 - depends: - - __osx >=10.13 - - libcxx >=17 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 h00291cd_2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/brotli?source=hash-mapping - size: 363178 - timestamp: 1725267893889 -- kind: conda - name: brotli-python - version: 1.1.0 - build: py312hde4cb15_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda - sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af - md5: a83c2ef76ccb11bc2349f4f17696b15d - depends: - - __osx >=11.0 - - libcxx >=17 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.1.0 hd74edd7_2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/brotli?source=hash-mapping - size: 339360 - timestamp: 1725268143995 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h4bc722e_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d - md5: 62ee74e96c5ebb0af99386de58cf9553 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 252783 - timestamp: 1720974456583 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h99b78c6_7 - build_number: 7 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 - md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 122909 - timestamp: 1720974522888 -- kind: conda - name: bzip2 - version: 1.0.8 - build: hfdf4475_7 - build_number: 7 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 - md5: 7ed4301d437b59045be7e051a0308211 - depends: - - __osx >=10.13 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 134188 - timestamp: 1720974491916 -- kind: conda - name: ca-certificates - version: 2024.8.30 - build: h8857fd0_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda - sha256: 593f302d0f44c2c771e1614ee6d56fffdc7d616e6f187669c8b0e34ffce3e1ae - md5: b7e5424e7f06547a903d28e4651dbb21 - license: ISC - purls: [] - size: 158665 - timestamp: 1725019059295 -- kind: conda - name: ca-certificates - version: 2024.8.30 - build: hbcca054_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda - sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea - md5: c27d1c142233b5bc9ca570c6e2e0c244 - license: ISC - purls: [] - size: 159003 - timestamp: 1725018903918 -- kind: conda - name: ca-certificates - version: 2024.8.30 - build: hf0a4a13_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 - md5: 40dec13fd8348dbe303e57be74bd3d35 - license: ISC - purls: [] - size: 158482 - timestamp: 1725019034582 -- kind: conda - name: cairo - version: 1.18.0 - build: hebfffa5_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda - sha256: aee5b9e6ef71cdfb2aee9beae3ea91910ca761c01c0ef32052e3f94a252fa173 - md5: fceaedf1cdbcb02df9699a0d9b005292 - depends: - - __glibc >=2.17,<3.0.a0 - - fontconfig >=2.14.2,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 - - icu >=75.1,<76.0a0 - - libgcc-ng >=12 - - libglib >=2.80.3,<3.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libxcb >=1.16,<2.0.0a0 - - libzlib >=1.3.1,<2.0a0 - - pixman >=0.43.2,<1.0a0 - - xorg-libice >=1.1.1,<2.0a0 - - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.9,<2.0a0 - - xorg-libxext >=1.3.4,<2.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - - zlib - license: LGPL-2.1-only or MPL-1.1 - purls: [] - size: 983604 - timestamp: 1721138900054 -- kind: conda - name: cctools_osx-arm64 - version: '1010.6' - build: hf7b29d9_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1010.6-hf7b29d9_1.conda - sha256: 631d79130770aff0a2ed0c0cd94480eb0d7c7a3ea1a963896781eaa09e482b8d - md5: 7d7fbb4d88bc05ef54a00bc63d0a0b1d - depends: - - __osx >=11.0 - - ld64_osx-arm64 >=951.9,<951.10.0a0 - - libcxx - - libllvm19 >=19.1.0,<19.2.0a0 - - libzlib >=1.3.1,<2.0a0 - - llvm-tools 19.1.* - - sigtool - constrains: - - cctools 1010.6.* - - ld64 951.9.* - - clang 19.1.* - license: APSL-2.0 - license_family: Other - purls: [] - size: 1090810 - timestamp: 1727792802809 -- kind: conda - name: certifi - version: 2024.8.30 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - sha256: 7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f - md5: 12f7d00853807b0531775e9be891cb11 - depends: - - python >=3.7 - license: ISC - purls: - - pkg:pypi/certifi?source=hash-mapping - size: 163752 - timestamp: 1725278204397 -- kind: conda - name: cffi - version: 1.17.1 - build: py312h06ac9bb_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda - sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 - md5: a861504bbea4161a9170b85d4d2be840 - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - size: 294403 - timestamp: 1725560714366 -- kind: conda - name: cffi - version: 1.17.1 - build: py312h0fad829_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f - md5: 19a5456f72f505881ba493979777b24e - depends: - - __osx >=11.0 - - libffi >=3.4,<4.0a0 - - pycparser - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - size: 281206 - timestamp: 1725560813378 -- kind: conda - name: cffi - version: 1.17.1 - build: py312hf857d28_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.17.1-py312hf857d28_0.conda - sha256: 94fe49aed25d84997e2630d6e776a75ee2a85bd64f258702c57faa4fe2986902 - md5: 5bbc69b8194fedc2792e451026cac34f - depends: - - __osx >=10.13 - - libffi >=3.4,<4.0a0 - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - size: 282425 - timestamp: 1725560725144 -- kind: conda - name: cfgv - version: 3.3.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 - sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c - md5: ebb5f5f7dc4f1a3780ef7ea7738db08c - depends: - - python >=3.6.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cfgv?source=hash-mapping - size: 10788 - timestamp: 1629909423398 -- kind: conda - name: charset-normalizer - version: 3.4.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda - sha256: 1873ac45ea61f95750cb0b4e5e675d1c5b3def937e80c7eebb19297f76810be8 - md5: a374efa97290b8799046df7c5ca17164 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/charset-normalizer?source=hash-mapping - size: 47314 - timestamp: 1728479405343 -- kind: conda - name: clang - version: 19.1.3 - build: default_h89fcaf4_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.3-default_h89fcaf4_0.conda - sha256: acc2c659ffc6f578eebe1bedeb7b9a7f9a9f9a133096e8f0b1216729a69bc73f - md5: df839a29b07bb96b55e00782d77f4e15 - depends: - - clang-19 19.1.3 default_h01e2e8e_0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 23757 - timestamp: 1730332237764 -- kind: conda - name: clang-19 - version: 19.1.3 - build: default_h01e2e8e_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.3-default_h01e2e8e_0.conda - sha256: 6443261d1f1598da2f8ba911fba441b679d81753538f0a3836797e91287c0181 - md5: b1fd7dfbd07bc77edc8b82fd8463e46a - depends: - - __osx >=11.0 - - libclang-cpp19.1 19.1.3 default_h01e2e8e_0 - - libcxx >=19.1.3 - - libllvm19 >=19.1.3,<19.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 764341 - timestamp: 1730332071458 -- kind: conda - name: clang_impl_osx-arm64 - version: 19.1.3 - build: h2621db8_21 - build_number: 21 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.3-h2621db8_21.conda - sha256: 6100729d28fac534205e67bb6e0479b407717860b2c51d03fda0a48e4ed92b25 - md5: ce2c99fd4582b2330bba009e14411f7b - depends: - - cctools_osx-arm64 - - clang 19.1.3.* - - compiler-rt 19.1.3.* - - ld64_osx-arm64 - - llvm-tools 19.1.3.* - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 17637 - timestamp: 1730374941777 -- kind: conda - name: clang_osx-arm64 - version: 19.1.3 - build: h54d7cd3_21 - build_number: 21 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.3-h54d7cd3_21.conda - sha256: 16be9f4e0ca9fb2c58483a34b1b238f281bc2719cdcc5c1f83bda7df0bd89e44 - md5: d29908c941fbc5f59993bf3c40dcd111 - depends: - - clang_impl_osx-arm64 19.1.3 h2621db8_21 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 20676 - timestamp: 1730374945600 -- kind: conda - name: colorama - version: 0.4.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 - depends: - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/colorama?source=hash-mapping - size: 25170 - timestamp: 1666700778190 -- kind: conda - name: compiler-rt - version: 19.1.3 - build: h33d20e1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.3-h33d20e1_0.conda - sha256: e20f1d770e8f77e86852132826cdf8bd853fece1680197ba8f1834356c0f53c0 - md5: e46d9cd5017fecc134f04848b194cef3 - depends: - - __osx >=11.0 - - clang 19.1.3.* - - compiler-rt_osx-arm64 19.1.3.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 96853 - timestamp: 1730361087214 -- kind: conda - name: compiler-rt_osx-arm64 - version: 19.1.3 - build: hccb7791_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.3-hccb7791_0.conda - sha256: b917cf852d306d3882e4194f1e40cea50e74948fe1fa99411c43349cc93dfe0e - md5: 67aef6fe3a99aad428b159e737a31018 - depends: - - clang 19.1.3.* - constrains: - - clangxx 19.1.3 - - compiler-rt 19.1.3 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 10703896 - timestamp: 1730361057691 -- kind: conda - name: contourpy - version: 1.3.0 - build: py312h2a50410_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.0-py312h2a50410_2.conda - sha256: 74d690a3e7721002d0e44f728abb656b0e8a9c6e409fbe56f26a94161133810b - md5: c9dfef12c2aea745b81857e8b8fcffd3 - depends: - - __osx >=10.13 - - libcxx >=17 - - numpy >=1.23 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - size: 260990 - timestamp: 1729602628652 -- kind: conda - name: contourpy - version: 1.3.0 - build: py312h4721b07_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.0-py312h4721b07_2.conda - sha256: 1452b38f34d4b7803c21d6d908793fbb2975da591e780d099c25bc773e9f0da3 - md5: 3bb511fda97b3dbe459a2e67e5d185d6 - depends: - - __osx >=11.0 - - libcxx >=17 - - numpy >=1.23 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - size: 250676 - timestamp: 1729602748580 -- kind: conda - name: contourpy - version: 1.3.0 - build: py312h68727a3_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda - sha256: 777ff055866872f45f0f8d2ad17a0c42f3c63463f8c1da9d75fa5b1652940b50 - md5: ff28f374b31937c048107521c814791e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - numpy >=1.23 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - size: 276004 - timestamp: 1727293728397 -- kind: conda - name: coverage - version: 7.6.4 - build: py312h178313f_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py312h178313f_0.conda - sha256: 62ef1654898b67a1aae353c8910323c803db0dcf0c117d5796eb1cfb03a2d777 - md5: a32fbd2322865ac80c7db74c553f5306 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tomli - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=hash-mapping - size: 363969 - timestamp: 1729610283175 -- kind: conda - name: coverage - version: 7.6.4 - build: py312ha0ccf2a_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.6.4-py312ha0ccf2a_0.conda - sha256: 4211bf3f5a2f9f45fbf7c73e40dfb6ad84f6123bbf77c3bee5ca04b85c8c400f - md5: ff7f61eae0c3bc906a37f0804208fd46 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - tomli - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=hash-mapping - size: 362479 - timestamp: 1729610313800 -- kind: conda - name: coverage - version: 7.6.4 - build: py312hbe3f5e4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.6.4-py312hbe3f5e4_0.conda - sha256: 59c715b5cea39fbcad43dc2000380a67ef904d3dfa6954d5af57fb23e71f7c29 - md5: 686d7971e78e94af94af94713853be60 - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tomli - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=hash-mapping - size: 362509 - timestamp: 1729610208953 -- kind: conda - name: cycler - version: 0.12.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 - md5: 5cd86562580f274031ede6aa6aa24441 - depends: - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/cycler?source=hash-mapping - size: 13458 - timestamp: 1696677888423 -- kind: conda - name: cyrus-sasl - version: 2.1.27 - build: h54b06d7_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda - sha256: d2ea5e52da745c4249e1a818095a28f9c57bd4df22cbfc645352defa468e86c2 - md5: dce22f70b4e5a407ce88f2be046f4ceb - depends: - - krb5 >=1.21.1,<1.22.0a0 - - libgcc-ng >=12 - - libntlm - - libstdcxx-ng >=12 - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause-Attribution - license_family: BSD - purls: [] - size: 219527 - timestamp: 1690061203707 -- kind: conda - name: dbus - version: 1.13.6 - build: h5008d03_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 - md5: ecfff944ba3960ecb334b9a2663d708d - depends: - - expat >=2.4.2,<3.0a0 - - libgcc-ng >=9.4.0 - - libglib >=2.70.2,<3.0a0 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - size: 618596 - timestamp: 1640112124844 -- kind: conda - name: distlib - version: 0.3.9 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - sha256: 300b2e714f59403df0560174f5ef6c19db8b4a3b74a7244862cf771f07dee8fb - md5: fe521c1608280cc2803ebd26dc252212 - depends: - - python 2.7|>=3.6 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/distlib?source=hash-mapping - size: 276214 - timestamp: 1728557312342 -- kind: conda - name: docutils - version: 0.21.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - sha256: 362bfe3afaac18298c48c0c6a935641544077ce5105a42a2d8ebe750ad07c574 - md5: e8cd5d629f65bdf0f3bb312cde14659e - depends: - - python >=3.9 - license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 - purls: - - pkg:pypi/docutils?source=hash-mapping - size: 403226 - timestamp: 1713930478970 -- kind: conda - name: double-conversion - version: 3.3.0 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda - sha256: 9eee491a73b67fd64379cf715f85f8681568ebc1f02f9e11b4c50d46a3323544 - md5: c2f83a5ddadadcdb08fe05863295ee97 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 78645 - timestamp: 1686489937183 -- kind: conda - name: exceptiongroup - version: 1.2.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - sha256: e0edd30c4b7144406bb4da975e6bb97d6bc9c0e999aa4efe66ae108cada5d5b5 - md5: d02ae936e42063ca46af6cdad2dbd1e0 - depends: - - python >=3.7 - license: MIT and PSF-2.0 - purls: - - pkg:pypi/exceptiongroup?source=hash-mapping - size: 20418 - timestamp: 1720869435725 -- kind: conda - name: expat - version: 2.6.3 - build: h5888daf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda - sha256: 65bd479c75ce876f26600cb230d6ebc474086e31fa384af9b4282b36842ed7e2 - md5: 6595440079bed734b113de44ffd3cd0a - depends: - - __glibc >=2.17,<3.0.a0 - - libexpat 2.6.3 h5888daf_0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 137891 - timestamp: 1725568750673 -- kind: conda - name: filelock - version: 3.16.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - sha256: 1da766da9dba05091af87977922fe60dc7464091a9ccffb3765d403189d39be4 - md5: 916f8ec5dd4128cd5f207a3c4c07b2c6 - depends: - - python >=3.7 - license: Unlicense - purls: - - pkg:pypi/filelock?source=hash-mapping - size: 17357 - timestamp: 1726613593584 -- kind: conda - name: flake8 - version: 7.1.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.1-pyhd8ed1ab_0.conda - sha256: c513c6db311641dc50dfadbc49c8edea105ec18fee350149543b49f7970c3962 - md5: a25e5df6b26be3c2d64be307c1ef0b37 - depends: - - mccabe >=0.7.0,<0.8.0 - - pycodestyle >=2.12.0,<2.13.0 - - pyflakes >=3.2.0,<3.3.0 - - python >=3.8.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/flake8?source=hash-mapping - size: 111109 - timestamp: 1722878963477 -- kind: conda - name: font-ttf-dejavu-sans-mono - version: '2.37' - build: hab24e00_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b - md5: 0c96522c6bdaed4b1566d11387caaf45 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 397370 - timestamp: 1566932522327 -- kind: conda - name: font-ttf-inconsolata - version: '3.000' - build: h77eed37_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c - md5: 34893075a5c9e55cdafac56607368fc6 - license: OFL-1.1 - license_family: Other - purls: [] - size: 96530 - timestamp: 1620479909603 -- kind: conda - name: font-ttf-source-code-pro - version: '2.038' - build: h77eed37_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 - md5: 4d59c254e01d9cde7957100457e2d5fb - license: OFL-1.1 - license_family: Other - purls: [] - size: 700814 - timestamp: 1620479612257 -- kind: conda - name: font-ttf-ubuntu - version: '0.83' - build: h77eed37_3 - build_number: 3 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 - md5: 49023d73832ef61042f6a237cb2687e7 - license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 - license_family: Other - purls: [] - size: 1620504 - timestamp: 1727511233259 -- kind: conda - name: fontconfig - version: 2.15.0 - build: h7e30c49_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 - md5: 8f5b0b297b59e1ac160ad4beec99dbee - depends: - - __glibc >=2.17,<3.0.a0 - - freetype >=2.12.1,<3.0a0 - - libexpat >=2.6.3,<3.0a0 - - libgcc >=13 - - libuuid >=2.38.1,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 265599 - timestamp: 1730283881107 -- kind: conda - name: fonts-conda-ecosystem - version: '1' - build: '0' - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 - md5: fee5683a3f04bd15cbd8318b096a27ab - depends: - - fonts-conda-forge - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 3667 - timestamp: 1566974674465 -- kind: conda - name: fonts-conda-forge - version: '1' - build: '0' - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 - md5: f766549260d6815b0c52253f1fb1bb29 - depends: - - font-ttf-dejavu-sans-mono - - font-ttf-inconsolata - - font-ttf-source-code-pro - - font-ttf-ubuntu - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 4102 - timestamp: 1566932280397 -- kind: conda - name: fonttools - version: 4.54.1 - build: py312h178313f_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda - sha256: 45f405d6d1ef528226c20b681373db0bdb79cc70fec1e495003247b0d3d00140 - md5: bbbf5fa5cab622c33907bc8d7eeea9f7 - depends: - - __glibc >=2.17,<3.0.a0 - - brotli - - libgcc >=13 - - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - unicodedata2 >=15.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - size: 2827447 - timestamp: 1729530553018 -- kind: conda - name: fonttools - version: 4.54.1 - build: py312ha0ccf2a_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.54.1-py312ha0ccf2a_1.conda - sha256: 7db92b5980ac60c362d2c7fa9c75c21578b0ebe58a23ba6e123f47d4d3baca53 - md5: 1d203fe9d62f4d2fea1c955d77bc642a - depends: - - __osx >=11.0 - - brotli - - munkres - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - unicodedata2 >=15.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - size: 2730304 - timestamp: 1729530557674 -- kind: conda - name: fonttools - version: 4.54.1 - build: py312hbe3f5e4_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.54.1-py312hbe3f5e4_1.conda - sha256: bec969c41482df669dcc17e8450693d206e0c155c46c47924ceb634f766df180 - md5: e58d62085d1b304863373b89caf8f5d4 - depends: - - __osx >=10.13 - - brotli - - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - unicodedata2 >=15.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - size: 2727792 - timestamp: 1729530530279 -- kind: conda - name: freetype - version: 2.12.1 - build: h267a509_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 - md5: 9ae35c3d96db2c94ce0cef86efdfa2cb - depends: - - libgcc-ng >=12 - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: GPL-2.0-only OR FTL - purls: [] - size: 634972 - timestamp: 1694615932610 -- kind: conda - name: freetype - version: 2.12.1 - build: h60636b9_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - sha256: b292cf5a25f094eeb4b66e37d99a97894aafd04a5683980852a8cbddccdc8e4e - md5: 25152fce119320c980e5470e64834b50 - depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: GPL-2.0-only OR FTL - purls: [] - size: 599300 - timestamp: 1694616137838 -- kind: conda - name: freetype - version: 2.12.1 - build: hadb7bae_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 - md5: e6085e516a3e304ce41a8ee08b9b89ad - depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: GPL-2.0-only OR FTL - purls: [] - size: 596430 - timestamp: 1694616332835 -- kind: conda - name: graphite2 - version: 1.3.13 - build: h59595ed_1003 - build_number: 1003 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add - md5: f87c7b7c2cb45f323ffbce941c78ab7c - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LGPL-2.0-or-later - license_family: LGPL - purls: [] - size: 96855 - timestamp: 1711634169756 -- kind: conda - name: h2 - version: 4.1.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a - md5: b748fbf7060927a6e82df7cb5ee8f097 - depends: - - hpack >=4.0,<5 - - hyperframe >=6.0,<7 - - python >=3.6.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/h2?source=hash-mapping - size: 46754 - timestamp: 1634280590080 -- kind: conda - name: harfbuzz - version: 9.0.0 - build: hda332d3_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda - sha256: 973afa37840b4e55e2540018902255cfb0d953aaed6353bb83a4d120f5256767 - md5: 76b32dcf243444aea9c6b804bcfa40b8 - depends: - - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.0,<2.0a0 - - freetype >=2.12.1,<3.0a0 - - graphite2 - - icu >=75.1,<76.0a0 - - libgcc-ng >=12 - - libglib >=2.80.3,<3.0a0 - - libstdcxx-ng >=12 - license: MIT - license_family: MIT - purls: [] - size: 1603653 - timestamp: 1721186240105 -- kind: conda - name: hpack - version: 4.0.0 - build: pyh9f0ad1d_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 - sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 - md5: 914d6646c4dbb1fd3ff539830a12fd71 - depends: - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/hpack?source=hash-mapping - size: 25341 - timestamp: 1598856368685 -- kind: conda - name: hyperframe - version: 6.0.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 - md5: 9f765cbfab6870c8435b9eefecd7a1f4 - depends: - - python >=3.6 - license: MIT - license_family: MIT - purls: - - pkg:pypi/hyperframe?source=hash-mapping - size: 14646 - timestamp: 1619110249723 -- kind: conda - name: icu - version: '75.1' - build: he02047a_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e - md5: 8b189310083baabfb622af68fd9d3ae3 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: MIT - license_family: MIT - purls: [] - size: 12129203 - timestamp: 1720853576813 -- kind: conda - name: icu - version: '75.1' - build: hfee45f7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 - md5: 5eb22c1d7b3fc4abb50d92d621583137 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 11857802 - timestamp: 1720853997952 -- kind: conda - name: identify - version: 2.6.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda - sha256: dc752392f327e64e32bc3122758b2d8951aec9d6e6aa888463c73d18a10e3c56 - md5: 43f629202f9eec21be5f71171fb5daf8 - depends: - - python >=3.6 - - ukkonen - license: MIT - license_family: MIT - purls: - - pkg:pypi/identify?source=hash-mapping - size: 78078 - timestamp: 1726369674008 -- kind: conda - name: idna - version: '3.10' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - sha256: 8c57fd68e6be5eecba4462e983aed7e85761a519aab80e834bbd7794d4b545b2 - md5: 7ba2ede0e7c795ff95088daf0dc59753 - depends: - - python >=3.6 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/idna?source=hash-mapping - size: 49837 - timestamp: 1726459583613 -- kind: conda - name: imagesize - version: 1.4.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 - md5: 7de5386c8fea29e76b303f37dde4c352 - depends: - - python >=3.4 - license: MIT - license_family: MIT - purls: - - pkg:pypi/imagesize?source=hash-mapping - size: 10164 - timestamp: 1656939625410 -- kind: conda - name: importlib-metadata - version: 8.5.0 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c - md5: 54198435fce4d64d8a89af22573012a8 - depends: - - python >=3.8 - - zipp >=0.5 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/importlib-metadata?source=hash-mapping - size: 28646 - timestamp: 1726082927916 -- kind: conda - name: iniconfig - version: 2.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 - md5: f800d2da156d08e289b14e87e43c1ae5 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/iniconfig?source=hash-mapping - size: 11101 - timestamp: 1673103208955 -- kind: conda - name: jinja2 - version: 3.1.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d - md5: 7b86ecb7d3557821c649b3c31e3eb9f2 - depends: - - markupsafe >=2.0 - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jinja2?source=hash-mapping - size: 111565 - timestamp: 1715127275924 -- kind: conda - name: keyutils - version: 1.6.1 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb - md5: 30186d27e2c9fa62b45fb1476b7200e3 - depends: - - libgcc-ng >=10.3.0 - license: LGPL-2.1-or-later - purls: [] - size: 117831 - timestamp: 1646151697040 -- kind: conda - name: kiwisolver - version: 1.4.7 - build: py312h6142ec9_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.7-py312h6142ec9_0.conda - sha256: 056a2cc3b6c07c79719cb8f2eda09408fca137b49fe46f919ef14247caa6f0e9 - md5: ea8a65d24baad7ed822ab7f07f19e105 - depends: - - __osx >=11.0 - - libcxx >=17 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - size: 60966 - timestamp: 1725459569843 -- kind: conda - name: kiwisolver - version: 1.4.7 - build: py312h68727a3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda - sha256: d752c53071ee5d712baa9742dd1629e60388c5ce4ab11d4e73a1690443e41769 - md5: 444266743652a4f1538145e9362f6d3b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - size: 70922 - timestamp: 1725459412788 -- kind: conda - name: kiwisolver - version: 1.4.7 - build: py312hc5c4d5f_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py312hc5c4d5f_0.conda - sha256: 87470d7eed470c01efa19dd0d5a2eca9149afa1176d1efc50c475b3b81df62c1 - md5: 7b72389a8a3ba350285f86933ab85da0 - depends: - - __osx >=10.13 - - libcxx >=17 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - size: 62176 - timestamp: 1725459509941 -- kind: conda - name: krb5 - version: 1.21.3 - build: h659f571_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 - md5: 3f43953b7d3fb3aaa1d0d0723d91e368 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 1370023 - timestamp: 1719463201255 -- kind: conda - name: latexcodec - version: 2.0.1 - build: pyh9f0ad1d_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 - sha256: 5210d31c8f2402dd1ad1b3edcf7a53292b9da5de20cd14d9c243dbf9278b1c4f - md5: 8d67904973263afd2985ba56aa2d6bb4 - depends: - - python - - six - license: MIT - license_family: MIT - purls: - - pkg:pypi/latexcodec?source=hash-mapping - size: 18212 - timestamp: 1592937373647 -- kind: conda - name: lcms2 - version: '2.16' - build: ha0e7c42_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 - md5: 66f6c134e76fe13cce8a9ea5814b5dd5 - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - size: 211959 - timestamp: 1701647962657 -- kind: conda - name: lcms2 - version: '2.16' - build: ha2f27b4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda - sha256: 222ebc0a55544b9922f61e75015d02861e65b48f12113af41d48ba0814e14e4e - md5: 1442db8f03517834843666c422238c9b - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - size: 224432 - timestamp: 1701648089496 -- kind: conda - name: lcms2 - version: '2.16' - build: hb7c19ff_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 - md5: 51bb7010fc86f70eee639b4bb7a894f5 - depends: - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - size: 245247 - timestamp: 1701647787198 -- kind: conda - name: ld64_osx-arm64 - version: '951.9' - build: hf3baa6d_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-hf3baa6d_1.conda - sha256: e9818467d8bac0afecb6f4ad3a5c975b8ead2c115af5c8a0ac8db500f9d3f1fe - md5: c80468b5863ac35ca5d2ea6df427d0c1 - depends: - - __osx >=11.0 - - libcxx - - libllvm19 >=19.1.0,<19.2.0a0 - - sigtool - - tapi >=1300.6.5,<1301.0a0 - constrains: - - ld 951.9.* - - cctools 1010.6.* - - cctools_osx-arm64 1010.6.* - - clang >=19.1.0,<20.0a0 - license: APSL-2.0 - license_family: Other - purls: [] - size: 1010000 - timestamp: 1727792742169 -- kind: conda - name: ld_impl_linux-64 - version: '2.43' - build: h712a8e2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe - md5: 048b02e3962f066da18efe3a21b77672 - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - binutils_impl_linux-64 2.43 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 669211 - timestamp: 1729655358674 -- kind: conda - name: lerc - version: 4.0.0 - build: h27087fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 - md5: 76bbff344f0134279f225174e9064c8f - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 281798 - timestamp: 1657977462600 -- kind: conda - name: lerc - version: 4.0.0 - build: h9a09cb3_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 - md5: de462d5aacda3b30721b512c5da4e742 - depends: - - libcxx >=13.0.1 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 215721 - timestamp: 1657977558796 -- kind: conda - name: lerc - version: 4.0.0 - build: hb486fe8_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - sha256: e41790fc0f4089726369b3c7f813117bbc14b533e0ed8b94cf75aba252e82497 - md5: f9d6a4c82889d5ecedec1d90eb673c55 - depends: - - libcxx >=13.0.1 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 290319 - timestamp: 1657977526749 -- kind: conda - name: libblas - version: 3.9.0 - build: 25_linux64_openblas - build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda - sha256: d6d12dc437d060f838820e9e61bf73baab651f91935ac594cf10beb9ef1b4450 - md5: 8ea26d42ca88ec5258802715fe1ee10b - depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 - constrains: - - liblapack 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - blas * openblas - - liblapacke 3.9.0 25_linux64_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15677 - timestamp: 1729642900350 -- kind: conda - name: libblas - version: 3.9.0 - build: 25_osx64_openblas - build_number: 25 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-25_osx64_openblas.conda - sha256: 1b22b5322a311a775bca637b26317645cf07e35f125cede9278c6c45db6e7105 - md5: da0a6f87958893e1d2e2bbc7e7a6541f - depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 - constrains: - - liblapack 3.9.0 25_osx64_openblas - - liblapacke 3.9.0 25_osx64_openblas - - blas * openblas - - libcblas 3.9.0 25_osx64_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15952 - timestamp: 1729643159199 -- kind: conda - name: libblas - version: 3.9.0 - build: 25_osxarm64_openblas - build_number: 25 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-25_osxarm64_openblas.conda - sha256: f1fb9a11af0b2878bd8804b4c77d3733c40076218bcbdb35f575b1c0c9fddf11 - md5: f8cf4d920ff36ce471619010eff59cac - depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 - constrains: - - blas * openblas - - liblapack 3.9.0 25_osxarm64_openblas - - liblapacke 3.9.0 25_osxarm64_openblas - - libcblas 3.9.0 25_osxarm64_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15913 - timestamp: 1729643265495 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: h00291cd_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda - sha256: b377056470a9fb4a100aa3c51b3581aab6496ba84d21cd99bcc1d5ef0359b1b6 - md5: 58f2c4bdd56c46cc7451596e4ae68e0b - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 67267 - timestamp: 1725267768667 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 - md5: 41b599ed2b02abcfdd84302bff174b23 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 68851 - timestamp: 1725267660471 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: hd74edd7_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 - md5: d0bf1dff146b799b319ea0434b93f779 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 68426 - timestamp: 1725267943211 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: h00291cd_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda - sha256: 4d49ea72e2f44d2d7a8be5472e4bd0bc2c6b89c55569de2c43576363a0685c0c - md5: 34709a1f5df44e054c4a12ab536c5459 - depends: - - __osx >=10.13 - - libbrotlicommon 1.1.0 h00291cd_2 - license: MIT - license_family: MIT - purls: [] - size: 29872 - timestamp: 1725267807289 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf - md5: 9566f0bd264fbd463002e759b8a82401 - depends: - - __glibc >=2.17,<3.0.a0 - - libbrotlicommon 1.1.0 hb9d3cd8_2 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 32696 - timestamp: 1725267669305 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: hd74edd7_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 - md5: 55e66e68ce55523a6811633dd1ac74e2 - depends: - - __osx >=11.0 - - libbrotlicommon 1.1.0 hd74edd7_2 - license: MIT - license_family: MIT - purls: [] - size: 28378 - timestamp: 1725267980316 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: h00291cd_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda - sha256: 477d236d389473413a1ccd2bec1b66b2f1d2d7d1b4a57bb56421b7b611a56cd1 - md5: 691f0dcb36f1ae67f5c489f20ae987ea - depends: - - __osx >=10.13 - - libbrotlicommon 1.1.0 h00291cd_2 - license: MIT - license_family: MIT - purls: [] - size: 296353 - timestamp: 1725267822076 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 - md5: 06f70867945ea6a84d35836af780f1de - depends: - - __glibc >=2.17,<3.0.a0 - - libbrotlicommon 1.1.0 hb9d3cd8_2 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 281750 - timestamp: 1725267679782 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: hd74edd7_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 - md5: 4f3a434504c67b2c42565c0b85c1885c - depends: - - __osx >=11.0 - - libbrotlicommon 1.1.0 hd74edd7_2 - license: MIT - license_family: MIT - purls: [] - size: 279644 - timestamp: 1725268003553 -- kind: conda - name: libcblas - version: 3.9.0 - build: 25_linux64_openblas - build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - sha256: ab87b0477078837c91d9cda62a9faca18fba7c57cc77aa779ae24b3ac783b5dd - md5: 5dbd1b0fc0d01ec5e0e1fbe667281a11 - depends: - - libblas 3.9.0 25_linux64_openblas - constrains: - - liblapack 3.9.0 25_linux64_openblas - - blas * openblas - - liblapacke 3.9.0 25_linux64_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15613 - timestamp: 1729642905619 -- kind: conda - name: libcblas - version: 3.9.0 - build: 25_osx64_openblas - build_number: 25 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-25_osx64_openblas.conda - sha256: b04ae297aa5396df3135514866db72845b111c92524570f923625473f11cfbe2 - md5: ab304b75ea67f850cf7adf9156e3f62f - depends: - - libblas 3.9.0 25_osx64_openblas - constrains: - - liblapack 3.9.0 25_osx64_openblas - - liblapacke 3.9.0 25_osx64_openblas - - blas * openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15842 - timestamp: 1729643166929 -- kind: conda - name: libcblas - version: 3.9.0 - build: 25_osxarm64_openblas - build_number: 25 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-25_osxarm64_openblas.conda - sha256: d9fa5b6b11252132a3383bbf87bd2f1b9d6248bef1b7e113c2a8ae41b0376218 - md5: 4df0fae81f0b5bf47d48c882b086da11 - depends: - - libblas 3.9.0 25_osxarm64_openblas - constrains: - - blas * openblas - - liblapack 3.9.0 25_osxarm64_openblas - - liblapacke 3.9.0 25_osxarm64_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15837 - timestamp: 1729643270793 -- kind: conda - name: libclang-cpp19.1 - version: 19.1.3 - build: default_h01e2e8e_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.3-default_h01e2e8e_0.conda - sha256: 9e33d0ef238953184dd524f0b2b6cae6c9efff86239e25ee86aa755a5b0ef619 - md5: d7b46054f23ed0af6f95f9835ffa0d90 - depends: - - __osx >=11.0 - - libcxx >=19.1.3 - - libllvm19 >=19.1.3,<19.2.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 13674917 - timestamp: 1730331708484 -- kind: conda - name: libclang-cpp19.1 - version: 19.1.3 - build: default_hb5137d0_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.3-default_hb5137d0_0.conda - sha256: 576c1826a91f93ef7c433fc6481334d21177996bd72ff6901f58fae8f6a765db - md5: 311e6a1d041db3d6a8a8437750d4234f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libllvm19 >=19.1.3,<19.2.0a0 - - libstdcxx >=13 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 20548148 - timestamp: 1730335997703 -- kind: conda - name: libclang13 - version: 19.1.3 - build: default_h9c6a7e4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.3-default_h9c6a7e4_0.conda - sha256: 7537cfefd76ffb0208484a2dc7d35d3752c6c42c80edabbc5f0dcae354d4b41e - md5: b8a8cd77810b20754f358f2327812552 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libllvm19 >=19.1.3,<19.2.0a0 - - libstdcxx >=13 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 11827604 - timestamp: 1730336232401 -- kind: conda - name: libcups - version: 2.3.3 - build: h4637d8d_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 - md5: d4529f4dff3057982a7617c7ac58fde3 - depends: - - krb5 >=1.21.1,<1.22.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 4519402 - timestamp: 1689195353551 -- kind: conda - name: libcxx - version: 19.1.3 - build: ha82da77_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.3-ha82da77_0.conda - sha256: 6d062760c6439e75b9a44d800d89aff60fe3441998d87506c62dc94c50412ef4 - md5: bf691071fba4734984231617783225bc - depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 520771 - timestamp: 1730314603920 -- kind: conda - name: libcxx - version: 19.1.3 - build: hf95d169_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.3-hf95d169_0.conda - sha256: 466f259bb13a8058fef28843977c090d21ad337b71a842ccc0407bccf8d27011 - md5: 86801fc56d4641e3ef7a63f5d996b960 - depends: - - __osx >=10.13 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 528991 - timestamp: 1730314340106 -- kind: conda - name: libdeflate - version: '1.22' - build: h00291cd_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.22-h00291cd_0.conda - sha256: 681035346974c3315685dc40898e26f65f1c00cbb0b5fd80cc2599e207a34b31 - md5: a15785ccc62ae2a8febd299424081efb - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 70407 - timestamp: 1728177128525 -- kind: conda - name: libdeflate - version: '1.22' - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda - sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 - md5: b422943d5d772b7cc858b36ad2a92db5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 72242 - timestamp: 1728177071251 -- kind: conda - name: libdeflate - version: '1.22' - build: hd74edd7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda - sha256: 3552894ca62bebc33d05982937cda25a4fa19e56a82af2ff20944ff4c2532fda - md5: 2d3e3f3d8ab315748420ef58d5a3ae0f - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 54089 - timestamp: 1728177149927 -- kind: conda - name: libdrm - version: 2.4.123 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda - sha256: 5f274243fc7480b721a4ed6623c72d07b86a508a1363a85f0f16451ab655ace8 - md5: ee605e794bdc14e2b7f84c4faa0d8c2c - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=13 - - libpciaccess >=0.18,<0.19.0a0 - license: MIT - license_family: MIT - purls: [] - size: 303108 - timestamp: 1724719521496 -- kind: conda - name: libedit - version: 3.1.20191231 - build: he28a2e2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf - md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 - depends: - - libgcc-ng >=7.5.0 - - ncurses >=6.2,<7.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 123878 - timestamp: 1597616541093 -- kind: conda - name: libegl - version: 1.7.0 - build: ha4b6fd6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_1.conda - sha256: e64388e983cf14354b70fe908ca3943f2481ea63df8a4de5e4d418dc2addd38e - md5: 38a5cd3be5fb620b48069e27285f1a44 - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_1 - license: LicenseRef-libglvnd - purls: [] - size: 44620 - timestamp: 1727968589748 -- kind: pypi - name: libensemble - version: 1.4.2+dev - path: . - sha256: 97a293c0deb2efb8e70565d867429996dff1ab2068f0b9e09ef8b39bd3d69934 - requires_python: '>=3.9' - editable: true -- kind: conda - name: libexpat - version: 2.6.3 - build: h5888daf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda - sha256: 4bb47bb2cd09898737a5211e2992d63c555d63715a07ba56eae0aff31fb89c22 - md5: 59f4c43bb1b5ef1c71946ff2cbf59524 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - expat 2.6.3.* - license: MIT - license_family: MIT - purls: [] - size: 73616 - timestamp: 1725568742634 -- kind: conda - name: libexpat - version: 2.6.3 - build: hac325c4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.3-hac325c4_0.conda - sha256: dd22dffad6731c352f4c14603868c9cce4d3b50ff5ff1e50f416a82dcb491947 - md5: c1db99b0a94a2f23bd6ce39e2d314e07 - depends: - - __osx >=10.13 - constrains: - - expat 2.6.3.* - license: MIT - license_family: MIT - purls: [] - size: 70517 - timestamp: 1725568864316 -- kind: conda - name: libexpat - version: 2.6.3 - build: hf9b8971_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - sha256: 5cbe5a199fba14ade55457a468ce663aac0b54832c39aa54470b3889b4c75c4a - md5: 5f22f07c2ab2dea8c66fe9585a062c96 - depends: - - __osx >=11.0 - constrains: - - expat 2.6.3.* - license: MIT - license_family: MIT - purls: [] - size: 63895 - timestamp: 1725568783033 -- kind: conda - name: libffi - version: 3.4.2 - build: h0d85af4_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f - md5: ccb34fb14960ad8b125962d3d79b31a9 - license: MIT - license_family: MIT - purls: [] - size: 51348 - timestamp: 1636488394370 -- kind: conda - name: libffi - version: 3.4.2 - build: h3422bc3_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca - md5: 086914b672be056eb70fd4285b6783b6 - license: MIT - license_family: MIT - purls: [] - size: 39020 - timestamp: 1636488587153 -- kind: conda - name: libffi - version: 3.4.2 - build: h7f98852_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - purls: [] - size: 58292 - timestamp: 1636488182923 -- kind: conda - name: libgcc - version: 14.2.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 - md5: 3cb76c3f10d3bc7f1105b2fc9db984df - depends: - - _libgcc_mutex 0.1 conda_forge - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.2.0 h77fa898_1 - - libgcc-ng ==14.2.0=*_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 848745 - timestamp: 1729027721139 -- kind: conda - name: libgcc-ng - version: 14.2.0 - build: h69a702a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 - md5: e39480b9ca41323497b05492a63bc35b - depends: - - libgcc 14.2.0 h77fa898_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 54142 - timestamp: 1729027726517 -- kind: conda - name: libgfortran - version: 5.0.0 - build: 13_2_0_h97931a8_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - sha256: 4874422e567b68334705c135c17e5acdca1404de8255673ce30ad3510e00be0d - md5: 0b6e23a012ee7a9a5f6b244f5a92c1d5 - depends: - - libgfortran5 13.2.0 h2873a65_3 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 110106 - timestamp: 1707328956438 -- kind: conda - name: libgfortran - version: 5.0.0 - build: 13_2_0_hd922786_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b - md5: 4a55d9e169114b2b90d3ec4604cd7bbf - depends: - - libgfortran5 13.2.0 hf226fd6_3 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 110233 - timestamp: 1707330749033 -- kind: conda - name: libgfortran - version: 14.2.0 - build: h69a702a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 - md5: f1fd30127802683586f768875127a987 - depends: - - libgfortran5 14.2.0 hd5240d6_1 - constrains: - - libgfortran-ng ==14.2.0=*_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 53997 - timestamp: 1729027752995 -- kind: conda - name: libgfortran5 - version: 13.2.0 - build: h2873a65_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - sha256: da3db4b947e30aec7596a3ef92200d17e774cccbbf7efc47802529a4ca5ca31b - md5: e4fb4d23ec2870ff3c40d10afe305aec - depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 5.0.0 13_2_0_*_3 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 1571379 - timestamp: 1707328880361 -- kind: conda - name: libgfortran5 - version: 13.2.0 - build: hf226fd6_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a - md5: 66ac81d54e95c534ae488726c1f698ea - depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 5.0.0 13_2_0_*_3 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 997381 - timestamp: 1707330687590 -- kind: conda - name: libgfortran5 - version: 14.2.0 - build: hd5240d6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - sha256: d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d - md5: 9822b874ea29af082e5d36098d25427d - depends: - - libgcc >=14.2.0 - constrains: - - libgfortran 14.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 1462645 - timestamp: 1729027735353 -- kind: conda - name: libgl - version: 1.7.0 - build: ha4b6fd6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda - sha256: 2de573a2231d0ffa13242e274d33b7bae88fb0a178392fd4a03cf803a47e4051 - md5: 204892bce2e44252b5cf272712f10bdd - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_1 - - libglx 1.7.0 ha4b6fd6_1 - license: LicenseRef-libglvnd - purls: [] - size: 134476 - timestamp: 1727968620103 -- kind: conda - name: libglib - version: 2.82.2 - build: h2ff4ddf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda - sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 - md5: 13e8e54035ddd2b91875ba399f0f7c04 - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - libiconv >=1.17,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.44,<10.45.0a0 - constrains: - - glib 2.82.2 *_0 - license: LGPL-2.1-or-later - purls: [] - size: 3931898 - timestamp: 1729191404130 -- kind: conda - name: libglvnd - version: 1.7.0 - build: ha4b6fd6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda - sha256: 67942c2b6e4ddb705640b5db962e678f17d8305df5c1633e939cef1158a95058 - md5: 1ece2ccb1dc8c68639712b05e0fae070 - depends: - - __glibc >=2.17,<3.0.a0 - license: LicenseRef-libglvnd - purls: [] - size: 132216 - timestamp: 1727968577428 -- kind: conda - name: libglx - version: 1.7.0 - build: ha4b6fd6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda - sha256: facc239145719034f7b8815d9630032e701d26534dae28303cdbae8b19590a82 - md5: 80a57756c545ad11f9847835aa21e6b2 - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_1 - - xorg-libx11 >=1.8.10,<2.0a0 - license: LicenseRef-libglvnd - purls: [] - size: 77902 - timestamp: 1727968607539 -- kind: conda - name: libgomp - version: 14.2.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 - md5: cc3573974587f12dda90d96e3e55a702 - depends: - - _libgcc_mutex 0.1 conda_forge - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 460992 - timestamp: 1729027639220 -- kind: conda - name: libiconv - version: '1.17' - build: h0d3ecfb_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 - md5: 69bda57310071cf6d2b86caf11573d2d - license: LGPL-2.1-only - purls: [] - size: 676469 - timestamp: 1702682458114 -- kind: conda - name: libiconv - version: '1.17' - build: hd590300_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 - md5: d66573916ffcf376178462f1b61c941e - depends: - - libgcc-ng >=12 - license: LGPL-2.1-only - purls: [] - size: 705775 - timestamp: 1702682170569 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: h0dc2134_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - sha256: d9572fd1024adc374aae7c247d0f29fdf4b122f1e3586fe62acc18067f40d02f - md5: 72507f8e3961bc968af17435060b6dd6 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - purls: [] - size: 579748 - timestamp: 1694475265912 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: hb547adb_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 - md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - purls: [] - size: 547541 - timestamp: 1694475104253 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f - md5: ea25936bb4080d843790b586850f82b8 - depends: - - libgcc-ng >=12 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - purls: [] - size: 618575 - timestamp: 1694474974816 -- kind: conda - name: liblapack - version: 3.9.0 - build: 25_linux64_openblas - build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - sha256: 9d1ff017714edb2d84868f0f931a4a0e7c289a971062b2ac66cfc8145df7e20e - md5: 4dc03a53fc69371a6158d0ed37214cd3 - depends: - - libblas 3.9.0 25_linux64_openblas - constrains: - - liblapacke 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - blas * openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15608 - timestamp: 1729642910812 -- kind: conda - name: liblapack - version: 3.9.0 - build: 25_osx64_openblas - build_number: 25 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-25_osx64_openblas.conda - sha256: 2a9a6143d103e7e21511cbf439521645bdd506bfabfcac9d6398dd0562c6905c - md5: dda0e24b4605ebbd381e48606a107bed - depends: - - libblas 3.9.0 25_osx64_openblas - constrains: - - liblapacke 3.9.0 25_osx64_openblas - - blas * openblas - - libcblas 3.9.0 25_osx64_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15852 - timestamp: 1729643174413 -- kind: conda - name: liblapack - version: 3.9.0 - build: 25_osxarm64_openblas - build_number: 25 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-25_osxarm64_openblas.conda - sha256: fdd742407672a9af20e70764550cf18b3ab67f12e48bf04163b90492fbc401e7 - md5: 19bbddfec972d401838330453186108d - depends: - - libblas 3.9.0 25_osxarm64_openblas - constrains: - - blas * openblas - - liblapacke 3.9.0 25_osxarm64_openblas - - libcblas 3.9.0 25_osxarm64_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 15823 - timestamp: 1729643275943 -- kind: conda - name: libllvm19 - version: 19.1.3 - build: ha7bfdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.3-ha7bfdaf_0.conda - sha256: 44502d37011472549367110a58ea78ff6c627f9436d1e4ebb5b34f80763dbf2a - md5: 8bd654307c455162668cd66e36494000 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - libxml2 >=2.13.4,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 40124530 - timestamp: 1730301303455 -- kind: conda - name: libllvm19 - version: 19.1.3 - build: haf57ff0_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.3-haf57ff0_0.conda - sha256: 174e24adb8bf5e55c6871057c6ac6aace11a043afd0528a7314c4f641c176444 - md5: 25dd0e37da590d639d35e1b6a66a4a96 - depends: - - __osx >=11.0 - - libcxx >=17 - - libxml2 >=2.13.4,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 26881534 - timestamp: 1730291029268 -- kind: conda - name: libnsl - version: 2.0.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 - md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 - depends: - - libgcc-ng >=12 - license: LGPL-2.1-only - license_family: GPL - purls: [] - size: 33408 - timestamp: 1697359010159 -- kind: conda - name: libntlm - version: '1.4' - build: h7f98852_1002 - build_number: 1002 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2 - sha256: 63244b73156033ea3b7c2a1581526e79b4670349d64b15f645dcdb12de441d1a - md5: e728e874159b042d92b90238a3cb0dc2 - depends: - - libgcc-ng >=9.3.0 - license: LGPL-2.1-or-later - purls: [] - size: 33201 - timestamp: 1609781914458 -- kind: conda - name: libopenblas - version: 0.3.28 - build: openmp_hbf64a52_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_hbf64a52_1.conda - sha256: cef5856952688ce9303f85f5bc62c99e8c2256b4c679f63afdfb381f222e90c7 - md5: cd2c572c02a73b88c4d378eb31110e85 - depends: - - __osx >=10.13 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - llvm-openmp >=18.1.8 - constrains: - - openblas >=0.3.28,<0.3.29.0a0 - license: BSD-3-Clause - purls: [] - size: 6165715 - timestamp: 1730773348340 -- kind: conda - name: libopenblas - version: 0.3.28 - build: openmp_hf332438_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda - sha256: 62bb669c37a845129096f73d446cdb6bb170e4927f2fea2b661329680dbbc373 - md5: 40803a48d947c8639da6704e9a44d3ce - depends: - - __osx >=11.0 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - llvm-openmp >=18.1.8 - constrains: - - openblas >=0.3.28,<0.3.29.0a0 - license: BSD-3-Clause - purls: [] - size: 4165774 - timestamp: 1730772154295 -- kind: conda - name: libopenblas - version: 0.3.28 - build: pthreads_h94d23a6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe - md5: 62857b389e42b36b686331bec0922050 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.2.0 - constrains: - - openblas >=0.3.28,<0.3.29.0a0 - license: BSD-3-Clause - purls: [] - size: 5578513 - timestamp: 1730772671118 -- kind: conda - name: libopengl - version: 1.7.0 - build: ha4b6fd6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_1.conda - sha256: b367afa1b63462b7bd64101dc8156470e9932a3f703c3423be26dd5a539a2ec2 - md5: e12057a66af8f2a38a839754ca4481e9 - depends: - - __glibc >=2.17,<3.0.a0 - - libglvnd 1.7.0 ha4b6fd6_1 - license: LicenseRef-libglvnd - purls: [] - size: 50219 - timestamp: 1727968613527 -- kind: conda - name: libpciaccess - version: '0.18' - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda - sha256: c0a30ac74eba66ea76a4f0a39acc7833f5ed783a632ca3bb6665b2d81aabd2fb - md5: 48f4330bfcd959c3cfb704d424903c82 - depends: - - libgcc-ng >=12 - license: MIT - license_family: MIT - purls: [] - size: 28361 - timestamp: 1707101388552 -- kind: conda - name: libpng - version: 1.6.44 - build: h4b8f8c9_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.44-h4b8f8c9_0.conda - sha256: 12b44e58f8832798d7a5c0a7480c95e905dbd6c3558dec09739062411f9e08d1 - md5: f32ac2c8dd390dbf169f550887ed09d9 - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement - purls: [] - size: 268073 - timestamp: 1726234803010 -- kind: conda - name: libpng - version: 1.6.44 - build: hadc24fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 - md5: f4cc49d7aa68316213e4b12be35308d1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement - purls: [] - size: 290661 - timestamp: 1726234747153 -- kind: conda - name: libpng - version: 1.6.44 - build: hc14010f_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - sha256: 38f8759a3eb8060deabd4db41f0f023514d853e46ddcbd0ba21768fc4e563bb1 - md5: fb36e93f0ea6a6f5d2b99984f34b049e - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement - purls: [] - size: 263385 - timestamp: 1726234714421 -- kind: conda - name: libpq - version: '17.0' - build: h04577a9_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda - sha256: 2f7e72e32f495cfb0492b8091d97dbe1c0700428fe167f3a781bb46e88dee4e5 - md5: 392cae2a58fbcb9db8c2147c6d6d1620 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=75.1,<76.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - openldap >=2.6.8,<2.7.0a0 - - openssl >=3.3.2,<4.0a0 - license: PostgreSQL - purls: [] - size: 2602277 - timestamp: 1729085182543 -- kind: conda - name: libsqlite - version: 3.47.0 - build: h2f8c449_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda - sha256: a0f7381c867898a45018b1e5cf1aca68659d292d58252e8f489a4270b010fed8 - md5: af445c495253a871c3d809e1199bb12b - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: Unlicense - purls: [] - size: 915300 - timestamp: 1730208101739 -- kind: conda - name: libsqlite - version: 3.47.0 - build: hadc24fc_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 - md5: b6f02b52a174e612e89548f4663ce56a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - license: Unlicense - purls: [] - size: 875349 - timestamp: 1730208050020 -- kind: conda - name: libsqlite - version: 3.47.0 - build: hbaaea75_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda - sha256: 5a96caa566c11e5a5ebdcdb86a0759a7fb27d3c5f42e6a0fd0d6023c1e935d9e - md5: 07a14fbe439eef078cc479deca321161 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: Unlicense - purls: [] - size: 837683 - timestamp: 1730208293578 -- kind: conda - name: libstdcxx - version: 14.2.0 - build: hc0a3c3a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 - md5: 234a5554c53625688d51062645337328 - depends: - - libgcc 14.2.0 h77fa898_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 3893695 - timestamp: 1729027746910 -- kind: conda - name: libstdcxx-ng - version: 14.2.0 - build: h4852527_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 - md5: 8371ac6457591af2cf6159439c1fd051 - depends: - - libstdcxx 14.2.0 hc0a3c3a_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 54105 - timestamp: 1729027780628 -- kind: conda - name: libtiff - version: 4.7.0 - build: h583c2ba_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-h583c2ba_1.conda - sha256: 4d58c695dfed6f308d0fd3ff552e0078bb98bc0be2ea0bf55820eb6e86fa5355 - md5: 4b78bcdcc8780cede8b3d090deba874d - depends: - - __osx >=10.13 - - lerc >=4.0.0,<5.0a0 - - libcxx >=17 - - libdeflate >=1.22,<1.23.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND - purls: [] - size: 395980 - timestamp: 1728232302162 -- kind: conda - name: libtiff - version: 4.7.0 - build: he137b08_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - sha256: 9890121db85f6ef463fe12eb04ef1471176e3ef3b5e2d62e8d6dac713df00df4 - md5: 63872517c98aa305da58a757c443698e - depends: - - __glibc >=2.17,<3.0.a0 - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.22,<1.23.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libstdcxx >=13 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND - purls: [] - size: 428156 - timestamp: 1728232228989 -- kind: conda - name: libtiff - version: 4.7.0 - build: hfce79cd_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - sha256: 97ba24c74750b6e731b3fe0d2a751cda6148b4937d2cc3f72d43bf7b3885c39d - md5: b9abf45f7c64caf3303725f1aa0e9a4d - depends: - - __osx >=11.0 - - lerc >=4.0.0,<5.0a0 - - libcxx >=17 - - libdeflate >=1.22,<1.23.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND - purls: [] - size: 366323 - timestamp: 1728232400072 -- kind: conda - name: libuuid - version: 2.38.1 - build: h0b41bf4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 - md5: 40b61aab5c7ba9ff276c41cfffe6b80b - depends: - - libgcc-ng >=12 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 33601 - timestamp: 1680112270483 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: h10d778d_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - sha256: 7bafd8f4c637778cd0aa390bf3a894feef0e1fcf6ea6000c7ffc25c4c5a65538 - md5: b2c0047ea73819d992484faacbbe1c24 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 355099 - timestamp: 1713200298965 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: h93a5062_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - sha256: 0d4bad713a512d79bfeb4d61821f447afab8b0792aca823f505ce6b195e9fde5 - md5: c0af0edfebe780b19940e94871f1a765 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 287750 - timestamp: 1713200194013 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f - md5: b26e8aa824079e1be0294e7152ca4559 - depends: - - libgcc-ng >=12 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 438953 - timestamp: 1713199854503 -- kind: conda - name: libxcb - version: 1.17.0 - build: h8a09558_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa - md5: 92ed62436b625154323d40d5f2f11dd7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp - license: MIT - license_family: MIT - purls: [] - size: 395888 - timestamp: 1727278577118 -- kind: conda - name: libxcb - version: 1.17.0 - build: hdb1d25a_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 - md5: af523aae2eca6dfa1c8eec693f5b9a79 - depends: - - __osx >=11.0 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp - license: MIT - license_family: MIT - purls: [] - size: 323658 - timestamp: 1727278733917 -- kind: conda - name: libxcb - version: 1.17.0 - build: hf1f96e2_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - sha256: 8896cd5deff6f57d102734f3e672bc17120613647288f9122bec69098e839af7 - md5: bbeca862892e2898bdb45792a61c4afc - depends: - - __osx >=10.13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp - license: MIT - license_family: MIT - purls: [] - size: 323770 - timestamp: 1727278927545 -- kind: conda - name: libxcrypt - version: 4.4.36 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 100393 - timestamp: 1702724383534 -- kind: conda - name: libxkbcommon - version: 1.7.0 - build: h2c5496b_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda - sha256: 6804c2a7062d10de6f159f7106dc45ebccc8d42bfb925f7919e26e567fa6da6b - md5: e2eaefa4de2b7237af7c907b8bbc760a - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libxcb >=1.16,<2.0.0a0 - - libxml2 >=2.12.7,<3.0a0 - - xkeyboard-config - - xorg-libxau >=1.0.11,<2.0a0 - license: MIT/X11 Derivative - license_family: MIT - purls: [] - size: 593336 - timestamp: 1718819935698 -- kind: conda - name: libxml2 - version: 2.13.4 - build: h8424949_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.4-h8424949_2.conda - sha256: 51048cd9d4d7ab3ab440bac01d1db8193ae1bd3e9502cdf6792a69c792fec2e5 - md5: 3f0764c38bc02720231d49d6035531f2 - depends: - - __osx >=11.0 - - icu >=75.1,<76.0a0 - - libiconv >=1.17,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - license: MIT - license_family: MIT - purls: [] - size: 572400 - timestamp: 1730356085177 -- kind: conda - name: libxml2 - version: 2.13.4 - build: hb346dea_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.4-hb346dea_2.conda - sha256: a111cb7f2deb6e20ebb475e8426ce5291451476f55f0dec6c220aa51e5a5784f - md5: 69b90b70c434b916abf5a1d5ee5d55fb - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=75.1,<76.0a0 - - libgcc >=13 - - libiconv >=1.17,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - license: MIT - license_family: MIT - purls: [] - size: 690019 - timestamp: 1730355770718 -- kind: conda - name: libxslt - version: 1.1.39 - build: h76b75d6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda - sha256: 684e9b67ef7b9ca0ca993762eeb39705ec58e2e7f958555c758da7ef416db9f3 - md5: e71f31f8cfb0a91439f2086fc8aa0461 - depends: - - libgcc-ng >=12 - - libxml2 >=2.12.1,<3.0.0a0 - license: MIT - license_family: MIT - purls: [] - size: 254297 - timestamp: 1701628814990 -- kind: conda - name: libzlib - version: 1.3.1 - build: h8359307_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 46438 - timestamp: 1727963202283 -- kind: conda - name: libzlib - version: 1.3.1 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 60963 - timestamp: 1727963148474 -- kind: conda - name: libzlib - version: 1.3.1 - build: hd23fc13_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 - md5: 003a54a4e32b02f7355b50a837e699da - depends: - - __osx >=10.13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 57133 - timestamp: 1727963183990 -- kind: conda - name: llvm-openmp - version: 19.1.3 - build: hb52a8e5_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.3-hb52a8e5_0.conda - sha256: 49a8940e727aa82ee034fa9a60b3fcababec41b3192d955772aab635a5374b82 - md5: dd695d23e78d1ca4fecce969b1e1db61 - depends: - - __osx >=11.0 - constrains: - - openmp 19.1.3|19.1.3.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 280488 - timestamp: 1730364082380 -- kind: conda - name: llvm-openmp - version: 19.1.3 - build: hf78d878_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.3-hf78d878_0.conda - sha256: 3d28e9938ab1400322ba76968cdbee035009d611bbee94ec6b38a154551954b4 - md5: 18a8498d57d871da066beaa09263a638 - depends: - - __osx >=10.13 - constrains: - - openmp 19.1.3|19.1.3.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - size: 305524 - timestamp: 1730364180247 -- kind: conda - name: llvm-tools - version: 19.1.3 - build: h33d20e1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.3-h33d20e1_0.conda - sha256: 38936860554eaf27c2e61d65e7f120abf66e59a22a4808413eb72151fa831b18 - md5: 62c9438f3cfa5cf08b6f244d926d6485 - depends: - - __osx >=11.0 - - libllvm19 19.1.3 haf57ff0_0 - - llvm-tools-19 19.1.3 he407fa0_0 - constrains: - - llvmdev 19.1.3 - - clang 19.1.3 - - llvm 19.1.3 - - clang-tools 19.1.3 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 87828 - timestamp: 1730291457622 -- kind: conda - name: llvm-tools-19 - version: 19.1.3 - build: he407fa0_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.3-he407fa0_0.conda - sha256: 19b6708194555f98c6f5673c8d0578bc8ed260e5764bad301ce872cac95acee2 - md5: 510011573240bb7e0bba0d23f37860eb - depends: - - __osx >=11.0 - - libcxx >=17 - - libllvm19 19.1.3 haf57ff0_0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 15968990 - timestamp: 1730291403428 -- kind: conda - name: markdown-it-py - version: 3.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 - md5: 93a8e71256479c62074356ef6ebf501b - depends: - - mdurl >=0.1,<1 - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/markdown-it-py?source=hash-mapping - size: 64356 - timestamp: 1686175179621 -- kind: conda - name: markupsafe - version: 3.0.2 - build: py312h178313f_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda - sha256: 15f14ab429c846aacd47fada0dc4f341d64491e097782830f0906d00cb7b48b6 - md5: a755704ea0e2503f8c227d84829a8e81 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 24878 - timestamp: 1729351558563 -- kind: conda - name: markupsafe - version: 3.0.2 - build: py312ha0ccf2a_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312ha0ccf2a_0.conda - sha256: 360e958055f35e5087942b9c499eaafae984a951b84cf354ef7481a2806f340d - md5: c6ff9f291d011c9d4f0b840f49435c64 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 24495 - timestamp: 1729351534830 -- kind: conda - name: markupsafe - version: 3.0.2 - build: py312hbe3f5e4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312hbe3f5e4_0.conda - sha256: b2fb54718159055fdf89da7d9f0c6743ef84b31960617a56810920d17616d944 - md5: c6238833d7dc908ec295bc490b80d845 - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 23889 - timestamp: 1729351468966 -- kind: conda - name: matplotlib - version: 3.9.2 - build: py312h1f38498_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.9.2-py312h1f38498_1.conda - sha256: 6fb7dd99a9706290aa653afda9ce7d70c4218325cfb1670683c2ea74a220d8e5 - md5: 9b1d61b4967cbfcd4f97a5f6a2fc01bd - depends: - - matplotlib-base >=3.9.2,<3.9.3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - purls: [] - size: 8924 - timestamp: 1726165048680 -- kind: conda - name: matplotlib - version: 3.9.2 - build: py312h7900ff3_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.9.2-py312h7900ff3_1.conda - sha256: 36eba5fde11962133b469c4121d83e26fba48654ee8f5753e5ffaf36d8631c47 - md5: 07d5646ea9f22f4b1c46c2947d1b2f58 - depends: - - matplotlib-base >=3.9.2,<3.9.3.0a0 - - pyside6 >=6.7.2 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - purls: [] - size: 8821 - timestamp: 1726164949072 -- kind: conda - name: matplotlib - version: 3.9.2 - build: py312hb401068_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.9.2-py312hb401068_1.conda - sha256: 91866c86a6e5609a132902077b6d1dc322a1bba7dd85dcea4d0bbfbdf5748437 - md5: 522402426e34fce47653fd99ffc40a22 - depends: - - matplotlib-base >=3.9.2,<3.9.3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tornado >=5 - license: PSF-2.0 - license_family: PSF - purls: [] - size: 8847 - timestamp: 1726165120341 -- kind: conda - name: matplotlib-base - version: 3.9.2 - build: py312h30cc4df_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.9.2-py312h30cc4df_1.conda - sha256: 2f8f222cebd8c5aa3d3878496bdfb976acedf7aad0cf4abce1c919d03b57c7ee - md5: 0cca3ae643d5cbfe380fda45bd55e001 - depends: - - __osx >=10.13 - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libcxx >=17 - - numpy >=1.19,<3 - - numpy >=1.23 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - qhull >=2020.2,<2020.3.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - size: 7678288 - timestamp: 1726165095191 -- kind: conda - name: matplotlib-base - version: 3.9.2 - build: py312h9bd0bc6_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.9.2-py312h9bd0bc6_1.conda - sha256: b3289cea8de29ba5b9fb437d3e4e32d2cbf88998890378a4e729c5be08e1ba41 - md5: b6a861da93e2f4fcecdb01ff7b8fc160 - depends: - - __osx >=11.0 - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libcxx >=17 - - numpy >=1.19,<3 - - numpy >=1.23 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - qhull >=2020.2,<2020.3.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - size: 7790076 - timestamp: 1726165022207 -- kind: conda - name: matplotlib-base - version: 3.9.2 - build: py312hd3ec401_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda - sha256: 3efd50d9b7b0f1b30611585810d4ae7566d7c860c101f47ec9372f6d4a80d040 - md5: 2f4f3854f23be30de29e9e4d39758349 - depends: - - __glibc >=2.17,<3.0.a0 - - certifi >=2020.06.20 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - freetype >=2.12.1,<3.0a0 - - kiwisolver >=1.3.1 - - libgcc >=13 - - libstdcxx >=13 - - numpy >=1.19,<3 - - numpy >=1.23 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - qhull >=2020.2,<2020.3.0a0 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - size: 7892651 - timestamp: 1726164930325 -- kind: conda - name: mccabe - version: 0.7.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mccabe-0.7.0-pyhd8ed1ab_0.tar.bz2 - sha256: 0466ad9490b761e9a8c57fab574fc099136b45fa19a0746ce33acdeb2a84766b - md5: 34fc335fc50eef0b5ea708f2b5f54e0c - depends: - - python >=3.6 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mccabe?source=hash-mapping - size: 10909 - timestamp: 1643049714491 -- kind: conda - name: mdurl - version: 0.1.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 - md5: 776a8dd9e824f77abac30e6ef43a8f7a - depends: - - python >=3.6 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mdurl?source=hash-mapping - size: 14680 - timestamp: 1704317789138 -- kind: conda - name: mock - version: 5.1.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda - sha256: c83ca0a2f3bdcaa3cec5d7b5c796748f66de530f7a2f1bdb27d3de424fb5b304 - md5: 926c67c0310094cf421ad13f7d3f38e5 - depends: - - python >=3.6 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/mock?source=hash-mapping - size: 33581 - timestamp: 1689092227859 -- kind: conda - name: mpi - version: 1.0.1 - build: mpich - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-mpich.conda - sha256: eacc189267202669a1c5c849dcca2298f41acb3918f05cf912d7d61ee7176fac - md5: 1052de900d672ec8b3713b8e300a8f06 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6522 - timestamp: 1727683134241 -- kind: conda - name: mpi4py - version: 4.0.1 - build: py312h017ff69_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/mpi4py-4.0.1-py312h017ff69_0.conda - sha256: 34643576ee47c882e98362c8ed68867fe0b2ec6a4ceae3c51e72d926bc39f5be - md5: bf13ed584249c31155d8e6ebeb768437 - depends: - - __osx >=10.13 - - mpich >=4.2.3,<5.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/mpi4py?source=hash-mapping - size: 750411 - timestamp: 1728738887286 -- kind: conda - name: mpi4py - version: 4.0.1 - build: py312h0a6c937_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.0.1-py312h0a6c937_0.conda - sha256: 77686b61cff83b5110b48b38d175e349a985d5a8a38b4f6e43f45b724a592630 - md5: 2ef9b8f9fc61ed32eec530e4e5855804 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - mpich >=4.2.3,<5.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/mpi4py?source=hash-mapping - size: 863274 - timestamp: 1728738980690 -- kind: conda - name: mpi4py - version: 4.0.1 - build: py312h5450814_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/mpi4py-4.0.1-py312h5450814_0.conda - sha256: fa3c1298781eb3e794a821314ad60444ecb174bd2f44031969e7de96308f3804 - md5: 0b6f0d22c2a9e77d0833043e8e8abf13 - depends: - - __osx >=11.0 - - mpich >=4.2.3,<5.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/mpi4py?source=hash-mapping - size: 711309 - timestamp: 1728738936102 -- kind: conda - name: mpich - version: 4.2.3 - build: h670b19f_100 - build_number: 100 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mpich-4.2.3-h670b19f_100.conda - sha256: 185c8ba393d559cdc92d5668efc0c47b3228b15e9047288d791eaf9097330f10 - md5: f20c61baae087e5092819cfed55ea861 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libgfortran - - libgfortran5 >=13.3.0 - - libstdcxx >=13 - - mpi 1.0.* mpich - license: LicenseRef-MPICH - license_family: Other - purls: [] - size: 13759543 - timestamp: 1727948359420 -- kind: conda - name: mpich - version: 4.2.3 - build: ha850315_100 - build_number: 100 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/mpich-4.2.3-ha850315_100.conda - sha256: b36604abd043ac83a41604e1b6af4e3fe6440df7bb4c5408f363bb9c9fc88841 - md5: b445812dc66fde076abd10c243662882 - depends: - - __osx >=10.13 - - libcxx >=17 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - mpi 1.0.* mpich - license: LicenseRef-MPICH - license_family: Other - purls: [] - size: 9212936 - timestamp: 1727948164224 -- kind: conda - name: mpich - version: 4.2.3 - build: he5dbaa7_100 - build_number: 100 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/mpich-4.2.3-he5dbaa7_100.conda - sha256: 3953146b98e9557ad825c6ab55c847a418717aed6e5b5fe3be846b6fd1f8858a - md5: e990510083600bc61e3c9a5615dcd412 - depends: - - __osx >=11.0 - - libcxx >=17 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - mpi 1.0.* mpich - license: LicenseRef-MPICH - license_family: Other - purls: [] - size: 5754558 - timestamp: 1727948143763 -- kind: conda - name: mpmath - version: 1.3.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda - sha256: a4f025c712ec1502a55c471b56a640eaeebfce38dd497d5a1a33729014cac47a - md5: dbf6e2d89137da32fa6670f3bffc024e - depends: - - python >=3.6 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/mpmath?source=hash-mapping - size: 438339 - timestamp: 1678228210181 -- kind: conda - name: munkres - version: 1.1.4 - build: pyh9f0ad1d_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 - md5: 2ba8498c1018c1e9c61eb99b973dfe19 - depends: - - python - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/munkres?source=hash-mapping - size: 12452 - timestamp: 1600387789153 -- kind: conda - name: mysql-common - version: 9.0.1 - build: h266115a_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda - sha256: bf0c230c35ca70e2c98530eb064a99f0c4d4596793a0be3ca8a3cbd92094ef82 - md5: 85c0dc0bcd110c998b01856975486ee7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.3.2,<4.0a0 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - size: 649443 - timestamp: 1729804130603 -- kind: conda - name: mysql-libs - version: 9.0.1 - build: he0572af_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda - sha256: e376189cd11304f4089971b372dac8a1cbbab6eacda8ca978ead2c220d16b8a4 - md5: 57a9e7ee3c0840d3c8c9012473978629 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - mysql-common 9.0.1 h266115a_2 - - openssl >=3.3.2,<4.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - size: 1372671 - timestamp: 1729804203990 -- kind: conda - name: ncurses - version: '6.5' - build: h7bae524_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc - md5: cb2b0ea909b97b3d70cd3921d1445e1a - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - purls: [] - size: 802321 - timestamp: 1724658775723 -- kind: conda - name: ncurses - version: '6.5' - build: he02047a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a - md5: 70caf8bb6cf39a0b6b7efc885f51c0fe - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - purls: [] - size: 889086 - timestamp: 1724658547447 -- kind: conda - name: ncurses - version: '6.5' - build: hf036a51_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af - md5: e102bbf8a6ceeaf429deab8032fc8977 - depends: - - __osx >=10.13 - license: X11 AND BSD-3-Clause - purls: [] - size: 822066 - timestamp: 1724658603042 -- kind: conda - name: nlopt - version: 2.8.0 - build: py312h314ef60_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/nlopt-2.8.0-py312h314ef60_2.conda - sha256: 489006fc82a81927c085918f27cdcb21fcea155b23b0fa1e09e79d1ab8a14aeb - md5: c348dd603f53faa384fee46aa00e8273 - depends: - - __osx >=10.13 - - libcxx >=17 - - numpy >=1.19,<3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: LGPL-2.1-or-later - purls: - - pkg:pypi/nlopt?source=hash-mapping - size: 385554 - timestamp: 1725348701333 -- kind: conda - name: nlopt - version: 2.8.0 - build: py312h69683c5_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/nlopt-2.8.0-py312h69683c5_2.conda - sha256: 22a30934649cabd7b20a9f17062543ca610c0e3840c7679999b7299ed2be073c - md5: 8582b8ef6a808ace0bfb83213ac54d54 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - numpy >=1.19,<3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: LGPL-2.1-or-later - purls: - - pkg:pypi/nlopt?source=hash-mapping - size: 402249 - timestamp: 1725348631250 -- kind: conda - name: nlopt - version: 2.8.0 - build: py312h857dc0a_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/nlopt-2.8.0-py312h857dc0a_2.conda - sha256: 93cc96f7f885b719639c4f3c0de0f4c35c8228865e1a7adb01126f1da9fa5a6c - md5: 43ff4f0c457575783aefdaeda1356c64 - depends: - - __osx >=11.0 - - libcxx >=17 - - numpy >=1.19,<3 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: LGPL-2.1-or-later - purls: - - pkg:pypi/nlopt?source=hash-mapping - size: 322857 - timestamp: 1725348697612 -- kind: conda - name: nodeenv - version: 1.9.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - sha256: 85ee07342ab055dc081f3de8292c5e7195e43e046db9c5750f242f928f6bb8f2 - md5: dfe0528d0f1c16c1f7c528ea5536ab30 - depends: - - python 2.7|>=3.7 - - setuptools - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/nodeenv?source=hash-mapping - size: 34489 - timestamp: 1717585382642 -- kind: conda - name: numpy - version: 2.1.3 - build: py312h58c1407_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.3-py312h58c1407_0.conda - sha256: e4c14f71588a5627a6935d3e7d9ca78a8387229ec8ebc91616b0988ce57ba0dc - md5: dfdbc12e6d81889ba4c494a23f23eba8 - depends: - - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=13 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - size: 8388631 - timestamp: 1730588649810 -- kind: conda - name: numpy - version: 2.1.3 - build: py312h94ee1e1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.1.3-py312h94ee1e1_0.conda - sha256: cd287b6c270ee8af77d200c46d56fdfe1e2a9deeff68044439718b8d073214dd - md5: a2af54c86582e08718805c69af737897 - depends: - - __osx >=11.0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=18 - - liblapack >=3.9.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - size: 6398123 - timestamp: 1730588490904 -- kind: conda - name: numpy - version: 2.1.3 - build: py312hfc93d17_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.1.3-py312hfc93d17_0.conda - sha256: 2f120e958da2d6ab7e4785a42515b4f65f70422b8b722e1a75654962fcfb26e9 - md5: 011118baf131914d1cb48e07317f0946 - depends: - - __osx >=10.13 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=18 - - liblapack >=3.9.0,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - size: 7538388 - timestamp: 1730588494493 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h488ebb8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 - md5: 7f2e286780f072ed750df46dc2631138 - depends: - - libgcc-ng >=12 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 341592 - timestamp: 1709159244431 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h7310d3a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - sha256: dc9c405119b9b54f8ca5984da27ba498bd848ab4f0f580da6f293009ca5adc13 - md5: 05a14cc9d725dd74995927968d6547e3 - depends: - - libcxx >=16 - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 331273 - timestamp: 1709159538792 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h9f1df11_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - sha256: 472d6eaffc1996e6af35ec8e91c967f472a536a470079bfa56383cc0dbf4d463 - md5: 5029846003f0bc14414b9128a1f7c84b - depends: - - libcxx >=16 - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 316603 - timestamp: 1709159627299 -- kind: conda - name: openldap - version: 2.6.8 - build: hedd0468_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda - sha256: 902652f7a106caa6ea9db2c44118078e23a499bf091ce8ea01d8498c156e8219 - md5: dcd0ed5147d8876b0848a552b416ce76 - depends: - - cyrus-sasl >=2.1.27,<3.0a0 - - krb5 >=1.21.2,<1.22.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.0,<4.0a0 - license: OLDAP-2.8 - license_family: BSD - purls: [] - size: 780492 - timestamp: 1716377814828 -- kind: conda - name: openssl - version: 3.3.2 - build: h8359307_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - sha256: 940fa01c4dc6152158fe8943e05e55a1544cab639df0994e3b35937839e4f4d1 - md5: 1773ebccdc13ec603356e8ff1db9e958 - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2882450 - timestamp: 1725410638874 -- kind: conda - name: openssl - version: 3.3.2 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda - sha256: cee91036686419f6dd6086902acf7142b4916e1c4ba042e9ca23e151da012b6d - md5: 4d638782050ab6faa27275bed57e9b4e - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=13 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2891789 - timestamp: 1725410790053 -- kind: conda - name: openssl - version: 3.3.2 - build: hd23fc13_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.2-hd23fc13_0.conda - sha256: 2b75d4b56e45992adf172b158143742daeb316c35274b36f385ccb6644e93268 - md5: 2ff47134c8e292868a4609519b1ea3b6 - depends: - - __osx >=10.13 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2544654 - timestamp: 1725410973572 -- kind: conda - name: packaging - version: '24.1' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - sha256: 36aca948219e2c9fdd6d80728bcc657519e02f06c2703d8db3446aec67f51d81 - md5: cbe1bb1f21567018ce595d9c2be0f0db - depends: - - python >=3.8 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/packaging?source=hash-mapping - size: 50290 - timestamp: 1718189540074 -- kind: conda - name: pcre2 - version: '10.44' - build: hba22ea6_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d - md5: df359c09c41cd186fffb93a2d87aa6f5 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - libgcc-ng >=12 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 952308 - timestamp: 1723488734144 -- kind: conda - name: pillow - version: 11.0.0 - build: py312h66fe14f_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pillow-11.0.0-py312h66fe14f_0.conda - sha256: 5e531eded0bb784c745abe3a1187c6c33478e153755bf8a8496aebff60801150 - md5: 1e49b81b5aae7af9d74bcdac0cd0d174 - depends: - - __osx >=10.13 - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - size: 42189378 - timestamp: 1729065985392 -- kind: conda - name: pillow - version: 11.0.0 - build: py312h7b63e92_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - sha256: 13a464bea02c0df0199c20ef6bad24a6bc336aaf55bf8d6a133d0fe664463224 - md5: 385f46a4df6f97892503a841121a9acf - depends: - - __glibc >=2.17,<3.0.a0 - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - size: 41948418 - timestamp: 1729065846594 -- kind: conda - name: pillow - version: 11.0.0 - build: py312haf37ca6_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda - sha256: 727b4c3faecdb6f6809cf20c5f32d2df4af34e0d5b9146b7588383bcba7990e8 - md5: dc9b51fbd2b6f7fea9b5123458864dbb - depends: - - __osx >=11.0 - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - size: 41737424 - timestamp: 1729065920347 -- kind: conda - name: pip - version: 24.3.1 - build: pyh8b19718_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 - md5: 5dd546fe99b44fda83963d15f84263b7 - depends: - - python >=3.8,<3.13.0a0 - - setuptools - - wheel - license: MIT - license_family: MIT - purls: - - pkg:pypi/pip?source=hash-mapping - size: 1243168 - timestamp: 1730203795600 -- kind: conda - name: pixman - version: 0.43.2 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - sha256: 366d28e2a0a191d6c535e234741e0cd1d94d713f76073d8af4a5ccb2a266121e - md5: 71004cbf7924e19c02746ccde9fd7123 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: MIT - license_family: MIT - purls: [] - size: 386826 - timestamp: 1706549500138 -- kind: conda - name: platformdirs - version: 4.3.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - sha256: c81bdeadc4adcda216b2c7b373f0335f5c78cc480d1d55d10f21823590d7e46f - md5: fd8f2b18b65bbf62e8f653100690c8d2 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/platformdirs?source=hash-mapping - size: 20625 - timestamp: 1726613611845 -- kind: conda - name: pluggy - version: 1.5.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 - md5: d3483c8fc2dc2cc3f5cf43e26d60cabf - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pluggy?source=hash-mapping - size: 23815 - timestamp: 1713667175451 -- kind: conda - name: pre-commit - version: 4.0.1 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda - sha256: 2490b18ec802d8f085f2de8298a3d275451f7db17769353080dfb121fe386675 - md5: 5971cc64048943605f352f7f8612de6c - depends: - - cfgv >=2.0.0 - - identify >=1.0.0 - - nodeenv >=0.11.1 - - python >=3.9 - - pyyaml >=5.1 - - virtualenv >=20.10.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pre-commit?source=hash-mapping - size: 194633 - timestamp: 1728420305558 -- kind: conda - name: psutil - version: 6.1.0 - build: py312h0bf5046_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.0-py312h0bf5046_0.conda - sha256: 143a40f9c72d803744ebd6a60801c5cd17af152b293f8d59e90111ce62b53569 - md5: 61566f5c6e1d29d1d12882eb93e28532 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/psutil?source=hash-mapping - size: 493431 - timestamp: 1729847279283 -- kind: conda - name: psutil - version: 6.1.0 - build: py312h3d0f464_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/psutil-6.1.0-py312h3d0f464_0.conda - sha256: a2c2d8a8665cce8a1c2b186b2580e1ef3e3414aa67b2d48ac46f0582434910c3 - md5: 1df95544dc6aeb33af591146f44d9293 - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/psutil?source=hash-mapping - size: 493463 - timestamp: 1729847222797 -- kind: conda - name: psutil - version: 6.1.0 - build: py312h66e93f0_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda - sha256: 0f309b435174e037d5cfe5ed26c1c5ad8152c68cfe61af17709ec31ec3d9f096 - md5: 0524eb91d3d78d76d671c6e3cd7cee82 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/psutil?source=hash-mapping - size: 488462 - timestamp: 1729847159916 -- kind: conda - name: pthread-stubs - version: '0.4' - build: h00291cd_1002 - build_number: 1002 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - sha256: 05944ca3445f31614f8c674c560bca02ff05cb51637a96f665cb2bbe496099e5 - md5: 8bcf980d2c6b17094961198284b8e862 - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 8364 - timestamp: 1726802331537 -- kind: conda - name: pthread-stubs - version: '0.4' - build: hb9d3cd8_1002 - build_number: 1002 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 - md5: b3c17d95b5a10c6e64a21fa17573e70e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 8252 - timestamp: 1726802366959 -- kind: conda - name: pthread-stubs - version: '0.4' - build: hd74edd7_1002 - build_number: 1002 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 - md5: 415816daf82e0b23a736a069a75e9da7 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 8381 - timestamp: 1726802424786 -- kind: conda - name: pybtex - version: 0.24.0 - build: pyhd8ed1ab_2 - build_number: 2 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2 - sha256: 258fbf46050bbd51fbaa504116e56e8f3064156f0e08cad4e2fec97f5f29e6dc - md5: 2099b86a7399c44c0c61cdb6de6915ba - depends: - - latexcodec >=1.0.4 - - python >=3.6 - - pyyaml >=3.01 - - setuptools - - six - license: MIT - license_family: MIT - purls: - - pkg:pypi/pybtex?source=hash-mapping - size: 72866 - timestamp: 1638467164424 -- kind: conda - name: pybtex-docutils - version: 1.0.3 - build: py312h7900ff3_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_2.conda - sha256: bf9c8f4c5282d46ce54bd2c6837fa5ff7a1c112382be3d13a7a0ae038d92b7c7 - md5: 0472f87b9dc0b1db7b501f4d814ba90b - depends: - - docutils >=0.14 - - pybtex >=0.16 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools - license: MIT - license_family: MIT - purls: - - pkg:pypi/pybtex-docutils?source=hash-mapping - size: 16629 - timestamp: 1725691821342 -- kind: conda - name: pybtex-docutils - version: 1.0.3 - build: py312h81bd7bf_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pybtex-docutils-1.0.3-py312h81bd7bf_2.conda - sha256: 246ff1b7cd335a5ffb60f180426d1f7c75b7abd04e8a54dfb95ac499b5bb8307 - md5: 573f5bef5c0b4ea1405e78e941a29284 - depends: - - docutils >=0.14 - - pybtex >=0.16 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - setuptools - license: MIT - license_family: MIT - purls: - - pkg:pypi/pybtex-docutils?source=hash-mapping - size: 17243 - timestamp: 1725691887793 -- kind: conda - name: pybtex-docutils - version: 1.0.3 - build: py312hb401068_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pybtex-docutils-1.0.3-py312hb401068_2.conda - sha256: b2668b6b195c2fbcdffddb98ebb489e77b21b96d35056a2f5eb6e36b7b3a3fbf - md5: 5becc4ce9642b93f69bcf091ce1f8104 - depends: - - docutils >=0.14 - - pybtex >=0.16 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools - license: MIT - license_family: MIT - purls: - - pkg:pypi/pybtex-docutils?source=hash-mapping - size: 16678 - timestamp: 1725691864150 -- kind: conda - name: pycodestyle - version: 2.12.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.1-pyhd8ed1ab_0.conda - sha256: ca548aa380edcc1a6e96893c0d870de9e22a7b0d4619ffa426875e6443a2044f - md5: 72453e39709f38d0494d096bb5f678b7 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pycodestyle?source=hash-mapping - size: 34215 - timestamp: 1722846854518 -- kind: conda - name: pycparser - version: '2.22' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 - md5: 844d9eb3b43095b031874477f7d70088 - depends: - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pycparser?source=hash-mapping - size: 105098 - timestamp: 1711811634025 -- kind: conda - name: pydantic - version: 2.9.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.9.2-pyhd8ed1ab_0.conda - sha256: 1b7b0dc9f6af4da156bf22b0263be70829364a08145c696d3670facff2f6441a - md5: 1eb533bb8eb2199e3fef3e4aa147319f - depends: - - annotated-types >=0.6.0 - - pydantic-core 2.23.4 - - python >=3.7 - - typing-extensions >=4.6.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic?source=hash-mapping - size: 300649 - timestamp: 1726601202431 -- kind: conda - name: pydantic-core - version: 2.23.4 - build: py312h12e396e_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.23.4-py312h12e396e_0.conda - sha256: 365fde689865087b2a9da636f36678bd59617b324ce7a538b4806e90602b20f1 - md5: 0845ab52d4ea209049129a6a91bc74ba - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.6.0,!=4.7.0 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic-core?source=hash-mapping - size: 1611784 - timestamp: 1726525286507 -- kind: conda - name: pydantic-core - version: 2.23.4 - build: py312h669792a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.23.4-py312h669792a_0.conda - sha256: 46b17406772d7403ce454c1005e493a2723a189403dd2a70a3566ac4b1f82a4a - md5: 14806afd8ed78812d83e8b9ea4b549c0 - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.6.0,!=4.7.0 - constrains: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic-core?source=hash-mapping - size: 1535259 - timestamp: 1726525537029 -- kind: conda - name: pydantic-core - version: 2.23.4 - build: py312he431725_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.23.4-py312he431725_0.conda - sha256: d6edd3d0f9e701c8299519d412ad3dc900c7d893a134f2582203cf43585decca - md5: 3148052477686acc581b20a34b478eeb - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.6.0,!=4.7.0 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pydantic-core?source=hash-mapping - size: 1431747 - timestamp: 1726525575527 -- kind: conda - name: pyflakes - version: 3.2.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.2.0-pyhd8ed1ab_0.conda - sha256: b1582410fcfa30b3597629e39b688ead87833c4a64f7c4637068f80aa1411d49 - md5: 0cf7fef6aa123df28adb21a590065e3d - depends: - - python ==2.7.*|>=3.5 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyflakes?source=hash-mapping - size: 58654 - timestamp: 1704424729210 -- kind: conda - name: pygments - version: 2.18.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b - md5: b7f5c092b8f9800150d998a71b76d5a1 - depends: - - python >=3.8 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/pygments?source=hash-mapping - size: 879295 - timestamp: 1714846885370 -- kind: conda - name: pyparsing - version: 3.2.0 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda - sha256: b846e3965cd106438cf0b9dc0de8d519670ac065f822a7d66862e9423e0229cb - md5: 035c17fbf099f50ff60bf2eb303b0a83 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyparsing?source=hash-mapping - size: 92444 - timestamp: 1728880549923 -- kind: conda - name: pyside6 - version: 6.8.0.2 - build: py312h91f0f75_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.8.0.2-py312h91f0f75_0.conda - sha256: 16309c16764c45e147f2eabbb6a064ac3e3d17e7e1b49110b14e13a8ed631276 - md5: ec3da81d5f9d3612b227e09a650f7bf2 - depends: - - __glibc >=2.17,<3.0.a0 - - libclang13 >=19.1.2 - - libegl >=1.7.0,<2.0a0 - - libgcc >=13 - - libgl >=1.7.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 - - libstdcxx >=13 - - libxml2 >=2.12.7,<3.0a0 - - libxslt >=1.1.39,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - qt6-main 6.8.0.* - - qt6-main >=6.8.0,<6.9.0a0 - license: LGPL-3.0-only - license_family: LGPL - purls: - - pkg:pypi/pyside6?source=hash-mapping - - pkg:pypi/shiboken6?source=hash-mapping - size: 10839502 - timestamp: 1730212750602 -- kind: conda - name: pysocks - version: 1.7.1 - build: pyha2e5f31_6 - build_number: 6 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b - md5: 2a7de29fb590ca14b5243c4c812c8025 - depends: - - __unix - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pysocks?source=hash-mapping - size: 18981 - timestamp: 1661604969727 -- kind: conda - name: pytest - version: 8.3.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 - md5: c03d61f31f38fdb9facf70c29958bf7a - depends: - - colorama - - exceptiongroup >=1.0.0rc8 - - iniconfig - - packaging - - pluggy <2,>=1.5 - - python >=3.8 - - tomli >=1 - constrains: - - pytest-faulthandler >=2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest?source=hash-mapping - size: 258293 - timestamp: 1725977334143 -- kind: conda - name: pytest-cov - version: 5.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda - sha256: 218306243faf3c36347131c2b36bb189daa948ac2e92c7ab52bb26cc8c157b3c - md5: c54c0107057d67ddf077751339ec2c63 - depends: - - coverage >=5.2.1 - - pytest >=4.6 - - python >=3.8 - - toml - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest-cov?source=hash-mapping - size: 25507 - timestamp: 1711411153367 -- kind: conda - name: pytest-timeout - version: 2.3.1 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.3.1-pyhd8ed1ab_1.conda - sha256: 501e2417f23596815aeb41ad3bc69016a59c9f5dab62860b8be41e006d538fe8 - md5: 27860d8e6cc9e14da4ea900788693e40 - depends: - - pytest >=7.0.0 - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest-timeout?source=hash-mapping - size: 19397 - timestamp: 1712277747247 -- kind: conda - name: python - version: 3.12.7 - build: h739c21a_0_cpython - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda - sha256: 45d7ca2074aa92594bd2f91a9003b338cc1df8a46b9492b7fc8167110783c3ef - md5: e0d82e57ebb456077565e6d82cd4a323 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 12975439 - timestamp: 1728057819519 -- kind: conda - name: python - version: 3.12.7 - build: h8f8b54e_0_cpython - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda - sha256: 28172d94f7193c5075c0fc3c4b1bb617c512ffc991f4e2af0dbb6a2916872b76 - md5: 7f81191b1ca1113e694e90e15c27a12f - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 13761315 - timestamp: 1728058247482 -- kind: conda - name: python - version: 3.12.7 - build: hc5c86c4_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - sha256: 674be31ff152d9f0e0fe16959a45e3803a730fc4f54d87df6a9ac4e6a698c41d - md5: 0515111a9cdf69f83278f7c197db9807 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 31574780 - timestamp: 1728059777603 -- kind: conda - name: python-dateutil - version: 2.9.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 - md5: 2cf4264fffb9e6eff6031c5b6884d61c - depends: - - python >=3.7 - - six >=1.5 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/python-dateutil?source=hash-mapping - size: 222742 - timestamp: 1709299922152 -- kind: conda - name: python_abi - version: '3.12' - build: 5_cp312 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 - md5: 0424ae29b104430108f5218a66db7260 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6238 - timestamp: 1723823388266 -- kind: conda - name: python_abi - version: '3.12' - build: 5_cp312 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda - sha256: 4da26c7508d5bc5d8621e84dc510284402239df56aab3587a7d217de9d3c806d - md5: c34dd4920e0addf7cfcc725809f25d8e - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6312 - timestamp: 1723823137004 -- kind: conda - name: python_abi - version: '3.12' - build: 5_cp312 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 - md5: b76f9b1c862128e56ac7aa8cd2333de9 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6278 - timestamp: 1723823099686 -- kind: conda - name: pytz - version: '2024.2' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda - sha256: 81c16d9183bb4a6780366ce874e567ee5fc903722f85b2f8d1d9479ef1dafcc9 - md5: 260009d03c9d5c0f111904d851f053dc - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytz?source=hash-mapping - size: 186995 - timestamp: 1726055625738 -- kind: conda - name: pyyaml - version: 6.0.2 - build: py312h024a12e_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda - sha256: b06f1c15fb39695bbf707ae8fb554b9a77519af577b5556784534c7db10b52e3 - md5: 1ee23620cf46cb15900f70a1300bae55 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - size: 187143 - timestamp: 1725456547263 -- kind: conda - name: pyyaml - version: 6.0.2 - build: py312h66e93f0_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda - sha256: a60705971e958724168f2ebbb8ed4853067f1d3f7059843df3903e3092bbcffa - md5: 549e5930e768548a89c23f595dac5a95 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - size: 206553 - timestamp: 1725456256213 -- kind: conda - name: pyyaml - version: 6.0.2 - build: py312hb553811_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.2-py312hb553811_1.conda - sha256: 455ce40588b35df654cb089d29cc3f0d3c78365924ffdfc6ee93dba80cea5f33 - md5: 66514594817d51c78db7109a23ad322f - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - size: 189347 - timestamp: 1725456465705 -- kind: conda - name: qhull - version: '2020.2' - build: h3c5361c_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - sha256: 79d804fa6af9c750e8b09482559814ae18cd8df549ecb80a4873537a5a31e06e - md5: dd1ea9ff27c93db7c01a7b7656bd4ad4 - depends: - - __osx >=10.13 - - libcxx >=16 - license: LicenseRef-Qhull - purls: [] - size: 528122 - timestamp: 1720814002588 -- kind: conda - name: qhull - version: '2020.2' - build: h420ef59_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 - md5: 6483b1f59526e05d7d894e466b5b6924 - depends: - - __osx >=11.0 - - libcxx >=16 - license: LicenseRef-Qhull - purls: [] - size: 516376 - timestamp: 1720814307311 -- kind: conda - name: qhull - version: '2020.2' - build: h434a139_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc - md5: 353823361b1d27eb3960efb076dfcaf6 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LicenseRef-Qhull - purls: [] - size: 552937 - timestamp: 1720813982144 -- kind: conda - name: qt6-main - version: 6.8.0 - build: h6e8976b_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.8.0-h6e8976b_0.conda - sha256: f21949a55d07f72f910b0256401ae7b666d04810d110236aee86063da7babc51 - md5: 6d1c5d2d904d24c17cbb538a95855a4e - depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.12,<1.3.0a0 - - dbus >=1.13.6,<2.0a0 - - double-conversion >=3.3.0,<3.4.0a0 - - fontconfig >=2.14.2,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 - - icu >=75.1,<76.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp19.1 >=19.1.0,<19.2.0a0 - - libclang13 >=19.1.0 - - libcups >=2.3.3,<2.4.0a0 - - libdrm >=2.4.123,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libgcc >=13 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.82.1,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libllvm19 >=19.1.0,<19.2.0a0 - - libpng >=1.6.44,<1.7.0a0 - - libpq >=17.0,<18.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libstdcxx >=13 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libxkbcommon >=1.7.0,<2.0a0 - - libxml2 >=2.12.7,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - mysql-libs >=9.0.1,<9.1.0a0 - - openssl >=3.3.2,<4.0a0 - - pcre2 >=10.44,<10.45.0a0 - - wayland >=1.23.1,<2.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - - xcb-util-cursor >=0.1.5,<0.2.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - xcb-util-keysyms >=0.4.1,<0.5.0a0 - - xcb-util-renderutil >=0.3.10,<0.4.0a0 - - xcb-util-wm >=0.4.2,<0.5.0a0 - - xorg-libice >=1.1.1,<2.0a0 - - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxcomposite >=0.4.6,<1.0a0 - - xorg-libxcursor >=1.2.2,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrandr >=1.5.4,<2.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - - xorg-libxxf86vm >=1.1.5,<2.0a0 - - zstd >=1.5.6,<1.6.0a0 - constrains: - - qt 6.8.0 - license: LGPL-3.0-only - license_family: LGPL - purls: [] - size: 51315820 - timestamp: 1728406028 -- kind: conda - name: readline - version: '8.2' - build: h8228510_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 - md5: 47d31b792659ce70f470b5c82fdfb7a4 - depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 281456 - timestamp: 1679532220005 -- kind: conda - name: readline - version: '8.2' - build: h92ec313_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 - md5: 8cbb776a2f641b943d413b3e19df71f4 - depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 250351 - timestamp: 1679532511311 -- kind: conda - name: readline - version: '8.2' - build: h9e318b2_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 - md5: f17f77f2acf4d344734bda76829ce14e - depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 255870 - timestamp: 1679532707590 -- kind: conda - name: requests - version: 2.32.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda - sha256: 5845ffe82a6fa4d437a2eae1e32a1ad308d7ad349f61e337c0a890fe04c513cc - md5: 5ede4753180c7a550a443c430dc8ab52 - depends: - - certifi >=2017.4.17 - - charset-normalizer >=2,<4 - - idna >=2.5,<4 - - python >=3.8 - - urllib3 >=1.21.1,<3 - constrains: - - chardet >=3.0.2,<6 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/requests?source=hash-mapping - size: 58810 - timestamp: 1717057174842 -- kind: conda - name: rich - version: 13.9.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 - md5: bcf8cc8924b5d20ead3d122130b8320b - depends: - - markdown-it-py >=2.2.0 - - pygments >=2.13.0,<3.0.0 - - python >=3.8 - - typing_extensions >=4.0.0,<5.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/rich?source=hash-mapping - size: 185481 - timestamp: 1730592349978 -- kind: conda - name: scipy - version: 1.14.1 - build: py312h20deb59_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.14.1-py312h20deb59_1.conda - sha256: 1a4d655609bad7dbdbe9f44ba37fd100d01fb8e4e7060dfaed3c4a044ab40052 - md5: c60ad657cccb6c2b97513f87ae27f47a - depends: - - __osx >=11.0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=17 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.3 - - numpy >=1.19,<3 - - numpy >=1.23.5 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - size: 15132713 - timestamp: 1729481799441 -- kind: conda - name: scipy - version: 1.14.1 - build: py312h62794b6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda - sha256: d069a64edade554261672d8febf4756aeb56a6cb44bd91844eaa944e5d9f4eb9 - md5: b43233a9e2f62fb94affe5607ea79473 - depends: - - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=13 - - libgfortran - - libgfortran5 >=13.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=13 - - numpy <2.3 - - numpy >=1.19,<3 - - numpy >=1.23.5 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - size: 17622722 - timestamp: 1729481826601 -- kind: conda - name: scipy - version: 1.14.1 - build: py312h888eae2_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.14.1-py312h888eae2_1.conda - sha256: 5a28ea91c935513e6c5f64baac5a02ce43d9ba183b98e20127220b207ec96529 - md5: ee7a4ffe9742d2df44caa858b36814b8 - depends: - - __osx >=10.13 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=17 - - libgfortran 5.* - - libgfortran5 >=13.2.0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.3 - - numpy >=1.19,<3 - - numpy >=1.23.5 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - size: 16032291 - timestamp: 1729481615781 -- kind: conda - name: setuptools - version: 75.3.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - sha256: a36d020b9f32fc3f1a6488a1c4a9c13988c6468faf6895bf30ca69521a61230e - md5: 2ce9825396daf72baabaade36cee16da - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/setuptools?source=hash-mapping - size: 779561 - timestamp: 1730382173961 -- kind: conda - name: sigtool - version: 0.1.3 - build: h44b9a77_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - sha256: 70791ae00a3756830cb50451db55f63e2a42a2fa2a8f1bab1ebd36bbb7d55bff - md5: 4a2cac04f86a4540b8c9b8d8f597848f - depends: - - openssl >=3.0.0,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 210264 - timestamp: 1643442231687 -- kind: conda - name: six - version: 1.16.0 - build: pyh6c4a22f_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 - md5: e5f25f8dbc060e9a8d912e432202afc2 - depends: - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/six?source=hash-mapping - size: 14259 - timestamp: 1620240338595 -- kind: conda - name: sniffio - version: 1.3.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - sha256: bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b - md5: 490730480d76cf9c8f8f2849719c6e2b - depends: - - python >=3.7 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/sniffio?source=hash-mapping - size: 15064 - timestamp: 1708953086199 -- kind: conda - name: snowballstemmer - version: 2.2.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2 - sha256: a0fd916633252d99efb6223b1050202841fa8d2d53dacca564b0ed77249d3228 - md5: 4d22a9315e78c6827f806065957d566e - depends: - - python >=2 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/snowballstemmer?source=hash-mapping - size: 58824 - timestamp: 1637143137377 -- kind: conda - name: sphinx - version: 8.1.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda - sha256: e9e3eaa7277934ba20314ffb92c941c4ec12c0c440e608b7b495c5ce579af1f7 - md5: 05706dd5a145a9c91861495cd435409a - depends: - - alabaster >=0.7.14 - - babel >=2.13 - - colorama >=0.4.6 - - docutils >=0.20,<0.22 - - imagesize >=1.3 - - jinja2 >=3.1 - - packaging >=23.0 - - pygments >=2.17 - - python >=3.10 - - requests >=2.30.0 - - snowballstemmer >=2.2 - - sphinxcontrib-applehelp >=1.0.7 - - sphinxcontrib-devhelp >=1.0.6 - - sphinxcontrib-htmlhelp >=2.0.6 - - sphinxcontrib-jsmath >=1.0.1 - - sphinxcontrib-qthelp >=1.0.6 - - sphinxcontrib-serializinghtml >=1.1.9 - - tomli >=2.0 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinx?source=hash-mapping - size: 1401233 - timestamp: 1728874101851 -- kind: conda - name: sphinx-copybutton - version: 0.5.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda - sha256: 7ea21f009792e7c69612ddba367afe0412b3fdff2e92f439e8cd222de4b40bfe - md5: ac832cc43adc79118cf6e23f1f9b8995 - depends: - - python >=3 - - sphinx >=1.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/sphinx-copybutton?source=hash-mapping - size: 17801 - timestamp: 1681468271927 -- kind: conda - name: sphinx-design - version: 0.6.1 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda - sha256: 3db5d78271e3b0761db591111153f80428733972cab0bfdcf24b352133c85de9 - md5: db0f1eb28b6df3a11e89437597309009 - depends: - - python >=3.9 - - sphinx >=6,<9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/sphinx-design?source=hash-mapping - size: 916271 - timestamp: 1724519188841 -- kind: conda - name: sphinx_rtd_theme - version: 3.0.1 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda - sha256: b81e8b0a66dcff33f308909940c9127e51536b99a51167f3e7266e65e3473f7d - md5: 740536f8a54250b1964e494c0bf5c9c3 - depends: - - docutils >0.18,<0.22 - - python >=3.8 - - sphinx >=6,<9 - - sphinxcontrib-jquery >=4,<5 - license: MIT - license_family: MIT - purls: - - pkg:pypi/sphinx-rtd-theme?source=hash-mapping - size: 4630230 - timestamp: 1730015354284 -- kind: conda - name: sphinxcontrib-applehelp - version: 2.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda - sha256: 8ac476358cf26098e3a360b2a9037bd809243f72934c103953e25f4fda4b9f31 - md5: 9075bd8c033f0257122300db914e49c9 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-applehelp?source=hash-mapping - size: 29617 - timestamp: 1722244567894 -- kind: conda - name: sphinxcontrib-bibtex - version: 2.6.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.6.3-pyhd8ed1ab_0.conda - sha256: 49bac08adb8ae32197c7b9b13219f91332b60e69771122f870c79abcf5611a55 - md5: 2925be8d19542dd116775f1b9c55bb50 - depends: - - docutils >=0.8,!=0.18.*,!=0.19.* - - importlib-metadata >=3.6 - - pybtex >=0.24 - - pybtex-docutils >=1.0.0 - - python >=3.7 - - sphinx >=3.5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-bibtex?source=hash-mapping - size: 32362 - timestamp: 1726176560542 -- kind: conda - name: sphinxcontrib-devhelp - version: 2.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda - sha256: 6790efe55f168816dfc9c14235054d5156e5150d28546c5baf2ff4973eff8f6b - md5: b3bcc38c471ebb738854f52a36059b48 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-devhelp?source=hash-mapping - size: 24138 - timestamp: 1722245127289 -- kind: conda - name: sphinxcontrib-htmlhelp - version: 2.1.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda - sha256: 55e14b77ed786ab6ff752b8d75f8448536f385ed250f432bd408d2eff5ea4a9e - md5: e25640d692c02e8acfff0372f547e940 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-htmlhelp?source=hash-mapping - size: 32798 - timestamp: 1722248429933 -- kind: conda - name: sphinxcontrib-jquery - version: '4.1' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda - sha256: 2e5f16a2d58f9a31443ffbb8ce3852cfccf533a6349045828cd2e994ef0679ca - md5: 914897066d5873acfb13e75705276ad1 - depends: - - python >=2.7 - - sphinx >=1.8 - license: 0BSD AND MIT - purls: - - pkg:pypi/sphinxcontrib-jquery?source=hash-mapping - size: 112985 - timestamp: 1678809100921 -- kind: conda - name: sphinxcontrib-jsmath - version: 1.0.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda - sha256: d4337d83b8edba688547766fc80f1ac86d6ec86ceeeda93f376acc04079c5ce2 - md5: da1d979339e2714c30a8e806a33ec087 - depends: - - python >=3.5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-jsmath?source=hash-mapping - size: 10431 - timestamp: 1691604844204 -- kind: conda - name: sphinxcontrib-qthelp - version: 2.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda - sha256: 7ae639b729844de2ec74dbaf1acccc14843868a82fa46cd2ceb735bc8266af5b - md5: d6e5ea5fe00164ac6c2dcc5d76a42192 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-qthelp?source=hash-mapping - size: 26794 - timestamp: 1722245959953 -- kind: conda - name: sphinxcontrib-serializinghtml - version: 1.1.10 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda - sha256: bf80e4c0ff97d5e8e5f6db0831ba60007e820a3a438e8f1afd868aa516d67d6f - md5: e507335cb4ca9cff4c3d0fa9cdab255e - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-serializinghtml?source=hash-mapping - size: 28776 - timestamp: 1705118378942 -- kind: conda - name: sphinxcontrib-spelling - version: 4.3.0 - build: py_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-spelling-4.3.0-py_0.tar.bz2 - sha256: f42a8bca7367bb87dd9148727439e549c50b3053b633e399e4848763bc6cded6 - md5: 4d07af45dbfeadfb1f890283b2f13453 - depends: - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-spelling?source=hash-mapping - size: 12351 - timestamp: 1561960104955 -- kind: conda - name: tapi - version: 1300.6.5 - build: h03f4b80_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda - sha256: 37cd4f62ec023df8a6c6f9f6ffddde3d6620a83cbcab170a8fff31ef944402e5 - md5: b703bc3e6cba5943acf0e5f987b5d0e2 - depends: - - __osx >=11.0 - - libcxx >=17.0.0.a0 - - ncurses >=6.5,<7.0a0 - license: NCSA - license_family: MIT - purls: [] - size: 207679 - timestamp: 1725491499758 -- kind: conda - name: tk - version: 8.6.13 - build: h1abcd95_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 - md5: bf830ba5afc507c6232d4ef0fb1a882d - depends: - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3270220 - timestamp: 1699202389792 -- kind: conda - name: tk - version: 8.6.13 - build: h5083fa2_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 - md5: b50a57ba89c32b62428b71a875291c9b - depends: - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3145523 - timestamp: 1699202432999 -- kind: conda - name: tk - version: 8.6.13 - build: noxft_h4845f30_101 - build_number: 101 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3318875 - timestamp: 1699202167581 -- kind: conda - name: toml - version: 0.10.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - sha256: f0f3d697349d6580e4c2f35ba9ce05c65dc34f9f049e85e45da03800b46139c1 - md5: f832c45a477c78bebd107098db465095 - depends: - - python >=2.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/toml?source=hash-mapping - size: 18433 - timestamp: 1604308660817 -- kind: conda - name: tomli - version: 2.0.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - sha256: 5e742ba856168b606ac3c814d247657b1c33b8042371f1a08000bdc5075bc0cc - md5: e977934e00b355ff55ed154904044727 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/tomli?source=hash-mapping - size: 18203 - timestamp: 1727974767524 -- kind: conda - name: tornado - version: 6.4.1 - build: py312h024a12e_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.1-py312h024a12e_1.conda - sha256: 5eefede1d8a2f55892bc582dbcb574b1806f19bc1e3939ce56b79721b9406db7 - md5: 967bc97bb9e258993289546479af971f - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/tornado?source=hash-mapping - size: 841722 - timestamp: 1724956439106 -- kind: conda - name: tornado - version: 6.4.1 - build: py312h66e93f0_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda - sha256: c0c9cc7834e8f43702956afaa5af7b0639c4835c285108a43e6b91687ce53ab8 - md5: af648b62462794649066366af4ecd5b0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/tornado?source=hash-mapping - size: 837665 - timestamp: 1724956252424 -- kind: conda - name: tornado - version: 6.4.1 - build: py312hb553811_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.1-py312hb553811_1.conda - sha256: 67711e308059fd4fd9ce2389b155ffcc52723d202b78cdfa01e7d6a3d42725b5 - md5: 479bb06cef210f968f20866277acd8b9 - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/tornado?source=hash-mapping - size: 841028 - timestamp: 1724956347530 -- kind: conda - name: typing-extensions - version: 4.12.2 - build: hd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - sha256: d3b9a8ed6da7c9f9553c5fd8a4fca9c3e0ab712fa5f497859f82337d67533b73 - md5: 52d648bd608f5737b123f510bb5514b5 - depends: - - typing_extensions 4.12.2 pyha770c72_0 - license: PSF-2.0 - license_family: PSF - purls: [] - size: 10097 - timestamp: 1717802659025 -- kind: conda - name: typing_extensions - version: 4.12.2 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb - md5: ebe6952715e1d5eb567eeebf25250fa7 - depends: - - python >=3.8 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/typing-extensions?source=hash-mapping - size: 39888 - timestamp: 1717802653893 -- kind: conda - name: tzdata - version: 2024b - build: hc8b5060_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf - md5: 8ac3367aafb1cc0a068483c580af8015 - license: LicenseRef-Public-Domain - purls: [] - size: 122354 - timestamp: 1728047496079 -- kind: conda - name: ukkonen - version: 1.0.1 - build: py312h6142ec9_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py312h6142ec9_5.conda - sha256: 1e4452b4a12d8a69c237f14b876fbf0cdc456914170b49ba805779c749c31eca - md5: 2b485a809d1572cbe7f0ad9ee107e4b0 - depends: - - __osx >=11.0 - - cffi - - libcxx >=17 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ukkonen?source=hash-mapping - size: 13605 - timestamp: 1725784243533 -- kind: conda - name: ukkonen - version: 1.0.1 - build: py312h68727a3_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda - sha256: 9fb020083a7f4fee41f6ece0f4840f59739b3e249f157c8a407bb374ffb733b5 - md5: f9664ee31aed96c85b7319ab0a693341 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi - - libgcc >=13 - - libstdcxx >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ukkonen?source=hash-mapping - size: 13904 - timestamp: 1725784191021 -- kind: conda - name: ukkonen - version: 1.0.1 - build: py312hc5c4d5f_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py312hc5c4d5f_5.conda - sha256: f6433143294c1ca52410bf8bbca6029a04f2061588d32e6d2b67c7fd886bc4e0 - md5: f270aa502d8817e9cb3eb33541f78418 - depends: - - __osx >=10.13 - - cffi - - libcxx >=17 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ukkonen?source=hash-mapping - size: 13031 - timestamp: 1725784199719 -- kind: conda - name: unicodedata2 - version: 15.1.0 - build: py312h0bf5046_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py312h0bf5046_1.conda - sha256: 236961004c088f190d8b27863b2898f1d43c2d5dc769f135abdacc644b033fab - md5: eda2082df9c9c6259af246424b7f3db1 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/unicodedata2?source=hash-mapping - size: 372492 - timestamp: 1729704995151 -- kind: conda - name: unicodedata2 - version: 15.1.0 - build: py312h3d0f464_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py312h3d0f464_1.conda - sha256: e1d8da8eed41f5479eacff7d4b42ad69e8476eb370dcebd3ffff26819a7da4ea - md5: f4627b5e2f46389140760303124b4c49 - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/unicodedata2?source=hash-mapping - size: 364385 - timestamp: 1729704742038 -- kind: conda - name: unicodedata2 - version: 15.1.0 - build: py312h66e93f0_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda - sha256: 1fcba6d363d901d9a06381e1aee2d5634f82389965dd7a339f19b3ae81ce6da0 - md5: 588486a61153f94c7c13816f7069e440 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/unicodedata2?source=hash-mapping - size: 368550 - timestamp: 1729704685856 -- kind: conda - name: urllib3 - version: 2.2.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda - sha256: b6bb34ce41cd93956ad6eeee275ed52390fb3788d6c75e753172ea7ac60b66e5 - md5: 6b55867f385dd762ed99ea687af32a69 - depends: - - brotli-python >=1.0.9 - - h2 >=4,<5 - - pysocks >=1.5.6,<2.0,!=1.5.7 - - python >=3.8 - - zstandard >=0.18.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/urllib3?source=hash-mapping - size: 98076 - timestamp: 1726496531769 -- kind: conda - name: virtualenv - version: 20.27.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - sha256: 189b935224732267df10dc116bce0835bd76fcdb20c30f560591c92028d513b0 - md5: dae21509d62aa7bf676279ced3edcb3f - depends: - - distlib <1,>=0.3.7 - - filelock <4,>=3.12.2 - - platformdirs <5,>=3.9.1 - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/virtualenv?source=hash-mapping - size: 2965442 - timestamp: 1730204927840 -- kind: conda - name: wayland - version: 1.23.1 - build: h3e06ad9_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda - sha256: 0884b2023a32d2620192cf2e2fc6784b8d1e31cf9f137e49e00802d4daf7d1c1 - md5: 0a732427643ae5e0486a727927791da1 - depends: - - __glibc >=2.17,<3.0.a0 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=13 - - libstdcxx-ng >=13 - license: MIT - license_family: MIT - purls: [] - size: 321561 - timestamp: 1724530461598 -- kind: conda - name: wheel - version: 0.44.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - sha256: d828764736babb4322b8102094de38074dedfc71f5ff405c9dfee89191c14ebc - md5: d44e3b085abcaef02983c6305b84b584 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/wheel?source=hash-mapping - size: 58585 - timestamp: 1722797131787 -- kind: conda - name: xcb-util - version: 0.4.1 - build: hb711507_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda - sha256: 416aa55d946ce4ab173ab338796564893a2f820e80e04e098ff00c25fb981263 - md5: 8637c3e5821654d0edf97e2b0404b443 - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - license: MIT - license_family: MIT - purls: [] - size: 19965 - timestamp: 1718843348208 -- kind: conda - name: xcb-util-cursor - version: 0.1.5 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda - sha256: c7b35db96f6e32a9e5346f97adc968ef2f33948e3d7084295baebc0e33abdd5b - md5: eb44b3b6deb1cab08d72cb61686fe64c - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libxcb >=1.13 - - libxcb >=1.16,<2.0.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - xcb-util-renderutil >=0.3.10,<0.4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 20296 - timestamp: 1726125844850 -- kind: conda - name: xcb-util-image - version: 0.4.0 - build: hb711507_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda - sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7 - md5: a0901183f08b6c7107aab109733a3c91 - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - license: MIT - license_family: MIT - purls: [] - size: 24551 - timestamp: 1718880534789 -- kind: conda - name: xcb-util-keysyms - version: 0.4.1 - build: hb711507_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda - sha256: 546e3ee01e95a4c884b6401284bb22da449a2f4daf508d038fdfa0712fe4cc69 - md5: ad748ccca349aec3e91743e08b5e2b50 - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - license: MIT - license_family: MIT - purls: [] - size: 14314 - timestamp: 1718846569232 -- kind: conda - name: xcb-util-renderutil - version: 0.3.10 - build: hb711507_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda - sha256: 2d401dadc43855971ce008344a4b5bd804aca9487d8ebd83328592217daca3df - md5: 0e0cbe0564d03a99afd5fd7b362feecd - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - license: MIT - license_family: MIT - purls: [] - size: 16978 - timestamp: 1718848865819 -- kind: conda - name: xcb-util-wm - version: 0.4.2 - build: hb711507_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda - sha256: 31d44f297ad87a1e6510895740325a635dd204556aa7e079194a0034cdd7e66a - md5: 608e0ef8256b81d04456e8d211eee3e8 - depends: - - libgcc-ng >=12 - - libxcb >=1.16,<2.0.0a0 - license: MIT - license_family: MIT - purls: [] - size: 51689 - timestamp: 1718844051451 -- kind: conda - name: xkeyboard-config - version: '2.43' - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda - sha256: 0d89b5873515a1f05d311f37ea4e087bbccc0418afa38f2f6189e97280db3179 - md5: f725c7425d6d7c15e31f3b99a88ea02f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 389475 - timestamp: 1727840188958 -- kind: conda - name: xorg-libice - version: 1.1.1 - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda - sha256: ec276da68d1c4a3d34a63195b35ca5b248d4aff0812464dcd843d74649b5cec4 - md5: 19608a9656912805b2b9a2f6bd257b04 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 58159 - timestamp: 1727531850109 -- kind: conda - name: xorg-libsm - version: 1.2.4 - build: he73a12e_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda - sha256: 70e903370977d44c9120a5641ab563887bd48446e9ef6fc2a3f5f60531c2cd6c - md5: 05a8ea5f446de33006171a7afe6ae857 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libuuid >=2.38.1,<3.0a0 - - xorg-libice >=1.1.1,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 27516 - timestamp: 1727634669421 -- kind: conda - name: xorg-libx11 - version: 1.8.10 - build: h4f16b4b_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda - sha256: c4650634607864630fb03696474a0535f6fce5fda7d81a6462346e071b53dfa7 - md5: 0b666058a179b744a622d0a4a0c56353 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libxcb >=1.17.0,<2.0a0 - - xorg-xorgproto - license: MIT - license_family: MIT - purls: [] - size: 838308 - timestamp: 1727356837875 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: h00291cd_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h00291cd_1.conda - sha256: 96177823ec38336b0f4b7e7c2413da61f8d008d800cc4a5b8ad21f9128fb7de0 - md5: c6cc91149a08402bbb313c5dc0142567 - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 13176 - timestamp: 1727034772877 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda - sha256: 532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6 - md5: 77cbc488235ebbaab2b6e912d3934bae - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 14679 - timestamp: 1727034741045 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: hd74edd7_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda - sha256: 7113618021cf6c80831a429b2ebb9d639f3c43cf7fe2257d235dc6ae0ab43289 - md5: 7e0125f8fb619620a0011dc9297e2493 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 13515 - timestamp: 1727034783560 -- kind: conda - name: xorg-libxcomposite - version: 0.4.6 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda - sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f - md5: d3c295b50f092ab525ffe3c2aa4b7413 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - license: MIT - license_family: MIT - purls: [] - size: 13603 - timestamp: 1727884600744 -- kind: conda - name: xorg-libxcursor - version: 1.2.2 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.2-hb9d3cd8_0.conda - sha256: 7262935568963836efd05e0c68d5c787246578465b7a66c8bd7f0ba361d6a105 - md5: bb2638cd7fbdd980b1cff9a99a6c1fa8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - license: MIT - license_family: MIT - purls: [] - size: 31804 - timestamp: 1727796817007 -- kind: conda - name: xorg-libxdamage - version: 1.1.6 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 - md5: b5fcc7172d22516e1f965490e65e33a4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - license: MIT - license_family: MIT - purls: [] - size: 13217 - timestamp: 1727891438799 -- kind: conda - name: xorg-libxdmcp - version: 1.1.5 - build: h00291cd_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda - sha256: bb4d1ef9cafef535494adf9296130b6193b3a44375883185b5167de03eb1ac7f - md5: 9f438e1b6f4e73fd9e6d78bfe7c36743 - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - purls: [] - size: 18465 - timestamp: 1727794980957 -- kind: conda - name: xorg-libxdmcp - version: 1.1.5 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee - md5: 8035c64cb77ed555e3f150b7b3972480 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 19901 - timestamp: 1727794976192 -- kind: conda - name: xorg-libxdmcp - version: 1.1.5 - build: hd74edd7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 - md5: 77c447f48cab5d3a15ac224edb86a968 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 18487 - timestamp: 1727795205022 -- kind: conda - name: xorg-libxext - version: 1.3.6 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda - sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 - md5: febbab7d15033c913d53c7a2c102309d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 50060 - timestamp: 1727752228921 -- kind: conda - name: xorg-libxfixes - version: 6.0.1 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda - sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 - md5: 4bdb303603e9821baf5fe5fdff1dc8f8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 19575 - timestamp: 1727794961233 -- kind: conda - name: xorg-libxi - version: 1.8.2 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a - md5: 17dcc85db3c7886650b8908b183d6876 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 - license: MIT - license_family: MIT - purls: [] - size: 47179 - timestamp: 1727799254088 -- kind: conda - name: xorg-libxrandr - version: 1.5.4 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda - sha256: ac0f037e0791a620a69980914a77cb6bb40308e26db11698029d6708f5aa8e0d - md5: 2de7f99d6581a4a7adbff607b5c278ca - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - license: MIT - license_family: MIT - purls: [] - size: 29599 - timestamp: 1727794874300 -- kind: conda - name: xorg-libxrender - version: 0.9.11 - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda - sha256: f1217e902c0b1d8bc5d3ce65e483ebf38b049c823c9117b7198cfb16bd2b9143 - md5: a7a49a8b85122b49214798321e2e96b4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-xorgproto - license: MIT - license_family: MIT - purls: [] - size: 37780 - timestamp: 1727529943015 -- kind: conda - name: xorg-libxtst - version: 1.2.5 - build: hb9d3cd8_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a - md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxi >=1.7.10,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 32808 - timestamp: 1727964811275 -- kind: conda - name: xorg-libxxf86vm - version: 1.1.5 - build: hb9d3cd8_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda - sha256: 0b8f062a5b4a2c3833267285b7d41b3542f54d2c935c86ca98504c3e5296354c - md5: 7da9007c0582712c4bad4131f89c8372 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - license: MIT - license_family: MIT - purls: [] - size: 18072 - timestamp: 1728920051869 -- kind: conda - name: xorg-xorgproto - version: '2024.1' - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - sha256: 1316680be6edddee0156b86ec1102fc8286f51c1a5440366ed1db596a2dc3731 - md5: 7c21106b851ec72c037b162c216d8f05 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 565425 - timestamp: 1726846388217 -- kind: conda - name: xz - version: 5.2.6 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 418368 - timestamp: 1660346797927 -- kind: conda - name: xz - version: 5.2.6 - build: h57fd34a_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 235693 - timestamp: 1660346961024 -- kind: conda - name: xz - version: 5.2.6 - build: h775f41a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 - md5: a72f9d4ea13d55d745ff1ed594747f10 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 238119 - timestamp: 1660346964847 -- kind: conda - name: yaml - version: 0.2.5 - build: h0d85af4_2 - build_number: 2 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 - sha256: 5301417e2c8dea45b401ffee8df3957d2447d4ce80c83c5ff151fc6bfe1c4148 - md5: d7e08fcf8259d742156188e8762b4d20 - license: MIT - license_family: MIT - purls: [] - size: 84237 - timestamp: 1641347062780 -- kind: conda - name: yaml - version: 0.2.5 - build: h3422bc3_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 - sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 - md5: 4bb3f014845110883a3c5ee811fd84b4 - license: MIT - license_family: MIT - purls: [] - size: 88016 - timestamp: 1641347076660 -- kind: conda - name: yaml - version: 0.2.5 - build: h7f98852_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 - sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 - md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - purls: [] - size: 89141 - timestamp: 1641346969816 -- kind: conda - name: zipp - version: 3.20.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - sha256: 1e84fcfa41e0afdd87ff41e6fbb719c96a0e098c1f79be342293ab0bd8dea322 - md5: 4daaed111c05672ae669f7036ee5bba3 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/zipp?source=hash-mapping - size: 21409 - timestamp: 1726248679175 -- kind: conda - name: zlib - version: 1.3.1 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab - md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib 1.3.1 hb9d3cd8_2 - license: Zlib - license_family: Other - purls: [] - size: 92286 - timestamp: 1727963153079 -- kind: conda - name: zstandard - version: 0.23.0 - build: py312h15fbf35_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda - sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb - md5: a4cde595509a7ad9c13b1a3809bcfe51 - depends: - - __osx >=11.0 - - cffi >=1.11 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - zstd >=1.5.6,<1.5.7.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 330788 - timestamp: 1725305806565 -- kind: conda - name: zstandard - version: 0.23.0 - build: py312h7122b0e_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.23.0-py312h7122b0e_1.conda - sha256: 2685dde42478fae0780fba5d1f8a06896a676ae105f215d32c9f9e76f3c6d8fd - md5: bd132ba98f3fc0a6067f355f8efe4cb6 - depends: - - __osx >=10.13 - - cffi >=1.11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - zstd >=1.5.6,<1.5.7.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 410873 - timestamp: 1725305688706 -- kind: conda - name: zstandard - version: 0.23.0 - build: py312hef9b889_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda - sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b - md5: 8b7069e9792ee4e5b4919a7a306d2e67 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=1.11 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - zstd >=1.5.6,<1.5.7.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 419552 - timestamp: 1725305670210 -- kind: conda - name: zstd - version: 1.5.6 - build: h915ae27_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda - sha256: efa04a98cb149643fa54c4dad5a0179e36a5fbc88427ea0eec88ceed87fd0f96 - md5: 4cb2cd56f039b129bb0e491c1164167e - depends: - - __osx >=10.9 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 498900 - timestamp: 1714723303098 -- kind: conda - name: zstd - version: 1.5.6 - build: ha6fb4c9_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b - md5: 4d056880988120e29d75bfff282e0f45 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 554846 - timestamp: 1714722996770 -- kind: conda - name: zstd - version: 1.5.6 - build: hb46c0d2_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 - md5: d96942c06c3e84bfcc5efb038724a7fd - depends: - - __osx >=11.0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 405089 - timestamp: 1714723101397 From 8324014f2dbeae6dd7fefcbcb4af74a614be4694 Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 19 Dec 2024 13:36:43 -0600 Subject: [PATCH 019/215] add python 3.13 to pyproject.toml --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4a67361687..ebcda319e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,11 +27,12 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering", "Topic :: Software Development :: Libraries :: Python Modules", ] -version = "1.4.2+dev" +version = "1.4.3+dev" [project.urls] Documentation = "https://libensemble.readthedocs.io/en/main/" @@ -100,7 +101,7 @@ gpcam = ">=8.1.6,<9" [tool.black] line-length = 120 -target-version = ['py39', 'py310', 'py311', 'py312'] +target-version = ['py39', 'py310', 'py311', 'py312', 'py313'] force-exclude = ''' ( /( From 61fb6b84c1c756f7516e7f1f5e041e5a49e4b90c Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 19 Dec 2024 14:12:59 -0600 Subject: [PATCH 020/215] move build dependencies under build-system, rearrange other dependencies --- pyproject.toml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ebcda319e8..9fab5c9bde 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,8 +4,7 @@ authors = [{name = "Jeffrey Larson"}, {name = "Stephen Hudson"}, {name = "Stefan M. Wild"}, {name = "David Bindel"}, {name = "John-Luke Navarro"}] -dependencies = ["pip>=24.3.1,<25", "setuptools>=75.1.0,<76", "numpy>=1.21,<3", - "psutil>=5.9.4,<7", "pydantic>=1.10.12,<3", "pyyaml>=6.0,<7", "tomli>=1.2.1,<3"] +dependencies = ["numpy", "psutil", "pydantic", "pyyaml", "tomli"] description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." name = "libensemble" @@ -41,7 +40,7 @@ Issues = "https://github.com/Libensemble/libensemble/issues" [build-system] build-backend = "setuptools.build_meta" -requires = ["setuptools", "wheel"] +requires = ["setuptools", "wheel", "pip>=24.3.1,<25", "setuptools>=75.1.0,<76", ] [tool.setuptools.packages.find] where = ["."] @@ -81,10 +80,10 @@ sphinx_rtd_theme = ">=3.0.1,<4" sphinx-copybutton = ">=0.5.2,<0.6" pre-commit = ">=4.0.1,<5" nlopt = ">=2.8.0,<3" -scipy = ">=1.14.1,<2" +scipy = ">=1.9.1,<2" [tool.pixi.dependencies] -python = ">=3.9,<=3.12.7" +python = ">=3.9,<3.14" pip = ">=24.3.1,<25" setuptools = ">=75.1.0,<76" numpy = ">=1.21,<3" @@ -96,9 +95,6 @@ psutil = ">=5.9.4,<7" [tool.pixi.target.osx-arm64.dependencies] clang_osx-arm64 = ">=19.1.2,<20" -[tool.pixi.target.linux-64.dependencies] -gpcam = ">=8.1.6,<9" - [tool.black] line-length = 120 target-version = ['py39', 'py310', 'py311', 'py312', 'py313'] From 6475e533ace30c14e15df498a458e26864e9a448 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 19:16:23 +0000 Subject: [PATCH 021/215] Bump crate-ci/typos from 1.28.2 to 1.28.4 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.28.2 to 1.28.4. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.28.2...v1.28.4) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index b694113d88..64f1d11396 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.28.2 + - uses: crate-ci/typos@v1.28.4 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 773dac1541..2f95a4ea7c 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -181,4 +181,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.28.2 + - uses: crate-ci/typos@v1.28.4 From 097cea11e66b2999686a1516008d9b57a8a7bd72 Mon Sep 17 00:00:00 2001 From: jlnav Date: Fri, 3 Jan 2025 15:54:16 -0600 Subject: [PATCH 022/215] bump some dev dependencies, add some missing docs dependencies --- pyproject.toml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9fab5c9bde..d4a82021e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ authors = [{name = "Jeffrey Larson"}, {name = "Stephen Hudson"}, {name = "Stefan M. Wild"}, {name = "David Bindel"}, {name = "John-Luke Navarro"}] -dependencies = ["numpy", "psutil", "pydantic", "pyyaml", "tomli"] +dependencies = [ "numpy", "psutil", "pydantic", "pyyaml", "tomli"] description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." name = "libensemble" @@ -62,30 +62,30 @@ mpi = ">=1.0.1,<2" mpich = ">=4.2.3,<5" mpi4py = ">=4.0.1,<5" flake8 = ">=7.1.1,<8" -coverage = ">=7.6.4,<8" -pytest = ">=8.3.3,<9" -pytest-cov = ">=5.0.0,<6" +coverage = ">=7.6.10,<8" +pytest = ">=8.3.4,<9" +pytest-cov = ">=6.0.0,<7" pytest-timeout = ">=2.3.1,<3" mock = ">=5.1.0,<6" -python-dateutil = ">=2.9.0,<3" -anyio = ">=4.6.2.post1,<5" -matplotlib = ">=3.9.2,<4" +python-dateutil = ">=2.9.0.post0,<3" +anyio = ">=4.7.0,<5" +matplotlib = ">=3.10.0,<4" mpmath = ">=1.3.0,<2" -rich = ">=13.9.3,<14" +rich = ">=13.9.4,<14" sphinx = ">=8.1.3,<9" sphinxcontrib-bibtex = ">=2.6.3,<3" -sphinxcontrib-spelling = ">=4.3.0,<5" sphinx-design = ">=0.6.1,<0.7" sphinx_rtd_theme = ">=3.0.1,<4" sphinx-copybutton = ">=0.5.2,<0.6" pre-commit = ">=4.0.1,<5" -nlopt = ">=2.8.0,<3" -scipy = ">=1.9.1,<2" +nlopt = ">=2.9.0,<3" +scipy = ">=1.14.1,<2" +enchant = ">=2.8.2,<3" # required for sphinxcontrib-spelling [tool.pixi.dependencies] python = ">=3.9,<3.14" pip = ">=24.3.1,<25" -setuptools = ">=75.1.0,<76" +setuptools = ">=75.6.0,<76" numpy = ">=1.21,<3" pydantic = ">=1.10,<3" pyyaml = ">=6.0,<7" @@ -129,3 +129,6 @@ noy = "noy" [tool.typos.files] extend-exclude = ["*.bib", "*.xml", "docs/nitpicky"] + +[dependency-groups] +dev = ["sphinxcontrib-spelling==8.0.0", "autodoc-pydantic>=2.2.0,<3"] From 13f1d821b3220dffad1f9a4c521f0d1126bf7d4d Mon Sep 17 00:00:00 2001 From: jlnav Date: Mon, 6 Jan 2025 08:57:05 -0600 Subject: [PATCH 023/215] trying to reduce some of the listed example gen funcs in some sections, slim down some description? --- docs/examples/aposmm.rst | 4 ++-- docs/examples/gen_funcs.rst | 4 +++- docs/examples/sampling.rst | 8 ++++---- libensemble/gen_funcs/persistent_aposmm.py | 12 +++++------- libensemble/gen_funcs/sampling.py | 4 +--- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/docs/examples/aposmm.rst b/docs/examples/aposmm.rst index 9ecdbdb578..6e8eb576ff 100644 --- a/docs/examples/aposmm.rst +++ b/docs/examples/aposmm.rst @@ -49,13 +49,13 @@ Persistent APOSMM ^^^^^^^^^^^^^^^^^ .. automodule:: persistent_aposmm - :members: + :members: aposmm :undoc-members: LocalOptInterfacer ^^^^^^^^^^^^^^^^^^ .. automodule:: aposmm_localopt_support - :members: + :members: LocalOptInterfacer :undoc-members: .. _DFO-LS: https://github.com/numericalalgorithmsgroup/dfols diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 8e5af973b1..cb7eae5ee6 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -1,11 +1,13 @@ Generator Functions =================== +Here we list many generator functions included with libEnsemble. + .. include:: ../introduction.rst :start-after: example_packages .. IMPORTANT:: - See the API for generation functions :ref:`here`. + See the API for generator functions :ref:`here`. .. toctree:: :maxdepth: 2 diff --git a/docs/examples/sampling.rst b/docs/examples/sampling.rst index d16753aab3..dd7c12f4f6 100644 --- a/docs/examples/sampling.rst +++ b/docs/examples/sampling.rst @@ -5,7 +5,7 @@ sampling :class: underline .. automodule:: sampling - :members: + :members: uniform_random_sample latin_hypercube_sample :undoc-members: .. dropdown:: :underline:`sampling.py` @@ -15,9 +15,9 @@ sampling :linenos: persistent_sampling ---------------------------- +------------------- .. automodule:: persistent_sampling - :members: + :members: persistent_uniform persistent_uniform_final_update persistent_request_shutdown :undoc-members: .. dropdown:: :underline:`persistent_sampling.py` @@ -29,5 +29,5 @@ persistent_sampling persistent_sampling_var_resources --------------------------------- .. automodule:: persistent_sampling_var_resources - :members: + :members: uniform_sample_with_var_gpus :undoc-members: diff --git a/libensemble/gen_funcs/persistent_aposmm.py b/libensemble/gen_funcs/persistent_aposmm.py index c5c3aa5e65..b7495509aa 100644 --- a/libensemble/gen_funcs/persistent_aposmm.py +++ b/libensemble/gen_funcs/persistent_aposmm.py @@ -37,10 +37,8 @@ def cdist(XA, XB, metric="euclidean"): def aposmm(H, persis_info, gen_specs, libE_info): """ - APOSMM coordinates multiple local optimization runs, starting from points - which do not have a better point nearby (within a distance ``r_k``). This - generation function uses a ``local_H`` (serving a similar purpose as ``H`` - in libEnsemble) containing the fields: + APOSMM coordinates multiple local optimization runs, dramatically reducing time-to-solution + on parallel systems for discovering multiple minima. APOSMM tracks these fields: - ``'x' [n floats]``: Parameters being optimized over - ``'x_on_cube' [n floats]``: Parameters scaled to the unit cube @@ -82,7 +80,7 @@ def aposmm(H, persis_info, gen_specs, libE_info): at an optimum, but SciPy's Nelder-Mead and BFGS have a 'status' of 0 if at an optimum.) - ``'initial_sample_size' [int]``: Number of uniformly sampled points - must be returned (non-nan value) before a local opt run is started. Can be + to be evaluated before starting the localopt runs. Can be zero if no additional sampling is desired, but if zero there must be past sim_f values given to libEnsemble in H0. @@ -114,8 +112,8 @@ def aposmm(H, persis_info, gen_specs, libE_info): ``'max_active_runs'`` in some iteration, then existing runs are prioritized. And ``gen_specs['user']`` must also contain fields for the given - localopt_method's convergence tolerances (e.g., gatol/grtol for PETSC/TAO - or ftol_rel for NLopt) + localopt_method's convergence tolerances (e.g., ``gatol/grtol`` for PETSC/TAO + or ``ftol_rel`` for NLopt) .. seealso:: diff --git a/libensemble/gen_funcs/sampling.py b/libensemble/gen_funcs/sampling.py index 6cf0347fef..efe9eab407 100644 --- a/libensemble/gen_funcs/sampling.py +++ b/libensemble/gen_funcs/sampling.py @@ -1,7 +1,5 @@ """ -This module contains multiple generation functions for sampling a domain. All -use (and return) a random stream in ``persis_info``, given by the allocation -function. +This module contains multiple generator functions for sampling a domain. """ import numpy as np From 3c507bf6122f1ae7842061ac840a3d060407f784 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 19:25:45 +0000 Subject: [PATCH 024/215] Bump crate-ci/typos from 1.28.4 to 1.29.4 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.28.4 to 1.29.4. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.28.4...v1.29.4) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 64f1d11396..7b3dd61c41 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.28.4 + - uses: crate-ci/typos@v1.29.4 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 2f95a4ea7c..3565768c57 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -181,4 +181,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.28.4 + - uses: crate-ci/typos@v1.29.4 From 5ce982dfbfe2df5cc1bb41429c74c8e271e062c7 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Mon, 6 Jan 2025 16:28:46 -0600 Subject: [PATCH 025/215] A typo --- docs/tutorials/executor_forces_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/executor_forces_tutorial.rst b/docs/tutorials/executor_forces_tutorial.rst index 914edaf2a2..1c2c3ecd09 100644 --- a/docs/tutorials/executor_forces_tutorial.rst +++ b/docs/tutorials/executor_forces_tutorial.rst @@ -380,7 +380,7 @@ Running forces application with input file Many applications read an input file instead of being given parameters directly on the run line. forces_simple_with_input_file_ directory contains a variant of this example, where a templated -input file is parametized for each evaluation. +input file is parameterized for each evaluation. This requires **jinja2** to be installed:: From bfe1a4610c5e098f0c3b7781a46acb7608d34d1e Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 7 Jan 2025 10:34:35 -0600 Subject: [PATCH 026/215] some simplifying language in aposmm.rst --- docs/examples/aposmm.rst | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/docs/examples/aposmm.rst b/docs/examples/aposmm.rst index 6e8eb576ff..75c128fdd0 100644 --- a/docs/examples/aposmm.rst +++ b/docs/examples/aposmm.rst @@ -2,8 +2,8 @@ APOSMM ------ Asynchronously Parallel Optimization Solver for finding Multiple Minima -(APOSMM) coordinates concurrent local optimization runs in order to identify -many local minima. +(APOSMM) coordinates concurrent local optimization runs to identify +many local minima faster on parallel hardware. Required: mpmath_, SciPy_ @@ -12,32 +12,26 @@ Optional (see below): petsc4py_, nlopt_, DFO-LS_ Configuring APOSMM ^^^^^^^^^^^^^^^^^^ -APOSMM works with a choice of optimizers, some requiring external packages. To -import the optimization packages (and their dependencies) at a global level -(recommended), add the following lines in the calling script before importing -APOSMM:: +APOSMM works with a choice of optimizers, some requiring external packages. Specify +them on a global level before importing APOSMM:: import libensemble.gen_funcs libensemble.gen_funcs.rc.aposmm_optimizers = -where ``optimizers`` is a string (or list of strings) from the available options: +where ``optimizers`` is a string (or list-of-strings) from: ``"petsc"``, ``"nlopt"``, ``"dfols"``, ``"scipy"``, ``"external"`` -.. dropdown:: Issues with ensemble hanging or failed simulations? +.. dropdown:: Issues with ensemble hanging or failed simulations with PETSc? - Note that if using **mpi4py** comms, PETSc must be imported at the global - level or the ensemble may hang. + If using the MPIExecutor or other MPI routines + and your MPI backend is Open MPI, then you must: - Exception: In the case that you are using the MPIExecutor or other MPI inside - a user function and you are using Open MPI, then you must: + - Use ``local`` comms for libEnsemble (no ``mpirun``, ``mpiexec``, ``aprun``, etc.). + - Must **NOT** include the *aposmm_optimizers* line above. - - Use ``local`` comms for libEnsemble (not ``mpi4py``) - - Must **NOT** include the *rc* line above - - This is because PETSc imports MPI, and a global import of PETSc would result - in nested MPI (which is not supported by Open MPI). When the above line is - not used, an import local to the optimization function will happen. + This is because PETSc imports MPI, and a global import of PETSc results + in nested MPI (which is not supported by Open MPI). To see the optimization algorithms supported, see `LocalOptInterfacer`_. From dfeb9a06982fb58c653178b46ce1418a67cb8d63 Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 7 Jan 2025 14:40:10 -0600 Subject: [PATCH 027/215] some cleanup, including replacing some single-quotes with double-quotes, removing some out-of-date commented-out code, fixing some links. adds 3 tentative categories on the Generator functions example page --- docs/examples/gen_funcs.rst | 30 ++++--- docs/examples/sampling.rst | 4 +- docs/examples/sim_funcs.rst | 14 +--- docs/examples/surmise.rst | 3 +- docs/examples/tasmanian.rst | 3 +- docs/introduction.rst | 2 +- docs/introduction_latex.rst | 2 +- docs/nitpicky | 1 + .../gen_funcs/aposmm_localopt_support.py | 10 +-- libensemble/gen_funcs/persistent_aposmm.py | 81 +++++++++---------- .../gen_funcs/persistent_fd_param_finder.py | 20 +---- libensemble/gen_funcs/persistent_tasmanian.py | 2 +- pyproject.toml | 1 + 13 files changed, 75 insertions(+), 98 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index cb7eae5ee6..03f59108fb 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -10,15 +10,25 @@ Here we list many generator functions included with libEnsemble. See the API for generator functions :ref:`here`. .. toctree:: - :maxdepth: 2 - :caption: Documented Example Generator Functions: - - sampling - aposmm - uniform_or_localopt - tasmanian - fd_param_finder - surmise - ax_multitask + :maxdepth: 2 + :caption: Sampling + + sampling + +.. toctree:: + :maxdepth: 2 + :caption: Optimization + + aposmm + uniform_or_localopt + ax_multitask + +.. toctree:: + :maxdepth: 2 + :caption: Modeling and Approximation + + tasmanian + fd_param_finder + surmise .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples diff --git a/docs/examples/sampling.rst b/docs/examples/sampling.rst index dd7c12f4f6..fa8830a8a5 100644 --- a/docs/examples/sampling.rst +++ b/docs/examples/sampling.rst @@ -5,7 +5,7 @@ sampling :class: underline .. automodule:: sampling - :members: uniform_random_sample latin_hypercube_sample + :members: uniform_random_sample, latin_hypercube_sample :undoc-members: .. dropdown:: :underline:`sampling.py` @@ -17,7 +17,7 @@ sampling persistent_sampling ------------------- .. automodule:: persistent_sampling - :members: persistent_uniform persistent_uniform_final_update persistent_request_shutdown + :members: persistent_uniform, persistent_request_shutdown, persistent_uniform_with_cancellations :undoc-members: .. dropdown:: :underline:`persistent_sampling.py` diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index 81b922d366..be7624c384 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -16,7 +16,7 @@ function launching tasks, see the six_hump_camel -------------- .. automodule:: six_hump_camel - :members: + :members: six_hump_camel_simple, persistent_six_hump_camel :undoc-members: .. dropdown:: :underline:`six_hump_camel.py` @@ -25,12 +25,6 @@ six_hump_camel :language: python :linenos: -chwirut -------- -.. automodule:: chwirut1 - :members: - :undoc-members: - noisy_vector_mapping -------------------- .. automodule:: noisy_vector_mapping @@ -43,12 +37,6 @@ noisy_vector_mapping :language: python :linenos: -periodic_func -------------- -.. automodule:: periodic_func - :members: - :undoc-members: - borehole -------- .. automodule:: borehole diff --git a/docs/examples/surmise.rst b/docs/examples/surmise.rst index 69d0f068ec..3aa28c7b70 100644 --- a/docs/examples/surmise.rst +++ b/docs/examples/surmise.rst @@ -1,7 +1,8 @@ persistent_surmise ------------------ -Required: Surmise_ +Required: Surmise_. + The :doc:`Borehole Calibration tutorial<../tutorials/calib_cancel_tutorial>` uses this generator as an example of the capability to cancel pending simulations. diff --git a/docs/examples/tasmanian.rst b/docs/examples/tasmanian.rst index 9ddd8b054a..1cdf79de10 100644 --- a/docs/examples/tasmanian.rst +++ b/docs/examples/tasmanian.rst @@ -9,7 +9,7 @@ use either *venv* or *--user* install. ``E.g: pip install scikit-build packaging Tasmanian --user`` .. automodule:: persistent_tasmanian - :members: + :members: sparse_grid_batched, sparse_grid_async :undoc-members: .. role:: underline @@ -23,4 +23,3 @@ use either *venv* or *--user* install. .. _pypackaging: https://pypi.org/project/pypackaging/ .. _scikit-build: https://scikit-build.readthedocs.io/en/latest/index.html -.. _Tasmanian: https://tasmanian.ornl.gov/ diff --git a/docs/introduction.rst b/docs/introduction.rst index bbea8d9d43..9c9d08e169 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -49,7 +49,7 @@ See the `user guide`_ for more information. .. _PETSc/TAO: http://www.mcs.anl.gov/petsc .. _scipy.optimize: https://docs.scipy.org/doc/scipy/reference/optimize.html .. _Surmise: https://surmise.readthedocs.io/en/latest/index.html -.. _Tasmanian: https://tasmanian.ornl.gov/ +.. _Tasmanian: https://github.com/ORNL/Tasmanian .. _user guide: https://libensemble.readthedocs.io/en/latest/programming_libE.html .. _VTMOP: https://github.com/Libensemble/libe-community-examples#vtmop .. _WarpX: https://warpx.readthedocs.io/en/latest/ diff --git a/docs/introduction_latex.rst b/docs/introduction_latex.rst index d271c085bb..e7750bac5f 100644 --- a/docs/introduction_latex.rst +++ b/docs/introduction_latex.rst @@ -50,7 +50,7 @@ .. _Surmise: https://surmise.readthedocs.io/en/latest/index.html .. _SWIG: http://swig.org/ .. _tarball: https://github.com/Libensemble/libensemble/releases/latest -.. _Tasmanian: https://tasmanian.ornl.gov/ +.. _Tasmanian: https://github.com/ORNL/Tasmanian .. _tomli: https://pypi.org/project/tomli/ .. _tqdm: https://tqdm.github.io/ .. _user guide: https://libensemble.readthedocs.io/en/latest/programming_libE.html diff --git a/docs/nitpicky b/docs/nitpicky index 8315471a11..b1be7c01e9 100644 --- a/docs/nitpicky +++ b/docs/nitpicky @@ -37,6 +37,7 @@ py:class py:class +ScalarType py:class +_ScalarType_co py:class collections.abc.Sequence +py:class pathlib._local.Path # Internal paths that are verified importable but Sphinx can't find py:class libensemble.resources.platforms.Aurora diff --git a/libensemble/gen_funcs/aposmm_localopt_support.py b/libensemble/gen_funcs/aposmm_localopt_support.py index 0bd1b9f3c7..3545afd892 100644 --- a/libensemble/gen_funcs/aposmm_localopt_support.py +++ b/libensemble/gen_funcs/aposmm_localopt_support.py @@ -75,11 +75,11 @@ class LocalOptInterfacer(object): Currently supported routines are - - NLopt routines ['LN_SBPLX', 'LN_BOBYQA', 'LN_COBYLA', 'LN_NEWUOA', 'LN_NELDERMEAD', 'LD_MMA'] - - PETSc/TAO routines ['pounders', 'blmvm', 'nm'] - - SciPy routines ['scipy_Nelder-Mead', 'scipy_COBYLA', 'scipy_BFGS'] - - DFOLS ['dfols'] - - External local optimizer ['external_localopt'] (which use files to pass/receive x/f values) + - NLopt [``'LN_SBPLX'``, ``LN_BOBYQA'``, ``'LN_COBYLA'``, ``'LN_NEWUOA'``, ``'LN_NELDERMEAD'``, ``'LD_MMA'``] + - PETSc/TAO [``'pounders'``, ``'blmvm'``, ``'nm'``] + - SciPy [``'scipy_Nelder-Mead'``, ``'scipy_COBYLA'``, ``'scipy_BFGS'``] + - DFOLS [``'dfols'``] + - External local optimizer [``'external_localopt'``] (which use files to pass/receive ``x/f`` values) """ def __init__(self, user_specs, x0, f0, grad0=None): diff --git a/libensemble/gen_funcs/persistent_aposmm.py b/libensemble/gen_funcs/persistent_aposmm.py index b7495509aa..1dc3af8e13 100644 --- a/libensemble/gen_funcs/persistent_aposmm.py +++ b/libensemble/gen_funcs/persistent_aposmm.py @@ -37,81 +37,76 @@ def cdist(XA, XB, metric="euclidean"): def aposmm(H, persis_info, gen_specs, libE_info): """ - APOSMM coordinates multiple local optimization runs, dramatically reducing time-to-solution - on parallel systems for discovering multiple minima. APOSMM tracks these fields: - - - ``'x' [n floats]``: Parameters being optimized over - - ``'x_on_cube' [n floats]``: Parameters scaled to the unit cube - - ``'f' [float]``: Objective function being minimized - - ``'local_pt' [bool]``: True if point from a local optimization run - - ``'dist_to_unit_bounds' [float]``: Distance to domain boundary - - ``'dist_to_better_l' [float]``: Dist to closest better local opt point - - ``'dist_to_better_s' [float]``: Dist to closest better sample point - - ``'ind_of_better_l' [int]``: Index of point ``'dist_to_better_l``' away - - ``'ind_of_better_s' [int]``: Index of point ``'dist_to_better_s``' away - - ``'started_run' [bool]``: True if point has started a local opt run - - ``'num_active_runs' [int]``: Number of active local runs point is in - - ``'local_min' [float]``: True if point has been ruled a local minima - - ``'sim_id' [int]``: Row number of entry in history + APOSMM coordinates multiple local optimization runs, dramatically reducing time for + discovering multiple minima on parallel systems. APOSMM tracks these fields: + + - ``"x" [n floats]``: Parameters being optimized over + - ``"x_on_cube" [n floats]``: Parameters scaled to the unit cube + - ``"f" [float]``: Objective function being minimized + - ``"local_pt" [bool]``: True if point from a local optimization run + - ``"started_run" [bool]``: True if point has started a local opt run + - ``"num_active_runs" [int]``: Number of active local runs point is in + - ``"local_min" [float]``: True if point has been ruled a local minima + - ``"sim_id" [int]``: Row number of entry in history and optionally - - ``'fvec' [m floats]``: All objective components (if performing a least-squares calculation) - - ``'grad' [n floats]``: The gradient (if available) of the objective with respect to `x`. + - ``"fvec" [m floats]``: All objective components (if performing a least-squares calculation) + - ``"grad" [n floats]``: The gradient (if available) of the objective with respect to `x`. Note: - If any of the above fields are desired after a libEnsemble run, name - them in ``gen_specs['out']``. + them in ``gen_specs["out"]``. - If intitializing APOSMM with past function values, make sure to include - ``'x'``, ``'x_on_cube'``, ``'f'``, ``'local_pt'``, etc. in - ``gen_specs['in']`` (and, of course, include them in the H0 array given + ``"x"``, ``"x_on_cube"``, ``"f"``, ``"local_pt"``, etc. in + ``gen_specs["in"]`` (and, of course, include them in the H0 array given to libensemble). - Necessary quantities in ``gen_specs['user']`` are: + Necessary quantities in ``gen_specs["user"]`` are: - - ``'lb' [n floats]``: Lower bound on search domain - - ``'ub' [n floats]``: Upper bound on search domain - - ``'localopt_method' [str]``: Name of an NLopt, PETSc/TAO, or SciPy method - (see 'advance_local_run' below for supported methods). When using a SciPy - method, must supply ``'opt_return_codes'``, a list of integers that will + - ``"lb" [n floats]``: Lower bound on search domain + - ``"ub" [n floats]``: Upper bound on search domain + - ``"localopt_method" [str]``: Name of an NLopt, PETSc/TAO, or SciPy method + (see "advance_local_run" below for supported methods). When using a SciPy + method, must supply ``"opt_return_codes"``, a list of integers that will be used to determine if the x produced by the localopt method should be - ruled a local minimum. (For example, SciPy's COBYLA has a 'status' of 1 if - at an optimum, but SciPy's Nelder-Mead and BFGS have a 'status' of 0 if at + ruled a local minimum. (For example, SciPy's COBYLA has a "status" of ``1`` if + at an optimum, but SciPy's Nelder-Mead and BFGS have a "status" of ``0`` if at an optimum.) - - ``'initial_sample_size' [int]``: Number of uniformly sampled points + - ``"initial_sample_size" [int]``: Number of uniformly sampled points to be evaluated before starting the localopt runs. Can be zero if no additional sampling is desired, but if zero there must be past sim_f values given to libEnsemble in H0. - Optional ``gen_specs['user']`` entries are: + Optional ``gen_specs["user"]`` entries are: - - ``'sample_points' [numpy array]``: Points to be sampled (original domain). + - ``"max_active_runs" [int]``: Bound on number of runs APOSMM is advancing + - ``"sample_points" [numpy array]``: Points to be sampled (original domain). If more sample points are needed by APOSMM during the course of the optimization, points will be drawn uniformly over the domain - - ``'components' [int]``: Number of objective components - - ``'dist_to_bound_multiple' [float in (0, 1]]``: What fraction of the + - ``"components" [int]``: Number of objective components + - ``"dist_to_bound_multiple" [float in (0, 1]]``: What fraction of the distance to the nearest boundary should the initial step size be in localopt runs - - ``'lhs_divisions' [int]``: Number of Latin hypercube sampling partitions + - ``"lhs_divisions" [int]``: Number of Latin hypercube sampling partitions (0 or 1 results in uniform sampling) - - ``'mu' [float]``: Distance from the boundary that all localopt starting + - ``"mu" [float]``: Distance from the boundary that all localopt starting points must satisfy - - ``'nu' [float]``: Distance from identified minima that all starting + - ``"nu" [float]``: Distance from identified minima that all starting points must satisfy - - ``'rk_const' [float]``: Multiplier in front of the r_k value - - ``'max_active_runs' [int]``: Bound on number of runs APOSMM is advancing - - ``'stop_after_k_minima' [int]``: Tell APOSMM to stop after this many + - ``"rk_const" [float]``: Multiplier in front of the ``r_k`` value + - ``"stop_after_k_minima" [int]``: Tell APOSMM to stop after this many local minima have been identified by a local optimization run. - - ``'stop_after_k_runs' [int]``: Tell APOSMM to stop after this many runs + - ``"stop_after_k_runs" [int]``: Tell APOSMM to stop after this many runs have ended. (The number of ended runs may be less than the number of minima if, for example, a local optimization run ends due to a evaluation constraint, but not convergence criteria.) If the rules in ``decide_where_to_start_localopt`` produces more than - ``'max_active_runs'`` in some iteration, then existing runs are prioritized. + ``"max_active_runs"`` in some iteration, then existing runs are prioritized. - And ``gen_specs['user']`` must also contain fields for the given + And ``gen_specs["user"]`` must also contain fields for the given localopt_method's convergence tolerances (e.g., ``gatol/grtol`` for PETSC/TAO or ``ftol_rel`` for NLopt) diff --git a/libensemble/gen_funcs/persistent_fd_param_finder.py b/libensemble/gen_funcs/persistent_fd_param_finder.py index 87881422e6..d72f64537a 100644 --- a/libensemble/gen_funcs/persistent_fd_param_finder.py +++ b/libensemble/gen_funcs/persistent_fd_param_finder.py @@ -35,7 +35,7 @@ def build_H0(x_f_pairs, gen_specs, noise_h_mat): def fd_param_finder(H, persis_info, gen_specs, libE_info): """ This generation function loops through a set of suitable finite difference - parameters for a mapping F from R^n to R^m. + parameters for a mapping ``F`` from ``R^n`` to ``R^m``. .. seealso:: `test_persistent_fd_param_finder.py` `_ # noqa @@ -56,16 +56,8 @@ def fd_param_finder(H, persis_info, gen_specs, libE_info): tag = None # # Request evaluations of the base point x0 at all p f_inds - # H0 = np.zeros(p, dtype=gen_specs["out"]) - # for j in range(p): - # H0["x"][j] = x0 - # H0["x_ind"][j] = -1 # Marking these to know they are the basepoint - # H0["f_ind"][j] = j - # H0["n_ind"][j] = nf/2 - # tag, Work, calc_in = sendrecv_mgr_worker_msg(comm, H0) for i in range(n): for j in range(p): - # Fhist0[i, j, nf//2] = calc_in["f_val"][calc_in["f_ind"]==j] Fhist0[i, j, nf // 2] = U["f0"][j] x_f_pairs = np.array(np.meshgrid(range(n), range(p))).T.reshape(-1, n) @@ -75,9 +67,6 @@ def fd_param_finder(H, persis_info, gen_specs, libE_info): tag, Work, calc_in = ps.send_recv(H0) - # import matlab.engine - # eng = matlab.engine.start_matlab() - # Send nf points for each (x_ind, f_ind) pair while tag not in [STOP_TAG, PERSIS_STOP]: x_f_pairs = np.unique(calc_in[["x_ind", "f_ind"]]) @@ -90,13 +79,6 @@ def fd_param_finder(H, persis_info, gen_specs, libE_info): logical_conds = (calc_in["x_ind"] == i, calc_in["f_ind"] == j, calc_in["n_ind"] == k) Fhist0[i, j, k] = calc_in["f_val"][np.logical_and.reduce(logical_conds)][0] - # Compute noise for (i, j): - # [Fnoise(i, j), ~, inform(i, j)] = ECnoise(nf-1, Fhist0(i, j, 2:nf)); - # t = eng.ECnoise(nf+1, matlab.double(Fhist0[i, j, :nf+1]), nargout=3) - # # Optional: check to see what would get with 2 fewer evals (requires nf>=4): - # [Fnoise2(i, j), ~, inform2(i, j)] = ECnoise(nf-1, Fhist0(i, j, 2:nf)); - - # cmd = ["/home/jlarson/software/MATLAB/R2019a/bin/matlab", "-batch", cmd = [ "octave", "--no-window-system", diff --git a/libensemble/gen_funcs/persistent_tasmanian.py b/libensemble/gen_funcs/persistent_tasmanian.py index cedb87c1ea..69ae8adeab 100644 --- a/libensemble/gen_funcs/persistent_tasmanian.py +++ b/libensemble/gen_funcs/persistent_tasmanian.py @@ -1,6 +1,6 @@ """ A persistent generator using the uncertainty quantification capabilities in -`Tasmanian `_. +`Tasmanian `_. """ import numpy as np diff --git a/pyproject.toml b/pyproject.toml index d4a82021e9..891c66add6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,6 +81,7 @@ pre-commit = ">=4.0.1,<5" nlopt = ">=2.9.0,<3" scipy = ">=1.14.1,<2" enchant = ">=2.8.2,<3" # required for sphinxcontrib-spelling +ax-platform = "<=0.4.0" [tool.pixi.dependencies] python = ">=3.9,<3.14" From 0ffd44bbe3ccfa213575c9d74a82af189377d2dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 19:42:13 +0000 Subject: [PATCH 028/215] Bump the python-updates group across 1 directory with 3 updates Bumps the python-updates group with 3 updates in the / directory: [matplotlib](https://github.com/matplotlib/matplotlib), [anyio](https://github.com/agronholm/anyio) and [globus-compute-sdk](https://github.com/globus/globus-compute). Updates `matplotlib` from 3.9.3 to 3.10.0 - [Release notes](https://github.com/matplotlib/matplotlib/releases) - [Commits](https://github.com/matplotlib/matplotlib/compare/v3.9.3...v3.10.0) Updates `anyio` from 4.7.0 to 4.8.0 - [Release notes](https://github.com/agronholm/anyio/releases) - [Changelog](https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst) - [Commits](https://github.com/agronholm/anyio/compare/4.7.0...4.8.0) Updates `globus-compute-sdk` from 2.33.0 to 2.34.0 - [Release notes](https://github.com/globus/globus-compute/releases) - [Changelog](https://github.com/globus/globus-compute/blob/main/docs/changelog.rst) - [Commits](https://github.com/globus/globus-compute/compare/2.33.0...2.34.0) --- updated-dependencies: - dependency-name: matplotlib dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates - dependency-name: anyio dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates - dependency-name: globus-compute-sdk dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- install/misc_feature_requirements.txt | 2 +- install/testing_requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/install/misc_feature_requirements.txt b/install/misc_feature_requirements.txt index a8e91cecac..3cb3a25b09 100644 --- a/install/misc_feature_requirements.txt +++ b/install/misc_feature_requirements.txt @@ -1 +1 @@ -globus-compute-sdk==2.33.0 +globus-compute-sdk==2.34.0 diff --git a/install/testing_requirements.txt b/install/testing_requirements.txt index ae6b37de0b..1beaa32c65 100644 --- a/install/testing_requirements.txt +++ b/install/testing_requirements.txt @@ -5,7 +5,7 @@ pytest-cov==6.0.0 pytest-timeout==2.3.1 mock==5.1.0 python-dateutil==2.9.0.post0 -anyio==4.7.0 -matplotlib==3.9.3 +anyio==4.8.0 +matplotlib==3.10.0 mpmath==1.3.0 rich==13.9.4 From fa3b2ab9a010fcd6d2f79545ad37931840493af1 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 15 Jan 2025 11:20:50 -0600 Subject: [PATCH 029/215] Update testing_requirements.txt --- install/testing_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/testing_requirements.txt b/install/testing_requirements.txt index 1beaa32c65..529d18d206 100644 --- a/install/testing_requirements.txt +++ b/install/testing_requirements.txt @@ -6,6 +6,6 @@ pytest-timeout==2.3.1 mock==5.1.0 python-dateutil==2.9.0.post0 anyio==4.8.0 -matplotlib==3.10.0 +matplotlib==3.9.3 mpmath==1.3.0 rich==13.9.4 From 64ddfca3c89ee9c073bc2b0aacd5e774ebbd3abd Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 15 Jan 2025 13:23:12 -0600 Subject: [PATCH 030/215] decrement matplotlib in pyproject.toml, add links to community examples in generators toctree, add gpcam.rst --- docs/examples/gen_funcs.rst | 5 +++++ docs/examples/gpcam.rst | 7 +++++++ pyproject.toml | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 docs/examples/gpcam.rst diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 5574c624b2..09159e4f98 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -22,6 +22,10 @@ Here we list many generator functions included with libEnsemble. aposmm uniform_or_localopt ax_multitask + VTMOP + ytopt + Ax + Dragonfly .. toctree:: :maxdepth: 2 @@ -31,5 +35,6 @@ Here we list many generator functions included with libEnsemble. tasmanian fd_param_finder surmise + DEAP .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples diff --git a/docs/examples/gpcam.rst b/docs/examples/gpcam.rst new file mode 100644 index 0000000000..97fb38b9a4 --- /dev/null +++ b/docs/examples/gpcam.rst @@ -0,0 +1,7 @@ +.. _gpcam: + +gpCAM +----- + +.. automodule:: persistent_gpCAM + :members: persistent_gpCAM_simple, persistent_gpCAM_ask_tell diff --git a/pyproject.toml b/pyproject.toml index 891c66add6..34b23c7064 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ pytest-timeout = ">=2.3.1,<3" mock = ">=5.1.0,<6" python-dateutil = ">=2.9.0.post0,<3" anyio = ">=4.7.0,<5" -matplotlib = ">=3.10.0,<4" +matplotlib = ">=3.9.0,<4" mpmath = ">=1.3.0,<2" rich = ">=13.9.4,<14" sphinx = ">=8.1.3,<9" From af3896cc25c8584b45dd0bd4985c37de8ec08b87 Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 16 Jan 2025 13:37:07 -0600 Subject: [PATCH 031/215] some rearranging, including having index under Examples, will fill with table of "Selected Examples". Generator function section lists all gens. --- docs/examples/examples_index.rst | 23 +++++++---------------- docs/examples/gen_funcs.rst | 3 --- docs/examples/sampling.rst | 6 +++--- docs/index.rst | 1 + docs/introduction.rst | 1 + 5 files changed, 12 insertions(+), 22 deletions(-) diff --git a/docs/examples/examples_index.rst b/docs/examples/examples_index.rst index 88a2df7a52..278c327a2b 100644 --- a/docs/examples/examples_index.rst +++ b/docs/examples/examples_index.rst @@ -1,20 +1,11 @@ -Example User Functions and Calling Scripts -========================================== +Selected Examples +================= -Here we give example generation, simulation, and allocation functions for -libEnsemble, as well as example calling scripts. +.. include:: ../introduction.rst + :start-after: example_packages + :end-before: libEnsemble has also been used to coordinate many computationally expensive -Additional examples from libEnsemble's users are available in -the `libEnsemble Community Repository`_, with corresponding generator documentation available -:doc:`here`. - -.. toctree:: - :maxdepth: 2 - :caption: libEnsemble Example Functions: - - gen_funcs - sim_funcs - alloc_funcs - calling_scripts +.. include:: ../introduction.rst + :start-after: - WarpX_ Advanced electromagnetic particle-in-cell code. .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 09159e4f98..5f0385ad15 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -3,9 +3,6 @@ Generator Functions Here we list many generator functions included with libEnsemble. -.. include:: ../introduction.rst - :start-after: example_packages - .. IMPORTANT:: See the API for generator functions :ref:`here`. diff --git a/docs/examples/sampling.rst b/docs/examples/sampling.rst index fa8830a8a5..f54116159a 100644 --- a/docs/examples/sampling.rst +++ b/docs/examples/sampling.rst @@ -5,7 +5,7 @@ sampling :class: underline .. automodule:: sampling - :members: uniform_random_sample, latin_hypercube_sample + :members: :undoc-members: .. dropdown:: :underline:`sampling.py` @@ -17,7 +17,7 @@ sampling persistent_sampling ------------------- .. automodule:: persistent_sampling - :members: persistent_uniform, persistent_request_shutdown, persistent_uniform_with_cancellations + :members: :undoc-members: .. dropdown:: :underline:`persistent_sampling.py` @@ -29,5 +29,5 @@ persistent_sampling persistent_sampling_var_resources --------------------------------- .. automodule:: persistent_sampling_var_resources - :members: uniform_sample_with_var_gpus + :members: :undoc-members: diff --git a/docs/index.rst b/docs/index.rst index 3cfa749e97..1e0e566adc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,6 +30,7 @@ :maxdepth: 1 :caption: Examples: + examples/examples_index examples/gen_funcs examples/sim_funcs examples/alloc_funcs diff --git a/docs/introduction.rst b/docs/introduction.rst index 9c9d08e169..4b36943398 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -8,6 +8,7 @@ See the `user guide`_ for more information. .. example_packages .. dropdown:: **Example Compatible Packages** + :open: libEnsemble and the `Community Examples repository`_ include example generator functions for the following libraries: From c9b8316c0fcacd2e638914a8892f350bad6f0fa2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 19:25:28 +0000 Subject: [PATCH 032/215] Bump crate-ci/typos from 1.29.4 to 1.29.5 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.29.4 to 1.29.5. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.29.4...v1.29.5) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 7b3dd61c41..f7b1c23977 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.4 + - uses: crate-ci/typos@v1.29.5 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 3565768c57..feaa173073 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -181,4 +181,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.4 + - uses: crate-ci/typos@v1.29.5 From 9a4b571c720966221e95762a5a43eabc44564adb Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 3 Feb 2025 18:09:59 -0600 Subject: [PATCH 033/215] Updated Ax multitask generator for Ax > 0.4.0 * Implemented a custom get_MTGP function * Use register_metrics for serialization of output --- .../gen_funcs/persistent_ax_multitask.py | 90 +++++++++++++++++-- 1 file changed, 81 insertions(+), 9 deletions(-) diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 7f61104762..0018eff631 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -8,16 +8,25 @@ This `gen_f` is meant to be used with the `alloc_f` function `only_persistent_gens` -This test currently requires ax-platform<=0.4.0 +Ax notes: +Each arm = a set of simulation inputs (a sim_id) +Each trial = a batch of simulations. +The metric = the recorded simulation output (f) that Ax optimizes. +An Ax runner handles the execution of trials - AxRunner wraps Runner to use libE. + """ import os from copy import deepcopy +from typing import Optional import numpy as np import pandas as pd +import torch + from ax import Metric, Runner from ax.core.data import Data +from ax.core.experiment import Experiment from ax.core.generator_run import GeneratorRun from ax.core.multi_type_experiment import MultiTypeExperiment from ax.core.objective import Objective @@ -26,24 +35,84 @@ from ax.core.parameter import ParameterType, RangeParameter from ax.core.search_space import SearchSpace from ax.modelbridge.factory import get_sobol +from ax.modelbridge.registry import Models, MT_MTGP_trans, ST_MTGP_trans +from ax.modelbridge.torch import TorchModelBridge +from ax.modelbridge.transforms.convert_metric_names import tconfig_from_mt_experiment +from ax.utils.common.typeutils import checked_cast +from ax.storage.metric_registry import register_metrics from ax.runners import SyntheticRunner from ax.storage.json_store.save import save_experiment -from ax.storage.metric_registry import register_metric from ax.storage.runner_registry import register_runner from ax.utils.common.result import Ok -try: - from ax.modelbridge.factory import get_MTGP -except ImportError: - # For Ax >= 0.3.4 - from ax.modelbridge.factory import get_MTGP_LEGACY as get_MTGP - from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG from libensemble.tools.persistent_support import PersistentSupport __all__ = ["persistent_gp_mt_ax_gen_f"] +def get_MTGP( + experiment: Experiment, + data: Data, + search_space: Optional[SearchSpace] = None, + trial_index: Optional[int] = None, + device: torch.device = torch.device("cpu"), + dtype: torch.dtype = torch.double, +) -> TorchModelBridge: + """Instantiates a Multi-task Gaussian Process (MTGP) model that generates + points with EI. + + If the input experiment is a MultiTypeExperiment then a + Multi-type Multi-task GP model will be instantiated. + Otherwise, the model will be a Single-type Multi-task GP. + """ + + if isinstance(experiment, MultiTypeExperiment): + trial_index_to_type = { + t.index: t.trial_type for t in experiment.trials.values() + } + transforms = MT_MTGP_trans + transform_configs = { + "TrialAsTask": {"trial_level_map": {"trial_type": trial_index_to_type}}, + "ConvertMetricNames": tconfig_from_mt_experiment(experiment), + } + else: + # Set transforms for a Single-type MTGP model. + transforms = ST_MTGP_trans + transform_configs = None + + # Choose the status quo features for the experiment from the selected trial. + # If trial_index is None, we will look for a status quo from the last + # experiment trial to use as a status quo for the experiment. + if trial_index is None: + trial_index = len(experiment.trials) - 1 + elif trial_index >= len(experiment.trials): + raise ValueError("trial_index is bigger than the number of experiment trials") + + status_quo = experiment.trials[trial_index].status_quo + if status_quo is None: + status_quo_features = None + else: + status_quo_features = ObservationFeatures( + parameters=status_quo.parameters, + trial_index=trial_index, # pyre-ignore[6] + ) + + return checked_cast( + TorchModelBridge, + Models.ST_MTGP( + experiment=experiment, + search_space=search_space or experiment.search_space, + data=data, + transforms=transforms, + transform_configs=transform_configs, + torch_dtype=dtype, + torch_device=device, + status_quo_features=status_quo_features, + ), + ) + + def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): """ Create a Gaussian Process model for multi-task optimization @@ -99,6 +168,7 @@ def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): optimization_config=opt_config, ) + # hifi_task has been added as default but we need to add lofi task and link them. exp.add_trial_type(lofi_task, ax_runner) exp.add_tracking_metric(metric=lofi_objective, trial_type=lofi_task, canonical_name="hifi_metric") @@ -171,7 +241,9 @@ def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): if not os.path.exists("model_history"): os.mkdir("model_history") # Register metric and runner in order to be able to save to json. - _, encoder_registry, decoder_registry = register_metric(AxMetric) + _, encoder_registry, decoder_registry = register_metrics( + {AxMetric: None} + ) _, encoder_registry, decoder_registry = register_runner( AxRunner, encoder_registry=encoder_registry, From eaef976e88b0aeca45fb8cdd2a0d1149fa63bc22 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 3 Feb 2025 18:29:08 -0600 Subject: [PATCH 034/215] Make test_persistent_gp_multitask_ax.py use gen_on_manager --- .../test_persistent_gp_multitask_ax.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py index 35acc541e3..57e701f57f 100644 --- a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py +++ b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py @@ -2,21 +2,22 @@ Example of multi-fidelity optimization using a persistent GP gen_func (calling Ax). +Test is set to use the gen_on_manager option (persistent generator runs on +a thread). Therefore nworkers is the number of simulation workers. + Execute via one of the following commands (e.g. 5 workers): - mpiexec -np 5 python test_persistent_gp_multitask_ax.py - python test_persistent_gp_multitask_ax.py --nworkers 4 --comms local - python test_persistent_gp_multitask_ax.py --nworkers 4 --comms tcp + mpiexec -np 4 python test_persistent_gp_multitask_ax.py + python test_persistent_gp_multitask_ax.py --nworkers 3 --comms local + python test_persistent_gp_multitask_ax.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of -the objective function will be 3, as one of the three workers will be the -persistent generator. +the objective function will be 3. -Requires numpy<2. """ # Do not change these lines - they are parsed by run-tests.sh # TESTSUITE_COMMS: local mpi -# TESTSUITE_NPROCS: 5 +# TESTSUITE_NPROCS: 4 # TESTSUITE_EXTRA: true # TESTSUITE_OS_SKIP: OSX # TESTSUITE_EXCLUDE: true @@ -63,6 +64,7 @@ def run_simulation(H, persis_info, sim_specs, libE_info): # Main block is necessary only when using local comms with spawn start method (default on macOS and Windows). if __name__ == "__main__": nworkers, is_manager, libE_specs, _ = parse_args() + libE_specs["gen_on_manager"] = True mt_params = { "name_hifi": "expensive_model", From 75c666e177e4097fb25b3f243c0f2e80c79d3d99 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 3 Feb 2025 19:07:45 -0600 Subject: [PATCH 035/215] Enable running Ax on CI --- install/gen_deps_environment.yml | 1 + .../tests/regression_tests/test_persistent_gp_multitask_ax.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/install/gen_deps_environment.yml b/install/gen_deps_environment.yml index 9c5492663f..190c5ffd09 100644 --- a/install/gen_deps_environment.yml +++ b/install/gen_deps_environment.yml @@ -12,3 +12,4 @@ dependencies: - mumps-mpi - DFO-LS - mpmath + - ax-platform diff --git a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py index 57e701f57f..568eb6e76f 100644 --- a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py +++ b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py @@ -20,7 +20,6 @@ # TESTSUITE_NPROCS: 4 # TESTSUITE_EXTRA: true # TESTSUITE_OS_SKIP: OSX -# TESTSUITE_EXCLUDE: true import warnings From 00e96d9ea51bdb89cace05e3b9bb2cc4a5ef19c0 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 3 Feb 2025 19:38:16 -0600 Subject: [PATCH 036/215] Filter warnings for Ax --- libensemble/gen_funcs/persistent_ax_multitask.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 0018eff631..8ed38725ee 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -50,6 +50,21 @@ __all__ = ["persistent_gp_mt_ax_gen_f"] +import warnings +from ax.exceptions.core import AxParameterWarning + +warnings.filterwarnings( + "ignore", + message="`cache_root` is only supported for GPyTorchModels", + category=RuntimeWarning, +) + +warnings.filterwarnings( + "ignore", + message="Changing `is_ordered` to `True` for `ChoiceParameter`", + category=AxParameterWarning, +) + def get_MTGP( experiment: Experiment, From c466c81df42b7ebc7e20db8fb5aa289809f503e2 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 5 Feb 2025 14:41:15 -0600 Subject: [PATCH 037/215] Update multitask gen for Ax v0.5.0 --- .../gen_funcs/persistent_ax_multitask.py | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 8ed38725ee..91a57e2eb5 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -12,13 +12,15 @@ Each arm = a set of simulation inputs (a sim_id) Each trial = a batch of simulations. The metric = the recorded simulation output (f) that Ax optimizes. -An Ax runner handles the execution of trials - AxRunner wraps Runner to use libE. +Ax runner handles the execution of trials - AxRunner wraps Runner to use libE tr.run() """ import os from copy import deepcopy from typing import Optional +from pyre_extensions import assert_is_instance +import warnings import numpy as np import pandas as pd @@ -34,25 +36,42 @@ from ax.core.optimization_config import OptimizationConfig from ax.core.parameter import ParameterType, RangeParameter from ax.core.search_space import SearchSpace +from ax.exceptions.core import AxParameterWarning from ax.modelbridge.factory import get_sobol -from ax.modelbridge.registry import Models, MT_MTGP_trans, ST_MTGP_trans +from ax.modelbridge.registry import Models, ST_MTGP_trans from ax.modelbridge.torch import TorchModelBridge from ax.modelbridge.transforms.convert_metric_names import tconfig_from_mt_experiment -from ax.utils.common.typeutils import checked_cast from ax.storage.metric_registry import register_metrics from ax.runners import SyntheticRunner from ax.storage.json_store.save import save_experiment from ax.storage.runner_registry import register_runner from ax.utils.common.result import Ok +try: + # For Ax >= 0.5.0 + from ax.modelbridge.transforms.derelativize import Derelativize + from ax.modelbridge.transforms.convert_metric_names import ConvertMetricNames + from ax.modelbridge.transforms.trial_as_task import TrialAsTask + from ax.modelbridge.transforms.stratified_standardize_y import StratifiedStandardizeY + from ax.modelbridge.transforms.task_encode import TaskChoiceToIntTaskChoice + from ax.modelbridge.registry import MBM_X_trans + MT_MTGP_trans = MBM_X_trans + [ + Derelativize, + ConvertMetricNames, + TrialAsTask, + StratifiedStandardizeY, + TaskChoiceToIntTaskChoice, + ] + +except ImportError: + # For Ax < 0.5.0 + from ax.modelbridge.registry import MT_MTGP_trans + from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG from libensemble.tools.persistent_support import PersistentSupport __all__ = ["persistent_gp_mt_ax_gen_f"] -import warnings -from ax.exceptions.core import AxParameterWarning - warnings.filterwarnings( "ignore", message="`cache_root` is only supported for GPyTorchModels", @@ -66,6 +85,7 @@ ) +# get_MTGP based on https://ax.dev/docs/tutorials/multi_task/ def get_MTGP( experiment: Experiment, data: Data, @@ -113,8 +133,7 @@ def get_MTGP( trial_index=trial_index, # pyre-ignore[6] ) - return checked_cast( - TorchModelBridge, + return assert_is_instance( Models.ST_MTGP( experiment=experiment, search_space=search_space or experiment.search_space, @@ -125,6 +144,7 @@ def get_MTGP( torch_device=device, status_quo_features=status_quo_features, ), + TorchModelBridge, ) @@ -228,7 +248,7 @@ def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): # But launch them at low fidelity. tr = exp.new_batch_trial(trial_type=lofi_task, generator_run=gr) - tr.run() + tr.run() # Runs sims via libE (see AxRunner.run below) tr.mark_completed() tag = tr.run_metadata["tag"] if tag in [STOP_TAG, PERSIS_STOP]: @@ -244,7 +264,7 @@ def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): # Select max-utility points from the low fidelity batch to generate a high fidelity batch. gr = max_utility_from_GP(n=n_opt_hifi, m=m, gr=gr, hifi_task=hifi_task) tr = exp.new_batch_trial(trial_type=hifi_task, generator_run=gr) - tr.run() + tr.run() # Runs sims via libE (see AxRunner.run below) tr.mark_completed() tag = tr.run_metadata["tag"] if tag in [STOP_TAG, PERSIS_STOP]: @@ -311,9 +331,8 @@ def run(self, trial): for j in range(n_param): param_array[j] = params[f"x{j}"] H_o["x"][i] = param_array - H_o["resource_sets"][i] = 1 + H_o["resource_sets"][i] = 1 # one is default but could be diff for hi/lo H_o["task"][i] = task - tag, Work, calc_in = self.ps.send_recv(H_o) trial_metadata["tag"] = tag From 4c1ff40a8bce255a23319a8bf6620e91bd30e225 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 5 Feb 2025 15:07:16 -0600 Subject: [PATCH 038/215] Update gpCAM version --- .github/workflows/extra.yml | 2 +- install/ubuntu_no312.txt | 2 +- libensemble/tests/regression_tests/test_gpCAM.py | 1 - .../regression_tests/test_persistent_gp_multitask_ax.py | 1 + libensemble/tests/run_tests.py | 5 +++-- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 3565768c57..80cea9ae3e 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -94,7 +94,7 @@ jobs: conda env update --file install/gen_deps_environment.yml - name: Install gpcam - if: matrix.python-version != '3.12' + if: matrix.python-version <= '3.13' run: | pip install gpcam diff --git a/install/ubuntu_no312.txt b/install/ubuntu_no312.txt index 35964ae6cc..671febe2ba 100644 --- a/install/ubuntu_no312.txt +++ b/install/ubuntu_no312.txt @@ -1,4 +1,4 @@ -gpcam==8.1.6 +gpcam==8.1.12 scikit-build==0.18.1 packaging==24.1 git+https://github.com/bandframework/surmise.git diff --git a/libensemble/tests/regression_tests/test_gpCAM.py b/libensemble/tests/regression_tests/test_gpCAM.py index e1bc1e4049..c62ebb461c 100644 --- a/libensemble/tests/regression_tests/test_gpCAM.py +++ b/libensemble/tests/regression_tests/test_gpCAM.py @@ -19,7 +19,6 @@ # TESTSUITE_COMMS: mpi local # TESTSUITE_NPROCS: 4 # TESTSUITE_EXTRA: true -# TESTSUITE_EXCLUDE: true import sys import warnings diff --git a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py index 568eb6e76f..96e30d98af 100644 --- a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py +++ b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py @@ -50,6 +50,7 @@ def run_simulation(H, persis_info, sim_specs, libE_info): z = 8 elif task == "cheap_model": z = 1 + print('in sim', task) libE_output = np.zeros(1, dtype=sim_specs["out"]) calc_status = WORKER_DONE diff --git a/libensemble/tests/run_tests.py b/libensemble/tests/run_tests.py index e8f7de57eb..8aeb4c2f98 100755 --- a/libensemble/tests/run_tests.py +++ b/libensemble/tests/run_tests.py @@ -29,7 +29,7 @@ REG_TEST_LIST = "test_*.py" REG_TEST_OUTPUT_EXT = "std.out" REG_STOP_ON_FAILURE = False -REG_LIST_TESTS_ONLY = False # just shows all tests to be run. +REG_LIST_TESTS_ONLY = True # just shows all tests to be run. REG_RUN_LARGEST_TEST_ONLY = False # Test Directories - all relative to project root dir @@ -360,7 +360,7 @@ def run_regression_tests(root_dir, python_exec, args, current_os): user_comms_list = ["mpi", "local", "tcp"] print_heading(f"Running regression tests (comms: {', '.join(user_comms_list)})") - build_forces(root_dir) # Build forces.x before running tests + # build_forces(root_dir) # Build forces.x before running tests reg_test_list = REG_TEST_LIST reg_test_files = [] @@ -375,6 +375,7 @@ def run_regression_tests(root_dir, python_exec, args, current_os): start_time = time.time() for test_script in reg_test_files: + print(test_script) test_script_name = os.path.basename(test_script) directives = parse_test_directives(test_script) if skip_test(directives, args, current_os): From 5d60e9409617ebadf99a7562d63d79ec6c35e323 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 5 Feb 2025 15:16:21 -0600 Subject: [PATCH 039/215] Do not build forces if only listing tests --- libensemble/tests/run_tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libensemble/tests/run_tests.py b/libensemble/tests/run_tests.py index 8aeb4c2f98..073ab1a541 100755 --- a/libensemble/tests/run_tests.py +++ b/libensemble/tests/run_tests.py @@ -29,7 +29,7 @@ REG_TEST_LIST = "test_*.py" REG_TEST_OUTPUT_EXT = "std.out" REG_STOP_ON_FAILURE = False -REG_LIST_TESTS_ONLY = True # just shows all tests to be run. +REG_LIST_TESTS_ONLY = False # just shows all tests to be run. REG_RUN_LARGEST_TEST_ONLY = False # Test Directories - all relative to project root dir @@ -360,7 +360,8 @@ def run_regression_tests(root_dir, python_exec, args, current_os): user_comms_list = ["mpi", "local", "tcp"] print_heading(f"Running regression tests (comms: {', '.join(user_comms_list)})") - # build_forces(root_dir) # Build forces.x before running tests + if not REG_LIST_TESTS_ONLY: + build_forces(root_dir) # Build forces.x before running tests reg_test_list = REG_TEST_LIST reg_test_files = [] @@ -375,7 +376,6 @@ def run_regression_tests(root_dir, python_exec, args, current_os): start_time = time.time() for test_script in reg_test_files: - print(test_script) test_script_name = os.path.basename(test_script) directives = parse_test_directives(test_script) if skip_test(directives, args, current_os): From 507a3a7707d7ea64fd4bfaed58df904375458ef3 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Thu, 13 Feb 2025 15:11:47 -0600 Subject: [PATCH 040/215] Adjusting to account for 3.10 as minimum python version --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- .pre-commit-config.yaml | 4 ++-- .readthedocs.yml | 2 +- docs/advanced_installation.rst | 8 ++++---- docs/platforms/perlmutter.rst | 2 +- docs/platforms/summit.rst | 2 +- docs/tutorials/local_sine_tutorial.rst | 2 +- pyproject.toml | 5 ++--- 9 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index f7b1c23977..a2c4e98d15 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -17,7 +17,7 @@ jobs: matrix: os: [ubuntu-latest] mpi-version: [mpich] - python-version: [3.9, "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13"] pydantic-version: ["2.8.2"] comms-type: [m, l] include: diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index feaa173073..41f9e979ed 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -11,7 +11,7 @@ jobs: matrix: os: [ubuntu-latest] mpi-version: [mpich] - python-version: [3.9, "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] pydantic-version: ["2.8.2"] comms-type: [m, l] include: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 309db9e15c..ab7687d1ef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,13 +8,13 @@ repos: exclude: ^(.*\.xml|.*\.svg)$ - repo: https://github.com/pycqa/isort - rev: 5.13.2 + rev: 6.0.0 hooks: - id: isort args: [--profile=black, --line-length=120] - repo: https://github.com/psf/black - rev: 24.10.0 + rev: 25.1.0 hooks: - id: black args: [--line-length=120] diff --git a/.readthedocs.yml b/.readthedocs.yml index a8caf706f0..50b0395fae 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -3,7 +3,7 @@ version: 2 build: os: "ubuntu-22.04" tools: - python: "3.9" + python: "3.10" sphinx: configuration: docs/conf.py diff --git a/docs/advanced_installation.rst b/docs/advanced_installation.rst index 758b7277a0..4d436eb2cd 100644 --- a/docs/advanced_installation.rst +++ b/docs/advanced_installation.rst @@ -6,7 +6,7 @@ libEnsemble can be installed from ``pip``, ``Conda``, or ``Spack``. libEnsemble requires the following dependencies, which are typically automatically installed alongside libEnsemble: -* Python_ ``>= 3.9`` +* Python_ ``>= 3.10`` * NumPy_ ``>= 1.21`` * psutil_ ``>= 5.9.4`` * `pydantic`_ ``<= 1.10.12`` @@ -139,7 +139,7 @@ Further recommendations for selected HPC systems are given in the **Hint**: When combining Spack and Conda, you can access your Conda Python and packages in your ``~/.spack/packages.yaml`` while your Conda environment is activated, using ``CONDA_PREFIX`` - For example, if you have an activated Conda environment with Python 3.9 and SciPy installed: + For example, if you have an activated Conda environment with Python 3.10 and SciPy installed: .. code-block:: yaml @@ -152,12 +152,12 @@ Further recommendations for selected HPC systems are given in the py-numpy: externals: - spec: "py-numpy" - prefix: $CONDA_PREFIX/lib/python3.9/site-packages/numpy + prefix: $CONDA_PREFIX/lib/python3.10/site-packages/numpy buildable: False py-scipy: externals: - spec: "py-scipy" - prefix: $CONDA_PREFIX/lib/python3.9/site-packages/scipy + prefix: $CONDA_PREFIX/lib/python3.10/site-packages/scipy buildable: True For more information on Spack builds and any particular considerations diff --git a/docs/platforms/perlmutter.rst b/docs/platforms/perlmutter.rst index c9f903dc44..2019c72cfb 100644 --- a/docs/platforms/perlmutter.rst +++ b/docs/platforms/perlmutter.rst @@ -21,7 +21,7 @@ Create a conda environment You can create a conda_ environment in which to install libEnsemble and all dependencies. For example:: - conda create -n libe-pm python=3.9 -y + conda create -n libe-pm python=3.10 -y As Perlmutter has a shared HOME filesystem with other clusters, using the ``-pm`` suffix (for Perlmutter) is good practice. diff --git a/docs/platforms/summit.rst b/docs/platforms/summit.rst index b68f9c35ee..80f166ef0d 100644 --- a/docs/platforms/summit.rst +++ b/docs/platforms/summit.rst @@ -21,7 +21,7 @@ Begin by loading the Python 3 Anaconda module:: You can now create and activate your own custom conda_ environment:: - conda create --name myenv python=3.9 + conda create --name myenv python=3.10 export PYTHONNOUSERSITE=1 # Make sure get python from conda env . activate myenv diff --git a/docs/tutorials/local_sine_tutorial.rst b/docs/tutorials/local_sine_tutorial.rst index 00dafdcdfb..0509824750 100644 --- a/docs/tutorials/local_sine_tutorial.rst +++ b/docs/tutorials/local_sine_tutorial.rst @@ -22,7 +22,7 @@ need to write a new allocation function. .. code-block:: bash - python --version # This should be >= 3.9 + python --version # This should be >= 3.10 .. _Python: https://www.python.org/ diff --git a/pyproject.toml b/pyproject.toml index 9fab5c9bde..11cfec398d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ dependencies = ["numpy", "psutil", "pydantic", "pyyaml", "tomli"] description = "A Python toolkit for coordinating asynchronous and dynamic ensembles of calculations." name = "libensemble" -requires-python = ">=3.9" +requires-python = ">=3.10" license = {file = "LICENSE"} readme = "README.rst" @@ -22,7 +22,6 @@ classifiers = [ "Operating System :: Unix", "Operating System :: MacOS", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -83,7 +82,7 @@ nlopt = ">=2.8.0,<3" scipy = ">=1.9.1,<2" [tool.pixi.dependencies] -python = ">=3.9,<3.14" +python = ">=3.10,<3.14" pip = ">=24.3.1,<25" setuptools = ">=75.1.0,<76" numpy = ">=1.21,<3" From 5bd1de23b8f5eaffa8445943d788eaa879aee2ee Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Fri, 14 Feb 2025 08:12:40 -0600 Subject: [PATCH 041/215] Update test_persistent_gp_multitask_ax.py --- .../tests/regression_tests/test_persistent_gp_multitask_ax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py index 96e30d98af..478b42fcc5 100644 --- a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py +++ b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py @@ -5,7 +5,7 @@ Test is set to use the gen_on_manager option (persistent generator runs on a thread). Therefore nworkers is the number of simulation workers. -Execute via one of the following commands (e.g. 5 workers): +Execute via one of the following commands: mpiexec -np 4 python test_persistent_gp_multitask_ax.py python test_persistent_gp_multitask_ax.py --nworkers 3 --comms local python test_persistent_gp_multitask_ax.py --nworkers 3 --comms tcp From 0a9e10e4b51684ecad0c1e68e40ebaf3d6b4b000 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:22:53 +0000 Subject: [PATCH 042/215] Bump crate-ci/typos from 1.29.5 to 1.29.7 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.29.5 to 1.29.7. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.29.5...v1.29.7) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index f7b1c23977..3c01b41c63 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.5 + - uses: crate-ci/typos@v1.29.7 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 160f3c9e95..c907f1e946 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -181,4 +181,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.5 + - uses: crate-ci/typos@v1.29.7 From 3543ea49e21c7759b3f8ee516764071370477e42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:41:10 +0000 Subject: [PATCH 043/215] Bump the python-updates group across 1 directory with 4 updates Updates the requirements on [pip](https://github.com/pypa/pip), [matplotlib](https://github.com/matplotlib/matplotlib), [globus-compute-sdk](https://github.com/globus/globus-compute) and [flake8](https://github.com/pycqa/flake8) to permit the latest version. Updates `pip` to 25.0.1 - [Changelog](https://github.com/pypa/pip/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/pip/compare/24.3.1...25.0.1) Updates `matplotlib` from 3.9.3 to 3.10.0 - [Release notes](https://github.com/matplotlib/matplotlib/releases) - [Commits](https://github.com/matplotlib/matplotlib/compare/v3.9.3...v3.10.0) Updates `globus-compute-sdk` from 2.34.0 to 3.1.1 - [Release notes](https://github.com/globus/globus-compute/releases) - [Changelog](https://github.com/globus/globus-compute/blob/main/docs/changelog.rst) - [Commits](https://github.com/globus/globus-compute/compare/2.34.0...3.1.1) Updates `flake8` from 7.1.1 to 7.1.2 - [Commits](https://github.com/pycqa/flake8/compare/7.1.1...7.1.2) --- updated-dependencies: - dependency-name: pip dependency-type: direct:production dependency-group: python-updates - dependency-name: matplotlib dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates - dependency-name: globus-compute-sdk dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-updates - dependency-name: flake8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- install/misc_feature_requirements.txt | 2 +- install/testing_requirements.txt | 4 ++-- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install/misc_feature_requirements.txt b/install/misc_feature_requirements.txt index 3cb3a25b09..1786efcaf0 100644 --- a/install/misc_feature_requirements.txt +++ b/install/misc_feature_requirements.txt @@ -1 +1 @@ -globus-compute-sdk==2.34.0 +globus-compute-sdk==3.1.1 diff --git a/install/testing_requirements.txt b/install/testing_requirements.txt index 529d18d206..5eee68d8e6 100644 --- a/install/testing_requirements.txt +++ b/install/testing_requirements.txt @@ -1,4 +1,4 @@ -flake8==7.1.1 +flake8==7.1.2 coverage>=7.5 pytest==8.3.4 pytest-cov==6.0.0 @@ -6,6 +6,6 @@ pytest-timeout==2.3.1 mock==5.1.0 python-dateutil==2.9.0.post0 anyio==4.8.0 -matplotlib==3.9.3 +matplotlib==3.10.0 mpmath==1.3.0 rich==13.9.4 diff --git a/pyproject.toml b/pyproject.toml index 11cfec398d..8b5be4bf64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ Issues = "https://github.com/Libensemble/libensemble/issues" [build-system] build-backend = "setuptools.build_meta" -requires = ["setuptools", "wheel", "pip>=24.3.1,<25", "setuptools>=75.1.0,<76", ] +requires = ["setuptools", "wheel", "pip>=24.3.1,<26", "setuptools>=75.1.0,<76", ] [tool.setuptools.packages.find] where = ["."] From c29f4365f32058a22a458a875dc4deb398234aae Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Feb 2025 17:54:39 -0600 Subject: [PATCH 044/215] Delay error when no MPI runner found. MPI runner can be specified on the submit call or in an env script. --- libensemble/executors/mpi_executor.py | 3 +++ libensemble/executors/mpi_runner.py | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libensemble/executors/mpi_executor.py b/libensemble/executors/mpi_executor.py index 96c4d0d090..157402390d 100644 --- a/libensemble/executors/mpi_executor.py +++ b/libensemble/executors/mpi_executor.py @@ -336,6 +336,9 @@ def submit( else: mpi_runner_obj = self.mpi_runner_obj or self._create_mpi_runner_from_attr() + if env_script is None and mpi_runner_obj is None: + raise ExecutorException("No valid MPI runner was found") + mpi_specs = mpi_runner_obj.get_mpi_specs( task, num_procs, diff --git a/libensemble/executors/mpi_runner.py b/libensemble/executors/mpi_runner.py index eb002d14b5..48953cc3c9 100644 --- a/libensemble/executors/mpi_runner.py +++ b/libensemble/executors/mpi_runner.py @@ -21,11 +21,13 @@ def get_runner(mpi_runner_type, runner_name=None, platform_info=None): "msmpi": MSMPI_MPIRunner, "custom": MPIRunner, } - mpi_runner = mpi_runners[mpi_runner_type] - if runner_name is not None: - runner = mpi_runner(run_command=runner_name, platform_info=platform_info) - else: - runner = mpi_runner(platform_info=platform_info) + runner = None + if mpi_runner_type is not None: + mpi_runner = mpi_runners[mpi_runner_type] + if runner_name is not None: + runner = mpi_runner(run_command=runner_name, platform_info=platform_info) + else: + runner = mpi_runner(platform_info=platform_info) return runner def __init__(self, run_command="mpiexec", platform_info=None): From 69f40ccfdaec57947d2ae7a33de77a54d2bd4dab Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Feb 2025 17:57:36 -0600 Subject: [PATCH 045/215] Improve custom_info explanation and formatting --- libensemble/executors/mpi_executor.py | 31 +++++++++++++++------------ 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/libensemble/executors/mpi_executor.py b/libensemble/executors/mpi_executor.py index 157402390d..28d1fb6f97 100644 --- a/libensemble/executors/mpi_executor.py +++ b/libensemble/executors/mpi_executor.py @@ -47,29 +47,32 @@ class MPIExecutor(Executor): information using the ``custom_info`` argument. This takes a dictionary of values. - The allowable fields are:: + The allowable fields are: - 'mpi_runner' [string]: - Select runner: 'mpich', 'openmpi', 'aprun', 'srun', 'jsrun', 'custom' - All except 'custom' relate to runner classes in libEnsemble. + .. parsed-literal:: + + **'mpi_runner'** [string]: + Select runner: `'mpich'`, `'openmpi'`, `'aprun'`, `'srun'`, `'jsrun'`, `'custom'` + All except `'custom'` relate to runner classes in libEnsemble. Custom allows user to define their own run-lines but without parsing arguments or making use of auto-resources. - 'runner_name' [string]: - Runner name: Replaces run command if present. All runners have a default - except for 'custom'. - 'subgroup_launch' [bool]: + **'runner_name'** [string]: + The literal string that appears at the front of the run command. + This is typically 'mpirun', 'srun', etc., and can be a full path. + Defaults exist for all runners except 'custom'. + **'subgroup_launch'** [bool]: Whether MPI runs should be initiated in a new process group. This needs to be correct for kills to work correctly. Use the standalone test at - libensemble/tests/standalone_tests/kill_test to determine correct value + `libensemble/tests/standalone_tests/kill_test` to determine correct value for a system. - For example:: + For example:: - customizer = {'mpi_runner': 'mpich', - 'runner_name': 'wrapper -x mpich'} + customizer = {'mpi_runner': 'mpich', + 'runner_name': 'wrapper -x mpich'} - from libensemble.executors.mpi_executor import MPIExecutor - exctr = MPIExecutor(custom_info=customizer) + from libensemble.executors.mpi_executor import MPIExecutor + exctr = MPIExecutor(custom_info=customizer) """ From 1991dd8462ca0025485478ac609f8c518d47fc76 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 18 Feb 2025 14:44:36 -0600 Subject: [PATCH 046/215] Testing for 3.13 --- .github/workflows/extra.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index a9f3196845..c0ef64f016 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -11,22 +11,22 @@ jobs: matrix: os: [ubuntu-latest] mpi-version: [mpich] - python-version: ["3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12", "3.13"] pydantic-version: ["2.8.2"] comms-type: [m, l] include: - os: macos-latest - python-version: 3.11 + python-version: "3.13" mpi-version: mpich pydantic-version: "2.8.2" comms-type: m - os: macos-latest - python-version: 3.11 + python-version: "3.13" mpi-version: mpich pydantic-version: "2.8.2" comms-type: l - os: ubuntu-latest - python-version: "3.10" + python-version: "3.12" mpi-version: mpich pydantic-version: "2.8.2" comms-type: t @@ -37,12 +37,12 @@ jobs: comms-type: l - os: ubuntu-latest mpi-version: mpich - python-version: "3.10" + python-version: "3.12" pydantic-version: "1.10.17" comms-type: m - os: ubuntu-latest mpi-version: mpich - python-version: "3.10" + python-version: "3.12" pydantic-version: "1.10.17" comms-type: l From b7317dbe98e8ef8bcd8c6200d7bff3eab2cb1854 Mon Sep 17 00:00:00 2001 From: Stephen Hudson Date: Tue, 18 Feb 2025 15:35:46 -0600 Subject: [PATCH 047/215] Update Aurora guide (#1510) --------- Co-authored-by: Jeffrey Larson --- docs/platforms/aurora.rst | 89 ++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 20 deletions(-) diff --git a/docs/platforms/aurora.rst b/docs/platforms/aurora.rst index 864d5bedf1..4189de840c 100644 --- a/docs/platforms/aurora.rst +++ b/docs/platforms/aurora.rst @@ -12,10 +12,16 @@ nodes. Configuring Python and Installation ----------------------------------- -To obtain Python use:: +To obtain Python and create a virtual environment: + +.. code-block:: console - module use /soft/modulefiles module load frameworks + python -m venv /path/to-venv --system-site-packages + . /path/to-venv/bin/activate + +where ``/path/to-venv`` can be anywhere you have write access. For future sessions, +just load the frameworks module and run the activate line. To obtain libEnsemble:: @@ -31,7 +37,7 @@ To run the :doc:`forces_gpu<../tutorials/forces_gpu_tutorial>` tutorial on Aurora. To obtain the example you can git clone libEnsemble - although only -the forces sub-directory is needed:: +the ``forces`` sub-directory is strictly needed:: git clone https://github.com/Libensemble/libensemble cd libensemble/libensemble/tests/scaling_tests/forces/forces_app @@ -44,9 +50,11 @@ Now go to forces_gpu directory:: cd ../forces_gpu -To make use of all available GPUs, open ``run_libe_forces.py`` and adjust -the exit_criteria to do more simulations. The following will do two -simulations for each worker:: +To make use of all available GPUs, open **run_libe_forces.py** and adjust +the ``exit_criteria`` to perform more simulations. The following will run two +simulations for each worker: + +.. code-block:: python # Instruct libEnsemble to exit after this many simulations ensemble.exit_criteria = ExitCriteria(sim_max=nsim_workers*2) @@ -54,17 +62,16 @@ simulations for each worker:: Now grab an interactive session on two nodes (or use the batch script at ``../submission_scripts/submit_pbs_aurora.sh``):: - qsub -A -l select=2 -l walltime=15:00 -lfilesystems=home -q EarlyAppAccess -I + qsub -A -l select=2 -l walltime=15:00 -lfilesystems=home:flare -q debug -I Once in the interactive session, you may need to reload the frameworks module:: cd $PBS_O_WORKDIR - module use /soft/modulefiles - module load frameworks + . /path/to-venv/bin/activate Then in the session run:: - python run_libe_forces.py --comms local --nworkers 13 + python run_libe_forces.py -n 13 This provides twelve workers for running simulations (one for each GPU across two nodes). An extra worker is added to run the persistent generator. The @@ -72,12 +79,28 @@ GPU settings for each worker simulation are printed. Looking at ``libE_stats.txt`` will provide a summary of the runs. +Now try running:: + + ./cleanup.sh + python run_libe_forces.py -n 7 + +And you will see it runs with two cores and two GPUs are used per +worker. The **forces** example automatically uses the GPUs available to +each worker. + +Live viewing GPU usage +---------------------- + +To see GPU usage, SSH into a compute node you are on in another window and run:: + + module load xpu-smi + watch -n 0.1 xpu-smi dump -d -1 -m 0 -n 1 + Using tiles as GPUs ------------------- -If you wish to treat each tile as its own GPU, then add the *libE_specs* -option ``use_tiles_as_gpus=True``, so the *libE_specs* block of -``run_libe_forces.py`` becomes: +To treat each tile as its own GPU, add the ``use_tiles_as_gpus=True`` option +to the ``libE_specs`` block in **run_libe_forces.py**: .. code-block:: python @@ -90,19 +113,45 @@ option ``use_tiles_as_gpus=True``, so the *libE_specs* block of Now you can run again but with twice the workers for running simulations (each will use one GPU tile):: - python run_libe_forces.py --comms local --nworkers 25 + python run_libe_forces.py -n 25 + + +Running generator on the manager +-------------------------------- + +An alternative is to run the generator on a thread on the manager. The +number of workers can then be set to the number of simulation workers. + +Change the ``libE_specs`` in **run_libe_forces.py** as follows: + +.. code-block:: python + + nsim_workers = ensemble.nworkers + + # Persistent gen does not need resources + ensemble.libE_specs = LibeSpecs( + gen_on_manager=True, + + +then we can run with 12 (instead of 13) workers:: + + python run_libe_forces.py -n 12 + +Dynamic resource assignment +--------------------------- -Note that the *forces* example will automatically use the GPUs available to -each worker (with one MPI rank per GPU), so if fewer workers are provided, -more than one GPU will be used per simulation. +In the **forces** directory you will also find: -Also see ``forces_gpu_var_resources`` and ``forces_multi_app`` examples for -cases that use varying processor/GPU counts per simulation. +* ``forces_gpu_var_resources`` uses varying processor/GPU counts per simulation. +* ``forces_multi_app`` uses varying processor/GPU counts per simulation and also + uses two different user executables, one which is CPU-only and one which + uses GPUs. This allows highly efficient use of nodes for multi-application + ensembles. Demonstration ------------- -Note that a video demonstration_ of the *forces_gpu* example on *Frontier* +Note that a video demonstration_ of the *forces_gpu* example on **Frontier** is also available. The workflow is identical when running on Aurora, with the exception of different compiler options and numbers of workers (because the numbers of GPUs on a node differs). From b8a5d4a018add97e5d56838a7ca5ff3f3d8a23df Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 18 Feb 2025 16:18:59 -0600 Subject: [PATCH 048/215] Return None from persistent gens The default to be to return None instead of H_o. --- libensemble/gen_funcs/persistent_ax_multitask.py | 2 +- libensemble/gen_funcs/persistent_gpCAM.py | 4 ++-- libensemble/gen_funcs/persistent_inverse_bayes.py | 6 +++++- libensemble/gen_funcs/persistent_sampling.py | 10 +++++----- .../gen_funcs/persistent_sampling_var_resources.py | 12 ++++++------ libensemble/gen_funcs/persistent_tasmanian.py | 9 +++++++-- 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 91a57e2eb5..0f5df7e303 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -305,7 +305,7 @@ def persistent_gp_mt_ax_gen_f(H, persis_info, gen_specs, libE_info): # Increase iteration counter. model_iteration += 1 - return [], persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG class AxRunner(Runner): diff --git a/libensemble/gen_funcs/persistent_gpCAM.py b/libensemble/gen_funcs/persistent_gpCAM.py index 953cf33cf8..837c39835e 100644 --- a/libensemble/gen_funcs/persistent_gpCAM.py +++ b/libensemble/gen_funcs/persistent_gpCAM.py @@ -212,7 +212,7 @@ def persistent_gpCAM_simple(H_in, persis_info, gen_specs, libE_info): x_for_var = persis_info["rand_stream"].uniform(lb, ub, (10 * batch_size, n)) var_vals = _eval_var(my_gp, all_x, all_y, x_for_var, test_points, persis_info) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def persistent_gpCAM_ask_tell(H_in, persis_info, gen_specs, libE_info): @@ -264,4 +264,4 @@ def persistent_gpCAM_ask_tell(H_in, persis_info, gen_specs, libE_info): tag, Work, calc_in = ps.send_recv(H_o) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG diff --git a/libensemble/gen_funcs/persistent_inverse_bayes.py b/libensemble/gen_funcs/persistent_inverse_bayes.py index 4875ca03bf..2f677902b0 100644 --- a/libensemble/gen_funcs/persistent_inverse_bayes.py +++ b/libensemble/gen_funcs/persistent_inverse_bayes.py @@ -3,6 +3,10 @@ from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG from libensemble.tools.persistent_support import PersistentSupport +__all__ = [ + "persistent_updater_after_likelihood", +] + def persistent_updater_after_likelihood(H, persis_info, gen_specs, libE_info): """ """ @@ -36,4 +40,4 @@ def persistent_updater_after_likelihood(H, persis_info, gen_specs, libE_info): if calc_in is not None: w = H_o["prior"] + calc_in["like"] - H_o["prop"] - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG diff --git a/libensemble/gen_funcs/persistent_sampling.py b/libensemble/gen_funcs/persistent_sampling.py index fcbcba0904..44611d06b6 100644 --- a/libensemble/gen_funcs/persistent_sampling.py +++ b/libensemble/gen_funcs/persistent_sampling.py @@ -60,7 +60,7 @@ def persistent_uniform(_, persis_info, gen_specs, libE_info): if hasattr(calc_in, "__len__"): b = len(calc_in) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def persistent_uniform_final_update(_, persis_info, gen_specs, libE_info): @@ -163,7 +163,7 @@ def persistent_request_shutdown(_, persis_info, gen_specs, libE_info): print("Reached threshold.", f_count, flush=True) break # End the persistent gen - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def uniform_nonblocking(_, persis_info, gen_specs, libE_info): @@ -197,7 +197,7 @@ def uniform_nonblocking(_, persis_info, gen_specs, libE_info): if hasattr(calc_in, "__len__"): b = len(calc_in) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def batched_history_matching(_, persis_info, gen_specs, libE_info): @@ -243,7 +243,7 @@ def batched_history_matching(_, persis_info, gen_specs, libE_info): mu = np.mean(H_o["x"][best_inds], axis=0) Sigma = np.cov(H_o["x"][best_inds].T) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def persistent_uniform_with_cancellations(_, persis_info, gen_specs, libE_info): @@ -272,4 +272,4 @@ def persistent_uniform_with_cancellations(_, persis_info, gen_specs, libE_info): cancel_from += b ps.request_cancel_sim_ids(cancel_ids) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG diff --git a/libensemble/gen_funcs/persistent_sampling_var_resources.py b/libensemble/gen_funcs/persistent_sampling_var_resources.py index 252fe6019d..394ef75815 100644 --- a/libensemble/gen_funcs/persistent_sampling_var_resources.py +++ b/libensemble/gen_funcs/persistent_sampling_var_resources.py @@ -58,7 +58,7 @@ def uniform_sample(_, persis_info, gen_specs, libE_info): if hasattr(calc_in, "__len__"): b = len(calc_in) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def uniform_sample_with_var_gpus(_, persis_info, gen_specs, libE_info): @@ -99,7 +99,7 @@ def uniform_sample_with_var_gpus(_, persis_info, gen_specs, libE_info): if hasattr(calc_in, "__len__"): b = len(calc_in) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def uniform_sample_with_procs_gpus(_, persis_info, gen_specs, libE_info): @@ -128,7 +128,7 @@ def uniform_sample_with_procs_gpus(_, persis_info, gen_specs, libE_info): if hasattr(calc_in, "__len__"): b = len(calc_in) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def uniform_sample_with_var_priorities(_, persis_info, gen_specs, libE_info): @@ -163,7 +163,7 @@ def uniform_sample_with_var_priorities(_, persis_info, gen_specs, libE_info): tag, Work, calc_in = ps.send_recv(H_o) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def uniform_sample_diff_simulations(_, persis_info, gen_specs, libE_info): @@ -197,7 +197,7 @@ def uniform_sample_diff_simulations(_, persis_info, gen_specs, libE_info): if hasattr(calc_in, "__len__"): b = len(calc_in) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def uniform_sample_with_sim_gen_resources(_, persis_info, gen_specs, libE_info): @@ -245,4 +245,4 @@ def uniform_sample_with_sim_gen_resources(_, persis_info, gen_specs, libE_info): if hasattr(calc_in, "__len__"): b = len(calc_in) - return H_o, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG diff --git a/libensemble/gen_funcs/persistent_tasmanian.py b/libensemble/gen_funcs/persistent_tasmanian.py index cedb87c1ea..35aa5219d4 100644 --- a/libensemble/gen_funcs/persistent_tasmanian.py +++ b/libensemble/gen_funcs/persistent_tasmanian.py @@ -10,6 +10,11 @@ from libensemble.tools import parse_args from libensemble.tools.persistent_support import PersistentSupport +__all__ = [ + "sparse_grid_batched", + "sparse_grid_async", +] + def lex_le(x, y, tol=1e-12): """ @@ -195,7 +200,7 @@ def sparse_grid_batched(H, persis_info, gen_specs, libE_info): assert "sCriteria" in U grid.setSurplusRefinement(U["fTolerance"], U["iOutput"], U["sCriteria"]) - return H0, persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def sparse_grid_async(H, persis_info, gen_specs, libE_info): @@ -283,7 +288,7 @@ def get_refined_points(g, U): else: tag, Work, calc_in = ps.recv() - return [], persis_info, FINISHED_PERSISTENT_GEN_TAG + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG def get_sparse_grid_specs(user_specs, sim_f, num_dims, num_outputs=1, mode="batched"): From d836fa14bb159e04056eebba274e0358a92928c5 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 08:48:50 -0600 Subject: [PATCH 049/215] Ignoring gpcam for 3.13 --- .github/workflows/extra.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index c0ef64f016..139a12d91c 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -94,7 +94,7 @@ jobs: conda env update --file install/gen_deps_environment.yml - name: Install gpcam - if: matrix.python-version <= '3.13' + if: matrix.python-version <= '3.12' run: | pip install gpcam @@ -139,6 +139,11 @@ jobs: rm ./libensemble/tests/regression_tests/test_persistent_surmise_calib.py rm ./libensemble/tests/regression_tests/test_persistent_surmise_killsims.py + - name: Remove test for persistent gpcam Python 3.13 + if: matrix.python-version == '3.13' + run: | + rm ./libensemble/tests/regression_tests/test_gpCAM.py + - name: Install redis/proxystore on Pydantic 2 if: matrix.pydantic-version == '2.8.2' run: | From 0e721d232dc36911486c4c84ccacb707315cc452 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 09:51:20 -0600 Subject: [PATCH 050/215] Mirroring basic in extra --- .github/workflows/extra.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 139a12d91c..19b1f8b672 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -124,6 +124,7 @@ jobs: pip install -r install/testing_requirements.txt pip install -r install/misc_feature_requirements.txt source install/install_ibcdfo.sh + conda install numpy scipy - name: Install libEnsemble, flake8, lock environment run: | From 112eb6eeef369fb25c5d6254d7ab0751b8bca9a7 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 10:27:30 -0600 Subject: [PATCH 051/215] Trying something else --- .github/workflows/extra.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 19b1f8b672..da56075605 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -104,7 +104,7 @@ jobs: pip install --upgrade git+https://github.com/bandframework/surmise.git - name: Install generator dependencies for Ubuntu tests - if: matrix.os == 'ubuntu-latest' && matrix.python-version != '3.12' + if: matrix.os == 'ubuntu-latest' && matrix.python-version <= '3.12' run: | sudo apt-get install bc pip install -r install/ubuntu_no312.txt From b27476876218a03a9f02c3387cbfbde506e329cb Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 10:48:06 -0600 Subject: [PATCH 052/215] Moving octave --- .github/workflows/extra.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index da56075605..2a98ba03c5 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -103,6 +103,11 @@ jobs: run: | pip install --upgrade git+https://github.com/bandframework/surmise.git + - name: Install generator dependencies for Ubuntu tests + if: matrix.python-version <= '3.12' + run: | + conda install octave + - name: Install generator dependencies for Ubuntu tests if: matrix.os == 'ubuntu-latest' && matrix.python-version <= '3.12' run: | @@ -120,7 +125,6 @@ jobs: - name: Install other testing dependencies run: | - conda install octave pip install -r install/testing_requirements.txt pip install -r install/misc_feature_requirements.txt source install/install_ibcdfo.sh From 41161370b239c6672344b96bf304fb1275cc93d7 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 11:13:39 -0600 Subject: [PATCH 053/215] Removing octave for 3.13 --- .github/workflows/extra.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 2a98ba03c5..019e2e42b0 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -136,13 +136,15 @@ jobs: pip install -e . flake8 libensemble - - name: Remove test for persistent Tasmanian, Surmise on Python 3.12 + - name: Remove test for persistent Tasmanian, Surmise, octave on Python 3.12 if: matrix.python-version >= '3.12' run: | rm ./libensemble/tests/regression_tests/test_persistent_tasmanian.py rm ./libensemble/tests/regression_tests/test_persistent_tasmanian_async.py rm ./libensemble/tests/regression_tests/test_persistent_surmise_calib.py rm ./libensemble/tests/regression_tests/test_persistent_surmise_killsims.py + rm ./libensemble/tests/regression_tests/test_persistent_fd_param_finder.py # needs octave, which doesn't yet support 3.13 + rm ./libensemble/tests/regression_tests/test_persistent_aposmm_external_localopt.py # needs octave, which doesn't yet support 3.13 - name: Remove test for persistent gpcam Python 3.13 if: matrix.python-version == '3.13' From 6fbc89927822f4826d3a314fefe00dab4c377a17 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 11:46:55 -0600 Subject: [PATCH 054/215] Trying adding back tests --- .github/workflows/extra.yml | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 019e2e42b0..58cc858226 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -93,21 +93,17 @@ jobs: run: | conda env update --file install/gen_deps_environment.yml - - name: Install gpcam + - name: Install gpcam and octave if: matrix.python-version <= '3.12' run: | pip install gpcam + conda install octave - name: Install surmise if: matrix.os == 'ubuntu-latest' run: | pip install --upgrade git+https://github.com/bandframework/surmise.git - - name: Install generator dependencies for Ubuntu tests - if: matrix.python-version <= '3.12' - run: | - conda install octave - - name: Install generator dependencies for Ubuntu tests if: matrix.os == 'ubuntu-latest' && matrix.python-version <= '3.12' run: | @@ -136,20 +132,12 @@ jobs: pip install -e . flake8 libensemble - - name: Remove test for persistent Tasmanian, Surmise, octave on Python 3.12 - if: matrix.python-version >= '3.12' + - name: Remove test for persistent Surmise, octave on Python 3.12 + if: matrix.python-version >= '3.13' run: | - rm ./libensemble/tests/regression_tests/test_persistent_tasmanian.py - rm ./libensemble/tests/regression_tests/test_persistent_tasmanian_async.py - rm ./libensemble/tests/regression_tests/test_persistent_surmise_calib.py - rm ./libensemble/tests/regression_tests/test_persistent_surmise_killsims.py rm ./libensemble/tests/regression_tests/test_persistent_fd_param_finder.py # needs octave, which doesn't yet support 3.13 rm ./libensemble/tests/regression_tests/test_persistent_aposmm_external_localopt.py # needs octave, which doesn't yet support 3.13 - - - name: Remove test for persistent gpcam Python 3.13 - if: matrix.python-version == '3.13' - run: | - rm ./libensemble/tests/regression_tests/test_gpCAM.py + rm ./libensemble/tests/regression_tests/test_gpCAM.py # needs gpcam, which doesn't build on 3.13 - name: Install redis/proxystore on Pydantic 2 if: matrix.pydantic-version == '2.8.2' From b1c529d1a0365328b2562c842051eae512a5bd16 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 13:23:40 -0600 Subject: [PATCH 055/215] Trying adding back tests --- .github/workflows/extra.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 58cc858226..5875064643 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -105,11 +105,12 @@ jobs: pip install --upgrade git+https://github.com/bandframework/surmise.git - name: Install generator dependencies for Ubuntu tests - if: matrix.os == 'ubuntu-latest' && matrix.python-version <= '3.12' - run: | - sudo apt-get install bc - pip install -r install/ubuntu_no312.txt - pip install Tasmanian --user + if: matrix.os == 'ubuntu-latest' + if: matrix.python-version <= '3.12' + run: | + sudo apt-get install bc + pip install -r install/ubuntu_no312.txt + pip install Tasmanian --user - name: Install Balsam on Pydantic 1 if: matrix.pydantic-version == '1.10.17' From 652f4b383ffe7c65c82fc95db13fcdb1af3ddd3c Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Feb 2025 13:38:00 -0600 Subject: [PATCH 056/215] Trying adding back tests --- .github/workflows/extra.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 5875064643..ba06cf9150 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -105,12 +105,11 @@ jobs: pip install --upgrade git+https://github.com/bandframework/surmise.git - name: Install generator dependencies for Ubuntu tests - if: matrix.os == 'ubuntu-latest' - if: matrix.python-version <= '3.12' - run: | - sudo apt-get install bc - pip install -r install/ubuntu_no312.txt - pip install Tasmanian --user + if: matrix.os == 'ubuntu-latest' && matrix.python-version <= "3.12" + run: | + sudo apt-get install bc + pip install -r install/ubuntu_no312.txt + pip install Tasmanian --user - name: Install Balsam on Pydantic 1 if: matrix.pydantic-version == '1.10.17' @@ -134,7 +133,7 @@ jobs: flake8 libensemble - name: Remove test for persistent Surmise, octave on Python 3.12 - if: matrix.python-version >= '3.13' + if: matrix.python-version >= "3.13" run: | rm ./libensemble/tests/regression_tests/test_persistent_fd_param_finder.py # needs octave, which doesn't yet support 3.13 rm ./libensemble/tests/regression_tests/test_persistent_aposmm_external_localopt.py # needs octave, which doesn't yet support 3.13 From 003ad079c593f6fae74945a2da8862928a23a4d8 Mon Sep 17 00:00:00 2001 From: Stephen Hudson Date: Wed, 19 Feb 2025 14:16:46 -0600 Subject: [PATCH 057/215] Update naming of gpCAM gen functions (#1516) --- libensemble/gen_funcs/persistent_gpCAM.py | 120 ++++++++++-------- .../tests/regression_tests/test_gpCAM.py | 6 +- 2 files changed, 68 insertions(+), 58 deletions(-) diff --git a/libensemble/gen_funcs/persistent_gpCAM.py b/libensemble/gen_funcs/persistent_gpCAM.py index 837c39835e..c95b9cac1a 100644 --- a/libensemble/gen_funcs/persistent_gpCAM.py +++ b/libensemble/gen_funcs/persistent_gpCAM.py @@ -10,8 +10,8 @@ from libensemble.tools.persistent_support import PersistentSupport __all__ = [ - "persistent_gpCAM_simple", - "persistent_gpCAM_ask_tell", + "persistent_gpCAM", + "persistent_gpCAM_covar", ] @@ -140,16 +140,78 @@ def _find_eligible_points(x_for_var, sorted_indices, r, batch_size): return np.array(eligible_points) -def persistent_gpCAM_simple(H_in, persis_info, gen_specs, libE_info): +def persistent_gpCAM(H_in, persis_info, gen_specs, libE_info): + """ + This generation function constructs a global surrogate of `f` values. It is + a batched method that produces a first batch uniformly random from (lb, ub). + On subequent iterations, it calls an optimization method to produce the next + batch of points. This optimization might be too slow (relative to the + simulation evaluation time) for some use cases. + + .. seealso:: + `test_gpCAM.py `_ + """ # noqa + + batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs["user"], libE_info) + ask_max_iter = gen_specs["user"].get("ask_max_iter") or 10 + + H_o = np.zeros(batch_size, dtype=gen_specs["out"]) + x_new = persis_info["rand_stream"].uniform(lb, ub, (batch_size, n)) + H_o["x"] = x_new + + tag, Work, calc_in = ps.send_recv(H_o) + + first_call = True + while tag not in [STOP_TAG, PERSIS_STOP]: + all_x = np.vstack((all_x, x_new)) + all_y = np.vstack((all_y, np.atleast_2d(calc_in["f"]).T)) + + if first_call: + # Initialize GP + my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y))) + first_call = False + else: + my_gp.tell(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y))) + + my_gp.train() + + start = time.time() + x_new = my_gp.ask( + input_set=np.column_stack((lb, ub)), + n=batch_size, + pop_size=batch_size, + acquisition_function="total correlation", + max_iter=ask_max_iter, # Larger takes longer. gpCAM default is 20. + )["x"] + print(f"Ask time:{time.time() - start}") + H_o = np.zeros(batch_size, dtype=gen_specs["out"]) + H_o["x"] = x_new + + tag, Work, calc_in = ps.send_recv(H_o) + + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG + + +def persistent_gpCAM_covar(H_in, persis_info, gen_specs, libE_info): """ This generation function constructs a global surrogate of `f` values. It is a batched method that produces a first batch uniformly random from (lb, ub) and on following iterations samples the GP posterior covariance function to find sample points. + If gen_specs["user"]["use_grid"] is set to True the parameter space is + divided into a mesh of candidate points (num_points in each dimension). + Subsequent points chosen by maximum covariance that are at least a distance + `r` away from each other to explore difference regions. + + If gen_specs["user"]["test_points_file"] is set to a file of evaluated + points, then the gpCAM predications are compared at these points to assess + model quality. + .. seealso:: `test_gpCAM.py `_ """ # noqa + U = gen_specs["user"] my_gp = None noise = 1e-12 @@ -213,55 +275,3 @@ def persistent_gpCAM_simple(H_in, persis_info, gen_specs, libE_info): var_vals = _eval_var(my_gp, all_x, all_y, x_for_var, test_points, persis_info) return None, persis_info, FINISHED_PERSISTENT_GEN_TAG - - -def persistent_gpCAM_ask_tell(H_in, persis_info, gen_specs, libE_info): - """ - Like persistent_gpCAM_simple, this generation function constructs a global - surrogate of `f` values. It also aa batched method that produces a first batch - uniformly random from (lb, ub). On subequent iterations, it calls an - optimization method to produce the next batch of points. This optimization - might be too slow (relative to the simulation evaluation time) for some use cases. - - .. seealso:: - `test_gpCAM.py `_ - """ # noqa - - batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs["user"], libE_info) - ask_max_iter = gen_specs["user"].get("ask_max_iter") or 10 - - H_o = np.zeros(batch_size, dtype=gen_specs["out"]) - x_new = persis_info["rand_stream"].uniform(lb, ub, (batch_size, n)) - H_o["x"] = x_new - - tag, Work, calc_in = ps.send_recv(H_o) - - first_call = True - while tag not in [STOP_TAG, PERSIS_STOP]: - all_x = np.vstack((all_x, x_new)) - all_y = np.vstack((all_y, np.atleast_2d(calc_in["f"]).T)) - - if first_call: - # Initialize GP - my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y))) - first_call = False - else: - my_gp.tell(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y))) - - my_gp.train() - - start = time.time() - x_new = my_gp.ask( - input_set=np.column_stack((lb, ub)), - n=batch_size, - pop_size=batch_size, - acquisition_function="total correlation", - max_iter=ask_max_iter, # Larger takes longer. gpCAM default is 20. - )["x"] - print(f"Ask time:{time.time() - start}") - H_o = np.zeros(batch_size, dtype=gen_specs["out"]) - H_o["x"] = x_new - - tag, Work, calc_in = ps.send_recv(H_o) - - return None, persis_info, FINISHED_PERSISTENT_GEN_TAG diff --git a/libensemble/tests/regression_tests/test_gpCAM.py b/libensemble/tests/regression_tests/test_gpCAM.py index c62ebb461c..62a9a7955d 100644 --- a/libensemble/tests/regression_tests/test_gpCAM.py +++ b/libensemble/tests/regression_tests/test_gpCAM.py @@ -26,7 +26,7 @@ import numpy as np from libensemble.alloc_funcs.start_only_persistent import only_persistent_gens as alloc_f -from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM_ask_tell, persistent_gpCAM_simple +from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM, persistent_gpCAM_covar # Import libEnsemble items for this test from libensemble.libE import libE @@ -69,7 +69,7 @@ for inst in range(3): if inst == 0: - gen_specs["gen_f"] = persistent_gpCAM_simple + gen_specs["gen_f"] = persistent_gpCAM_covar num_batches = 10 exit_criteria = {"sim_max": num_batches * batch_size, "wallclock_max": 300} libE_specs["save_every_k_gens"] = 150 @@ -81,7 +81,7 @@ del libE_specs["H_file_prefix"] del libE_specs["save_every_k_gens"] elif inst == 2: - gen_specs["gen_f"] = persistent_gpCAM_ask_tell + gen_specs["gen_f"] = persistent_gpCAM num_batches = 3 # Few because the ask_tell gen can be slow gen_specs["user"]["ask_max_iter"] = 1 # For quicker test exit_criteria = {"sim_max": num_batches * batch_size, "wallclock_max": 300} From 8a4f2c7eccf9b80bab827bbfccde7d0719f17fd0 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 19 Feb 2025 14:47:20 -0600 Subject: [PATCH 058/215] New intro line focussed on supercomputers --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 1a27ec7484..4975e80ee9 100644 --- a/README.rst +++ b/README.rst @@ -10,7 +10,8 @@ libEnsemble: A complete toolkit for dynamic ensembles of calculations ===================================================================== -Adaptive, portable, and scalable software for connecting "deciders" to experiments or simulations. +libEnsemble empowers model-driven ensembles on the world's leading supercomputers +including Frontier, Aurora, and Perlmutter. • **Dynamic ensembles**: Generate parallel tasks on-the-fly based on previous computations. • **Extreme portability and scaling**: Run on or across laptops, clusters, and leadership-class machines. From 81e6813b79d7bfd1ad31d9a9fd1a9cbb633e43dc Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 19 Feb 2025 16:57:23 -0600 Subject: [PATCH 059/215] Fix gpCAM rst file --- docs/examples/gpcam.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/examples/gpcam.rst b/docs/examples/gpcam.rst index 97fb38b9a4..f38d62cea8 100644 --- a/docs/examples/gpcam.rst +++ b/docs/examples/gpcam.rst @@ -1,7 +1,11 @@ -.. _gpcam: - gpCAM ----- +This module provides persistent generators for Gaussian Process-based adaptive sampling. + +Required: gpcam_ + .. automodule:: persistent_gpCAM - :members: persistent_gpCAM_simple, persistent_gpCAM_ask_tell + :members: + +.. _gpcam: https://pypi.org/project/gpcam From 40b2725c27193130672ae89261adcafc76a201ca Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 19 Feb 2025 16:58:05 -0600 Subject: [PATCH 060/215] Alternative layout of gen examples --- docs/examples/gen_funcs.rst | 115 ++++++++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 6 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 5f0385ad15..9c25471862 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -6,32 +6,135 @@ Here we list many generator functions included with libEnsemble. .. IMPORTANT:: See the API for generator functions :ref:`here`. + + +Sampling +-------- + .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Sampling + :hidden: sampling +- :doc:`sampling` + + Various generators for sampling a space. + +Optimization +------------ + .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Optimization + :hidden: aposmm uniform_or_localopt ax_multitask VTMOP ytopt - Ax - Dragonfly + consensus +.. Ax +.. Dragonfly + +- :doc:`APOSMM` + + APOSMM_ Asynchronously parallel optimization solver for finding multiple minima. Supported local optimization routines include: + + - DFO-LS_ Derivative-free solver for (bound constrained) nonlinear least-squares minimization + - NLopt_ Library for nonlinear optimization, providing a common interface for various methods + - `scipy.optimize`_ Open-source solvers for nonlinear problems, linear programming, + constrained and nonlinear least-squares, root finding, and curve fitting. + - `PETSc/TAO`_ Routines for the scalable (parallel) solution of scientific applications + +- :doc:`uniform_or_localopt` + + Performs a uniform random sample or a single persistent NLopt_ local optimization run. + +- :doc:`ax_multitask` + + Bayesian optimization with a Gaussian process and the multi-task algorithm of Ax_. + +- :ref:`VTMOP` + + Generators using the VTMOP_ Fortran package for large-scale multiobjective multidisciplinary design optimization. + +- :ref:`ytopt` + + Generators using ytopt_ (A Bayesian Optimization package for determining optimal input parameter configurations for applications or other executables). + +.. - :ref:`Dragonfly` +.. +.. Generators for. + +- :ref:`Consensus` + + Distributed optimization methods for minimizing sums of convex functions. Methods include: + - Primal-dual sliding (https://arxiv.org/pdf/2101.00143). + - Distributed gradient descent with gradient tracking (https://arxiv.org/abs/1908.11444). + - Proximal sliding (https://arxiv.org/abs/1406.0919). + +Modeling and Approximation +-------------------------- .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Modeling and Approximation + :hidden: gpcam tasmanian fd_param_finder surmise - DEAP + DEAP-NSGA-II + +- :doc:`gpCAM` + + Generators for Gaussian Process-based adaptive sampling using gpcam_. + +- :doc:`Tasmanian` + + Generators using the Tasmanian_ sparse grid library + (*Toolkit for Adaptive Stochastic Modeling and Non-Intrusive ApproximatioN*). + +- :doc:`fd_param_finder` + + Generator that loops through a set of suitable finite difference + parameters for a mapping ``F`` from ``R^n`` to ``R^m``. + +- :doc:`surmise` + + Modular Bayesian calibration/inference framework using Surmise_. + Has the option of cancelling previous issued simulations. + +- :ref:`DEAP-NSGA-II` + + Distributed evolutionary algorithms (community example) + + .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples + +.. _APOSMM: https://link.springer.com/article/10.1007/s12532-017-0131-4 +.. _Ax: https://github.com/facebook/Ax +.. _Community Examples repository: https://github.com/Libensemble/libe-community-examples +.. _DEAP: https://deap.readthedocs.io/en/master/overview.html +.. _DFO-LS: https://github.com/numericalalgorithmsgroup/dfols +.. _ECNoise: https://www.mcs.anl.gov/~wild/cnoise/ +.. _gpcam: https://gpcam.lbl.gov/ +.. .. _heFFTe: https://github.com/icl-utk-edu/heffte +.. _IPAC manuscript: https://doi.org/10.18429/JACoW-ICAP2018-SAPAF03 +.. _NLopt: https://nlopt.readthedocs.io/en/latest/ +.. _OPAL: http://amas.web.psi.ch/docs/opal/opal_user_guide-1.6.0.pdf +.. _PETSc/TAO: http://www.mcs.anl.gov/petsc +.. _scipy.optimize: https://docs.scipy.org/doc/scipy/reference/optimize.html +.. _Surmise: https://surmise.readthedocs.io/en/latest/index.html +.. _Tasmanian: https://github.com/ORNL/Tasmanian +.. _user guide: https://libensemble.readthedocs.io/en/latest/programming_libE.html +.. _VTMOP: https://github.com/Libensemble/libe-community-examples#vtmop +.. _WarpX: https://warpx.readthedocs.io/en/latest/ +.. _ytopt: https://github.com/ytopt-team/ytopt + + From 695c3ea60b075626f10b772e66018d11d1410520 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 19 Feb 2025 17:08:15 -0600 Subject: [PATCH 061/215] update gens --- docs/examples/gen_funcs.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 9c25471862..2bfffa49b6 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -32,7 +32,7 @@ Optimization aposmm uniform_or_localopt - ax_multitask + ax_multitask VTMOP ytopt consensus @@ -53,17 +53,17 @@ Optimization Performs a uniform random sample or a single persistent NLopt_ local optimization run. -- :doc:`ax_multitask` +- :doc:`Ax Multitask` Bayesian optimization with a Gaussian process and the multi-task algorithm of Ax_. - :ref:`VTMOP` - Generators using the VTMOP_ Fortran package for large-scale multiobjective multidisciplinary design optimization. + Generators using the VTMOP_ Fortran package for large-scale multiobjective multidisciplinary design optimization. (*community example*) - :ref:`ytopt` - Generators using ytopt_ (A Bayesian Optimization package for determining optimal input parameter configurations for applications or other executables). + Generators using ytopt_. A Bayesian Optimization package for determining optimal input parameter configurations for applications or other executables. (*community example*) .. - :ref:`Dragonfly` .. @@ -71,7 +71,8 @@ Optimization - :ref:`Consensus` - Distributed optimization methods for minimizing sums of convex functions. Methods include: + Distributed optimization methods for minimizing sums of convex functions (*community example*). + Methods include: - Primal-dual sliding (https://arxiv.org/pdf/2101.00143). - Distributed gradient descent with gradient tracking (https://arxiv.org/abs/1908.11444). - Proximal sliding (https://arxiv.org/abs/1406.0919). @@ -111,7 +112,7 @@ Modeling and Approximation - :ref:`DEAP-NSGA-II` - Distributed evolutionary algorithms (community example) + Distributed evolutionary algorithms (*community example*) From 88366cf712cb66a977c353cee4f55a4528db891c Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 19 Feb 2025 17:11:57 -0600 Subject: [PATCH 062/215] update gens --- docs/examples/gen_funcs.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 2bfffa49b6..fd58e631cf 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -21,6 +21,8 @@ Sampling - :doc:`sampling` Various generators for sampling a space. + Includes both persistent and non-persistent sampling generators. There are also useful examples of assigning resources for each simulation (persistent_sampling_var_resources). + Optimization ------------ From f1fd08f73d4f0b72792f0d76203ed3ce31d6e770 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Thu, 20 Feb 2025 07:54:11 -0600 Subject: [PATCH 063/215] whitespace --- .github/dependabot.yml | 1 - docs/platforms/perlmutter.rst | 1 - docs/platforms/polaris.rst | 1 - docs/tutorials/forces_gpu_tutorial.rst | 1 - 4 files changed, 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 66ac4c3f1c..21ca389e09 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -36,4 +36,3 @@ updates: submodule-updates: patterns: - "*" - diff --git a/docs/platforms/perlmutter.rst b/docs/platforms/perlmutter.rst index 2019c72cfb..88d3f808b2 100644 --- a/docs/platforms/perlmutter.rst +++ b/docs/platforms/perlmutter.rst @@ -125,7 +125,6 @@ and run with:: python run_libe_forces.py -n 4 - To watch video ^^^^^^^^^^^^^^ diff --git a/docs/platforms/polaris.rst b/docs/platforms/polaris.rst index 4cdabbcf0b..bc44d621ab 100644 --- a/docs/platforms/polaris.rst +++ b/docs/platforms/polaris.rst @@ -39,7 +39,6 @@ environment (if you need ``conda install``). More details at `Python for Polaris See :doc:`here<../advanced_installation>` for more information on advanced options for installing libEnsemble, including using Spack. - Job Submission -------------- diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index ba425e8363..eaff67323f 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -154,7 +154,6 @@ and use this information however you want. output = np.zeros(1, dtype=sim_specs["out"]) output["energy"][0] = final_energy - return output The above code will assign a GPU to each worker on CUDA-capable systems, From 6496ce0390a2c11ebb7eaa76fa222d0a79868917 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Thu, 20 Feb 2025 07:57:27 -0600 Subject: [PATCH 064/215] Debugging --- .github/workflows/extra.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index ba06cf9150..77e37cb596 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -105,7 +105,7 @@ jobs: pip install --upgrade git+https://github.com/bandframework/surmise.git - name: Install generator dependencies for Ubuntu tests - if: matrix.os == 'ubuntu-latest' && matrix.python-version <= "3.12" + if: matrix.os == 'ubuntu-latest' && matrix.python-version <= '3.12' run: | sudo apt-get install bc pip install -r install/ubuntu_no312.txt From 94751cd2cc3e5206fa22a7709949815d15cb3275 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Thu, 20 Feb 2025 08:03:28 -0600 Subject: [PATCH 065/215] Debugging --- .github/workflows/extra.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 77e37cb596..2d7904f75d 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -11,43 +11,43 @@ jobs: matrix: os: [ubuntu-latest] mpi-version: [mpich] - python-version: ["3.10", "3.11", "3.12", "3.13"] - pydantic-version: ["2.8.2"] + python-version: ['3.10', '3.11', '3.12', '3.13'] + pydantic-version: ['2.8.2'] comms-type: [m, l] include: - os: macos-latest - python-version: "3.13" + python-version: '3.13' mpi-version: mpich - pydantic-version: "2.8.2" + pydantic-version: '2.8.2' comms-type: m - os: macos-latest - python-version: "3.13" + python-version: '3.13' mpi-version: mpich - pydantic-version: "2.8.2" + pydantic-version: '2.8.2' comms-type: l - os: ubuntu-latest - python-version: "3.12" + python-version: '3.12' mpi-version: mpich - pydantic-version: "2.8.2" + pydantic-version: '2.8.2' comms-type: t - os: ubuntu-latest - mpi-version: "openmpi" - pydantic-version: "2.8.2" - python-version: "3.12" + mpi-version: 'openmpi' + pydantic-version: '2.8.2' + python-version: '3.12' comms-type: l - os: ubuntu-latest mpi-version: mpich - python-version: "3.12" - pydantic-version: "1.10.17" + python-version: '3.12' + pydantic-version: '1.10.17' comms-type: m - os: ubuntu-latest mpi-version: mpich - python-version: "3.12" - pydantic-version: "1.10.17" + python-version: '3.12' + pydantic-version: '1.10.17' comms-type: l env: - HYDRA_LAUNCHER: "fork" + HYDRA_LAUNCHER: 'fork' TERM: xterm-256color GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -61,7 +61,7 @@ jobs: uses: conda-incubator/setup-miniconda@v3 with: activate-environment: condaenv - miniconda-version: "latest" + miniconda-version: 'latest' python-version: ${{ matrix.python-version }} channels: conda-forge channel-priority: flexible @@ -133,7 +133,7 @@ jobs: flake8 libensemble - name: Remove test for persistent Surmise, octave on Python 3.12 - if: matrix.python-version >= "3.13" + if: matrix.python-version >= '3.13' run: | rm ./libensemble/tests/regression_tests/test_persistent_fd_param_finder.py # needs octave, which doesn't yet support 3.13 rm ./libensemble/tests/regression_tests/test_persistent_aposmm_external_localopt.py # needs octave, which doesn't yet support 3.13 From 73717d8b62f6915286bc5a89aa9864512e1c69a4 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Thu, 20 Feb 2025 09:13:30 -0600 Subject: [PATCH 066/215] Trying something out --- .github/workflows/extra.yml | 15 +++++++-------- install/ubuntu_no312.txt | 4 ---- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 2d7904f75d..abf9f0a27f 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -75,8 +75,8 @@ jobs: - name: Install Ubuntu compilers if: matrix.os == 'ubuntu-latest' run: | - conda install gcc_linux-64 - pip install nlopt==2.9.0 + conda install gcc_linux-64 + pip install nlopt==2.9.0 # Roundabout solution on macos for proper linking with mpicc - name: Install macOS compilers @@ -93,23 +93,22 @@ jobs: run: | conda env update --file install/gen_deps_environment.yml - - name: Install gpcam and octave + - name: Install gpcam and octave # Neither yet support 3.13 if: matrix.python-version <= '3.12' run: | pip install gpcam conda install octave - - name: Install surmise + - name: Install surmise and Tasmanian if: matrix.os == 'ubuntu-latest' run: | pip install --upgrade git+https://github.com/bandframework/surmise.git + pip install Tasmanian --user - name: Install generator dependencies for Ubuntu tests if: matrix.os == 'ubuntu-latest' && matrix.python-version <= '3.12' run: | - sudo apt-get install bc - pip install -r install/ubuntu_no312.txt - pip install Tasmanian --user + pip install scikit-build packaging - name: Install Balsam on Pydantic 1 if: matrix.pydantic-version == '1.10.17' @@ -132,7 +131,7 @@ jobs: pip install -e . flake8 libensemble - - name: Remove test for persistent Surmise, octave on Python 3.12 + - name: Remove test using octave, gpcam on Python 3.13 if: matrix.python-version >= '3.13' run: | rm ./libensemble/tests/regression_tests/test_persistent_fd_param_finder.py # needs octave, which doesn't yet support 3.13 diff --git a/install/ubuntu_no312.txt b/install/ubuntu_no312.txt index 671febe2ba..e69de29bb2 100644 --- a/install/ubuntu_no312.txt +++ b/install/ubuntu_no312.txt @@ -1,4 +0,0 @@ -gpcam==8.1.12 -scikit-build==0.18.1 -packaging==24.1 -git+https://github.com/bandframework/surmise.git From d0e15f1d0471f94b92393fdb3f52a2809581b4b8 Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 20 Feb 2025 09:38:55 -0600 Subject: [PATCH 067/215] removing guides, references, and resource management for Summit, Spock, Crusher, and Sunspot --- docs/advanced_installation.rst | 10 - docs/introduction_latex.rst | 1 - docs/known_issues.rst | 2 - docs/nitpicky | 3 - docs/platforms/example_scripts.rst | 12 - docs/platforms/platforms_index.rst | 26 +-- docs/platforms/spock_crusher.rst | 82 ------- docs/platforms/summit.rst | 210 ------------------ docs/resource_manager/resource_detection.rst | 2 +- docs/running_libE.rst | 7 - .../cobalt_submit_mproc.sh | 48 ---- .../edtb_submit_pbspro_central.sh | 39 ---- libensemble/resources/platforms.py | 50 ----- .../test_mpi_gpu_settings.py | 8 +- .../scaling_tests/forces/forces_adv/readme.md | 4 - .../forces/forces_app/build_forces.sh | 3 - .../scaling_tests/warpx/all_machine_specs.py | 10 - .../warpx/run_libensemble_on_warpx.py | 5 - .../tests/scaling_tests/warpx/warpx_simf.py | 27 +-- libensemble/tests/unit_tests/test_platform.py | 18 +- 20 files changed, 24 insertions(+), 543 deletions(-) delete mode 100644 docs/platforms/spock_crusher.rst delete mode 100644 docs/platforms/summit.rst delete mode 100755 examples/libE_submission_scripts/cobalt_submit_mproc.sh delete mode 100644 examples/libE_submission_scripts/edtb_submit_pbspro_central.sh diff --git a/docs/advanced_installation.rst b/docs/advanced_installation.rst index 4d436eb2cd..f85203f753 100644 --- a/docs/advanced_installation.rst +++ b/docs/advanced_installation.rst @@ -49,10 +49,6 @@ Further recommendations for selected HPC systems are given in the MPICC=mpiicc pip install mpi4py --no-binary mpi4py - On Summit, the following line is recommended (with gcc compilers):: - - CC=mpicc MPICC=mpicc pip install mpi4py --no-binary mpi4py - .. tab-item:: conda Install libEnsemble with Conda_ from the conda-forge channel:: @@ -116,12 +112,6 @@ Further recommendations for selected HPC systems are given in the spack info py-libensemble - On some platforms you may wish to run libEnsemble without ``mpi4py``, - using a serial PETSc build. This is often preferable if running on - the launch nodes of a three-tier system (e.g., Summit):: - - spack install py-libensemble +scipy +mpmath +petsc4py ^py-petsc4py~mpi ^petsc~mpi~hdf5~hypre~superlu-dist - The installation will create modules for libEnsemble and the dependent packages. These can be loaded by running:: diff --git a/docs/introduction_latex.rst b/docs/introduction_latex.rst index d271c085bb..8c5d40fbc3 100644 --- a/docs/introduction_latex.rst +++ b/docs/introduction_latex.rst @@ -46,7 +46,6 @@ .. _scipy.optimize: https://docs.scipy.org/doc/scipy/reference/optimize.html .. _setuptools: https://setuptools.pypa.io/en/latest/ .. _Spack: https://spack.readthedocs.io/en/latest -.. _Summit: https://www.olcf.ornl.gov/olcf-resources/compute-systems/summit/ .. _Surmise: https://surmise.readthedocs.io/en/latest/index.html .. _SWIG: http://swig.org/ .. _tarball: https://github.com/Libensemble/libensemble/releases/latest diff --git a/docs/known_issues.rst b/docs/known_issues.rst index 3910ad210c..cb069e945a 100644 --- a/docs/known_issues.rst +++ b/docs/known_issues.rst @@ -19,8 +19,6 @@ may occur when using libEnsemble. * Local comms mode (multiprocessing) may fail if MPI is initialized before forking processors. This is thought to be responsible for issues combining multiprocessing with PETSc on some platforms. -* Remote detection of logical cores via ``LSB_HOSTS`` (e.g., Summit) returns the - number of physical cores as SMT info not available. * TCP mode does not support (1) more than one libEnsemble call in a given script or (2) the auto-resources option to the Executor. diff --git a/docs/nitpicky b/docs/nitpicky index 8315471a11..771c1d0da3 100644 --- a/docs/nitpicky +++ b/docs/nitpicky @@ -41,14 +41,11 @@ py:class collections.abc.Sequence # Internal paths that are verified importable but Sphinx can't find py:class libensemble.resources.platforms.Aurora py:class libensemble.resources.platforms.GenericROCm -py:class libensemble.resources.platforms.Crusher py:class libensemble.resources.platforms.Frontier py:class libensemble.resources.platforms.Perlmutter py:class libensemble.resources.platforms.PerlmutterCPU py:class libensemble.resources.platforms.PerlmutterGPU py:class libensemble.resources.platforms.Polaris -py:class libensemble.resources.platforms.Spock -py:class libensemble.resources.platforms.Summit py:class libensemble.resources.platforms.Sunspot py:class libensemble.resources.rset_resources.RSetResources py:class libensemble.resources.env_resources.EnvResources diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 90db3a63a6..83b2ff1b05 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -28,15 +28,3 @@ information about the respective systems and configuration. .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh :caption: /examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh :language: bash - -.. dropdown:: Summit - On Launch Nodes with Multiprocessing - - .. literalinclude:: ../../examples/libE_submission_scripts/summit_submit_mproc.sh - :caption: /examples/libE_submission_scripts/summit_submit_mproc.sh - :language: bash - -.. dropdown:: Cobalt - Intermediate node with Multiprocessing - - .. literalinclude:: ../../examples/libE_submission_scripts/cobalt_submit_mproc.sh - :caption: /examples/libE_submission_scripts/cobalt_submit_mproc.sh - :language: bash diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 814b3e986f..b091f09504 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -80,26 +80,6 @@ per worker, and adding the manager onto the first node. HPC systems that only allow one application to be launched to a node at any one time, will not allow a distributed configuration. -Systems with Launch/MOM Nodes ------------------------------ - -Some large systems have a 3-tier node setup. That is, they have a separate set of launch nodes -(known as MOM nodes on Cray Systems). User batch jobs or interactive sessions run on a launch node. -Most such systems supply a special MPI runner that has some application-level scheduling -capability (e.g., ``aprun``, ``jsrun``). MPI applications can only be submitted from these nodes. Examples -of these systems include Summit and Sierra. - -There are two ways of running libEnsemble on these kinds of systems. The first, and simplest, -is to run libEnsemble on the launch nodes. This is often sufficient if the worker's simulation -or generation functions are not doing much work (other than launching applications). This approach -is inherently centralized. The entire node allocation is available for the worker-launched -tasks. - -However, running libEnsemble on the compute nodes is potentially more scalable and -will better manage simulation and generation functions that contain considerable -computational work or I/O. Therefore the second option is to use proxy task-execution -services like Balsam_. - Balsam - Externally Managed Applications ---------------------------------------- @@ -210,13 +190,11 @@ libEnsemble on specific HPC systems. :titlesonly: aurora - bebop frontier - improv perlmutter polaris - spock_crusher - summit + bebop + improv srun example_scripts diff --git a/docs/platforms/spock_crusher.rst b/docs/platforms/spock_crusher.rst deleted file mode 100644 index e19c9120fa..0000000000 --- a/docs/platforms/spock_crusher.rst +++ /dev/null @@ -1,82 +0,0 @@ -============= -Spock/Crusher -============= - -Spock_ and Crusher_ are early-access testbed systems located at Oak Ridge -Leadership Computing Facility (OLCF). - -Each Spock compute node consists of one 64-core AMD EPYC "Rome" CPU and four -AMD MI100 GPUs. - -Each Crusher compute node contains a 64-core AMD EPYC and 4 AMD MI250X GPUs -(8 Graphics Compute Dies). - -These systems use the SLURM scheduler to submit jobs from login nodes to run on the -compute nodes. - -Configuring Python and Installation ------------------------------------ - -Begin by loading the ``python`` module:: - - module load cray-python - -Job Submission --------------- - -Slurm_ is used for job submission and management. libEnsemble runs on the -compute nodes using either ``multi-processing`` or ``mpi4py``. - -If running more than one worker per node, the following is recommended to prevent -resource conflicts:: - - export SLURM_EXACT=1 - export SLURM_MEM_PER_NODE=0 - -Installing libEnsemble and dependencies ---------------------------------------- - -libEnsemble can be installed via pip:: - - pip install libensemble - -Example -------- - -To run the :doc:`forces_gpu<../tutorials/forces_gpu_tutorial>` tutorial on Spock or Crusher. - -To obtain the example you can git clone libEnsemble - although only -the forces sub-directory is needed:: - - git clone https://github.com/Libensemble/libensemble - cd libensemble/libensemble/tests/scaling_tests/forces/forces_app - -To compile forces (in addition to cray-python module):: - - module load rocm - module load craype-accel-amd-gfx90a # (craype-accel-amd-gfx908 on Spock) - cc -DGPU -I${ROCM_PATH}/include -L${ROCM_PATH}/lib -lamdhip64 -fopenmp -O3 -o forces.x forces.c - -Now go to forces_gpu directory:: - - cd ../forces_gpu - -Now grab an interactive session on one node:: - - salloc --nodes=1 -A --time=00:10:00 - -Then in the session run:: - - python run_libe_forces.py -n 5 - -This places the generator on the first worker and runs simulations on the -others (each simulation using one GPU). - -To see GPU usage, ssh into the node you are on in another window and run:: - - module load rocm - watch -n 0.1 rocm-smi - -.. _Crusher: https://docs.olcf.ornl.gov/systems/crusher_quick_start_guide.html -.. _Slurm: https://slurm.schedmd.com/ -.. _Spock: https://docs.olcf.ornl.gov/systems/spock_quick_start_guide.html diff --git a/docs/platforms/summit.rst b/docs/platforms/summit.rst deleted file mode 100644 index 80f166ef0d..0000000000 --- a/docs/platforms/summit.rst +++ /dev/null @@ -1,210 +0,0 @@ -====== -Summit -====== - -Summit_ is an IBM AC922 system located at the Oak Ridge Leadership Computing -Facility (OLCF). Each of the approximately 4,600 compute nodes on Summit contains two -IBM POWER9 processors and six NVIDIA Volta V100 accelerators. - -Summit features three tiers of nodes: login, launch, and compute nodes. - -Users on login nodes submit batch runs to the launch nodes. -Batch scripts and interactive sessions run on the launch nodes. Only the launch -nodes can submit MPI runs to the compute nodes via ``jsrun``. - -Configuring Python ------------------- - -Begin by loading the Python 3 Anaconda module:: - - $ module load python - -You can now create and activate your own custom conda_ environment:: - - conda create --name myenv python=3.10 - export PYTHONNOUSERSITE=1 # Make sure get python from conda env - . activate myenv - -If you are installing any packages with extensions, ensure that the correct compiler -module is loaded. If using mpi4py_, this must be installed from source, -referencing the compiler. Currently, mpi4py must be built with gcc:: - - module load gcc - -With your environment activated, run :: - - CC=mpicc MPICC=mpicc pip install mpi4py --no-binary mpi4py - -Installing libEnsemble ----------------------- - -Obtaining libEnsemble is now as simple as ``pip install libensemble``. -Your prompt should be similar to the following line: - -.. code-block:: console - - (my_env) user@login5:~$ pip install libensemble - -.. note:: - If you encounter pip errors, run ``python -m pip install --upgrade pip`` first - -Or, you can install via ``conda``: - -.. code-block:: console - - (my_env) user@login5:~$ conda config --add channels conda-forge - (my_env) user@login5:~$ conda install -c conda-forge libensemble - -See :doc:`here<../advanced_installation>` for more information on advanced options -for installing libEnsemble. - -Special note on resource sets and Executor submit options ---------------------------------------------------------- - -When using the portable MPI run configuration options (e.g., num_nodes) to the -:doc:`MPIExecutor<../executor/mpi_executor>` ``submit`` function, it is important -to note that, due to the `resource sets`_ used on Summit, the options refer to -resource sets as follows: - -- num_procs (int, optional) – The total number resource sets for this run. - -- num_nodes (int, optional) – The number of nodes on which to submit the run. - -- procs_per_node (int, optional) – The number of resource sets per node. - -It is recommended that the user defines a resource set as the minimal configuration -of CPU cores/processes and GPUs. These can be added to the ``extra_args`` option -of the *submit* function. Alternatively, the portable options can be ignored and -everything expressed in ``extra_args``. - -For example, the following *jsrun* line would run three resource sets, -each having one core (with one process), and one GPU, along with some extra options:: - - jsrun -n 3 -a 1 -g 1 -c 1 --bind=packed:1 --smpiargs="-gpu" - -To express this line in the ``submit`` function may look -something like the following:: - - exctr = Executor.executor - task = exctr.submit(app_name="mycode", - num_procs=3, - extra_args="-a 1 -g 1 -c 1 --bind=packed:1 --smpiargs="-gpu"" - app_args="-i input") - -This would be equivalent to:: - - exctr = Executor.executor - task = exctr.submit(app_name="mycode", - extra_args="-n 3 -a 1 -g 1 -c 1 --bind=packed:1 --smpiargs="-gpu"" - app_args="-i input") - -The libEnsemble resource manager works out the resources available to each worker, -but unlike some other systems, ``jsrun`` on Summit dynamically schedules runs to -available slots across and within nodes. It can also queue tasks. This allows variable -size runs to easily be handled on Summit. If oversubscription to the `jsrun` system -is desired, then libEnsemble's resource manager can be disabled in the -calling script via:: - - libE_specs["disable_resource_manager"] = True - -In the above example, the task being submitted used three GPUs, which is half those -available on a Summit node, and thus two such tasks may be allocated to each node -(from different workers), if they were running at the same time. - -Job Submission --------------- - -Summit uses LSF_ for job management and submission. For libEnsemble, the most -important command is ``bsub`` for submitting batch scripts from the login nodes -to execute on the launch nodes. - -It is recommended to run libEnsemble on the launch nodes (assuming workers are -submitting MPI applications) using the ``local`` communications mode (multiprocessing). - -Interactive Runs -^^^^^^^^^^^^^^^^ - -You can run interactively with ``bsub`` by specifying the ``-Is`` flag, -similarly to the following:: - - $ bsub -W 30 -P [project] -nnodes 8 -Is - -This will place you on a launch node. - -.. note:: - You will need to reactivate your conda virtual environment. - -Batch Runs -^^^^^^^^^^ - -Batch scripts specify run settings using ``#BSUB`` statements. The following -simple example depicts configuring and launching libEnsemble to a launch node with -multiprocessing. This script also assumes the user is using the ``parse_args()`` -convenience function from libEnsemble's :doc:`tools module<../utilities>`. - -.. code-block:: bash - - #!/bin/bash -x - #BSUB -P - #BSUB -J libe_mproc - #BSUB -W 60 - #BSUB -nnodes 128 - #BSUB -alloc_flags "smt1" - - # --- Prepare Python --- - - # Load conda module and gcc. - module load python - module load gcc - - # Name of conda environment - export CONDA_ENV_NAME=my_env - - # Activate conda environment - export PYTHONNOUSERSITE=1 - source activate $CONDA_ENV_NAME - - # --- Prepare libEnsemble --- - - # Name of calling script - export EXE=calling_script.py - - # Communication Method - export COMMS="--comms local" - - # Number of workers. - export NWORKERS="--nworkers 128" - - hash -r # Check no commands hashed (pip/python...) - - # Launch libE - python $EXE $COMMS $NWORKERS > out.txt 2>&1 - -With this saved as ``myscript.sh``, allocating, configuring, and queueing -libEnsemble on Summit is achieved by running :: - - $ bsub myscript.sh - -Example submission scripts are also given in the :doc:`examples`. - -Launching User Applications from libEnsemble Workers ----------------------------------------------------- - -Only the launch nodes can submit MPI runs to the compute nodes via ``jsrun``. -This can be accomplished in user ``sim_f`` functions directly. However, it is highly -recommended that the :doc:`Executor<../executor/ex_index>` interface -be used inside the ``sim_f`` or ``gen_f``, because this provides a portable interface -with many advantages including automatic resource detection, portability, -launch failure resilience, and ease of use. - -Additional Information ----------------------- - -See the OLCF guides_ for more information about Summit. - -.. _conda: https://conda.io/en/latest/ -.. _guides: https://docs.olcf.ornl.gov/systems/summit_user_guide.html -.. _LSF: https://www.olcf.ornl.gov/wp-content/uploads/2018/12/summit_workshop_fuson.pdf -.. _mpi4py: https://mpi4py.readthedocs.io/en/stable/ -.. _resource sets: https://docs.olcf.ornl.gov/systems/summit_user_guide.html#job-launcher-jsrun -.. _Summit: https://docs.olcf.ornl.gov/systems/summit_user_guide.html diff --git a/docs/resource_manager/resource_detection.rst b/docs/resource_manager/resource_detection.rst index 461d1d0eed..474cc1cade 100644 --- a/docs/resource_manager/resource_detection.rst +++ b/docs/resource_manager/resource_detection.rst @@ -32,7 +32,7 @@ Resource detection can be disabled by setting configuration options on the Executor submit line. This will usually work sufficiently on -systems that have application-level scheduling and queuing (e.g., ``jsrun`` on Summit). +systems that have application-level scheduling and queuing (e.g., ``jsrun``). However, on many cluster and multi-node systems, if the built-in resource manager is disabled, then runs without a hostlist or machinefile supplied may be undesirably scheduled to the same nodes. diff --git a/docs/running_libE.rst b/docs/running_libE.rst index cb86262526..278352ee04 100644 --- a/docs/running_libE.rst +++ b/docs/running_libE.rst @@ -66,10 +66,6 @@ supercomputers. from app-launches (if running libEnsemble on a compute node), set ``libE_specs["dedicated_mode"] = True``. - This mode can also be used to run on a **launch** node of a three-tier - system (e.g., Summit), ensuring the whole compute-node allocation is available for - launching apps. Make sure there are no imports of ``mpi4py`` in your Python scripts. - Note that on macOS (since Python 3.8) and Windows, the default multiprocessing method is ``"spawn"`` instead of ``"fork"``; to resolve many related issues, we recommend placing calling script code in an ``if __name__ == "__main__":`` block. @@ -104,9 +100,6 @@ supercomputers. (see :doc:`Balsam`). This nesting does work with MPICH_ and its derivative MPI implementations. - It is also unsuitable to use this mode when running on the **launch** nodes of - three-tier systems (e.g., Summit). In that case ``local`` mode is recommended. - .. tab-item:: TCP Comms Run the Manager on one system and launch workers to remote diff --git a/examples/libE_submission_scripts/cobalt_submit_mproc.sh b/examples/libE_submission_scripts/cobalt_submit_mproc.sh deleted file mode 100755 index d2fa3a10a4..0000000000 --- a/examples/libE_submission_scripts/cobalt_submit_mproc.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -x -#COBALT -t 00:30:00 -#COBALT -O libE_mproc_MOM -#COBALT -n 4 -#COBALT -q debug-flat-quad # Up to 8 nodes only -##COBALT -q default # For large jobs >=128 nodes -##COBALT -A - -# Script to run libEnsemble using multiprocessing on launch nodes. -# Assumes Conda environment is set up. - -# To be run with central job management -# - Manager and workers run on launch node. -# - Workers submit tasks to the compute nodes in the allocation. - -# Name of calling script -export EXE=libE_calling_script.py - -# Communication Method -export COMMS="--comms local" - -# Number of workers. -export NWORKERS="--nworkers 4" - -# Wallclock for libE (allow clean shutdown) -export LIBE_WALLCLOCK=25 # Optional if pass to script - -# Name of Conda environment -export CONDA_ENV_NAME= - -# Conda location - theta specific -export PATH=/opt/intel/python/2017.0.035/intelpython35/bin:$PATH -export LD_LIBRARY_PATH=~/.conda/envs/$CONDA_ENV_NAME/lib:$LD_LIBRARY_PATH -export PMI_NO_FORK=1 # Required for python kills on Theta - -# Unload Theta modules that may interfere with job monitoring/kills -module unload trackdeps -module unload darshan -module unload xalt - -# Activate conda environment -export PYTHONNOUSERSITE=1 -. activate $CONDA_ENV_NAME - -# Launch libE -# python $EXE $NUM_WORKERS > out.txt 2>&1 # No args. All defined in calling script -# python $EXE $COMMS $NWORKERS > out.txt 2>&1 # If calling script is using parse_args() -python $EXE $LIBE_WALLCLOCK $COMMS $NWORKERS > out.txt 2>&1 # If calling script takes wall-clock as positional arg. diff --git a/examples/libE_submission_scripts/edtb_submit_pbspro_central.sh b/examples/libE_submission_scripts/edtb_submit_pbspro_central.sh deleted file mode 100644 index 2229820a99..0000000000 --- a/examples/libE_submission_scripts/edtb_submit_pbspro_central.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -x -#PBS -l walltime=00:30:00 -#PBS -l select=4:ncpus=128 -#PBS -A - -# Script to run libEnsemble using multiprocessing on launch nodes. -# Assumes Conda environment is set up. - -# To be run with central job management -# - Manager and workers run on launch node. -# - Workers submit tasks to the compute nodes in the allocation. - -# Name of calling script - -source ~/.bashrc - -export EXE= - -# Communication Method -export COMMS="--comms local" - -# Number of workers. -export NWORKERS="--nworkers 4" - -# Name of Conda environment -export CONDA_ENV_NAME= - -# Activate conda environment -export PYTHONNOUSERSITE=1 -conda activate $CONDA_ENV_NAME - -cd $PBS_O_WORKDIR - -# openmpi on edtb -export LD_LIBRARY_PATH=/lus/theta-fs0/software/edtb/openmpi/4.1.1/lib:$LD_LIBRARY_PATH -export PATH=/lus/theta-fs0/software/edtb/openmpi/4.1.1/bin:$PATH - -# Launch libE -python $EXE $COMMS $NWORKERS > out.txt 2>&1 diff --git a/libensemble/resources/platforms.py b/libensemble/resources/platforms.py index 34f6cae1fc..253976e51c 100644 --- a/libensemble/resources/platforms.py +++ b/libensemble/resources/platforms.py @@ -143,17 +143,6 @@ class Aurora(Platform): scheduler_match_slots: bool = True -# On SLURM systems, let srun assign free GPUs on the node -class Crusher(Platform): - mpi_runner: str = "srun" - cores_per_node: int = 64 - logical_cores_per_node: int = 128 - gpus_per_node: int = 8 - gpu_setting_type: str = "runner_default" - gpu_env_fallback: str = "ROCR_VISIBLE_DEVICES" - scheduler_match_slots: bool = False - - class Frontier(Platform): mpi_runner: str = "srun" cores_per_node: int = 64 @@ -202,38 +191,6 @@ class Polaris(Platform): scheduler_match_slots: bool = True -class Spock(Platform): - mpi_runner: str = "srun" - cores_per_node: int = 64 - logical_cores_per_node: int = 128 - gpus_per_node: int = 4 - gpu_setting_type: str = "runner_default" - gpu_setting_name: str = "ROCR_VISIBLE_DEVICES" - scheduler_match_slots: bool = False - - -class Summit(Platform): - mpi_runner: str = "jsrun" - cores_per_node: int = 42 - logical_cores_per_node: int = 168 - gpus_per_node: int = 6 - gpu_setting_type: str = "option_gpus_per_task" - gpu_setting_name: str = "-g" - scheduler_match_slots: bool = False - - -class Sunspot(Platform): - mpi_runner: str = "mpich" - runner_name: str = "mpiexec" - cores_per_node: int = 104 - logical_cores_per_node: int = 208 - gpus_per_node: int = 6 - tiles_per_gpu: int = 2 - gpu_setting_type: str = "env" - gpu_setting_name: str = "ZE_AFFINITY_MASK" - scheduler_match_slots: bool = True - - class Known_platforms(BaseModel): """A list of platforms with known configurations. @@ -274,25 +231,18 @@ class Known_platforms(BaseModel): aurora: Aurora = Aurora() generic_rocm: GenericROCm = GenericROCm() - crusher: Crusher = Crusher() frontier: Frontier = Frontier() perlmutter: Perlmutter = Perlmutter() perlmutter_c: PerlmutterCPU = PerlmutterCPU() perlmutter_g: PerlmutterGPU = PerlmutterGPU() polaris: Polaris = Polaris() - spock: Spock = Spock() - summit: Summit = Summit() - sunspot: Sunspot = Sunspot() # Dictionary of known systems (or system partitions) detectable by domain name detect_systems = { - "crusher.olcf.ornl.gov": "crusher", "frontier.olcf.ornl.gov": "frontier", "hostmgmt.cm.aurora.alcf.anl.gov": "aurora", "hsn.cm.polaris.alcf.anl.gov": "polaris", - "spock.olcf.ornl.gov": "spock", - "summit.olcf.ornl.gov": "summit", # Need to detect gpu count } diff --git a/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py b/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py index bb23e4a78b..321e698b81 100644 --- a/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py +++ b/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py @@ -53,7 +53,7 @@ # Import libEnsemble items for this test from libensemble.libE import libE -from libensemble.resources.platforms import Aurora, Frontier, PerlmutterGPU, Platform, Polaris, Summit +from libensemble.resources.platforms import Aurora, Frontier, PerlmutterGPU, Platform, Polaris from libensemble.sim_funcs import six_hump_camel from libensemble.sim_funcs.var_resources import gpu_variable_resources as sim_f from libensemble.tools import add_unique_random_streams, parse_args @@ -203,7 +203,7 @@ del libE_specs["platform_specs"] # Fourth set - use platform setting ------------------------------------------------------------ - for platform in ["summit", "crusher", "perlmutter_g", "polaris", "aurora"]: + for platform in ["perlmutter_g", "polaris", "aurora"]: print(f"\nRunning GPU setting checks (via known platform) for {platform} ------------------- ") libE_specs["platform"] = platform @@ -221,7 +221,7 @@ del libE_specs["platform"] # Fifth set - use platform environment setting ----------------------------------------------- - for platform in ["summit", "crusher", "perlmutter_g", "polaris", "aurora"]: + for platform in ["perlmutter_g", "polaris", "aurora"]: print(f"\nRunning GPU setting checks (via known platform env. variable) for {platform} ----- ") os.environ["LIBE_PLATFORM"] = platform @@ -239,7 +239,7 @@ del os.environ["LIBE_PLATFORM"] # Sixth set - use platform_specs with known systems ------------------------------------------- - for platform in [Summit, Frontier, PerlmutterGPU, Polaris, Aurora]: + for platform in [Frontier, PerlmutterGPU, Polaris, Aurora]: print(f"\nRunning GPU setting checks (via known platform - platform_specs) for {platform} ------------------- ") libE_specs["platform_specs"] = platform() diff --git a/libensemble/tests/scaling_tests/forces/forces_adv/readme.md b/libensemble/tests/scaling_tests/forces/forces_adv/readme.md index e30f10d2d3..2d0daf9f79 100644 --- a/libensemble/tests/scaling_tests/forces/forces_adv/readme.md +++ b/libensemble/tests/scaling_tests/forces/forces_adv/readme.md @@ -64,10 +64,6 @@ you will need to replace the following templated values if on a Cobalt system: The included scripts are. -* summit_submit_mproc.sh: - - Example Summit submission script to run libEnsemble in central mode on the Summit launch nodes with multiprocessing worker concurrency. - * cobalt_submit_mproc.sh: Example submission script to run libEnsemble similarly on ALCF's Theta, a now-retired system. diff --git a/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh b/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh index 7280ae9982..a01c715ab6 100755 --- a/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh +++ b/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh @@ -40,9 +40,6 @@ mpicc -O3 -o forces.x forces.c -lm # xlc_r -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c # mpicc -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c -# Summit with gcc (Need up to offload capable gcc: module load gcc/12.1.0) - slower than xlc -# mpicc -DGPU -Ofast -fopenmp -Wl,-rpath=/sw/summit/gcc/12.1.0-0/lib64 -lm -foffload=nvptx-none forces.c -o forces.x - # Nvidia (nvc) compiler with mpicc and on Cray system with target (Perlmutter) # mpicc -DGPU -O3 -fopenmp -mp=gpu -o forces.x forces.c # cc -DGPU -Wl,-znoexecstack -O3 -fopenmp -mp=gpu -target-accel=nvidia80 -o forces.x forces.c diff --git a/libensemble/tests/scaling_tests/warpx/all_machine_specs.py b/libensemble/tests/scaling_tests/warpx/all_machine_specs.py index dc3ecaca92..56a0623398 100644 --- a/libensemble/tests/scaling_tests/warpx/all_machine_specs.py +++ b/libensemble/tests/scaling_tests/warpx/all_machine_specs.py @@ -14,13 +14,3 @@ "OMP_NUM_THREADS": "2", "sim_max": 3, # Maximum number of simulations } - - -summit_specs = { - "name": "summit", # Machine name - "sim_app": os.environ["HOME"] + "/warpx/Bin/main2d.gnu.TPROF.MPI.CUDA.ex", - # extra arguments passed to jsrun at execution - "extra_args": '-n 1 -a 1 -g 1 -c 1 --bind=packed:1 --smpiargs="-gpu"', - "OMP_NUM_THREADS": "1", - "sim_max": 400, # Maximum number of simulations -} diff --git a/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py b/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py index 636767c0ed..3fde6a878d 100644 --- a/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py +++ b/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py @@ -7,8 +7,6 @@ Execute locally via the following command: python run_libensemble_on_warpx.py --comms local --nworkers 3 -On summit, use the submission script: - bsub summit_submit_mproc.sh The number of concurrent evaluations of the objective function will be nworkers=1 as one worker is for the persistent gen_f. @@ -16,7 +14,6 @@ # Either 'random' or 'aposmm' generator_type = "aposmm" -# Either 'local' or 'summit' machine = "local" import sys @@ -49,8 +46,6 @@ # Import machine-specific run parameters if machine == "local": machine_specs = all_machine_specs.local_specs -elif machine == "summit": - machine_specs = all_machine_specs.summit_specs else: print("you shouldn' hit that") sys.exit() diff --git a/libensemble/tests/scaling_tests/warpx/warpx_simf.py b/libensemble/tests/scaling_tests/warpx/warpx_simf.py index a3852a99e9..6d88d05433 100644 --- a/libensemble/tests/scaling_tests/warpx/warpx_simf.py +++ b/libensemble/tests/scaling_tests/warpx/warpx_simf.py @@ -44,25 +44,14 @@ def run_warpx(H, persis_info, sim_specs, libE_info): app_args = input_file os.environ["OMP_NUM_THREADS"] = machine_specs["OMP_NUM_THREADS"] - # Launch the executor to actually run the WarpX simulation - if machine_specs["name"] == "summit": - task = exctr.submit( - app_name="warpx", - extra_args=machine_specs["extra_args"], - app_args=app_args, - stdout="out.txt", - stderr="err.txt", - wait_on_start=True, - ) - else: - task = exctr.submit( - app_name="warpx", - num_procs=machine_specs["cores"], - app_args=app_args, - stdout="out.txt", - stderr="err.txt", - wait_on_start=True, - ) + task = exctr.submit( + app_name="warpx", + num_procs=machine_specs["cores"], + app_args=app_args, + stdout="out.txt", + stderr="err.txt", + wait_on_start=True, + ) # Periodically check the status of the simulation poll_interval = 1 # secs diff --git a/libensemble/tests/unit_tests/test_platform.py b/libensemble/tests/unit_tests/test_platform.py index ba27d03b2d..238631448a 100644 --- a/libensemble/tests/unit_tests/test_platform.py +++ b/libensemble/tests/unit_tests/test_platform.py @@ -15,13 +15,13 @@ "cores_per_node": 32, } -summit_spec = { - "mpi_runner": "jsrun", - "cores_per_node": 42, - "logical_cores_per_node": 168, - "gpus_per_node": 6, - "gpu_setting_type": "option_gpus_per_task", - "gpu_setting_name": "-g", +frontier_spec = { + "mpi_runner": "srun", + "cores_per_node": 64, + "logical_cores_per_node": 128, + "gpus_per_node": 8, + "gpu_setting_type": "runner_default", + "gpu_env_fallback": "ROCR_VISIBLE_DEVICES", "scheduler_match_slots": False, } @@ -101,10 +101,10 @@ def test_known_sys_detect(monkeypatch): monkeypatch.delenv("NERSC_HOST", raising=False) known_platforms = specs_dump(Known_platforms(), exclude_none=True) - get_sys_cmd = "echo summit.olcf.ornl.gov" # Overrides default "hostname -d" + get_sys_cmd = "echo frontier.olcf.ornl.gov" # Overrides default "hostname -d" name = known_system_detect(cmd=get_sys_cmd) platform_info = known_platforms[name] - assert platform_info == summit_spec, f"Summit spec does not match expected ({platform_info})" + assert platform_info == frontier_spec, f"Frontier spec does not match expected ({platform_info})" # Try unknown system get_sys_cmd = "echo madeup.system" # Overrides default "hostname -d" From e13f6452b090e740e7a9225fb97c82f24329118f Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 20 Feb 2025 09:49:12 -0600 Subject: [PATCH 068/215] update Bebop guide --- docs/platforms/bebop.rst | 73 +++++++--------------------------------- 1 file changed, 12 insertions(+), 61 deletions(-) diff --git a/docs/platforms/bebop.rst b/docs/platforms/bebop.rst index 80f4a56024..9f77aa4212 100644 --- a/docs/platforms/bebop.rst +++ b/docs/platforms/bebop.rst @@ -2,7 +2,7 @@ Bebop ===== -Bebop_ is a Cray CS400 cluster with Intel Broadwell and Knights Landing compute +Bebop_ is a Cray CS400 cluster with Intel Broadwell compute nodes available in the Laboratory Computing Resources Center (LCRC) at Argonne National Laboratory. @@ -52,24 +52,24 @@ for installing libEnsemble. Job Submission -------------- -Bebop uses Slurm_ for job submission and management. The two commands you'll -likely use the most to run jobs are ``srun`` and ``sbatch`` for running -interactively and batch, respectively. - -libEnsemble node-worker affinity is especially flexible on Bebop. By adjusting -``srun`` runtime options_ users may assign multiple libEnsemble workers to each -allocated node(oversubscription) or assign multiple nodes per worker. +Bebop uses PBS for job submission and management. Interactive Runs ^^^^^^^^^^^^^^^^ -You can allocate four Knights Landing nodes for thirty minutes through the following:: +You can allocate four Broadwell nodes for thirty minutes through the following:: + + qsub -I -A -l select=4:mpiprocs=4 -l walltime=30:00 - salloc -N 4 -p knl -A [username OR project] -t 00:30:00 +Once in the interactive session, you may need to reload your modules:: -With your nodes allocated, queue your job to start with four MPI ranks:: + cd $PBS_O_WORKDIR + module load anaconda3 gcc openmpi aocl + conda activate bebop_libe_env - srun -n 4 python calling.py +Now run your script with four workers (one for generator and three for simulations):: + + python my_libe_script.py --comms local --nworkers 4 ``mpirun`` should also work. This line launches libEnsemble with a manager and **three** workers to one allocated compute node, with three nodes available for @@ -83,57 +83,10 @@ be initiated with ``libE_specs["dedicated_mode"]=True`` and not oversubscribing, specify one more MPI process than the number of allocated nodes. The manager and first worker run together on a node. -If you would like to interact directly with the compute nodes via a shell, -the following starts a bash session on a Knights Landing node -for thirty minutes:: - - srun --pty -A [username OR project] -p knl -t 00:30:00 /bin/bash - .. note:: You will need to reactivate your conda virtual environment and reload your modules! Configuring this routine to occur automatically is recommended. -Batch Runs -^^^^^^^^^^ - -Batch scripts specify run settings using ``#SBATCH`` statements. A simple example -for a libEnsemble use case running in :doc:`distributed` MPI -mode on Broadwell nodes resembles the following: - -.. code-block:: bash - :linenos: - - #!/bin/bash - #SBATCH -J myjob - #SBATCH -N 4 - #SBATCH -p bdwall - #SBATCH -A myproject - #SBATCH -o myjob.out - #SBATCH -e myjob.error - #SBATCH -t 00:15:00 - - # These four lines construct a machinefile for the executor and slurm - srun hostname | sort -u > node_list - head -n 1 node_list > machinefile.$SLURM_JOBID - cat node_list >> machinefile.$SLURM_JOBID - export SLURM_HOSTFILE=machinefile.$SLURM_JOBID - - srun --ntasks 5 python calling_script.py - -With this saved as ``myscript.sh``, allocating, configuring, and running libEnsemble -on Bebop is achieved by running :: - - sbatch myscript.sh - -Example submission scripts for running on Bebop in distributed and centralized mode -are also given in the :doc:`examples`. - -Debugging Strategies --------------------- - -View the status of your submitted jobs with ``squeue``, and cancel jobs with -``scancel ``. - Additional Information ---------------------- @@ -144,5 +97,3 @@ See the LCRC Bebop docs here_ for more information about Bebop. .. _conda: https://conda.io/en/latest/ .. _here: https://docs.lcrc.anl.gov/bebop/running-jobs-bebop/ .. _mpi4py: https://mpi4py.readthedocs.io/en/stable/ -.. _options: https://slurm.schedmd.com/srun.html -.. _Slurm: https://slurm.schedmd.com/ From f181c1abb08ae7a0272c6074acf10ed6ce640ae2 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Thu, 20 Feb 2025 10:30:30 -0600 Subject: [PATCH 069/215] Removing --- install/ubuntu_no312.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 install/ubuntu_no312.txt diff --git a/install/ubuntu_no312.txt b/install/ubuntu_no312.txt deleted file mode 100644 index e69de29bb2..0000000000 From 055db18dee16c3117080f2f88034ffd3e4e6d7eb Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 20 Feb 2025 11:43:02 -0600 Subject: [PATCH 070/215] bump nlopt --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8b5be4bf64..a4d62b9f0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,7 +78,7 @@ sphinx-design = ">=0.6.1,<0.7" sphinx_rtd_theme = ">=3.0.1,<4" sphinx-copybutton = ">=0.5.2,<0.6" pre-commit = ">=4.0.1,<5" -nlopt = ">=2.8.0,<3" +nlopt = ">=2.10.0,<3" scipy = ">=1.9.1,<2" [tool.pixi.dependencies] From 6f377656350b55e17ddeee19ba73f9134342390e Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 12:13:19 -0600 Subject: [PATCH 071/215] Update wording for uniform_or_localopt --- docs/examples/gen_funcs.rst | 2 +- libensemble/gen_funcs/uniform_or_localopt.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index fd58e631cf..62e7ed9392 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -53,7 +53,7 @@ Optimization - :doc:`uniform_or_localopt` - Performs a uniform random sample or a single persistent NLopt_ local optimization run. + Samples uniformly in non-persistent mode or runs an NLopt_ local optimization run in persistent mode. - :doc:`Ax Multitask` diff --git a/libensemble/gen_funcs/uniform_or_localopt.py b/libensemble/gen_funcs/uniform_or_localopt.py index 5e478cdcc1..fca0e70bb6 100644 --- a/libensemble/gen_funcs/uniform_or_localopt.py +++ b/libensemble/gen_funcs/uniform_or_localopt.py @@ -1,7 +1,7 @@ """ This module is a persistent generation function that performs a uniform random sample when ``libE_info["persistent"]`` isn't ``True``, or performs a -single persistent persistent nlopt local optimization run. +single persistent nlopt local optimization run. """ __all__ = ["uniform_or_localopt"] From d08462d6ddbaa3185af44d2d1cd2ba83475492cf Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 12:13:34 -0600 Subject: [PATCH 072/215] Add examples to tasmanian --- docs/examples/tasmanian.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/examples/tasmanian.rst b/docs/examples/tasmanian.rst index 1cdf79de10..2c59525724 100644 --- a/docs/examples/tasmanian.rst +++ b/docs/examples/tasmanian.rst @@ -8,6 +8,8 @@ use either *venv* or *--user* install. ``E.g: pip install scikit-build packaging Tasmanian --user`` +Example usage: batched_, async_ + .. automodule:: persistent_tasmanian :members: sparse_grid_batched, sparse_grid_async :undoc-members: @@ -23,3 +25,7 @@ use either *venv* or *--user* install. .. _pypackaging: https://pypi.org/project/pypackaging/ .. _scikit-build: https://scikit-build.readthedocs.io/en/latest/index.html + +.. Caution - tasmanian_ is named in example docstring so must be named differently +.. _batched: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/regression_tests/test_persistent_tasmanian.py +.. _async: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/regression_tests/test_persistent_tasmanian_async.py From c7c10c4db1eeab495d59bae7b0fdc284d4dc7f27 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 15:42:41 -0600 Subject: [PATCH 073/215] Add missing kill_canceled_sims --- .../tests/regression_tests/test_persistent_surmise_killsims.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py b/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py index 56698bc680..7e9b480952 100644 --- a/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py +++ b/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py @@ -74,7 +74,7 @@ # Subprocess variant creates input and output files for each sim libE_specs["sim_dirs_make"] = True # To keep all - make sim dirs - # libE_specs["use_worker_dirs"] = True # To overwrite - make worker dirs only + libE_specs["kill_canceled_sims"] = True # Rename ensemble dir for non-interference with other regression tests en_suffix = str(nworkers) + "_" + libE_specs.get("comms") From 9789fd2ae6558fe80c4875fa2d79ee7381b1592b Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 15:54:01 -0600 Subject: [PATCH 074/215] Add examples to Surmise --- docs/examples/surmise.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/examples/surmise.rst b/docs/examples/surmise.rst index 3aa28c7b70..1b53c09f34 100644 --- a/docs/examples/surmise.rst +++ b/docs/examples/surmise.rst @@ -3,11 +3,17 @@ persistent_surmise Required: Surmise_. +Modular Bayesian calibration/inference framework using Surmise. + The :doc:`Borehole Calibration tutorial<../tutorials/calib_cancel_tutorial>` uses this generator as an example of the capability to cancel pending simulations. +Example usage: basic_, `kill canceled sims`_ + .. automodule:: persistent_surmise_calib :members: :no-undoc-members: .. _Surmise: https://github.com/bandframework/surmise +.. _basic: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/regression_tests/test_persistent_surmise_calib.py +.. _`kill canceled sims`: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py From d2233830dcd9727e6f5df308c36a9c6cbbbf0b25 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 19:47:46 -0600 Subject: [PATCH 075/215] Update gen docs --- docs/examples/gpcam.rst | 7 +++++-- docs/examples/surmise.rst | 6 +++--- docs/examples/tasmanian.rst | 4 ++-- libensemble/tests/regression_tests/test_gpCAM.py | 9 ++++++--- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/docs/examples/gpcam.rst b/docs/examples/gpcam.rst index f38d62cea8..48a5a97628 100644 --- a/docs/examples/gpcam.rst +++ b/docs/examples/gpcam.rst @@ -1,11 +1,14 @@ gpCAM ----- -This module provides persistent generators for Gaussian Process-based adaptive sampling. - Required: gpcam_ +Example usage: test_gpCAM_ + +This module provides persistent generators for Gaussian Process-based adaptive sampling. + .. automodule:: persistent_gpCAM :members: .. _gpcam: https://pypi.org/project/gpcam +.. _test_gpCAM: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/regression_tests/test_gpCAM.py diff --git a/docs/examples/surmise.rst b/docs/examples/surmise.rst index 1b53c09f34..f38b9b79a2 100644 --- a/docs/examples/surmise.rst +++ b/docs/examples/surmise.rst @@ -3,13 +3,13 @@ persistent_surmise Required: Surmise_. -Modular Bayesian calibration/inference framework using Surmise. +Example usage: basic_, `kill canceled sims`_ + +Modular Bayesian calibration/inference framework. The :doc:`Borehole Calibration tutorial<../tutorials/calib_cancel_tutorial>` uses this generator as an example of the capability to cancel pending simulations. -Example usage: basic_, `kill canceled sims`_ - .. automodule:: persistent_surmise_calib :members: :no-undoc-members: diff --git a/docs/examples/tasmanian.rst b/docs/examples/tasmanian.rst index 2c59525724..0099616f32 100644 --- a/docs/examples/tasmanian.rst +++ b/docs/examples/tasmanian.rst @@ -3,13 +3,13 @@ persistent_tasmanian Required: Tasmanian_, pypackaging_, scikit-build_ +Example usage: batched_, async_ + Note that Tasmanian can be pip installed, but currently must use either *venv* or *--user* install. ``E.g: pip install scikit-build packaging Tasmanian --user`` -Example usage: batched_, async_ - .. automodule:: persistent_tasmanian :members: sparse_grid_batched, sparse_grid_async :undoc-members: diff --git a/libensemble/tests/regression_tests/test_gpCAM.py b/libensemble/tests/regression_tests/test_gpCAM.py index 62a9a7955d..d59eabdc55 100644 --- a/libensemble/tests/regression_tests/test_gpCAM.py +++ b/libensemble/tests/regression_tests/test_gpCAM.py @@ -9,10 +9,13 @@ the objective function will be 2, as one of the three workers will be the persistent generator. -See libensemble.gen_funcs.persistent_gpCAM for more details about the generator -setup. +Runs three variants of gpCAM. The first two use the posterior covariance +sampling method, whereby the second run uses the grid approach and uses +the points from the first run as it’s test points.The third run uses the +gpCAM ask/tell interface. -Requires numpy<2. +See libensemble.gen_funcs.persistent_gpCAM for more details about the +generator setup. """ # Do not change these lines - they are parsed by run-tests.sh From e2cd95ce26eaa2d7bb21c4acc624ef0f6622a6d8 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 20:07:41 -0600 Subject: [PATCH 076/215] Update APOSMM docs --- docs/examples/aposmm.rst | 8 ++++++++ docs/examples/gen_funcs.rst | 9 ++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/examples/aposmm.rst b/docs/examples/aposmm.rst index 75c128fdd0..4ca355668b 100644 --- a/docs/examples/aposmm.rst +++ b/docs/examples/aposmm.rst @@ -5,6 +5,14 @@ Asynchronously Parallel Optimization Solver for finding Multiple Minima (APOSMM) coordinates concurrent local optimization runs to identify many local minima faster on parallel hardware. +Supported local optimization routines include: + + - DFO-LS_ Derivative-free solver for (bound constrained) nonlinear least-squares minimization + - NLopt_ Library for nonlinear optimization, providing a common interface for various methods + - `scipy.optimize`_ Open-source solvers for nonlinear problems, linear programming, + constrained and nonlinear least-squares, root finding, and curve fitting. + - `PETSc/TAO`_ Routines for the scalable (parallel) solution of scientific applications + Required: mpmath_, SciPy_ Optional (see below): petsc4py_, nlopt_, DFO-LS_ diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 62e7ed9392..85a957a658 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -43,13 +43,8 @@ Optimization - :doc:`APOSMM` - APOSMM_ Asynchronously parallel optimization solver for finding multiple minima. Supported local optimization routines include: - - - DFO-LS_ Derivative-free solver for (bound constrained) nonlinear least-squares minimization - - NLopt_ Library for nonlinear optimization, providing a common interface for various methods - - `scipy.optimize`_ Open-source solvers for nonlinear problems, linear programming, - constrained and nonlinear least-squares, root finding, and curve fitting. - - `PETSc/TAO`_ Routines for the scalable (parallel) solution of scientific applications + Asynchronously Parallel Optimization Solver for finding Multiple Minima (APOSMM_) coordinates + concurrent local optimization runs to identify many local minima faster on parallel hardware. - :doc:`uniform_or_localopt` From 728a2465e8b7de2862cd51b2fa22458da9773244 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 20:21:49 -0600 Subject: [PATCH 077/215] Update sampling generator docs --- docs/examples/gen_funcs.rst | 15 ++++++++++++--- docs/examples/persistent_sampling | 11 +++++++++++ docs/examples/persistent_sampling.rst | 12 ++++++++++++ docs/examples/sampling.rst | 18 ------------------ 4 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 docs/examples/persistent_sampling create mode 100644 docs/examples/persistent_sampling.rst diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 85a957a658..2210cd5c23 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -7,7 +7,6 @@ Here we list many generator functions included with libEnsemble. See the API for generator functions :ref:`here`. - Sampling -------- @@ -17,11 +16,21 @@ Sampling :hidden: sampling + persistent_sampling + persistent_sampling_var_resources - :doc:`sampling` - Various generators for sampling a space. - Includes both persistent and non-persistent sampling generators. There are also useful examples of assigning resources for each simulation (persistent_sampling_var_resources). + Various generators for sampling a space. Function runs once each call. + +- :doc:`persistent sampling` + + Various persistent generators (persists on a worker) for sampling a space. After the initial + batch each generator creates N new random points for every N points that are returned. + +- :doc:`persistent sampling with variable resources` + + Various persistent sampling generators that assign different resources to each simulation. Optimization diff --git a/docs/examples/persistent_sampling b/docs/examples/persistent_sampling new file mode 100644 index 0000000000..04f601e915 --- /dev/null +++ b/docs/examples/persistent_sampling @@ -0,0 +1,11 @@ +persistent_sampling +------------------- +.. automodule:: persistent_sampling + :members: + :undoc-members: + +.. dropdown:: :underline:`persistent_sampling.py` + + .. literalinclude:: ../../libensemble/gen_funcs/persistent_sampling.py + :language: python + :linenos: diff --git a/docs/examples/persistent_sampling.rst b/docs/examples/persistent_sampling.rst new file mode 100644 index 0000000000..7f778a8e8c --- /dev/null +++ b/docs/examples/persistent_sampling.rst @@ -0,0 +1,12 @@ +persistent_sampling +------------------- + +.. automodule:: persistent_sampling + :members: + :undoc-members: + +.. dropdown:: :underline:`persistent_sampling.py` + + .. literalinclude:: ../../libensemble/gen_funcs/persistent_sampling.py + :language: python + :linenos: diff --git a/docs/examples/sampling.rst b/docs/examples/sampling.rst index f54116159a..4e51b9a944 100644 --- a/docs/examples/sampling.rst +++ b/docs/examples/sampling.rst @@ -13,21 +13,3 @@ sampling .. literalinclude:: ../../libensemble/gen_funcs/sampling.py :language: python :linenos: - -persistent_sampling -------------------- -.. automodule:: persistent_sampling - :members: - :undoc-members: - -.. dropdown:: :underline:`persistent_sampling.py` - - .. literalinclude:: ../../libensemble/gen_funcs/persistent_sampling.py - :language: python - :linenos: - -persistent_sampling_var_resources ---------------------------------- -.. automodule:: persistent_sampling_var_resources - :members: - :undoc-members: From b1b0b22ab87d631b256a3462e878b1ab7e330112 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 20:26:06 -0600 Subject: [PATCH 078/215] cleanup gen funcs --- docs/examples/gen_funcs.rst | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 2210cd5c23..bb5eb4835f 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -71,17 +71,10 @@ Optimization Generators using ytopt_. A Bayesian Optimization package for determining optimal input parameter configurations for applications or other executables. (*community example*) -.. - :ref:`Dragonfly` -.. -.. Generators for. - - :ref:`Consensus` Distributed optimization methods for minimizing sums of convex functions (*community example*). - Methods include: - - Primal-dual sliding (https://arxiv.org/pdf/2101.00143). - - Distributed gradient descent with gradient tracking (https://arxiv.org/abs/1908.11444). - - Proximal sliding (https://arxiv.org/abs/1406.0919). + Modeling and Approximation -------------------------- From 0c0e949b61b9e0c4bc229e66d4207d430de27ae5 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 20:28:00 -0600 Subject: [PATCH 079/215] Remove mistaken file --- docs/examples/persistent_sampling | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 docs/examples/persistent_sampling diff --git a/docs/examples/persistent_sampling b/docs/examples/persistent_sampling deleted file mode 100644 index 04f601e915..0000000000 --- a/docs/examples/persistent_sampling +++ /dev/null @@ -1,11 +0,0 @@ -persistent_sampling -------------------- -.. automodule:: persistent_sampling - :members: - :undoc-members: - -.. dropdown:: :underline:`persistent_sampling.py` - - .. literalinclude:: ../../libensemble/gen_funcs/persistent_sampling.py - :language: python - :linenos: From a2839fa1f9af2138a318ad49429c31acfdbe11b9 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Feb 2025 20:28:36 -0600 Subject: [PATCH 080/215] Add correct var resources doc file --- docs/examples/persistent_sampling_var_resources.rst | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/examples/persistent_sampling_var_resources.rst diff --git a/docs/examples/persistent_sampling_var_resources.rst b/docs/examples/persistent_sampling_var_resources.rst new file mode 100644 index 0000000000..d4f7f8b5c5 --- /dev/null +++ b/docs/examples/persistent_sampling_var_resources.rst @@ -0,0 +1,6 @@ +persistent_sampling_var_resources +--------------------------------- + +.. automodule:: persistent_sampling_var_resources + :members: + :undoc-members: From 900584bc2585622186f07e7c5dd1c4df57fd2d0b Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 12:03:31 -0600 Subject: [PATCH 081/215] Update sim funcs examples --- docs/examples/gen_funcs.rst | 1 - docs/examples/sim_funcs.rst | 77 +++++++++---------- docs/examples/sim_funcs/borehole.rst | 16 ++++ docs/examples/sim_funcs/borehole_kills.rst | 16 ++++ docs/examples/sim_funcs/chwirut1.rst | 15 ++++ docs/examples/sim_funcs/forces_simf.rst | 15 ++++ docs/examples/sim_funcs/inverse_bayes.rst | 15 ++++ docs/examples/sim_funcs/mock_sim.rst | 16 ++++ .../sim_funcs/noisy_vector_mapping.rst | 15 ++++ docs/examples/sim_funcs/periodic_func.rst | 15 ++++ docs/examples/sim_funcs/rosenbrock.rst | 15 ++++ docs/examples/sim_funcs/simple_sim.rst | 15 ++++ docs/examples/sim_funcs/six_hump_camel.rst | 15 ++++ .../sim_funcs/surmise_test_function.rst | 15 ++++ docs/examples/sim_funcs/var_resources.rst | 15 ++++ 15 files changed, 235 insertions(+), 41 deletions(-) create mode 100644 docs/examples/sim_funcs/borehole.rst create mode 100644 docs/examples/sim_funcs/borehole_kills.rst create mode 100644 docs/examples/sim_funcs/chwirut1.rst create mode 100644 docs/examples/sim_funcs/forces_simf.rst create mode 100644 docs/examples/sim_funcs/inverse_bayes.rst create mode 100644 docs/examples/sim_funcs/mock_sim.rst create mode 100644 docs/examples/sim_funcs/noisy_vector_mapping.rst create mode 100644 docs/examples/sim_funcs/periodic_func.rst create mode 100644 docs/examples/sim_funcs/rosenbrock.rst create mode 100644 docs/examples/sim_funcs/simple_sim.rst create mode 100644 docs/examples/sim_funcs/six_hump_camel.rst create mode 100644 docs/examples/sim_funcs/surmise_test_function.rst create mode 100644 docs/examples/sim_funcs/var_resources.rst diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index bb5eb4835f..9452bf306d 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -114,7 +114,6 @@ Modeling and Approximation Distributed evolutionary algorithms (*community example*) - .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples .. _APOSMM: https://link.springer.com/article/10.1007/s12532-017-0131-4 diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index be7624c384..cf8d8f1054 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -13,43 +13,40 @@ function launching tasks, see the .. role:: underline :class: underline -six_hump_camel --------------- -.. automodule:: six_hump_camel - :members: six_hump_camel_simple, persistent_six_hump_camel - :undoc-members: - -.. dropdown:: :underline:`six_hump_camel.py` - - .. literalinclude:: ../../libensemble/sim_funcs/six_hump_camel.py - :language: python - :linenos: - -noisy_vector_mapping --------------------- -.. automodule:: noisy_vector_mapping - :members: - :undoc-members: - -.. dropdown:: :underline:`noisy_vector_mapping.py` - - .. literalinclude:: ../../libensemble/sim_funcs/noisy_vector_mapping.py - :language: python - :linenos: - -borehole --------- -.. automodule:: borehole - :members: - :undoc-members: - -executor_hworld ---------------- -.. automodule:: executor_hworld - :members: - -.. dropdown:: :underline:`executor_hworld.py` - - .. literalinclude:: ../../libensemble/sim_funcs/executor_hworld.py - :language: python - :linenos: + +Simple simulation functions +--------------------------- + +.. toctree:: + :maxdepth: 1 + + sim_funcs/simple_sim + sim_funcs/borehole + sim_funcs/borehole_kills + sim_funcs/chwirut1 + sim_funcs/inverse_bayes + sim_funcs/noisy_vector_mapping + sim_funcs/periodic_func + sim_funcs/rosenbrock + sim_funcs/six_hump_camel + sim_funcs/surmise_test_function + + +Functions with CPU/GPU allocation +--------------------------------- + +.. toctree:: + :maxdepth: 1 + + sim_funcs/var_resources + sim_funcs/forces_simf + +Special simulation functions +---------------------------- + +.. toctree:: + :maxdepth: 1 + + sim_funcs/mock_sim + + diff --git a/docs/examples/sim_funcs/borehole.rst b/docs/examples/sim_funcs/borehole.rst new file mode 100644 index 0000000000..fa12936523 --- /dev/null +++ b/docs/examples/sim_funcs/borehole.rst @@ -0,0 +1,16 @@ +borehole +-------------- +.. role:: underline + :class: underline + +.. automodule:: borehole + :members: + :undoc-members: + +.. dropdown:: :underline:`borehole.py` + + + + .. literalinclude:: ../../../libensemble/sim_funcs/borehole.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/borehole_kills.rst b/docs/examples/sim_funcs/borehole_kills.rst new file mode 100644 index 0000000000..e657a9b4d8 --- /dev/null +++ b/docs/examples/sim_funcs/borehole_kills.rst @@ -0,0 +1,16 @@ +borehole_kills +-------------- +.. role:: underline + :class: underline + +.. automodule:: borehole_kills + :members: + :undoc-members: + +.. dropdown:: :underline:`borehole_kills.py` + + + + .. literalinclude:: ../../../libensemble/sim_funcs/borehole_kills.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/chwirut1.rst b/docs/examples/sim_funcs/chwirut1.rst new file mode 100644 index 0000000000..1de2022228 --- /dev/null +++ b/docs/examples/sim_funcs/chwirut1.rst @@ -0,0 +1,15 @@ +chwirut1 +-------------- +.. role:: underline + :class: underline + +.. automodule:: chwirut1 + :members: + :undoc-members: + +.. dropdown:: :underline:`chwirut1.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/chwirut1.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/forces_simf.rst b/docs/examples/sim_funcs/forces_simf.rst new file mode 100644 index 0000000000..441c6680e8 --- /dev/null +++ b/docs/examples/sim_funcs/forces_simf.rst @@ -0,0 +1,15 @@ +forces_simf +-------------- +.. role:: underline + :class: underline + +.. automodule:: forces_simf + :members: + :undoc-members: + +.. dropdown:: :underline:`forces_simf.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/forces_simf.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/inverse_bayes.rst b/docs/examples/sim_funcs/inverse_bayes.rst new file mode 100644 index 0000000000..c89c85802a --- /dev/null +++ b/docs/examples/sim_funcs/inverse_bayes.rst @@ -0,0 +1,15 @@ +inverse_bayes +-------------- +.. role:: underline + :class: underline + +.. automodule:: inverse_bayes + :members: + :undoc-members: + +.. dropdown:: :underline:`inverse_bayes.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/inverse_bayes.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/mock_sim.rst b/docs/examples/sim_funcs/mock_sim.rst new file mode 100644 index 0000000000..3b42b7627f --- /dev/null +++ b/docs/examples/sim_funcs/mock_sim.rst @@ -0,0 +1,16 @@ +mock_sim (re-run using history file) +------------------------------------ + +.. role:: underline + :class: underline + +.. automodule:: mock_sim + :members: + :undoc-members: + +.. dropdown:: :underline:`mock_sim.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/mock_sim.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/noisy_vector_mapping.rst b/docs/examples/sim_funcs/noisy_vector_mapping.rst new file mode 100644 index 0000000000..e0a10709ed --- /dev/null +++ b/docs/examples/sim_funcs/noisy_vector_mapping.rst @@ -0,0 +1,15 @@ +noisy_vector_mapping +-------------- +.. role:: underline + :class: underline + +.. automodule:: noisy_vector_mapping + :members: + :undoc-members: + +.. dropdown:: :underline:`noisy_vector_mapping.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/noisy_vector_mapping.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/periodic_func.rst b/docs/examples/sim_funcs/periodic_func.rst new file mode 100644 index 0000000000..74949a7990 --- /dev/null +++ b/docs/examples/sim_funcs/periodic_func.rst @@ -0,0 +1,15 @@ +periodic_func +-------------- +.. role:: underline + :class: underline + +.. automodule:: periodic_func + :members: + :undoc-members: + +.. dropdown:: :underline:`periodic_func.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/periodic_func.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/rosenbrock.rst b/docs/examples/sim_funcs/rosenbrock.rst new file mode 100644 index 0000000000..b790723488 --- /dev/null +++ b/docs/examples/sim_funcs/rosenbrock.rst @@ -0,0 +1,15 @@ +rosenbrock +-------------- +.. role:: underline + :class: underline + +.. automodule:: rosenbrock + :members: + :undoc-members: + +.. dropdown:: :underline:`rosenbrock.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/rosenbrock.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/simple_sim.rst b/docs/examples/sim_funcs/simple_sim.rst new file mode 100644 index 0000000000..ba203f3437 --- /dev/null +++ b/docs/examples/sim_funcs/simple_sim.rst @@ -0,0 +1,15 @@ +simple_sim +-------------- +.. role:: underline + :class: underline + +.. automodule:: simple_sim + :members: + :undoc-members: + +.. dropdown:: :underline:`simple_sim.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/simple_sim.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/six_hump_camel.rst b/docs/examples/sim_funcs/six_hump_camel.rst new file mode 100644 index 0000000000..382d708180 --- /dev/null +++ b/docs/examples/sim_funcs/six_hump_camel.rst @@ -0,0 +1,15 @@ +six_hump_camel +-------------- +.. role:: underline + :class: underline + +.. automodule:: six_hump_camel + :members: + :undoc-members: + +.. dropdown:: :underline:`six_hump_camel.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/six_hump_camel.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/surmise_test_function.rst b/docs/examples/sim_funcs/surmise_test_function.rst new file mode 100644 index 0000000000..a7bacd8b8f --- /dev/null +++ b/docs/examples/sim_funcs/surmise_test_function.rst @@ -0,0 +1,15 @@ +surmise_test_function +-------------- +.. role:: underline + :class: underline + +.. automodule:: surmise_test_function + :members: + :undoc-members: + +.. dropdown:: :underline:`surmise_test_function.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/surmise_test_function.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/var_resources.rst b/docs/examples/sim_funcs/var_resources.rst new file mode 100644 index 0000000000..eb6b28cb1c --- /dev/null +++ b/docs/examples/sim_funcs/var_resources.rst @@ -0,0 +1,15 @@ +var_resources +-------------- +.. role:: underline + :class: underline + +.. automodule:: var_resources + :members: + :undoc-members: + +.. dropdown:: :underline:`var_resources.py` + + + .. literalinclude:: ../../../libensemble/sim_funcs/var_resources.py + :language: python + :linenos: From d3e050e1973f5b2171108585c42fbf2c949821d3 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 12:06:36 -0600 Subject: [PATCH 082/215] Add info to sim funcs docs --- docs/examples/sim_funcs.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index cf8d8f1054..dc630a98c3 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -21,6 +21,7 @@ Simple simulation functions :maxdepth: 1 sim_funcs/simple_sim + sim_funcs/six_hump_camel sim_funcs/borehole sim_funcs/borehole_kills sim_funcs/chwirut1 @@ -28,12 +29,14 @@ Simple simulation functions sim_funcs/noisy_vector_mapping sim_funcs/periodic_func sim_funcs/rosenbrock - sim_funcs/six_hump_camel sim_funcs/surmise_test_function -Functions with CPU/GPU allocation ---------------------------------- +Functions that run user applications +------------------------------------ + +This use the executor to launch applications and in some cases +handle dynamic CPU/GPU allocation. .. toctree:: :maxdepth: 1 From 86a29959e01ce035865b1747f6289e39c5fe0e68 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 13:09:28 -0600 Subject: [PATCH 083/215] Split forces sim func examples --- docs/conf.py | 1 + docs/examples/sim_funcs.rst | 2 ++ docs/examples/sim_funcs/forces_simf.rst | 14 +++++++---- docs/examples/sim_funcs/forces_simf_gpu.rst | 21 ++++++++++++++++ .../forces_simf_gpu_vary_resources.rst | 24 +++++++++++++++++++ .../forces/forces_simple/forces_simf.py | 9 ++++++- 6 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 docs/examples/sim_funcs/forces_simf_gpu.rst create mode 100644 docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst diff --git a/docs/conf.py b/docs/conf.py index 17dc692c41..53fa3a35df 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -65,6 +65,7 @@ def __getattr__(cls, name): sys.path.append(os.path.abspath("../libensemble/tools/live_data")) sys.path.append(os.path.abspath("../libensemble/executors")) sys.path.append(os.path.abspath("../libensemble/resources")) +sys.path.append(os.path.abspath("../libensemble/tests/scaling_tests/forces")) # print(sys.path) # -- General configuration ------------------------------------------------ diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index dc630a98c3..e01e1b8dfb 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -43,6 +43,8 @@ handle dynamic CPU/GPU allocation. sim_funcs/var_resources sim_funcs/forces_simf + sim_funcs/forces_simf_gpu + sim_funcs/forces_simf_gpu_vary_resources Special simulation functions ---------------------------- diff --git a/docs/examples/sim_funcs/forces_simf.rst b/docs/examples/sim_funcs/forces_simf.rst index 441c6680e8..b68705dcfe 100644 --- a/docs/examples/sim_funcs/forces_simf.rst +++ b/docs/examples/sim_funcs/forces_simf.rst @@ -1,15 +1,21 @@ -forces_simf --------------- +forces (CPU) +------------ + .. role:: underline :class: underline -.. automodule:: forces_simf +.. automodule:: forces_simple.forces_simf :members: :undoc-members: .. dropdown:: :underline:`forces_simf.py` + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_simple/forces_simf.py + :language: python + :linenos: + +.. dropdown:: :underline:`Example usage` - .. literalinclude:: ../../../libensemble/sim_funcs/forces_simf.py + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_simple/run_libe_forces.py :language: python :linenos: diff --git a/docs/examples/sim_funcs/forces_simf_gpu.rst b/docs/examples/sim_funcs/forces_simf_gpu.rst new file mode 100644 index 0000000000..b57118632a --- /dev/null +++ b/docs/examples/sim_funcs/forces_simf_gpu.rst @@ -0,0 +1,21 @@ +forces (GPU) +------------ + +.. role:: underline + :class: underline + +.. automodule:: forces_gpu.forces_simf + :members: + :undoc-members: + +.. dropdown:: :underline:`forces_simf.py` + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu/forces_simf.py + :language: python + :linenos: + +.. dropdown:: :underline:`Example usage` + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu/run_libe_forces.py + :language: python + :linenos: diff --git a/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst new file mode 100644 index 0000000000..935c3e407c --- /dev/null +++ b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst @@ -0,0 +1,24 @@ +forces (GPU) dynamic resources +------------------------------ + +.. role:: underline + :class: underline + +.. automodule:: forces_gpu_var_resources.forces_simf + :members: + :undoc-members: + +.. dropdown:: :underline:`forces_simf.py` + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu_var_resources/forces_simf.py + :language: python + :linenos: + + +.. dropdown:: :underline:`Example usage` + + Note the use of the generator function ``uniform_sample_with_var_gpus`` that sets ``num_gpus`` As a gen specs out for each generated input set (for the simulation). + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu_var_resources/run_libe_forces.py + :language: python + :linenos: diff --git a/libensemble/tests/scaling_tests/forces/forces_simple/forces_simf.py b/libensemble/tests/scaling_tests/forces/forces_simple/forces_simf.py index ecc2ad4b53..74e2ac2dbd 100644 --- a/libensemble/tests/scaling_tests/forces/forces_simple/forces_simf.py +++ b/libensemble/tests/scaling_tests/forces/forces_simple/forces_simf.py @@ -5,7 +5,14 @@ def run_forces(H, persis_info, sim_specs, libE_info): - """Runs the forces MPI application""" + """Runs the forces MPI application. + + By default assigns the number of MPI ranks to the number + of cores available to this worker. + + To assign a different number give e.g., `num_procs=4` to + ``exctr.submit``. + """ calc_status = 0 From 8763292e572e13248fd60850059d69383e95390d Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 15:26:32 -0600 Subject: [PATCH 084/215] Add multi-app sim to docs and update links --- docs/examples/sim_funcs.rst | 6 +++ docs/examples/sim_funcs/forces_simf.rst | 4 +- docs/examples/sim_funcs/forces_simf_gpu.rst | 8 +++- .../sim_funcs/forces_simf_gpu_multi_app.rst | 43 +++++++++++++++++++ .../forces_simf_gpu_vary_resources.rst | 13 +++++- .../forces/forces_multi_app/forces_simf.py | 5 +-- 6 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index e01e1b8dfb..fae31ed1e5 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -38,6 +38,10 @@ Functions that run user applications This use the executor to launch applications and in some cases handle dynamic CPU/GPU allocation. +The ``var_resources`` module contains basic examples, while the ``forces`` +examples use an MPI/OpenMP (with GPU offload option) application that is used +to demonstrate libEnsemble’s capabilities on various HPC systems. + .. toctree:: :maxdepth: 1 @@ -45,6 +49,8 @@ handle dynamic CPU/GPU allocation. sim_funcs/forces_simf sim_funcs/forces_simf_gpu sim_funcs/forces_simf_gpu_vary_resources + sim_funcs/forces_simf_gpu_multi_app + Special simulation functions ---------------------------- diff --git a/docs/examples/sim_funcs/forces_simf.rst b/docs/examples/sim_funcs/forces_simf.rst index b68705dcfe..fb2064869c 100644 --- a/docs/examples/sim_funcs/forces_simf.rst +++ b/docs/examples/sim_funcs/forces_simf.rst @@ -1,4 +1,4 @@ -forces (CPU) +Forces (CPU) ------------ .. role:: underline @@ -19,3 +19,5 @@ forces (CPU) .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_simple/run_libe_forces.py :language: python :linenos: + +Also see the :doc:`Forces tutorial <../../tutorials/executor_forces_tutorial>`. diff --git a/docs/examples/sim_funcs/forces_simf_gpu.rst b/docs/examples/sim_funcs/forces_simf_gpu.rst index b57118632a..2e22f81094 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu.rst @@ -1,4 +1,4 @@ -forces (GPU) +Forces (GPU) ------------ .. role:: underline @@ -19,3 +19,9 @@ forces (GPU) .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu/run_libe_forces.py :language: python :linenos: + +Also see the :doc:`Forces GPU tutorial <../../tutorials/forces_gpu_tutorial>` and the +video_ demonstration on Frontier_. + +.. _video: https://www.youtube.com/watch?v=H2fmbZ6DnVc +.. _Frontier: https://docs.olcf.ornl.gov/systems/frontier_user_guide.html diff --git a/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst new file mode 100644 index 0000000000..1074b1aaf0 --- /dev/null +++ b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst @@ -0,0 +1,43 @@ +Forces with dynamic resources (CPU app and GPU app) +--------------------------------------------------- + +.. role:: underline + :class: underline + +Launches either the CPU-only or GPU version of the forces MPI app and auto-assigns +ranks and GPU resources as requested by the generator. + +This makes efficient use of each node as the expensive GPU simulations will use the GPUs on +the node/s, while the rest of the CPU cores are assigned to the simple CPU-only simulations. + +For a realistic use-case see https://journals.aps.org/prab/abstract/10.1103/PhysRevAccelBeams.26.084601 + +.. automodule:: forces_multi_app.forces_simf + :members: + :undoc-members: + +.. dropdown:: :underline:`forces_simf.py` + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_multi_app/forces_simf.py + :language: python + :linenos: + +The generator in the example below assigns to each simulation either the CPU application +or the GPU application and also randomly assigns the number of processors for each +simulation. For the GPU application, one GPU is used for each MPI rank. As many nodes +as necessary will be used for each application. + +The special generator output fields "num_procs" and "num_gpus" are automatically picked +up by each worker and these will be used when the simulation is run, unless overridden. + +.. dropdown:: :underline:`Example usage` + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_multi_app/run_libe_forces.py + :language: python + :linenos: + +More information is available in the :doc:`Forces GPU tutorial <../../tutorials/forces_gpu_tutorial>` +and the video_ demonstration on Frontier_. + +.. _video: https://www.youtube.com/watch?v=H2fmbZ6DnVc +.. _Frontier: https://docs.olcf.ornl.gov/systems/frontier_user_guide.html diff --git a/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst index 935c3e407c..c80c9c6f56 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst @@ -1,4 +1,4 @@ -forces (GPU) dynamic resources +Forces (GPU) dynamic resources ------------------------------ .. role:: underline @@ -17,8 +17,17 @@ forces (GPU) dynamic resources .. dropdown:: :underline:`Example usage` - Note the use of the generator function ``uniform_sample_with_var_gpus`` that sets ``num_gpus`` As a gen specs out for each generated input set (for the simulation). + Note the use of the generator function ``uniform_sample_with_var_gpus`` that sets ``num_gpus`` as a ``gen_specs`` output field corresponding to each generated simulation input. + + The special generator output field "num_gpus" is automatically picked up by each worker + and will be used when the simulation is run, unless overridden. .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu_var_resources/run_libe_forces.py :language: python :linenos: + +Also see the :doc:`Forces GPU tutorial <../../tutorials/forces_gpu_tutorial>` and the +video_ demonstration on Frontier_. + +.. _video: https://www.youtube.com/watch?v=H2fmbZ6DnVc +.. _Frontier: https://docs.olcf.ornl.gov/systems/frontier_user_guide.html diff --git a/libensemble/tests/scaling_tests/forces/forces_multi_app/forces_simf.py b/libensemble/tests/scaling_tests/forces/forces_multi_app/forces_simf.py index bebc748172..3fbe03f2da 100644 --- a/libensemble/tests/scaling_tests/forces/forces_multi_app/forces_simf.py +++ b/libensemble/tests/scaling_tests/forces/forces_multi_app/forces_simf.py @@ -8,9 +8,8 @@ def run_forces(H, persis_info, sim_specs, libE_info): - """Launches the forces MPI app and auto-assigns ranks and GPU resources. - - Assigns one MPI rank to each GPU assigned to the worker. + """Launches the either the CPU-only or GPU version of the forces MPI app + and auto-assigns ranks and GPU resources as requested by the generator. """ calc_status = 0 From cf63cf88cd899ccc1004f6bc333e447737c05f03 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 16:48:04 -0600 Subject: [PATCH 085/215] Make Ax>=0.5.0 required --- docs/examples/ax_multitask.rst | 10 +++-- install/gen_deps_environment.yml | 2 +- .../gen_funcs/persistent_ax_multitask.py | 42 ++++++++++--------- pyproject.toml | 2 +- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/docs/examples/ax_multitask.rst b/docs/examples/ax_multitask.rst index e1133866d9..e3984f39a9 100644 --- a/docs/examples/ax_multitask.rst +++ b/docs/examples/ax_multitask.rst @@ -1,16 +1,18 @@ persistent_ax_multitask ----------------------- -Required: Ax_ version <=0.4.0 +Required: `ax-platform`_>=0.5.0 + +Example usage: gp_multitask_ax_ To install:: - pip install "ax-platform<=0.4.0" + pip install ax-platform An example of the Ax multitask GP. .. automodule:: persistent_ax_multitask :members: - :no-undoc-members: -.. _Ax: https://github.com/facebook/Ax +.. _`ax-platform`: https://github.com/facebook/Ax +.. _gp_multitask_ax: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py diff --git a/install/gen_deps_environment.yml b/install/gen_deps_environment.yml index 190c5ffd09..0d3b47aa25 100644 --- a/install/gen_deps_environment.yml +++ b/install/gen_deps_environment.yml @@ -12,4 +12,4 @@ dependencies: - mumps-mpi - DFO-LS - mpmath - - ax-platform + - ax-platform>=0.5.0 diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 0f5df7e303..397cd184a0 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -8,6 +8,8 @@ This `gen_f` is meant to be used with the `alloc_f` function `only_persistent_gens` +Requires: Ax>=0.5.0 + Ax notes: Each arm = a set of simulation inputs (a sim_id) Each trial = a batch of simulations. @@ -36,7 +38,13 @@ from ax.core.optimization_config import OptimizationConfig from ax.core.parameter import ParameterType, RangeParameter from ax.core.search_space import SearchSpace -from ax.exceptions.core import AxParameterWarning + +# Necessary for docs rendering (as Ax is mocked) +try: + from ax.exceptions.core import AxParameterWarning +except ImportError: + AxParameterWarning = Warning + from ax.modelbridge.factory import get_sobol from ax.modelbridge.registry import Models, ST_MTGP_trans from ax.modelbridge.torch import TorchModelBridge @@ -47,25 +55,12 @@ from ax.storage.runner_registry import register_runner from ax.utils.common.result import Ok -try: - # For Ax >= 0.5.0 - from ax.modelbridge.transforms.derelativize import Derelativize - from ax.modelbridge.transforms.convert_metric_names import ConvertMetricNames - from ax.modelbridge.transforms.trial_as_task import TrialAsTask - from ax.modelbridge.transforms.stratified_standardize_y import StratifiedStandardizeY - from ax.modelbridge.transforms.task_encode import TaskChoiceToIntTaskChoice - from ax.modelbridge.registry import MBM_X_trans - MT_MTGP_trans = MBM_X_trans + [ - Derelativize, - ConvertMetricNames, - TrialAsTask, - StratifiedStandardizeY, - TaskChoiceToIntTaskChoice, - ] - -except ImportError: - # For Ax < 0.5.0 - from ax.modelbridge.registry import MT_MTGP_trans +from ax.modelbridge.transforms.derelativize import Derelativize +from ax.modelbridge.transforms.convert_metric_names import ConvertMetricNames +from ax.modelbridge.transforms.trial_as_task import TrialAsTask +from ax.modelbridge.transforms.stratified_standardize_y import StratifiedStandardizeY +from ax.modelbridge.transforms.task_encode import TaskChoiceToIntTaskChoice +from ax.modelbridge.registry import MBM_X_trans from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG from libensemble.tools.persistent_support import PersistentSupport @@ -84,6 +79,13 @@ category=AxParameterWarning, ) +MT_MTGP_trans = list(MBM_X_trans) + [ + Derelativize, + ConvertMetricNames, + TrialAsTask, + StratifiedStandardizeY, + TaskChoiceToIntTaskChoice, +] # get_MTGP based on https://ax.dev/docs/tutorials/multi_task/ def get_MTGP( diff --git a/pyproject.toml b/pyproject.toml index 88107459e4..f6b1d10250 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,7 +80,7 @@ pre-commit = ">=4.0.1,<5" nlopt = ">=2.9.0,<3" scipy = ">=1.14.1,<2" enchant = ">=2.8.2,<3" # required for sphinxcontrib-spelling -ax-platform = "<=0.4.0" +ax-platform = ">=0.5.0" [tool.pixi.dependencies] python = ">=3.10,<3.14" From 904c06e6419f7b845ac3b8545afeae64acd605f1 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 16:50:09 -0600 Subject: [PATCH 086/215] Prevent failure to build docs from Ax warning --- docs/conf.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 53fa3a35df..8d0fe72792 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -47,6 +47,13 @@ def __getattr__(cls, name): sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) +class AxParameterWarning(Warning): # Ensure it's a real warning subclass + pass + +# Fix only `AxParameterWarning` while keeping `ax` mocked +sys.modules["ax.exceptions.core"] = MagicMock() +sys.modules["ax.exceptions.core"].AxParameterWarning = AxParameterWarning + # from libensemble import * # from libensemble.alloc_funcs import * # from libensemble.gen_funcs import * From 41c0b53efed64377689368be25d5e17a7a19644b Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 17:30:12 -0600 Subject: [PATCH 087/215] Minor fixes for docs --- docs/examples/aposmm.rst | 2 + docs/examples/gen_funcs.rst | 2 - .../sim_funcs/noisy_vector_mapping.rst | 4 +- docs/examples/sim_funcs/rosenbrock.rst | 5 +- .../sim_funcs/surmise_test_function.rst | 3 +- libensemble/sim_funcs/rosenbrock.py | 53 +++++++++++++++---- libensemble/sim_funcs/var_resources.py | 3 +- 7 files changed, 52 insertions(+), 20 deletions(-) diff --git a/docs/examples/aposmm.rst b/docs/examples/aposmm.rst index 4ca355668b..f5a7a2f11c 100644 --- a/docs/examples/aposmm.rst +++ b/docs/examples/aposmm.rst @@ -65,3 +65,5 @@ LocalOptInterfacer .. _nlopt: https://nlopt.readthedocs.io/en/latest/ .. _petsc4py: https://bitbucket.org/petsc/petsc4py .. _SciPy: https://pypi.org/project/scipy +.. _PETSc/TAO: http://www.mcs.anl.gov/petsc +.. _scipy.optimize: https://docs.scipy.org/doc/scipy/reference/optimize.html diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 9452bf306d..0165188c31 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -127,8 +127,6 @@ Modeling and Approximation .. _IPAC manuscript: https://doi.org/10.18429/JACoW-ICAP2018-SAPAF03 .. _NLopt: https://nlopt.readthedocs.io/en/latest/ .. _OPAL: http://amas.web.psi.ch/docs/opal/opal_user_guide-1.6.0.pdf -.. _PETSc/TAO: http://www.mcs.anl.gov/petsc -.. _scipy.optimize: https://docs.scipy.org/doc/scipy/reference/optimize.html .. _Surmise: https://surmise.readthedocs.io/en/latest/index.html .. _Tasmanian: https://github.com/ORNL/Tasmanian .. _user guide: https://libensemble.readthedocs.io/en/latest/programming_libE.html diff --git a/docs/examples/sim_funcs/noisy_vector_mapping.rst b/docs/examples/sim_funcs/noisy_vector_mapping.rst index e0a10709ed..4b0eab8878 100644 --- a/docs/examples/sim_funcs/noisy_vector_mapping.rst +++ b/docs/examples/sim_funcs/noisy_vector_mapping.rst @@ -1,5 +1,6 @@ noisy_vector_mapping --------------- +-------------------- + .. role:: underline :class: underline @@ -8,7 +9,6 @@ noisy_vector_mapping :undoc-members: .. dropdown:: :underline:`noisy_vector_mapping.py` - .. literalinclude:: ../../../libensemble/sim_funcs/noisy_vector_mapping.py :language: python diff --git a/docs/examples/sim_funcs/rosenbrock.rst b/docs/examples/sim_funcs/rosenbrock.rst index b790723488..4709215a1f 100644 --- a/docs/examples/sim_funcs/rosenbrock.rst +++ b/docs/examples/sim_funcs/rosenbrock.rst @@ -1,15 +1,14 @@ rosenbrock --------------- +---------- + .. role:: underline :class: underline .. automodule:: rosenbrock :members: - :undoc-members: .. dropdown:: :underline:`rosenbrock.py` - .. literalinclude:: ../../../libensemble/sim_funcs/rosenbrock.py :language: python :linenos: diff --git a/docs/examples/sim_funcs/surmise_test_function.rst b/docs/examples/sim_funcs/surmise_test_function.rst index a7bacd8b8f..48674fdeaa 100644 --- a/docs/examples/sim_funcs/surmise_test_function.rst +++ b/docs/examples/sim_funcs/surmise_test_function.rst @@ -1,5 +1,6 @@ surmise_test_function --------------- +--------------------- + .. role:: underline :class: underline diff --git a/libensemble/sim_funcs/rosenbrock.py b/libensemble/sim_funcs/rosenbrock.py index 29da3e60b0..67c4e0ba35 100644 --- a/libensemble/sim_funcs/rosenbrock.py +++ b/libensemble/sim_funcs/rosenbrock.py @@ -1,10 +1,12 @@ -""" Sim function for Rosenbrock function. We include a @const input to the - gradient, and not the function evaluation, to scale down the gradient - so the Lipschitz and smoothness term is reduced. +""" +Sim function for Rosenbrock function. We include a @const input to the +gradient, and not the function evaluation, to scale down the gradient +so the Lipschitz and smoothness term is reduced. """ import numpy as np +__all__ = ["rosenbrock_eval"] def EvaluateFunction(x, component=None): """ @@ -12,10 +14,15 @@ def EvaluateFunction(x, component=None): Parameters ---------- - x : np.ndarray - - input vector - component : int - - index + x : :class:`numpy.ndarray` + Input vector + component : int, optional + Index of the function component + + Returns + ------- + float + Evaluated function value """ assert len(x) % 2 == 0, "Length of input vector must be even" @@ -42,12 +49,17 @@ def EvaluateJacobian(x, component, const): Parameters ---------- - x : np.ndarray - - input vector + x : :class:`numpy.ndarray` + Input vector component : int - - index + Index of the function component const : float - - term to scale gradient by + Term to scale gradient by + + Returns + ------- + :class:`numpy.ndarray` + Jacobian of the function """ assert len(x) % 2 == 0, print("must be even lengthed input vector") @@ -71,6 +83,25 @@ def EvaluateJacobian(x, component, const): def rosenbrock_eval(H, persis_info, sim_specs, _): + """ + Evaluates the Rosenbrock function and its gradient + + Parameters + ---------- + H : dict + Dictionary containing input points + persis_info : dict + Persistent state information + sim_specs : dict + Simulation specifications + + Returns + ------- + tuple + - :class:`numpy.ndarray` - Evaluated function values + - dict - Updated `persis_info` + """ + if "params" in persis_info: const = persis_info["params"].get("const", 1000) else: diff --git a/libensemble/sim_funcs/var_resources.py b/libensemble/sim_funcs/var_resources.py index e3a9ad1175..65f91c18bd 100644 --- a/libensemble/sim_funcs/var_resources.py +++ b/libensemble/sim_funcs/var_resources.py @@ -80,7 +80,8 @@ def gpu_variable_resources(H, persis_info, sim_specs, libE_info): @input_fields(["x"]) @output_data([("f", float)]) def gpu_variable_resources_from_gen(H, persis_info, sim_specs, libE_info): - """Launches an app and assigns CPU and GPU resources as defined by the gen. + """ + Launches an app and assigns CPU and GPU resources as defined by the gen. Otherwise similar to gpu_variable_resources. """ From 43f927afe3e35111e4f66c0465c297e1c20b7dbf Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 17:37:31 -0600 Subject: [PATCH 088/215] Mock pyre_extensions --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index 8d0fe72792..3c21596c2b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,6 +42,7 @@ def __getattr__(cls, name): "PETSc", "petsc4py", "psutil", + "pyre_extensions", "Tasmanian", ] From d2061c430624f9d881a483454055d125bcafd2b6 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 17:41:37 -0600 Subject: [PATCH 089/215] Mock torch --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index 3c21596c2b..12c5b58ee0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -44,6 +44,7 @@ def __getattr__(cls, name): "psutil", "pyre_extensions", "Tasmanian", + "torch", ] sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) From c1e3d69bbfeabef594bb2b70298b1990a6f77096 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Feb 2025 18:18:47 -0600 Subject: [PATCH 090/215] Update forces calling script example --- docs/examples/calling_scripts.rst | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/examples/calling_scripts.rst b/docs/examples/calling_scripts.rst index 64401a5663..183128b6ed 100644 --- a/docs/examples/calling_scripts.rst +++ b/docs/examples/calling_scripts.rst @@ -27,17 +27,22 @@ Electrostatic Forces with Executor These examples are from a test for evaluating the scaling capabilities of libEnsemble by calculating particle electrostatic forces through a user application. This -application is registered with either the MPI or Balsam Executor, then submitted -for execution in the ``sim_f``. Note the use of the ``parse_args()`` and -``save_libE_output()`` convenience functions from the :doc:`tools<../utilities>` module -in the first calling script. +application is registered with the MPIExecutor, then submitted +for execution in the ``sim_f``. Note the use of the ``parse_args=True`` which allows +reading arguments such as the number of workers from the command line. Traditional Version ~~~~~~~~~~~~~~~~~~~ -.. literalinclude:: ../../libensemble/tests/scaling_tests/forces/forces_adv/run_libe_forces.py +Run using five workers with:: + + python run_libe_forces.py -n 5 + +One worker runs a persistent generator and the other four run the forces simulations. + +.. literalinclude:: ../../libensemble/tests/scaling_tests/forces/forces_simple/run_libe_forces.py :language: python - :caption: tests/scaling_tests/forces/forces_adv/run_libe_forces.py + :caption: tests/scaling_tests/forces/forces_simple/run_libe_forces.py :linenos: Object + yaml Version From 38c90fdf00fdd52ed9878bc374a9ca3c59606ab9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 20:19:22 +0000 Subject: [PATCH 091/215] Bump crate-ci/typos from 1.29.7 to 1.29.9 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.29.7 to 1.29.9. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.29.7...v1.29.9) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 0f657f1a35..98f4cef102 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.7 + - uses: crate-ci/typos@v1.29.9 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index abf9f0a27f..d7bbb170d7 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -180,4 +180,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.7 + - uses: crate-ci/typos@v1.29.9 From 8df89d4f715df1e5043593f563773546d8161d71 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 25 Feb 2025 11:19:16 -0600 Subject: [PATCH 092/215] Stop # noqa appearing in docs --- docs/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 12c5b58ee0..b0d0c95fe2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -225,9 +225,13 @@ class AxParameterWarning(Warning): # Ensure it's a real warning subclass html_static_path = ["_static"] # html_static_path = [] +def remove_noqa(app, what, name, obj, options, lines): + for i, line in enumerate(lines): + lines[i] = line.replace("# noqa", "").strip() def setup(app): app.add_css_file("my_theme.css") + app.connect("autodoc-process-docstring", remove_noqa) # Custom sidebar templates, must be a dictionary that maps document names From f171db8658740f658f39352c7545f852092e8459 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 25 Feb 2025 11:23:45 -0600 Subject: [PATCH 093/215] Highlight start_only_persistent --- docs/examples/alloc_funcs.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/examples/alloc_funcs.rst b/docs/examples/alloc_funcs.rst index f9259d27aa..b32218c46d 100644 --- a/docs/examples/alloc_funcs.rst +++ b/docs/examples/alloc_funcs.rst @@ -5,11 +5,15 @@ Allocation Functions Below are example allocation functions available in libEnsemble. +Many users use these unmodified. + .. IMPORTANT:: See the API for allocation functions :ref:`here`. .. note:: - The default allocation function is ``give_sim_work_first``. + The default allocation function (for non-persistent generators) is :ref:`give_sim_work_first`. + + The most commonly used (for persistent generators) is :ref:`start_only_persistent`. .. role:: underline :class: underline From 3661ea4f483b625c8cf0e3203b1a958f4ca08124 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 25 Feb 2025 11:35:13 -0600 Subject: [PATCH 094/215] Add alloc funcs in examples --- docs/examples/alloc_funcs.rst | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/examples/alloc_funcs.rst b/docs/examples/alloc_funcs.rst index b32218c46d..f54f4bf3c4 100644 --- a/docs/examples/alloc_funcs.rst +++ b/docs/examples/alloc_funcs.rst @@ -63,3 +63,39 @@ start_persistent_local_opt_gens .. automodule:: start_persistent_local_opt_gens :members: :undoc-members: + +fast_alloc_and_pausing +---------------------- +.. automodule:: fast_alloc_and_pausing + :members: + :undoc-members: + +only_one_gen_alloc +------------------ +.. automodule:: only_one_gen_alloc + :members: + :undoc-members: + +start_fd_persistent +------------------- +.. automodule:: start_fd_persistent + :members: + :undoc-members: + +persistent_aposmm_alloc +----------------------- +.. automodule:: persistent_aposmm_alloc + :members: + :undoc-members: + +give_pregenerated_work +---------------------- +.. automodule:: give_pregenerated_work + :members: + :undoc-members: + +inverse_bayes_allocf +-------------------- +.. automodule:: inverse_bayes_allocf + :members: + :undoc-members: From 04d35b6d482978e94f6146a4e29e7df1dd8a9161 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 25 Feb 2025 11:37:41 -0600 Subject: [PATCH 095/215] alloc docstring fixes --- libensemble/alloc_funcs/give_sim_work_first.py | 2 +- libensemble/alloc_funcs/start_only_persistent.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libensemble/alloc_funcs/give_sim_work_first.py b/libensemble/alloc_funcs/give_sim_work_first.py index 1e528917b6..f001006f3a 100644 --- a/libensemble/alloc_funcs/give_sim_work_first.py +++ b/libensemble/alloc_funcs/give_sim_work_first.py @@ -26,7 +26,7 @@ def give_sim_work_first( work is given out unless all entries in ``H`` are returned. Can give points in highest priority, if ``"priority"`` is a field in ``H``. - If alloc_specs["user"]["give_all_with_same_priority"] is set to True, then + If ``alloc_specs["user"]["give_all_with_same_priority"]`` is set to True, then all points with the same priority value are given as a batch to the sim. Workers performing sims will be assigned resources given in H["resource_sets"] diff --git a/libensemble/alloc_funcs/start_only_persistent.py b/libensemble/alloc_funcs/start_only_persistent.py index 101a90f516..606f3caf11 100644 --- a/libensemble/alloc_funcs/start_only_persistent.py +++ b/libensemble/alloc_funcs/start_only_persistent.py @@ -25,20 +25,24 @@ def only_persistent_gens(W, H, sim_specs, gen_specs, alloc_specs, persis_info, l To be provided in calling script: E.g., ``alloc_specs["user"]["async_return"] = True`` - init_sample_size: int, optional + ``init_sample_size``: int, optional Initial sample size - always return in batch. Default: 0 - num_active_gens: int, optional + ``num_active_gens``: int, optional Maximum number of persistent generators to start. Default: 1 - async_return: Boolean, optional + ``async_return``: Boolean, optional Return results to gen as they come in (after sample). Default: False (batch return). - active_recv_gen: Boolean, optional + ``active_recv_gen``: Boolean, optional Create gen in active receive mode. If True, the manager does not need to wait for a return from the generator before sending further returned points. Default: False + ``give_all_with_same_priority``: Boolean, optional + If True, then all points with the same priority value are given as a batch to the sim. + Default is False + tags: alloc, batch, async, persistent, priority .. seealso:: From da5dc59dbc77aee6f3c2cc8f3c4773d6037440c2 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 25 Feb 2025 11:41:23 -0600 Subject: [PATCH 096/215] Formatting fix --- libensemble/alloc_funcs/start_only_persistent.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libensemble/alloc_funcs/start_only_persistent.py b/libensemble/alloc_funcs/start_only_persistent.py index 606f3caf11..f272173d49 100644 --- a/libensemble/alloc_funcs/start_only_persistent.py +++ b/libensemble/alloc_funcs/start_only_persistent.py @@ -25,21 +25,21 @@ def only_persistent_gens(W, H, sim_specs, gen_specs, alloc_specs, persis_info, l To be provided in calling script: E.g., ``alloc_specs["user"]["async_return"] = True`` - ``init_sample_size``: int, optional + ``init_sample_size`` Int, optional. Initial sample size - always return in batch. Default: 0 - ``num_active_gens``: int, optional + ``num_active_gens`` Int, optional. Maximum number of persistent generators to start. Default: 1 - ``async_return``: Boolean, optional + ``async_return`` Boolean, optional. Return results to gen as they come in (after sample). Default: False (batch return). - ``active_recv_gen``: Boolean, optional + ``active_recv_gen`` Boolean, optional. Create gen in active receive mode. If True, the manager does not need to wait for a return from the generator before sending further returned points. Default: False - ``give_all_with_same_priority``: Boolean, optional + ``give_all_with_same_priority`` Boolean, optional. If True, then all points with the same priority value are given as a batch to the sim. Default is False From 93f08462b13aa522d6f96f2813d81c18ffe1ed07 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 26 Feb 2025 10:05:43 -0600 Subject: [PATCH 097/215] Formatting fixes --- .../gen_funcs/persistent_ax_multitask.py | 1 + libensemble/sim_funcs/rosenbrock.py | 1 + scripts/aposmm_min_loc.py | 26 +++++++++---------- scripts/aposmm_plot_local_runs.py | 24 ++++++++--------- 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 397cd184a0..270f59e8db 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -87,6 +87,7 @@ TaskChoiceToIntTaskChoice, ] + # get_MTGP based on https://ax.dev/docs/tutorials/multi_task/ def get_MTGP( experiment: Experiment, diff --git a/libensemble/sim_funcs/rosenbrock.py b/libensemble/sim_funcs/rosenbrock.py index 67c4e0ba35..7925e0a2ba 100644 --- a/libensemble/sim_funcs/rosenbrock.py +++ b/libensemble/sim_funcs/rosenbrock.py @@ -8,6 +8,7 @@ __all__ = ["rosenbrock_eval"] + def EvaluateFunction(x, component=None): """ Evaluates the chained Rosenbrock function diff --git a/scripts/aposmm_min_loc.py b/scripts/aposmm_min_loc.py index cc6b1eba62..2251b5cb58 100644 --- a/scripts/aposmm_min_loc.py +++ b/scripts/aposmm_min_loc.py @@ -19,9 +19,9 @@ N = 6 # number of opt runs to show. -x_name = 'x0' -y_name = 'x1' -z_name = 'x2' +x_name = "x0" +y_name = "x1" +z_name = "x2" full_bounds = False # For entire input space enter bounds below @@ -35,7 +35,7 @@ # Find the most recent .npy and pickle files try: H_file = max(glob.glob("*.npy"), key=os.path.getmtime) - persis_info_file = max(glob.iglob('*.pickle'), key=os.path.getctime) + persis_info_file = max(glob.iglob("*.pickle"), key=os.path.getctime) except Exception: sys.exit("Need a *.npy and a *.pickle files in run dir. Exiting...") @@ -45,30 +45,30 @@ index_sets = pickle.load(f)["run_order"] # Filter best N opt runs for clearer graph -trimmed_index_sets = {key: indices[:-1] for key, indices in index_sets.items()} -min_f_per_set = [(key, indices, H['f'][indices].min()) for key, indices in trimmed_index_sets.items() if len(indices) > 0] +trim_sets = {key: indices[:-1] for key, indices in index_sets.items()} +min_f_per_set = [(key, indices, H["f"][indices].min()) for key, indices in trim_sets.items() if len(indices) > 0] min_f_per_set_sorted = sorted(min_f_per_set, key=lambda x: x[2])[:N] # Plotting fig = plt.figure(figsize=(6, 6)) -ax = fig.add_subplot(111, projection='3d') +ax = fig.add_subplot(111, projection="3d") for key, indices, _ in min_f_per_set_sorted: - min_f_index = indices[np.argmin(H['f'][indices])] + min_f_index = indices[np.argmin(H["f"][indices])] # Extract the corresponding 3D x position from H try: - x, y, z = H['x'][min_f_index] + x, y, z = H["x"][min_f_index] except ValueError: x = H[x_name][min_f_index] y = H[y_name][min_f_index] z = H[z_name][min_f_index] # Plot the 3D point - ax.scatter(x, y, z, marker='o', s=50, label=f'Opt run {key}') + ax.scatter(x, y, z, marker="o", s=50, label=f"Opt run {key}") # Draw a line from the point to the XY plane (z=0) - ax.plot([x, x], [y, y], [0, z], color='grey', linestyle='--') + ax.plot([x, x], [y, y], [0, z], color="grey", linestyle="--") if full_bounds: ax.set_xlim(x0_min, x0_max) @@ -79,6 +79,6 @@ ax.set_xlabel(x_name) ax.set_ylabel(y_name) ax.set_zlabel(z_name) -ax.set_title('Locations of best points from each optimization run') -ax.legend(bbox_to_anchor=(-0.1, 0.9), loc='upper left', borderaxespad=0) +ax.set_title("Locations of best points from each optimization run") +ax.legend(bbox_to_anchor=(-0.1, 0.9), loc="upper left", borderaxespad=0) plt.savefig(f"location_min_best{N}.png") diff --git a/scripts/aposmm_plot_local_runs.py b/scripts/aposmm_plot_local_runs.py index f94ecb13aa..e6a61e814e 100755 --- a/scripts/aposmm_plot_local_runs.py +++ b/scripts/aposmm_plot_local_runs.py @@ -21,7 +21,7 @@ # Find the most recent .npy and pickle files try: H_file = max(glob.glob("*.npy"), key=os.path.getmtime) - persis_info_file = max(glob.iglob('*.pickle'), key=os.path.getctime) + persis_info_file = max(glob.iglob("*.pickle"), key=os.path.getctime) except Exception: sys.exit("Need a *.npy and a *.pickle files in run dir. Exiting...") @@ -31,38 +31,38 @@ index_sets = pickle.load(f)["run_order"] # Filter best N opt runs for clearer graph -trimmed_index_sets = {key: indices[:-1] for key, indices in index_sets.items()} -min_f_per_set = [(key, indices, H['f'][indices].min()) for key, indices in trimmed_index_sets.items() if len(indices) > 0] +trim_sets = {key: indices[:-1] for key, indices in index_sets.items()} +min_f_per_set = [(key, indices, H["f"][indices].min()) for key, indices in trim_sets.items() if len(indices) > 0] min_f_per_set_sorted = sorted(min_f_per_set, key=lambda x: x[2])[:N] # Plotting plt.figure(figsize=(10, 6)) -plt.scatter(range(len(H['f'])), H['f'], color='lightgrey', label='Other points', zorder=1) +plt.scatter(range(len(H["f"])), H["f"], color="lightgrey", label="Other points", zorder=1) num_runs = len(index_sets) # for key, indices in index_sets.items(): for key, indices, _ in min_f_per_set_sorted: # Extract the 'f' values for each index set - f_values = H['f'][indices] + f_values = H["f"][indices] - ratio = (f_values[-1] - f_values[-2])/ f_values[-2] + ratio = (f_values[-1] - f_values[-2]) / f_values[-2] # print(f"Tolerance of the last two values for {key}: {ratio}") - plt.plot(indices, f_values, marker='o', label=f'Opt run {key}', zorder=2) + plt.plot(indices, f_values, marker="o", label=f"Opt run {key}", zorder=2) # Identify the index and value of the minimum f min_index = indices[np.argmin(f_values)] min_f_value = np.min(f_values) # Mark the minimum f value with a distinct marker - plt.scatter(min_index, min_f_value, color='red', edgecolor='black', s=50, zorder=3) + plt.scatter(min_index, min_f_value, color="red", edgecolor="black", s=50, zorder=3) # Add a dummy point to the legend for "minima of opt run" -plt.scatter([], [], color='red', edgecolor='black', s=50, label='Best value of opt run') +plt.scatter([], [], color="red", edgecolor="black", s=50, label="Best value of opt run") -plt.xlabel('Simulation ID') -plt.ylabel('Objective value') -plt.title(f'Objective values by Optimization runs. Best {N} runs from {num_runs}') +plt.xlabel("Simulation ID") +plt.ylabel("Objective value") +plt.title(f"Objective values by Optimization runs. Best {N} runs from {num_runs}") plt.legend() plt.grid(True) plt.savefig(f"opt_runs_best{N}.png") From 23a16d079d1a1a3b80e5160b488b664bf12cd9b2 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 26 Feb 2025 10:43:50 -0600 Subject: [PATCH 098/215] restore many guides, uses of Summit. Mention that its decomissioned. --- docs/advanced_installation.rst | 10 ++ docs/known_issues.rst | 2 + docs/nitpicky | 2 +- docs/platforms/example_scripts.rst | 6 ++ docs/platforms/platforms_index.rst | 26 ++++- docs/platforms/summit.rst | 158 +++++++++++++++++++++++++++++ docs/running_libE.rst | 7 ++ libensemble/resources/platforms.py | 12 +++ 8 files changed, 220 insertions(+), 3 deletions(-) create mode 100644 docs/platforms/summit.rst diff --git a/docs/advanced_installation.rst b/docs/advanced_installation.rst index f85203f753..4d436eb2cd 100644 --- a/docs/advanced_installation.rst +++ b/docs/advanced_installation.rst @@ -49,6 +49,10 @@ Further recommendations for selected HPC systems are given in the MPICC=mpiicc pip install mpi4py --no-binary mpi4py + On Summit, the following line is recommended (with gcc compilers):: + + CC=mpicc MPICC=mpicc pip install mpi4py --no-binary mpi4py + .. tab-item:: conda Install libEnsemble with Conda_ from the conda-forge channel:: @@ -112,6 +116,12 @@ Further recommendations for selected HPC systems are given in the spack info py-libensemble + On some platforms you may wish to run libEnsemble without ``mpi4py``, + using a serial PETSc build. This is often preferable if running on + the launch nodes of a three-tier system (e.g., Summit):: + + spack install py-libensemble +scipy +mpmath +petsc4py ^py-petsc4py~mpi ^petsc~mpi~hdf5~hypre~superlu-dist + The installation will create modules for libEnsemble and the dependent packages. These can be loaded by running:: diff --git a/docs/known_issues.rst b/docs/known_issues.rst index cb069e945a..3910ad210c 100644 --- a/docs/known_issues.rst +++ b/docs/known_issues.rst @@ -19,6 +19,8 @@ may occur when using libEnsemble. * Local comms mode (multiprocessing) may fail if MPI is initialized before forking processors. This is thought to be responsible for issues combining multiprocessing with PETSc on some platforms. +* Remote detection of logical cores via ``LSB_HOSTS`` (e.g., Summit) returns the + number of physical cores as SMT info not available. * TCP mode does not support (1) more than one libEnsemble call in a given script or (2) the auto-resources option to the Executor. diff --git a/docs/nitpicky b/docs/nitpicky index 771c1d0da3..8a0eafad2f 100644 --- a/docs/nitpicky +++ b/docs/nitpicky @@ -46,7 +46,7 @@ py:class libensemble.resources.platforms.Perlmutter py:class libensemble.resources.platforms.PerlmutterCPU py:class libensemble.resources.platforms.PerlmutterGPU py:class libensemble.resources.platforms.Polaris -py:class libensemble.resources.platforms.Sunspot +py:class libensemble.resources.platforms.Summit py:class libensemble.resources.rset_resources.RSetResources py:class libensemble.resources.env_resources.EnvResources py:class libensemble.resources.resources.Resources diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 83b2ff1b05..87365b3fa6 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -28,3 +28,9 @@ information about the respective systems and configuration. .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh :caption: /examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh :language: bash + +.. dropdown:: Summit (Decomissioned) - On Launch Nodes with Multiprocessing + + .. literalinclude:: ../../examples/libE_submission_scripts/summit_submit_mproc.sh + :caption: /examples/libE_submission_scripts/summit_submit_mproc.sh + :language: bash diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index b091f09504..814b3e986f 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -80,6 +80,26 @@ per worker, and adding the manager onto the first node. HPC systems that only allow one application to be launched to a node at any one time, will not allow a distributed configuration. +Systems with Launch/MOM Nodes +----------------------------- + +Some large systems have a 3-tier node setup. That is, they have a separate set of launch nodes +(known as MOM nodes on Cray Systems). User batch jobs or interactive sessions run on a launch node. +Most such systems supply a special MPI runner that has some application-level scheduling +capability (e.g., ``aprun``, ``jsrun``). MPI applications can only be submitted from these nodes. Examples +of these systems include Summit and Sierra. + +There are two ways of running libEnsemble on these kinds of systems. The first, and simplest, +is to run libEnsemble on the launch nodes. This is often sufficient if the worker's simulation +or generation functions are not doing much work (other than launching applications). This approach +is inherently centralized. The entire node allocation is available for the worker-launched +tasks. + +However, running libEnsemble on the compute nodes is potentially more scalable and +will better manage simulation and generation functions that contain considerable +computational work or I/O. Therefore the second option is to use proxy task-execution +services like Balsam_. + Balsam - Externally Managed Applications ---------------------------------------- @@ -190,11 +210,13 @@ libEnsemble on specific HPC systems. :titlesonly: aurora + bebop frontier + improv perlmutter polaris - bebop - improv + spock_crusher + summit srun example_scripts diff --git a/docs/platforms/summit.rst b/docs/platforms/summit.rst new file mode 100644 index 0000000000..2c9318fec8 --- /dev/null +++ b/docs/platforms/summit.rst @@ -0,0 +1,158 @@ +====================== +Summit (Decomissioned) +====================== + +Summit_ was an IBM AC922 system located at the Oak Ridge Leadership Computing +Facility (OLCF). Each of the approximately 4,600 compute nodes on Summit contained two +IBM POWER9 processors and six NVIDIA Volta V100 accelerators. + +Summit featured three tiers of nodes: login, launch, and compute nodes. + +Users on login nodes submit batch runs to the launch nodes. +Batch scripts and interactive sessions run on the launch nodes. Only the launch +nodes can submit MPI runs to the compute nodes via ``jsrun``. + +These docs are maintained to guide libEnsemble's usage on three-tier systems similar to Summit. + +Special note on resource sets and Executor submit options +--------------------------------------------------------- + +When using the portable MPI run configuration options (e.g., num_nodes) to the +:doc:`MPIExecutor<../executor/mpi_executor>` ``submit`` function, it is important +to note that, due to the `resource sets`_ used on Summit, the options refer to +resource sets as follows: + +- num_procs (int, optional) – The total number resource sets for this run. + +- num_nodes (int, optional) – The number of nodes on which to submit the run. + +- procs_per_node (int, optional) – The number of resource sets per node. + +It is recommended that the user defines a resource set as the minimal configuration +of CPU cores/processes and GPUs. These can be added to the ``extra_args`` option +of the *submit* function. Alternatively, the portable options can be ignored and +everything expressed in ``extra_args``. + +For example, the following *jsrun* line would run three resource sets, +each having one core (with one process), and one GPU, along with some extra options:: + + jsrun -n 3 -a 1 -g 1 -c 1 --bind=packed:1 --smpiargs="-gpu" + +To express this line in the ``submit`` function may look +something like the following:: + + exctr = Executor.executor + task = exctr.submit(app_name="mycode", + num_procs=3, + extra_args="-a 1 -g 1 -c 1 --bind=packed:1 --smpiargs="-gpu"" + app_args="-i input") + +This would be equivalent to:: + + exctr = Executor.executor + task = exctr.submit(app_name="mycode", + extra_args="-n 3 -a 1 -g 1 -c 1 --bind=packed:1 --smpiargs="-gpu"" + app_args="-i input") + +The libEnsemble resource manager works out the resources available to each worker, +but unlike some other systems, ``jsrun`` on Summit dynamically schedules runs to +available slots across and within nodes. It can also queue tasks. This allows variable +size runs to easily be handled on Summit. If oversubscription to the `jsrun` system +is desired, then libEnsemble's resource manager can be disabled in the +calling script via:: + + libE_specs["disable_resource_manager"] = True + +In the above example, the task being submitted used three GPUs, which is half those +available on a Summit node, and thus two such tasks may be allocated to each node +(from different workers), if they were running at the same time. + +Job Submission +-------------- + +Summit used LSF_ for job management and submission. For libEnsemble, the most +important command is ``bsub`` for submitting batch scripts from the login nodes +to execute on the launch nodes. + +It is recommended to run libEnsemble on the launch nodes (assuming workers are +submitting MPI applications) using the ``local`` communications mode (multiprocessing). + +Interactive Runs +^^^^^^^^^^^^^^^^ + +You can run interactively with ``bsub`` by specifying the ``-Is`` flag, +similarly to the following:: + + $ bsub -W 30 -P [project] -nnodes 8 -Is + +This will place you on a launch node. + +.. note:: + You will need to reactivate your conda virtual environment. + +Batch Runs +^^^^^^^^^^ + +Batch scripts specify run settings using ``#BSUB`` statements. The following +simple example depicts configuring and launching libEnsemble to a launch node with +multiprocessing. This script also assumes the user is using the ``parse_args()`` +convenience function from libEnsemble's :doc:`tools module<../utilities>`. + +.. code-block:: bash + + #!/bin/bash -x + #BSUB -P + #BSUB -J libe_mproc + #BSUB -W 60 + #BSUB -nnodes 128 + #BSUB -alloc_flags "smt1" + + # --- Prepare Python --- + + # Load conda module and gcc. + module load python + module load gcc + + # Name of conda environment + export CONDA_ENV_NAME=my_env + + # Activate conda environment + export PYTHONNOUSERSITE=1 + source activate $CONDA_ENV_NAME + + # --- Prepare libEnsemble --- + + # Name of calling script + export EXE=calling_script.py + + # Communication Method + export COMMS="--comms local" + + # Number of workers. + export NWORKERS="--nworkers 128" + + hash -r # Check no commands hashed (pip/python...) + + # Launch libE + python $EXE $COMMS $NWORKERS > out.txt 2>&1 + +With this saved as ``myscript.sh``, allocating, configuring, and queueing +libEnsemble on Summit is achieved by running :: + + $ bsub myscript.sh + +Example submission scripts are also given in the :doc:`examples`. + +Launching User Applications from libEnsemble Workers +---------------------------------------------------- + +Only the launch nodes can submit MPI runs to the compute nodes via ``jsrun``. +This can be accomplished in user simulator functions directly. However, it is highly +recommended that the :doc:`Executor<../executor/ex_index>` interface +be used inside the simulator or generator, because this provides a portable interface +with many advantages including automatic resource detection, portability, +launch failure resilience, and ease of use. + +.. _conda: https://conda.io/en/latest/ +.. _LSF: https://www.olcf.ornl.gov/wp-content/uploads/2018/12/summit_workshop_fuson.pdf +.. _mpi4py: https://mpi4py.readthedocs.io/en/stable/ diff --git a/docs/running_libE.rst b/docs/running_libE.rst index 278352ee04..cb86262526 100644 --- a/docs/running_libE.rst +++ b/docs/running_libE.rst @@ -66,6 +66,10 @@ supercomputers. from app-launches (if running libEnsemble on a compute node), set ``libE_specs["dedicated_mode"] = True``. + This mode can also be used to run on a **launch** node of a three-tier + system (e.g., Summit), ensuring the whole compute-node allocation is available for + launching apps. Make sure there are no imports of ``mpi4py`` in your Python scripts. + Note that on macOS (since Python 3.8) and Windows, the default multiprocessing method is ``"spawn"`` instead of ``"fork"``; to resolve many related issues, we recommend placing calling script code in an ``if __name__ == "__main__":`` block. @@ -100,6 +104,9 @@ supercomputers. (see :doc:`Balsam`). This nesting does work with MPICH_ and its derivative MPI implementations. + It is also unsuitable to use this mode when running on the **launch** nodes of + three-tier systems (e.g., Summit). In that case ``local`` mode is recommended. + .. tab-item:: TCP Comms Run the Manager on one system and launch workers to remote diff --git a/libensemble/resources/platforms.py b/libensemble/resources/platforms.py index 253976e51c..c56060031e 100644 --- a/libensemble/resources/platforms.py +++ b/libensemble/resources/platforms.py @@ -153,6 +153,16 @@ class Frontier(Platform): scheduler_match_slots: bool = False +class Summit(Platform): + mpi_runner: str = "jsrun" + cores_per_node: int = 42 + logical_cores_per_node: int = 168 + gpus_per_node: int = 6 + gpu_setting_type: str = "option_gpus_per_task" + gpu_setting_name: str = "-g" + scheduler_match_slots: bool = False + + # Example of a ROCM system class GenericROCm(Platform): mpi_runner: str = "mpich" @@ -236,6 +246,7 @@ class Known_platforms(BaseModel): perlmutter_c: PerlmutterCPU = PerlmutterCPU() perlmutter_g: PerlmutterGPU = PerlmutterGPU() polaris: Polaris = Polaris() + summit: Summit = Summit() # Dictionary of known systems (or system partitions) detectable by domain name @@ -243,6 +254,7 @@ class Known_platforms(BaseModel): "frontier.olcf.ornl.gov": "frontier", "hostmgmt.cm.aurora.alcf.anl.gov": "aurora", "hsn.cm.polaris.alcf.anl.gov": "polaris", + "summit.olcf.ornl.gov": "summit", # Need to detect gpu count } From a14d045ec8757a67a73835fb8bc803bd5e115c95 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 26 Feb 2025 10:48:13 -0600 Subject: [PATCH 099/215] Update examples intro --- docs/examples/examples_index.rst | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/examples/examples_index.rst b/docs/examples/examples_index.rst index 278c327a2b..1e92e21c03 100644 --- a/docs/examples/examples_index.rst +++ b/docs/examples/examples_index.rst @@ -1,11 +1,18 @@ -Selected Examples -================= +Overview of Examples +==================== -.. include:: ../introduction.rst - :start-after: example_packages - :end-before: libEnsemble has also been used to coordinate many computationally expensive +Here we give example generation, simulation, and allocation functions for +libEnsemble, as well as example calling scripts. -.. include:: ../introduction.rst - :start-after: - WarpX_ Advanced electromagnetic particle-in-cell code. +The examples come from the libEnsemble repository and the `libEnsemble Community Repository`_. + +.. toctree:: + :maxdepth: 2 + :caption: libEnsemble Example Functions: + + gen_funcs + sim_funcs + alloc_funcs + calling_scripts .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples From 55228d9053a2e2e01871ac67b505de67889acd7e Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 26 Feb 2025 10:52:38 -0600 Subject: [PATCH 100/215] typo --- docs/platforms/example_scripts.rst | 2 +- docs/platforms/summit.rst | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 87365b3fa6..285fb4c718 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -29,7 +29,7 @@ information about the respective systems and configuration. :caption: /examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh :language: bash -.. dropdown:: Summit (Decomissioned) - On Launch Nodes with Multiprocessing +.. dropdown:: Summit (Decommissioned) - On Launch Nodes with Multiprocessing .. literalinclude:: ../../examples/libE_submission_scripts/summit_submit_mproc.sh :caption: /examples/libE_submission_scripts/summit_submit_mproc.sh diff --git a/docs/platforms/summit.rst b/docs/platforms/summit.rst index 2c9318fec8..0d9d230ae6 100644 --- a/docs/platforms/summit.rst +++ b/docs/platforms/summit.rst @@ -1,6 +1,6 @@ -====================== -Summit (Decomissioned) -====================== +======================= +Summit (Decommissioned) +======================= Summit_ was an IBM AC922 system located at the Oak Ridge Leadership Computing Facility (OLCF). Each of the approximately 4,600 compute nodes on Summit contained two From 3e97272360ca728de64d6cc447abc8e9747c8a60 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 26 Feb 2025 13:48:00 -0600 Subject: [PATCH 101/215] bump dev dependencies, "fix" noqa strip line --- docs/conf.py | 7 ++++++- pyproject.toml | 27 ++++++++++++++------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index b0d0c95fe2..7686b741f8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,6 +30,7 @@ class Mock(MagicMock): def __getattr__(cls, name): return MagicMock() + autodoc_mock_imports = ["ax", "balsam", "gpcam", "IPython", "matplotlib", "pandas", "scipy", "surmise"] MOCK_MODULES = [ @@ -49,9 +50,11 @@ def __getattr__(cls, name): sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) + class AxParameterWarning(Warning): # Ensure it's a real warning subclass pass + # Fix only `AxParameterWarning` while keeping `ax` mocked sys.modules["ax.exceptions.core"] = MagicMock() sys.modules["ax.exceptions.core"].AxParameterWarning = AxParameterWarning @@ -225,9 +228,11 @@ class AxParameterWarning(Warning): # Ensure it's a real warning subclass html_static_path = ["_static"] # html_static_path = [] + def remove_noqa(app, what, name, obj, options, lines): for i, line in enumerate(lines): - lines[i] = line.replace("# noqa", "").strip() + lines[i] = line.replace("# noqa", "") + def setup(app): app.add_css_file("my_theme.css") diff --git a/pyproject.toml b/pyproject.toml index f6b1d10250..83e34d4eee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,29 +58,30 @@ dev = ["dev"] [tool.pixi.feature.dev.dependencies] mpi = ">=1.0.1,<2" -mpich = ">=4.2.3,<5" -mpi4py = ">=4.0.1,<5" -flake8 = ">=7.1.1,<8" -coverage = ">=7.6.10,<8" +mpich = ">=4.3.0,<5" +mpi4py = ">=4.0.3,<5" +flake8 = ">=7.1.2,<8" +coverage = ">=7.6.12,<8" pytest = ">=8.3.4,<9" pytest-cov = ">=6.0.0,<7" pytest-timeout = ">=2.3.1,<3" mock = ">=5.1.0,<6" python-dateutil = ">=2.9.0.post0,<3" -anyio = ">=4.7.0,<5" -matplotlib = ">=3.9.0,<4" +anyio = ">=4.8.0,<5" +matplotlib = ">=3.10.0,<4" mpmath = ">=1.3.0,<2" rich = ">=13.9.4,<14" -sphinx = ">=8.1.3,<9" +sphinx = ">=8.2.1,<9" sphinxcontrib-bibtex = ">=2.6.3,<3" sphinx-design = ">=0.6.1,<0.7" sphinx_rtd_theme = ">=3.0.1,<4" sphinx-copybutton = ">=0.5.2,<0.6" -pre-commit = ">=4.0.1,<5" -nlopt = ">=2.9.0,<3" -scipy = ">=1.14.1,<2" -enchant = ">=2.8.2,<3" # required for sphinxcontrib-spelling -ax-platform = ">=0.5.0" +pre-commit = ">=4.1.0,<5" +nlopt = ">=2.10.0,<3" +scipy = ">=1.15.2,<2" +ax-platform = ">=0.5.0,<0.6" +sphinxcontrib-spelling = ">=8.0.1,<9" +autodoc-pydantic = ">=2.1.0,<3" [tool.pixi.dependencies] python = ">=3.10,<3.14" @@ -131,4 +132,4 @@ noy = "noy" extend-exclude = ["*.bib", "*.xml", "docs/nitpicky"] [dependency-groups] -dev = ["sphinxcontrib-spelling==8.0.0", "autodoc-pydantic>=2.2.0,<3"] +dev = ["pyenchant", "enchant>=0.0.1,<0.0.2"] From 90ced446ef62266f148553252d2d83a011afc9c7 Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 27 Feb 2025 15:59:16 -0600 Subject: [PATCH 102/215] specify Community Examples repository alongside regression tests for examples in README --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 4975e80ee9..b7dc18e87d 100644 --- a/README.rst +++ b/README.rst @@ -98,7 +98,7 @@ Try some other examples live in Colab. | Optimization example that finds multiple minima. | |Optimization example| | +---------------------------------------------------------------+-------------------------------------+ -There are many more examples in the `regression tests`_. +There are many more examples in the `Community Examples repository`_ and `regression tests`_. Resources ========= From 0e3b27b355c2470e1a98d6cd86638bbf142fdffe Mon Sep 17 00:00:00 2001 From: jlnav Date: Fri, 28 Feb 2025 10:49:27 -0600 Subject: [PATCH 103/215] bump pydantic versions in tests --- .github/workflows/basic.yml | 10 +++++----- .github/workflows/extra.yml | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 98f4cef102..679ab719ff 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -18,28 +18,28 @@ jobs: os: [ubuntu-latest] mpi-version: [mpich] python-version: ["3.10", "3.11", "3.12", "3.13"] - pydantic-version: ["2.8.2"] + pydantic-version: ["2.10.6"] comms-type: [m, l] include: - os: macos-latest python-version: "3.11" mpi-version: mpich - pydantic-version: "2.8.2" + pydantic-version: "2.10.6" comms-type: m - os: macos-latest python-version: "3.11" mpi-version: mpich - pydantic-version: "2.8.2" + pydantic-version: "2.10.6" comms-type: l - os: ubuntu-latest mpi-version: mpich python-version: "3.10" - pydantic-version: "1.10.17" + pydantic-version: "1.10.21" comms-type: m - os: ubuntu-latest mpi-version: mpich python-version: "3.10" - pydantic-version: "1.10.17" + pydantic-version: "1.10.21" comms-type: l env: diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index d7bbb170d7..bf6f36a6c5 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -12,38 +12,38 @@ jobs: os: [ubuntu-latest] mpi-version: [mpich] python-version: ['3.10', '3.11', '3.12', '3.13'] - pydantic-version: ['2.8.2'] + pydantic-version: ['2.10.6'] comms-type: [m, l] include: - os: macos-latest python-version: '3.13' mpi-version: mpich - pydantic-version: '2.8.2' + pydantic-version: '2.10.6' comms-type: m - os: macos-latest python-version: '3.13' mpi-version: mpich - pydantic-version: '2.8.2' + pydantic-version: '2.10.6' comms-type: l - os: ubuntu-latest python-version: '3.12' mpi-version: mpich - pydantic-version: '2.8.2' + pydantic-version: '2.10.6' comms-type: t - os: ubuntu-latest mpi-version: 'openmpi' - pydantic-version: '2.8.2' + pydantic-version: '2.10.6' python-version: '3.12' comms-type: l - os: ubuntu-latest mpi-version: mpich python-version: '3.12' - pydantic-version: '1.10.17' + pydantic-version: '1.10.21' comms-type: m - os: ubuntu-latest mpi-version: mpich python-version: '3.12' - pydantic-version: '1.10.17' + pydantic-version: '1.10.21' comms-type: l env: @@ -111,7 +111,7 @@ jobs: pip install scikit-build packaging - name: Install Balsam on Pydantic 1 - if: matrix.pydantic-version == '1.10.17' + if: matrix.pydantic-version == '1.10.21' run: | conda install pyzmq git clone https://github.com/argonne-lcf/balsam.git @@ -139,18 +139,18 @@ jobs: rm ./libensemble/tests/regression_tests/test_gpCAM.py # needs gpcam, which doesn't build on 3.13 - name: Install redis/proxystore on Pydantic 2 - if: matrix.pydantic-version == '2.8.2' + if: matrix.pydantic-version == '2.10.6' run: | pip install redis pip install proxystore==0.7.0 - name: Remove proxystore test on Pydantic 1 - if: matrix.pydantic-version == '1.10.17' + if: matrix.pydantic-version == '1.10.21' run: | rm ./libensemble/tests/regression_tests/test_proxystore_integration.py - name: Remove Balsam/Globus-compute tests on Pydantic 2 - if: matrix.pydantic-version == '2.8.2' + if: matrix.pydantic-version == '2.10.6' run: | rm ./libensemble/tests/unit_tests/test_ufunc_runners.py rm ./libensemble/tests/unit_tests/test_executor_balsam.py From 98fe61c7ab893625f89a151a0a6dd2d80127a0c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 19:24:22 +0000 Subject: [PATCH 104/215] Bump crate-ci/typos from 1.29.9 to 1.30.0 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.29.9 to 1.30.0. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.29.9...v1.30.0) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 679ab719ff..2d9f924ced 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.9 + - uses: crate-ci/typos@v1.30.0 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index bf6f36a6c5..1251ac4433 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -180,4 +180,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.29.9 + - uses: crate-ci/typos@v1.30.0 From 1151e6494a0eba462096f214da2ead64128e4b9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:12:15 +0000 Subject: [PATCH 105/215] Bump the python-updates group with 3 updates Bumps the python-updates group with 3 updates: [pytest](https://github.com/pytest-dev/pytest), [mock](https://github.com/testing-cabal/mock) and [matplotlib](https://github.com/matplotlib/matplotlib). Updates `pytest` from 8.3.4 to 8.3.5 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.3.4...8.3.5) Updates `mock` from 5.1.0 to 5.2.0 - [Changelog](https://github.com/testing-cabal/mock/blob/master/CHANGELOG.rst) - [Commits](https://github.com/testing-cabal/mock/compare/5.1.0...5.2.0) Updates `matplotlib` from 3.10.0 to 3.10.1 - [Release notes](https://github.com/matplotlib/matplotlib/releases) - [Commits](https://github.com/matplotlib/matplotlib/compare/v3.10.0...v3.10.1) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-updates - dependency-name: mock dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates - dependency-name: matplotlib dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- install/testing_requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/testing_requirements.txt b/install/testing_requirements.txt index 5eee68d8e6..20b9b545d0 100644 --- a/install/testing_requirements.txt +++ b/install/testing_requirements.txt @@ -1,11 +1,11 @@ flake8==7.1.2 coverage>=7.5 -pytest==8.3.4 +pytest==8.3.5 pytest-cov==6.0.0 pytest-timeout==2.3.1 -mock==5.1.0 +mock==5.2.0 python-dateutil==2.9.0.post0 anyio==4.8.0 -matplotlib==3.10.0 +matplotlib==3.10.1 mpmath==1.3.0 rich==13.9.4 From 7716696e1b7cd01ff51b57038b248f016dadc8c6 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 5 Mar 2025 17:58:06 -0600 Subject: [PATCH 106/215] Add sim func for forces with input file --- docs/examples/sim_funcs.rst | 1 + .../sim_funcs/forces_simf_input_file.rst | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 docs/examples/sim_funcs/forces_simf_input_file.rst diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index fae31ed1e5..7bd4e262de 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -47,6 +47,7 @@ to demonstrate libEnsemble’s capabilities on various HPC systems. sim_funcs/var_resources sim_funcs/forces_simf + sim_funcs/forces_simf_input_file sim_funcs/forces_simf_gpu sim_funcs/forces_simf_gpu_vary_resources sim_funcs/forces_simf_gpu_multi_app diff --git a/docs/examples/sim_funcs/forces_simf_input_file.rst b/docs/examples/sim_funcs/forces_simf_input_file.rst new file mode 100644 index 0000000000..16765b2fd2 --- /dev/null +++ b/docs/examples/sim_funcs/forces_simf_input_file.rst @@ -0,0 +1,43 @@ +Forces (CPU) with input file +---------------------------- + +.. role:: underline + :class: underline + +Many applications read an input file instead of being given parameters directly +on the run line. + +In this variant of the forces example, a templated input file is parameterized +for each evaluation. + +This requires **jinja2** to be installed:: + + pip install jinja2 + +In the example, the file ``forces_input`` contains the following (remember +we are using particles as seed also for simplicity):: + + num_particles = {{particles}} + num_steps = 10 + rand_seed = {{particles}} + +libEnsemble will copy this input file to each simulation directory. There, the +simulation function will updates the input file with the ``particles`` value for +this simulation. + +.. automodule:: forces_simple_with_input_file.forces_simf + :members: run_forces + +.. dropdown:: :underline:`forces_simf.py` + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_simple_with_input_file/forces_simf.py + :language: python + :linenos: + +.. dropdown:: :underline:`Example usage` + + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_simple_with_input_file/run_libe_forces.py + :language: python + :linenos: + +Also see the :doc:`Forces tutorial <../../tutorials/executor_forces_tutorial>`. From c8bfdaa5d6aa5714f73bf5073d05a93e35378431 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 6 Mar 2025 16:27:08 -0600 Subject: [PATCH 107/215] Reorder build_forces lines and link from examples --- docs/examples/sim_funcs.rst | 7 +++++-- docs/tutorials/executor_forces_tutorial.rst | 3 ++- .../forces/forces_app/build_forces.sh | 18 +++++++++--------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index 7bd4e262de..79fbb1fd7b 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -35,13 +35,16 @@ Simple simulation functions Functions that run user applications ------------------------------------ -This use the executor to launch applications and in some cases +These use the executor to launch applications and in some cases handle dynamic CPU/GPU allocation. The ``var_resources`` module contains basic examples, while the ``forces`` examples use an MPI/OpenMP (with GPU offload option) application that is used to demonstrate libEnsemble’s capabilities on various HPC systems. +The build_forces.sh_ file gives compile lines for building the forces application +on various platforms (use -DGPU to build for GPU). + .. toctree:: :maxdepth: 1 @@ -61,4 +64,4 @@ Special simulation functions sim_funcs/mock_sim - +.. _build_forces.sh: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh diff --git a/docs/tutorials/executor_forces_tutorial.rst b/docs/tutorials/executor_forces_tutorial.rst index 1c2c3ecd09..d2196d73e3 100644 --- a/docs/tutorials/executor_forces_tutorial.rst +++ b/docs/tutorials/executor_forces_tutorial.rst @@ -32,7 +32,7 @@ Assuming MPI and its C compiler ``mpicc`` are available, compile mpicc -O3 -o forces.x forces.c -lm -Alternative build lines for different platforms can be found in the ``build_forces.sh`` +Alternative build lines for different platforms can be found in the build_forces.sh_ file in the same directory. Calling Script @@ -514,6 +514,7 @@ these parameters can also be specified as different variables with corresponding to generator and simulator functions. .. _examples/tutorials/forces_with_executor: https://github.com/Libensemble/libensemble/tree/develop/examples/tutorials/forces_with_executor +.. _build_forces.sh: https://github.com/Libensemble/libensemble/blob/main/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh .. _forces_app: https://github.com/Libensemble/libensemble/tree/main/libensemble/tests/scaling_tests/forces/forces_app .. _forces_simple: https://github.com/Libensemble/libensemble/tree/main/libensemble/tests/scaling_tests/forces/forces_simple .. _forces_simple_with_input_file: https://github.com/Libensemble/libensemble/tree/main/libensemble/tests/scaling_tests/forces/forces_simple_with_input_file diff --git a/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh b/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh index 7280ae9982..b8b379e0ee 100755 --- a/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh +++ b/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh @@ -36,19 +36,19 @@ mpicc -O3 -o forces.x forces.c -lm # Building with OpenMP for target device (e.g. GPU) # ------------------------------------------------- -# xl (plain and using mpicc on Summit) -# xlc_r -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c -# mpicc -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c +# Aurora: Intel oneAPI (Clang based) Compiler (JIT compiled for device) +# mpicc -DGPU -O3 -fiopenmp -fopenmp-targets=spir64 -o forces.x forces.c -# Summit with gcc (Need up to offload capable gcc: module load gcc/12.1.0) - slower than xlc -# mpicc -DGPU -Ofast -fopenmp -Wl,-rpath=/sw/summit/gcc/12.1.0-0/lib64 -lm -foffload=nvptx-none forces.c -o forces.x +# Frontier (AMD ROCm compiler) +# cc -DGPU -I${ROCM_PATH}/include -L${ROCM_PATH}/lib -lamdhip64 -fopenmp -O3 -o forces.x forces.c # Nvidia (nvc) compiler with mpicc and on Cray system with target (Perlmutter) # mpicc -DGPU -O3 -fopenmp -mp=gpu -o forces.x forces.c # cc -DGPU -Wl,-znoexecstack -O3 -fopenmp -mp=gpu -target-accel=nvidia80 -o forces.x forces.c -# Spock/Crusher/Frontier (AMD ROCm compiler) -# cc -DGPU -I${ROCM_PATH}/include -L${ROCM_PATH}/lib -lamdhip64 -fopenmp -O3 -o forces.x forces.c +# xl (plain and using mpicc on Summit) +# xlc_r -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c +# mpicc -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c -# Aurora: Intel oneAPI (Clang based) Compiler (JIT compiled for device) -# mpicc -DGPU -O3 -fiopenmp -fopenmp-targets=spir64 -o forces.x forces.c +# Summit with gcc (Need up to offload capable gcc: module load gcc/12.1.0) - slower than xlc +# mpicc -DGPU -Ofast -fopenmp -Wl,-rpath=/sw/summit/gcc/12.1.0-0/lib64 -lm -foffload=nvptx-none forces.c -o forces.x From 8c062768e746893916473ce226310a9bd6a79d15 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 6 Mar 2025 16:44:37 -0600 Subject: [PATCH 108/215] Add example usage to mock sim docs --- docs/examples/sim_funcs.rst | 5 ++--- docs/examples/sim_funcs/mock_sim.rst | 9 +++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index 79fbb1fd7b..f39ac6007c 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -40,9 +40,8 @@ handle dynamic CPU/GPU allocation. The ``var_resources`` module contains basic examples, while the ``forces`` examples use an MPI/OpenMP (with GPU offload option) application that is used -to demonstrate libEnsemble’s capabilities on various HPC systems. - -The build_forces.sh_ file gives compile lines for building the forces application +to demonstrate libEnsemble’s capabilities on various HPC systems. The +build_forces.sh_ file gives compile lines for building the forces application on various platforms (use -DGPU to build for GPU). .. toctree:: diff --git a/docs/examples/sim_funcs/mock_sim.rst b/docs/examples/sim_funcs/mock_sim.rst index 3b42b7627f..4e25a551a6 100644 --- a/docs/examples/sim_funcs/mock_sim.rst +++ b/docs/examples/sim_funcs/mock_sim.rst @@ -14,3 +14,12 @@ mock_sim (re-run using history file) .. literalinclude:: ../../../libensemble/sim_funcs/mock_sim.py :language: python :linenos: + +.. dropdown:: :underline:`Example usage` + + This test runs two repetitions. The first ensemble dumps a history file, the second replays + the first run using the mock sim with the history file. + + .. literalinclude:: ../../../libensemble/tests/functionality_tests/test_uniform_sampling.py + :language: python + :linenos: From ee9cbf61fe52fa6f4bcbc78f48d50b90d4586ee3 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 6 Mar 2025 16:49:21 -0600 Subject: [PATCH 109/215] Format mock_sim --- libensemble/sim_funcs/mock_sim.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libensemble/sim_funcs/mock_sim.py b/libensemble/sim_funcs/mock_sim.py index 3099c9e89d..494c3dfa4c 100644 --- a/libensemble/sim_funcs/mock_sim.py +++ b/libensemble/sim_funcs/mock_sim.py @@ -2,10 +2,12 @@ def mock_sim(H, persis_info, sim_specs, libE_info): - """Places sim_specs["out"] from a numpy file into the outputs. Allows a user - to reproduce an existing run while, for example, capturing additional + """ + Places ``sim_specs["out"]`` from a numpy file into the outputs. Allows a + user to reproduce an existing run while, for example, capturing additional information from a gen. Requires a user to have set - sim_specs["user"]["history_file"] to point to a history file from a previous run. + ``sim_specs["user"]["history_file"]`` to point to a history file from a + previous run. """ hfile = sim_specs["user"]["history_file"] From cba6ff635381d940ba746b668a72c90d0a310b42 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 6 Mar 2025 16:57:55 -0600 Subject: [PATCH 110/215] Revert parameter formatting in start_only_persistent --- libensemble/alloc_funcs/start_only_persistent.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libensemble/alloc_funcs/start_only_persistent.py b/libensemble/alloc_funcs/start_only_persistent.py index f272173d49..7781ed3b5f 100644 --- a/libensemble/alloc_funcs/start_only_persistent.py +++ b/libensemble/alloc_funcs/start_only_persistent.py @@ -25,24 +25,24 @@ def only_persistent_gens(W, H, sim_specs, gen_specs, alloc_specs, persis_info, l To be provided in calling script: E.g., ``alloc_specs["user"]["async_return"] = True`` - ``init_sample_size`` Int, optional. + init_sample_size: int, optional Initial sample size - always return in batch. Default: 0 - ``num_active_gens`` Int, optional. + num_active_gens: int, optional Maximum number of persistent generators to start. Default: 1 - ``async_return`` Boolean, optional. + async_return: Boolean, optional Return results to gen as they come in (after sample). Default: False (batch return). - ``active_recv_gen`` Boolean, optional. + give_all_with_same_priority: Boolean, optional + If True, then all points with the same priority value are given as a batch to the sim. + Default is False + + active_recv_gen: Boolean, optional Create gen in active receive mode. If True, the manager does not need to wait for a return from the generator before sending further returned points. Default: False - ``give_all_with_same_priority`` Boolean, optional. - If True, then all points with the same priority value are given as a batch to the sim. - Default is False - tags: alloc, batch, async, persistent, priority .. seealso:: From 94d420aa2fd91b62b2dde91834e434d6601da8c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 19:46:12 +0000 Subject: [PATCH 111/215] Bump crate-ci/typos from 1.30.0 to 1.30.2 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.30.0 to 1.30.2. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.30.0...v1.30.2) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 2d9f924ced..f25437324a 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.30.0 + - uses: crate-ci/typos@v1.30.2 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index 1251ac4433..db1ecec979 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -180,4 +180,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.30.0 + - uses: crate-ci/typos@v1.30.2 From b640017a21a65a6eb5b2301623073c2783004357 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 20:08:09 +0000 Subject: [PATCH 112/215] Update setuptools requirement in the python-updates group Updates the requirements on [setuptools](https://github.com/pypa/setuptools) to permit the latest version. Updates `setuptools` to 76.0.0 - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v75.1.0...v76.0.0) --- updated-dependencies: - dependency-name: setuptools dependency-type: direct:production dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8b5be4bf64..e6745f37cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ Issues = "https://github.com/Libensemble/libensemble/issues" [build-system] build-backend = "setuptools.build_meta" -requires = ["setuptools", "wheel", "pip>=24.3.1,<26", "setuptools>=75.1.0,<76", ] +requires = ["setuptools", "wheel", "pip>=24.3.1,<26", "setuptools>=75.1.0,<77", ] [tool.setuptools.packages.find] where = ["."] From 437cab3c5bc4257189bd94ed2ead4bed83fbb4a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:02:57 -0500 Subject: [PATCH 113/215] Re-sorting for gens --- docs/examples/gen_funcs.rst | 65 ++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 0165188c31..060edab469 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -6,7 +6,6 @@ Here we list many generator functions included with libEnsemble. .. IMPORTANT:: See the API for generator functions :ref:`here`. - Sampling -------- @@ -19,20 +18,19 @@ Sampling persistent_sampling persistent_sampling_var_resources -- :doc:`sampling` +- :doc:`Basic sampling` - Various generators for sampling a space. Function runs once each call. + Various generators for sampling a space. The non-persistent function is called as needed. -- :doc:`persistent sampling` +- :doc:`Persistent sampling` Various persistent generators (persists on a worker) for sampling a space. After the initial - batch each generator creates N new random points for every N points that are returned. + batch each generator creates ``p`` new random points for every ``p`` points that are returned. -- :doc:`persistent sampling with variable resources` +- :doc:`Persistent sampling with variable resources` Various persistent sampling generators that assign different resources to each simulation. - Optimization ------------ @@ -47,34 +45,35 @@ Optimization VTMOP ytopt consensus -.. Ax -.. Dragonfly + DEAP-NSGA-II - :doc:`APOSMM` - Asynchronously Parallel Optimization Solver for finding Multiple Minima (APOSMM_) coordinates - concurrent local optimization runs to identify many local minima faster on parallel hardware. + Asynchronously Parallel Optimization Solver for finding Multiple Minima (APOSMM_). -- :doc:`uniform_or_localopt` +- :doc:`Ax Multitask` - Samples uniformly in non-persistent mode or runs an NLopt_ local optimization run in persistent mode. + Bayesian optimization with a Gaussian process driven by an Ax_ multi-task algorithm. -- :doc:`Ax Multitask` +- :ref:`Distributed optimization` - Bayesian optimization with a Gaussian process and the multi-task algorithm of Ax_. + Distributed optimization methods for minimizing sums of convex functions. (*community example*) -- :ref:`VTMOP` +- :ref:`DEAP-NSGA-II` + + Distributed evolutionary algorithms (*community example*) - Generators using the VTMOP_ Fortran package for large-scale multiobjective multidisciplinary design optimization. (*community example*) +- :doc:`uniform_or_localopt` -- :ref:`ytopt` + Samples uniformly in non-persistent mode then runs an NLopt_ local optimization runs in persistent mode. - Generators using ytopt_. A Bayesian Optimization package for determining optimal input parameter configurations for applications or other executables. (*community example*) +- :ref:`VTMOP` -- :ref:`Consensus` + Multiobjective multidisciplinary design optimization using the VTMOP_ Fortran package. (*community example*) - Distributed optimization methods for minimizing sums of convex functions (*community example*). +- :ref:`ytopt` + Bayesian Optimization package for determining optimal input parameter configurations for applications or other executables using ytopt_. (*community example*) Modeling and Approximation -------------------------- @@ -88,30 +87,23 @@ Modeling and Approximation tasmanian fd_param_finder surmise - DEAP-NSGA-II - -- :doc:`gpCAM` - - Generators for Gaussian Process-based adaptive sampling using gpcam_. -- :doc:`Tasmanian` +- :doc:`Finite-difference parameter finder` - Generators using the Tasmanian_ sparse grid library - (*Toolkit for Adaptive Stochastic Modeling and Non-Intrusive ApproximatioN*). + Uses ECNoise_ to determine a suitable finite difference parameters and a for a mapping ``F`` from ``R^n`` to ``R^m``. -- :doc:`fd_param_finder` +- :doc:`gpCAM` - Generator that loops through a set of suitable finite difference - parameters for a mapping ``F`` from ``R^n`` to ``R^m``. + Gaussian Process-based adaptive sampling using gpcam_. - :doc:`surmise` - Modular Bayesian calibration/inference framework using Surmise_. - Has the option of cancelling previous issued simulations. + Modular Bayesian calibration/inference framework using Surmise_ (demonstration of cancelling previous issued simulations). -- :ref:`DEAP-NSGA-II` +- :doc:`Tasmanian` + + Evaluates points generators by the Tasmanian_ sparse grid library - Distributed evolutionary algorithms (*community example*) .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples @@ -123,7 +115,6 @@ Modeling and Approximation .. _DFO-LS: https://github.com/numericalalgorithmsgroup/dfols .. _ECNoise: https://www.mcs.anl.gov/~wild/cnoise/ .. _gpcam: https://gpcam.lbl.gov/ -.. .. _heFFTe: https://github.com/icl-utk-edu/heffte .. _IPAC manuscript: https://doi.org/10.18429/JACoW-ICAP2018-SAPAF03 .. _NLopt: https://nlopt.readthedocs.io/en/latest/ .. _OPAL: http://amas.web.psi.ch/docs/opal/opal_user_guide-1.6.0.pdf From cdd6b3338dabfeeb1df5f3594674c9e331b2dae4 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:09:37 -0500 Subject: [PATCH 114/215] Cleanup --- docs/examples/gen_funcs.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 060edab469..5a98b06367 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -55,14 +55,14 @@ Optimization Bayesian optimization with a Gaussian process driven by an Ax_ multi-task algorithm. -- :ref:`Distributed optimization` - - Distributed optimization methods for minimizing sums of convex functions. (*community example*) - - :ref:`DEAP-NSGA-II` Distributed evolutionary algorithms (*community example*) +- :ref:`Distributed optimization` + + Distributed optimization methods for minimizing sums of convex functions. (*community example*) + - :doc:`uniform_or_localopt` Samples uniformly in non-persistent mode then runs an NLopt_ local optimization runs in persistent mode. @@ -73,7 +73,7 @@ Optimization - :ref:`ytopt` - Bayesian Optimization package for determining optimal input parameter configurations for applications or other executables using ytopt_. (*community example*) + Bayesian Optimization package for determining optimal input parameter configurations for applications/executables using ytopt_. (*community example*) Modeling and Approximation -------------------------- @@ -90,7 +90,7 @@ Modeling and Approximation - :doc:`Finite-difference parameter finder` - Uses ECNoise_ to determine a suitable finite difference parameters and a for a mapping ``F`` from ``R^n`` to ``R^m``. + Uses ECNoise_ to determine a suitable finite difference parameters for a mapping ``F`` from ``R^n`` to ``R^m``. - :doc:`gpCAM` From 78c6d1ff412c9807f77fea38b79a9fd7b5cfa1ab Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:12:34 -0500 Subject: [PATCH 115/215] Cleanup --- .github/dependabot.yml | 1 - docs/examples/gen_funcs.rst | 6 +----- docs/examples/sim_funcs.rst | 3 --- docs/examples/sim_funcs/borehole.rst | 2 -- docs/examples/sim_funcs/borehole_kills.rst | 2 -- docs/examples/sim_funcs/chwirut1.rst | 1 - docs/examples/sim_funcs/forces_simf.rst | 2 +- docs/examples/sim_funcs/forces_simf_gpu.rst | 2 +- docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst | 2 +- docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst | 3 +-- docs/examples/sim_funcs/forces_simf_input_file.rst | 2 +- docs/examples/sim_funcs/inverse_bayes.rst | 1 - docs/examples/sim_funcs/mock_sim.rst | 1 - docs/examples/sim_funcs/periodic_func.rst | 1 - docs/examples/sim_funcs/rosenbrock.rst | 2 +- docs/examples/sim_funcs/simple_sim.rst | 1 - docs/examples/sim_funcs/six_hump_camel.rst | 1 - docs/examples/sim_funcs/surmise_test_function.rst | 1 - docs/examples/sim_funcs/var_resources.rst | 1 - docs/executor/overview.rst | 1 - docs/platforms/aurora.rst | 2 -- docs/platforms/perlmutter.rst | 1 - docs/platforms/polaris.rst | 1 - docs/tutorials/forces_gpu_tutorial.rst | 1 - 24 files changed, 7 insertions(+), 34 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 66ac4c3f1c..21ca389e09 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -36,4 +36,3 @@ updates: submodule-updates: patterns: - "*" - diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 5a98b06367..2da06b35f0 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -20,7 +20,7 @@ Sampling - :doc:`Basic sampling` - Various generators for sampling a space. The non-persistent function is called as needed. + Various generators for sampling a space. The non-persistent function is called as needed. - :doc:`Persistent sampling` @@ -104,8 +104,6 @@ Modeling and Approximation Evaluates points generators by the Tasmanian_ sparse grid library - - .. _libEnsemble Community Repository: https://github.com/Libensemble/libe-community-examples .. _APOSMM: https://link.springer.com/article/10.1007/s12532-017-0131-4 @@ -124,5 +122,3 @@ Modeling and Approximation .. _VTMOP: https://github.com/Libensemble/libe-community-examples#vtmop .. _WarpX: https://warpx.readthedocs.io/en/latest/ .. _ytopt: https://github.com/ytopt-team/ytopt - - diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index f39ac6007c..ea37cd53f0 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -13,7 +13,6 @@ function launching tasks, see the .. role:: underline :class: underline - Simple simulation functions --------------------------- @@ -31,7 +30,6 @@ Simple simulation functions sim_funcs/rosenbrock sim_funcs/surmise_test_function - Functions that run user applications ------------------------------------ @@ -54,7 +52,6 @@ on various platforms (use -DGPU to build for GPU). sim_funcs/forces_simf_gpu_vary_resources sim_funcs/forces_simf_gpu_multi_app - Special simulation functions ---------------------------- diff --git a/docs/examples/sim_funcs/borehole.rst b/docs/examples/sim_funcs/borehole.rst index fa12936523..88e16ed9c7 100644 --- a/docs/examples/sim_funcs/borehole.rst +++ b/docs/examples/sim_funcs/borehole.rst @@ -8,8 +8,6 @@ borehole :undoc-members: .. dropdown:: :underline:`borehole.py` - - .. literalinclude:: ../../../libensemble/sim_funcs/borehole.py :language: python diff --git a/docs/examples/sim_funcs/borehole_kills.rst b/docs/examples/sim_funcs/borehole_kills.rst index e657a9b4d8..fb3f06381e 100644 --- a/docs/examples/sim_funcs/borehole_kills.rst +++ b/docs/examples/sim_funcs/borehole_kills.rst @@ -8,8 +8,6 @@ borehole_kills :undoc-members: .. dropdown:: :underline:`borehole_kills.py` - - .. literalinclude:: ../../../libensemble/sim_funcs/borehole_kills.py :language: python diff --git a/docs/examples/sim_funcs/chwirut1.rst b/docs/examples/sim_funcs/chwirut1.rst index 1de2022228..2112abbdf0 100644 --- a/docs/examples/sim_funcs/chwirut1.rst +++ b/docs/examples/sim_funcs/chwirut1.rst @@ -8,7 +8,6 @@ chwirut1 :undoc-members: .. dropdown:: :underline:`chwirut1.py` - .. literalinclude:: ../../../libensemble/sim_funcs/chwirut1.py :language: python diff --git a/docs/examples/sim_funcs/forces_simf.rst b/docs/examples/sim_funcs/forces_simf.rst index fb2064869c..fe30e6caeb 100644 --- a/docs/examples/sim_funcs/forces_simf.rst +++ b/docs/examples/sim_funcs/forces_simf.rst @@ -9,7 +9,7 @@ Forces (CPU) :undoc-members: .. dropdown:: :underline:`forces_simf.py` - + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_simple/forces_simf.py :language: python :linenos: diff --git a/docs/examples/sim_funcs/forces_simf_gpu.rst b/docs/examples/sim_funcs/forces_simf_gpu.rst index 2e22f81094..411e3629b1 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu.rst @@ -9,7 +9,7 @@ Forces (GPU) :undoc-members: .. dropdown:: :underline:`forces_simf.py` - + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu/forces_simf.py :language: python :linenos: diff --git a/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst index 1074b1aaf0..3dd708e6f7 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst @@ -17,7 +17,7 @@ For a realistic use-case see https://journals.aps.org/prab/abstract/10.1103/Phys :undoc-members: .. dropdown:: :underline:`forces_simf.py` - + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_multi_app/forces_simf.py :language: python :linenos: diff --git a/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst index c80c9c6f56..4f54a4001e 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst @@ -9,12 +9,11 @@ Forces (GPU) dynamic resources :undoc-members: .. dropdown:: :underline:`forces_simf.py` - + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_gpu_var_resources/forces_simf.py :language: python :linenos: - .. dropdown:: :underline:`Example usage` Note the use of the generator function ``uniform_sample_with_var_gpus`` that sets ``num_gpus`` as a ``gen_specs`` output field corresponding to each generated simulation input. diff --git a/docs/examples/sim_funcs/forces_simf_input_file.rst b/docs/examples/sim_funcs/forces_simf_input_file.rst index 16765b2fd2..07c0cfaef3 100644 --- a/docs/examples/sim_funcs/forces_simf_input_file.rst +++ b/docs/examples/sim_funcs/forces_simf_input_file.rst @@ -29,7 +29,7 @@ this simulation. :members: run_forces .. dropdown:: :underline:`forces_simf.py` - + .. literalinclude:: ../../../libensemble/tests/scaling_tests/forces/forces_simple_with_input_file/forces_simf.py :language: python :linenos: diff --git a/docs/examples/sim_funcs/inverse_bayes.rst b/docs/examples/sim_funcs/inverse_bayes.rst index c89c85802a..4320fb0be8 100644 --- a/docs/examples/sim_funcs/inverse_bayes.rst +++ b/docs/examples/sim_funcs/inverse_bayes.rst @@ -8,7 +8,6 @@ inverse_bayes :undoc-members: .. dropdown:: :underline:`inverse_bayes.py` - .. literalinclude:: ../../../libensemble/sim_funcs/inverse_bayes.py :language: python diff --git a/docs/examples/sim_funcs/mock_sim.rst b/docs/examples/sim_funcs/mock_sim.rst index 4e25a551a6..1fbdd34091 100644 --- a/docs/examples/sim_funcs/mock_sim.rst +++ b/docs/examples/sim_funcs/mock_sim.rst @@ -9,7 +9,6 @@ mock_sim (re-run using history file) :undoc-members: .. dropdown:: :underline:`mock_sim.py` - .. literalinclude:: ../../../libensemble/sim_funcs/mock_sim.py :language: python diff --git a/docs/examples/sim_funcs/periodic_func.rst b/docs/examples/sim_funcs/periodic_func.rst index 74949a7990..42e6298b87 100644 --- a/docs/examples/sim_funcs/periodic_func.rst +++ b/docs/examples/sim_funcs/periodic_func.rst @@ -8,7 +8,6 @@ periodic_func :undoc-members: .. dropdown:: :underline:`periodic_func.py` - .. literalinclude:: ../../../libensemble/sim_funcs/periodic_func.py :language: python diff --git a/docs/examples/sim_funcs/rosenbrock.rst b/docs/examples/sim_funcs/rosenbrock.rst index 4709215a1f..6eceae2034 100644 --- a/docs/examples/sim_funcs/rosenbrock.rst +++ b/docs/examples/sim_funcs/rosenbrock.rst @@ -8,7 +8,7 @@ rosenbrock :members: .. dropdown:: :underline:`rosenbrock.py` - + .. literalinclude:: ../../../libensemble/sim_funcs/rosenbrock.py :language: python :linenos: diff --git a/docs/examples/sim_funcs/simple_sim.rst b/docs/examples/sim_funcs/simple_sim.rst index ba203f3437..ae9fdc8380 100644 --- a/docs/examples/sim_funcs/simple_sim.rst +++ b/docs/examples/sim_funcs/simple_sim.rst @@ -8,7 +8,6 @@ simple_sim :undoc-members: .. dropdown:: :underline:`simple_sim.py` - .. literalinclude:: ../../../libensemble/sim_funcs/simple_sim.py :language: python diff --git a/docs/examples/sim_funcs/six_hump_camel.rst b/docs/examples/sim_funcs/six_hump_camel.rst index 382d708180..aca6fccae2 100644 --- a/docs/examples/sim_funcs/six_hump_camel.rst +++ b/docs/examples/sim_funcs/six_hump_camel.rst @@ -8,7 +8,6 @@ six_hump_camel :undoc-members: .. dropdown:: :underline:`six_hump_camel.py` - .. literalinclude:: ../../../libensemble/sim_funcs/six_hump_camel.py :language: python diff --git a/docs/examples/sim_funcs/surmise_test_function.rst b/docs/examples/sim_funcs/surmise_test_function.rst index 48674fdeaa..97a871f5d2 100644 --- a/docs/examples/sim_funcs/surmise_test_function.rst +++ b/docs/examples/sim_funcs/surmise_test_function.rst @@ -9,7 +9,6 @@ surmise_test_function :undoc-members: .. dropdown:: :underline:`surmise_test_function.py` - .. literalinclude:: ../../../libensemble/sim_funcs/surmise_test_function.py :language: python diff --git a/docs/examples/sim_funcs/var_resources.rst b/docs/examples/sim_funcs/var_resources.rst index eb6b28cb1c..713fbcf6bb 100644 --- a/docs/examples/sim_funcs/var_resources.rst +++ b/docs/examples/sim_funcs/var_resources.rst @@ -8,7 +8,6 @@ var_resources :undoc-members: .. dropdown:: :underline:`var_resources.py` - .. literalinclude:: ../../../libensemble/sim_funcs/var_resources.py :language: python diff --git a/docs/executor/overview.rst b/docs/executor/overview.rst index e3d025dfc8..1054c6b524 100644 --- a/docs/executor/overview.rst +++ b/docs/executor/overview.rst @@ -105,7 +105,6 @@ In simulation function (sim_f). import time - def sim_func(H, persis_info, sim_specs, libE_info): input_param = str(int(H["x"][0][0])) exctr = libE_info["executor"] diff --git a/docs/platforms/aurora.rst b/docs/platforms/aurora.rst index 4189de840c..af2e7cc160 100644 --- a/docs/platforms/aurora.rst +++ b/docs/platforms/aurora.rst @@ -115,7 +115,6 @@ will use one GPU tile):: python run_libe_forces.py -n 25 - Running generator on the manager -------------------------------- @@ -132,7 +131,6 @@ Change the ``libE_specs`` in **run_libe_forces.py** as follows: ensemble.libE_specs = LibeSpecs( gen_on_manager=True, - then we can run with 12 (instead of 13) workers:: python run_libe_forces.py -n 12 diff --git a/docs/platforms/perlmutter.rst b/docs/platforms/perlmutter.rst index 2019c72cfb..88d3f808b2 100644 --- a/docs/platforms/perlmutter.rst +++ b/docs/platforms/perlmutter.rst @@ -125,7 +125,6 @@ and run with:: python run_libe_forces.py -n 4 - To watch video ^^^^^^^^^^^^^^ diff --git a/docs/platforms/polaris.rst b/docs/platforms/polaris.rst index 4cdabbcf0b..bc44d621ab 100644 --- a/docs/platforms/polaris.rst +++ b/docs/platforms/polaris.rst @@ -39,7 +39,6 @@ environment (if you need ``conda install``). More details at `Python for Polaris See :doc:`here<../advanced_installation>` for more information on advanced options for installing libEnsemble, including using Spack. - Job Submission -------------- diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index ba425e8363..eaff67323f 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -154,7 +154,6 @@ and use this information however you want. output = np.zeros(1, dtype=sim_specs["out"]) output["energy"][0] = final_energy - return output The above code will assign a GPU to each worker on CUDA-capable systems, From 00609923841fe142584dbd7e97b2f1527919abad Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:13:09 -0500 Subject: [PATCH 116/215] isort --- .../gen_funcs/persistent_ax_multitask.py | 22 ++++++++----------- libensemble/specs.py | 2 +- .../tests/unit_tests_logger/test_logger.py | 1 + scripts/aposmm_min_loc.py | 5 +++-- scripts/aposmm_plot_local_runs.py | 5 +++-- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/libensemble/gen_funcs/persistent_ax_multitask.py b/libensemble/gen_funcs/persistent_ax_multitask.py index 270f59e8db..451f14ad9a 100644 --- a/libensemble/gen_funcs/persistent_ax_multitask.py +++ b/libensemble/gen_funcs/persistent_ax_multitask.py @@ -19,15 +19,13 @@ """ import os +import warnings from copy import deepcopy from typing import Optional -from pyre_extensions import assert_is_instance -import warnings import numpy as np import pandas as pd import torch - from ax import Metric, Runner from ax.core.data import Data from ax.core.experiment import Experiment @@ -38,6 +36,7 @@ from ax.core.optimization_config import OptimizationConfig from ax.core.parameter import ParameterType, RangeParameter from ax.core.search_space import SearchSpace +from pyre_extensions import assert_is_instance # Necessary for docs rendering (as Ax is mocked) try: @@ -46,22 +45,19 @@ AxParameterWarning = Warning from ax.modelbridge.factory import get_sobol -from ax.modelbridge.registry import Models, ST_MTGP_trans +from ax.modelbridge.registry import MBM_X_trans, Models, ST_MTGP_trans from ax.modelbridge.torch import TorchModelBridge -from ax.modelbridge.transforms.convert_metric_names import tconfig_from_mt_experiment -from ax.storage.metric_registry import register_metrics +from ax.modelbridge.transforms.convert_metric_names import ConvertMetricNames, tconfig_from_mt_experiment +from ax.modelbridge.transforms.derelativize import Derelativize +from ax.modelbridge.transforms.stratified_standardize_y import StratifiedStandardizeY +from ax.modelbridge.transforms.task_encode import TaskChoiceToIntTaskChoice +from ax.modelbridge.transforms.trial_as_task import TrialAsTask from ax.runners import SyntheticRunner from ax.storage.json_store.save import save_experiment +from ax.storage.metric_registry import register_metrics from ax.storage.runner_registry import register_runner from ax.utils.common.result import Ok -from ax.modelbridge.transforms.derelativize import Derelativize -from ax.modelbridge.transforms.convert_metric_names import ConvertMetricNames -from ax.modelbridge.transforms.trial_as_task import TrialAsTask -from ax.modelbridge.transforms.stratified_standardize_y import StratifiedStandardizeY -from ax.modelbridge.transforms.task_encode import TaskChoiceToIntTaskChoice -from ax.modelbridge.registry import MBM_X_trans - from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG from libensemble.tools.persistent_support import PersistentSupport diff --git a/libensemble/specs.py b/libensemble/specs.py index 494dd23f45..3b72482fc2 100644 --- a/libensemble/specs.py +++ b/libensemble/specs.py @@ -1,10 +1,10 @@ import random +import warnings from pathlib import Path from typing import Any, Callable, List, Optional, Tuple, Union import pydantic from pydantic import BaseModel, Field -import warnings from libensemble.alloc_funcs.give_sim_work_first import give_sim_work_first from libensemble.resources.platforms import Platform diff --git a/libensemble/tests/unit_tests_logger/test_logger.py b/libensemble/tests/unit_tests_logger/test_logger.py index 242f5119ce..e06331b3d2 100644 --- a/libensemble/tests/unit_tests_logger/test_logger.py +++ b/libensemble/tests/unit_tests_logger/test_logger.py @@ -5,6 +5,7 @@ """ import logging import os + import pytest from libensemble import logger diff --git a/scripts/aposmm_min_loc.py b/scripts/aposmm_min_loc.py index 2251b5cb58..d0cd48a339 100644 --- a/scripts/aposmm_min_loc.py +++ b/scripts/aposmm_min_loc.py @@ -10,13 +10,14 @@ """ -import numpy as np -import matplotlib.pyplot as plt import glob import os import pickle import sys +import matplotlib.pyplot as plt +import numpy as np + N = 6 # number of opt runs to show. x_name = "x0" diff --git a/scripts/aposmm_plot_local_runs.py b/scripts/aposmm_plot_local_runs.py index e6a61e814e..47a4f8c73b 100755 --- a/scripts/aposmm_plot_local_runs.py +++ b/scripts/aposmm_plot_local_runs.py @@ -9,13 +9,14 @@ """ -import numpy as np -import matplotlib.pyplot as plt import glob import os import pickle import sys +import matplotlib.pyplot as plt +import numpy as np + N = 6 # number of opt runs to show. # Find the most recent .npy and pickle files From 4e12bad074a804920de61f853af3eff48c998c8a Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:17:24 -0500 Subject: [PATCH 117/215] blacken-docs --- docs/executor/overview.rst | 1 + docs/tutorials/forces_gpu_tutorial.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/executor/overview.rst b/docs/executor/overview.rst index 1054c6b524..e3d025dfc8 100644 --- a/docs/executor/overview.rst +++ b/docs/executor/overview.rst @@ -105,6 +105,7 @@ In simulation function (sim_f). import time + def sim_func(H, persis_info, sim_specs, libE_info): input_param = str(int(H["x"][0][0])) exctr = libE_info["executor"] diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index eaff67323f..ba425e8363 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -154,6 +154,7 @@ and use this information however you want. output = np.zeros(1, dtype=sim_specs["out"]) output["energy"][0] = final_energy + return output The above code will assign a GPU to each worker on CUDA-capable systems, From 67dc2e86b54207e45f30d409a2c884e74d352b39 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:43:04 -0500 Subject: [PATCH 118/215] Sim functions re-works --- docs/examples/sim_funcs.rst | 30 +++++++++---------- docs/examples/sim_funcs/forces_simf.rst | 4 +-- docs/examples/sim_funcs/forces_simf_gpu.rst | 4 +-- .../sim_funcs/forces_simf_gpu_multi_app.rst | 4 +-- .../forces_simf_gpu_vary_resources.rst | 4 +-- .../sim_funcs/forces_simf_input_file.rst | 4 +-- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index ea37cd53f0..87b69cb969 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -15,20 +15,20 @@ function launching tasks, see the Simple simulation functions --------------------------- +Ideal for simple debugging of generator processes or system testing. .. toctree:: :maxdepth: 1 - sim_funcs/simple_sim - sim_funcs/six_hump_camel - sim_funcs/borehole - sim_funcs/borehole_kills - sim_funcs/chwirut1 - sim_funcs/inverse_bayes - sim_funcs/noisy_vector_mapping - sim_funcs/periodic_func - sim_funcs/rosenbrock - sim_funcs/surmise_test_function + Borehole function + Borehole function with kills + Chwirut1 vector-valued function + Inverse Bayesian likelihood + Norm + Rosenbrock test optimization function + Six Hump Camel + Test noisy function + Test periodic function Functions that run user applications ------------------------------------ @@ -36,16 +36,16 @@ Functions that run user applications These use the executor to launch applications and in some cases handle dynamic CPU/GPU allocation. -The ``var_resources`` module contains basic examples, while the ``forces`` -examples use an MPI/OpenMP (with GPU offload option) application that is used +The ``Variable resources`` module contains basic examples, while the ``Template`` +examples use a simple MPI/OpenMP (with GPU offload option) application (``forces``) to demonstrate libEnsemble’s capabilities on various HPC systems. The -build_forces.sh_ file gives compile lines for building the forces application -on various platforms (use -DGPU to build for GPU). +build_forces.sh_ file gives compile lines for building the simple ``forces`` +application on various platforms (use -DGPU to build for GPU). .. toctree:: :maxdepth: 1 - sim_funcs/var_resources + Variable resources sim_funcs/forces_simf sim_funcs/forces_simf_input_file sim_funcs/forces_simf_gpu diff --git a/docs/examples/sim_funcs/forces_simf.rst b/docs/examples/sim_funcs/forces_simf.rst index fe30e6caeb..2aa3c2664c 100644 --- a/docs/examples/sim_funcs/forces_simf.rst +++ b/docs/examples/sim_funcs/forces_simf.rst @@ -1,5 +1,5 @@ -Forces (CPU) ------------- +Template for CPU executables +---------------------------- .. role:: underline :class: underline diff --git a/docs/examples/sim_funcs/forces_simf_gpu.rst b/docs/examples/sim_funcs/forces_simf_gpu.rst index 411e3629b1..38cb8630e8 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu.rst @@ -1,5 +1,5 @@ -Forces (GPU) ------------- +Template for GPU executables +---------------------------- .. role:: underline :class: underline diff --git a/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst index 3dd708e6f7..a190e99fea 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst @@ -1,5 +1,5 @@ -Forces with dynamic resources (CPU app and GPU app) ---------------------------------------------------- +Template with dynamic resources (CPU app and GPU app) +----------------------------------------------------- .. role:: underline :class: underline diff --git a/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst index 4f54a4001e..da87171b12 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu_vary_resources.rst @@ -1,5 +1,5 @@ -Forces (GPU) dynamic resources ------------------------------- +Template for GPU executables with dynamic resources +--------------------------------------------------- .. role:: underline :class: underline diff --git a/docs/examples/sim_funcs/forces_simf_input_file.rst b/docs/examples/sim_funcs/forces_simf_input_file.rst index 07c0cfaef3..bc304f8815 100644 --- a/docs/examples/sim_funcs/forces_simf_input_file.rst +++ b/docs/examples/sim_funcs/forces_simf_input_file.rst @@ -1,5 +1,5 @@ -Forces (CPU) with input file ----------------------------- +Template for CPU executables with input file +-------------------------------------------- .. role:: underline :class: underline From 9f2809531c98c981e630b318ceb2bb9ec85cf890 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:44:30 -0500 Subject: [PATCH 119/215] Sim functions re-works --- docs/examples/sim_funcs/mock_sim.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/sim_funcs/mock_sim.rst b/docs/examples/sim_funcs/mock_sim.rst index 1fbdd34091..4555ab0b6c 100644 --- a/docs/examples/sim_funcs/mock_sim.rst +++ b/docs/examples/sim_funcs/mock_sim.rst @@ -1,5 +1,5 @@ -mock_sim (re-run using history file) ------------------------------------- +Mock simulation evaluations (re-run using history file) +------------------------------------------------------- .. role:: underline :class: underline From 70d3a3c3aa462facf3f8f1fea3776014c479283a Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 12 Mar 2025 14:49:05 -0500 Subject: [PATCH 120/215] whitespace --- docs/tutorials/forces_gpu_tutorial.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index eaff67323f..ba425e8363 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -154,6 +154,7 @@ and use this information however you want. output = np.zeros(1, dtype=sim_specs["out"]) output["energy"][0] = final_energy + return output The above code will assign a GPU to each worker on CUDA-capable systems, From 39cd7320a7a2d456692eac78e8e6c6cbdb6e97dc Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 12 Mar 2025 15:53:28 -0500 Subject: [PATCH 121/215] Newer tagline as suggested by wildsm --- README.rst | 6 ++---- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index b7dc18e87d..548f718685 100644 --- a/README.rst +++ b/README.rst @@ -10,8 +10,8 @@ libEnsemble: A complete toolkit for dynamic ensembles of calculations ===================================================================== -libEnsemble empowers model-driven ensembles on the world's leading supercomputers -including Frontier, Aurora, and Perlmutter. +libEnsemble empowers model-driven ensembles to solve design, decision, +and inference problems on the world's leading supercomputers such as Frontier, Aurora, and Perlmutter. • **Dynamic ensembles**: Generate parallel tasks on-the-fly based on previous computations. • **Extreme portability and scaling**: Run on or across laptops, clusters, and leadership-class machines. @@ -20,8 +20,6 @@ including Frontier, Aurora, and Perlmutter. • **Data-flow between tasks**: Running ensemble members can send and receive data. • **Low start-up cost**: No additional background services or processes required. -libEnsemble is effective at solving design, decision, and inference problems on parallel resources. - `Quickstart`_ Installation diff --git a/pyproject.toml b/pyproject.toml index 83e34d4eee..89942f4244 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -132,4 +132,4 @@ noy = "noy" extend-exclude = ["*.bib", "*.xml", "docs/nitpicky"] [dependency-groups] -dev = ["pyenchant", "enchant>=0.0.1,<0.0.2"] +dev = ["pyenchant"] From 9302d176ea4cbcd99285416a7d85e8d1b6a74ac6 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 12 Mar 2025 16:23:36 -0500 Subject: [PATCH 122/215] modify bebop-distributed example script to use pbs instead, presumably much simpler with mpirun --ppn --- docs/platforms/example_scripts.rst | 4 +- .../bebop_submit_pbs_central.sh | 12 +++ .../bebop_submit_slurm_distrib.sh | 89 ------------------- 3 files changed, 14 insertions(+), 91 deletions(-) create mode 100644 examples/libE_submission_scripts/bebop_submit_pbs_central.sh delete mode 100644 examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 90db3a63a6..49c4c6091e 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -19,8 +19,8 @@ information about the respective systems and configuration. .. dropdown:: Bebop - Central Mode - .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_slurm_central.sh - :caption: /examples/libE_submission_scripts/bebop_submit_slurm_central.sh + .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_central.sh + :caption: /examples/libE_submission_scripts/bebop_submit_pbs_central.sh :language: bash .. dropdown:: Bebop - Distributed Mode diff --git a/examples/libE_submission_scripts/bebop_submit_pbs_central.sh b/examples/libE_submission_scripts/bebop_submit_pbs_central.sh new file mode 100644 index 0000000000..756471d087 --- /dev/null +++ b/examples/libE_submission_scripts/bebop_submit_pbs_central.sh @@ -0,0 +1,12 @@ +#!/bin/bash -l +#PBS -l select=2:mpiprocs=16 +#PBS -l walltime=00:15:00 +#PBS -q bdwall +#PBS -A [project] +#PBS -N libE_example + + +cd $PBS_O_WORKDIR +module load openmpi + +mpirun -n 16 --ppn 8 python run_libe_example.py diff --git a/examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh b/examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh deleted file mode 100644 index f30e84340a..0000000000 --- a/examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash -#SBATCH -J libE_test -#SBATCH -N 4 -#SBATCH -p knlall -#SBATCH -A -#SBATCH -o tlib.%j.%N.out -#SBATCH -e tlib.%j.%N.error -#SBATCH -t 01:00:00 - -# Launch script that runs in distributed mode with mpi4py. -# Workers are evenly spread over nodes and manager added to the first node. -# Requires even distribution - either multiple workers per node or nodes per worker -# Option for manager to have a dedicated node. -# Use of MPI Executor will ensure workers co-locate tasks with workers -# If node_list file is kept, this informs libe of resources. Else, libe auto-detects. - -# User to edit these variables -export EXE=libE_calling_script.py -export NUM_WORKERS=4 -export MANAGER_NODE=false # true = Manager has a dedicated node (assign one extra) -export USE_NODE_LIST=true # If false, allow libE to determine node_list from environment. - -# As libE shares nodes with user applications allow fallback if contexts overrun. -unset I_MPI_FABRICS -export I_MPI_FABRICS_LIST=tmi,tcp -export I_MPI_FALLBACK=1 - -# If using in calling script (After N mins manager kills workers and exits cleanly) -export LIBE_WALLCLOCK=55 - -#----------------------------------------------------------------------------- -# Work out distribution -if [[ $MANAGER_NODE = "true" ]]; then - WORKER_NODES=$(($SLURM_NNODES-1)) -else - WORKER_NODES=$SLURM_NNODES -fi - -if [[ $NUM_WORKERS -ge $WORKER_NODES ]]; then - SUB_NODE_WORKERS=true - WORKERS_PER_NODE=$(($NUM_WORKERS/$WORKER_NODES)) -else - SUB_NODE_WORKERS=false - NODES_PER_WORKER=$(($WORKER_NODES/$NUM_WORKERS)) -fi; -#----------------------------------------------------------------------------- - -# A little useful information -echo -e "Manager process running on: $HOSTNAME" -echo -e "Directory is: $PWD" - -# Generate a node list with 1 node per line: -srun hostname | sort -u > node_list - -# Add manager node to machinefile -head -n 1 node_list > machinefile.$SLURM_JOBID - -# Add worker nodes to machinefile -if [[ $SUB_NODE_WORKERS = "true" ]]; then - awk -v repeat=$WORKERS_PER_NODE '{for(i=0; i>machinefile.$SLURM_JOBID -else - awk -v patt="$NODES_PER_WORKER" 'NR % patt == 1' node_list \ - >> machinefile.$SLURM_JOBID -fi; - -if [[ $USE_NODE_LIST = "false" ]]; then - rm node_list - wait -fi; - -# Put in a timestamp -echo Starting execution at: `date` - -# To use srun -export SLURM_HOSTFILE=machinefile.$SLURM_JOBID - -# The "arbitrary" flag should ensure SLURM_HOSTFILE is picked up -# cmd="srun --ntasks $(($NUM_WORKERS+1)) -m arbitrary python $EXE" -cmd="srun --ntasks $(($NUM_WORKERS+1)) -m arbitrary python $EXE $LIBE_WALLCLOCK" - -echo The command is: $cmd -echo End PBS script information. -echo All further output is from the process being run and not the script.\n\n $cmd - -$cmd - -# Print the date again -- when finished -echo Finished at: `date` From 7de85349532ae6c6849176b010bad42abfaf3eb3 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 12 Mar 2025 16:30:31 -0500 Subject: [PATCH 123/215] try removing overview of examples from left toctree, fix filenames for new bebop distributed example --- docs/index.rst | 1 - docs/platforms/example_scripts.rst | 8 ++++---- ..._submit_pbs_central.sh => bebop_submit_pbs_distrib.sh} | 0 3 files changed, 4 insertions(+), 5 deletions(-) rename examples/libE_submission_scripts/{bebop_submit_pbs_central.sh => bebop_submit_pbs_distrib.sh} (100%) diff --git a/docs/index.rst b/docs/index.rst index 1e0e566adc..3cfa749e97 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,7 +30,6 @@ :maxdepth: 1 :caption: Examples: - examples/examples_index examples/gen_funcs examples/sim_funcs examples/alloc_funcs diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 49c4c6091e..df8e0b3942 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -19,14 +19,14 @@ information about the respective systems and configuration. .. dropdown:: Bebop - Central Mode - .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_central.sh - :caption: /examples/libE_submission_scripts/bebop_submit_pbs_central.sh + .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_slurm_central.sh + :caption: /examples/libE_submission_scripts/bebop_submit_slurm_central.sh :language: bash .. dropdown:: Bebop - Distributed Mode - .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh - :caption: /examples/libE_submission_scripts/bebop_submit_slurm_distrib.sh + .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh + :caption: /examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh :language: bash .. dropdown:: Summit - On Launch Nodes with Multiprocessing diff --git a/examples/libE_submission_scripts/bebop_submit_pbs_central.sh b/examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh similarity index 100% rename from examples/libE_submission_scripts/bebop_submit_pbs_central.sh rename to examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh From 5c8e1af0662f90de8c3409dcd77687e964693432 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 11:53:41 -0500 Subject: [PATCH 124/215] Bugfix: Fix final_gen_send when no workers persis_info --- libensemble/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libensemble/manager.py b/libensemble/manager.py index 99321ce6a3..1a54b96fc8 100644 --- a/libensemble/manager.py +++ b/libensemble/manager.py @@ -580,7 +580,7 @@ def _final_receive_and_kill(self, persis_info: dict) -> (dict, int, int): rows_to_send = np.where(self.hist.H["sim_ended"] & ~self.hist.H["gen_informed"])[0] work = { "H_fields": self.gen_specs["persis_in"], - "persis_info": persis_info[w], + "persis_info": persis_info.get(w), "tag": PERSIS_STOP, "libE_info": {"persistent": True, "H_rows": rows_to_send}, } From 230c4ce6db04c8eeac28d4f38ddd6b93b29094dc Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 12:01:31 -0500 Subject: [PATCH 125/215] Handle worker-generated persis_info fields --- libensemble/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libensemble/manager.py b/libensemble/manager.py index 1a54b96fc8..c0cf02500e 100644 --- a/libensemble/manager.py +++ b/libensemble/manager.py @@ -514,7 +514,7 @@ def _update_state_on_worker_msg(self, persis_info: dict, D_recv: dict, w: int) - self.live_data.live_update(self.hist) if D_recv.get("persis_info"): - persis_info[w].update(D_recv["persis_info"]) + persis_info.setdefault(int(w), {}).update(D_recv["persis_info"]) def _handle_msg_from_worker(self, persis_info: dict, w: int) -> None: """Handles a message from worker w""" From 3b227e0cf733b2d8b12fec8ee4a22067a3d3469b Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 12:04:00 -0500 Subject: [PATCH 126/215] =?UTF-8?q?Ensure=20workers=20receive=C2=A0persis?= =?UTF-8?q?=5Finfo=20dict=20instead=20of=20None?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libensemble/utils/runners.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libensemble/utils/runners.py b/libensemble/utils/runners.py index 629c733b1b..93a2cd1afe 100644 --- a/libensemble/utils/runners.py +++ b/libensemble/utils/runners.py @@ -37,6 +37,8 @@ def shutdown(self) -> None: pass def run(self, calc_in: npt.NDArray, Work: dict) -> (npt.NDArray, dict, Optional[int]): + if Work["persis_info"] is None: + Work["persis_info"] = {} return self._result(calc_in, Work["persis_info"], Work["libE_info"]) From efa344911c3fb8a97aac7eeac0918e4d3b3a274a Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 14:04:53 -0500 Subject: [PATCH 127/215] Allow save filename without attributes --- libensemble/ensemble.py | 20 ++++++++++++++++---- libensemble/tools/tools.py | 29 ++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/libensemble/ensemble.py b/libensemble/ensemble.py index 31549d5b53..dea04e27f5 100644 --- a/libensemble/ensemble.py +++ b/libensemble/ensemble.py @@ -563,17 +563,29 @@ def add_random_streams(self, num_streams: int = 0, seed: str = ""): self.persis_info = add_unique_random_streams(self.persis_info, nstreams + 1, seed=seed) return self.persis_info - def save_output(self, file: str): + def save_output(self, basename: str, append_attrs: bool = True): """ Writes out History array and persis_info to files. If using a workflow_dir, will place with specified filename in that directory. - Format: ``_results_History_length=_evals=_ranks=`` + Parameters + ---------- + + Format: ``_results_History_length=_evals=_ranks=`` + + To use just basename as the filename, set append_attrs=False + + Format: ``_results_History_length=_evals=_ranks=`` """ if self.is_manager: if self._get_option("libE_specs", "workflow_dir_path"): save_libE_output( - self.H, self.persis_info, file, self.nworkers, dest_path=self.libE_specs.workflow_dir_path + self.H, + self.persis_info, + basename, + self.nworkers, + dest_path=self.libE_specs.workflow_dir_path, + append_attrs=append_attrs, ) else: - save_libE_output(self.H, self.persis_info, file, self.nworkers) + save_libE_output(self.H, self.persis_info, basename, self.nworkers, append_attrs=append_attrs) diff --git a/libensemble/tools/tools.py b/libensemble/tools/tools.py index 8dc629c8ad..4038b5fafe 100644 --- a/libensemble/tools/tools.py +++ b/libensemble/tools/tools.py @@ -75,19 +75,21 @@ ) -def _get_shortname(calling_file): - script_name = os.path.splitext(os.path.basename(calling_file))[0] +def _get_shortname(basename): + script_name = os.path.splitext(os.path.basename(basename))[0] short_name = script_name.split("test_", 1).pop() return short_name # =================== save libE output to pickle and np ======================== -def save_libE_output(H, persis_info, calling_file, nworkers, dest_path=None, mess="Run completed"): +def save_libE_output(H, persis_info, basename, nworkers, dest_path=None, mess="Run completed", append_attrs=True): """ Writes out history array and persis_info to files. - Format: _results_History_length=_evals=_ranks= + Format: _results_History_length=_evals=_ranks= + + To use just basename, set append_attrs=False .. code-block:: python @@ -106,7 +108,7 @@ def save_libE_output(H, persis_info, calling_file, nworkers, dest_path=None, mes Persistent information dictionary. :doc:`(example)` - calling_file : :obj:`str` + basename : :obj:`str` Name of user-calling script (or user chosen name) to prefix output files. The convention is to send __file__ from user calling script. @@ -119,15 +121,24 @@ def save_libE_output(H, persis_info, calling_file, nworkers, dest_path=None, mes A message to print/log when saving the file. + append_attrs: `bool` + + Append run attributes to the base filename. + """ if dest_path is None: dest_path = os.getcwd() - short_name = _get_shortname(calling_file) - prob_str = "length=" + str(len(H)) + "_evals=" + str(sum(H["sim_ended"])) + "_workers=" + str(nworkers) + short_name = _get_shortname(basename) + + prob_str = hist_name = persis_name = "" + if append_attrs: + prob_str = "length=" + str(len(H)) + "_evals=" + str(sum(H["sim_ended"])) + "_workers=" + str(nworkers) + hist_name = "_history_" + prob_str + persis_name = "_persis_info_" + prob_str - h_filename = os.path.join(dest_path, short_name + "_history_" + prob_str) - p_filename = os.path.join(dest_path, short_name + "_persis_info_" + prob_str) + h_filename = os.path.join(dest_path, short_name + hist_name) + p_filename = os.path.join(dest_path, short_name + persis_name) status_mess = " ".join(["------------------", mess, "-------------------"]) logger.info(f"{status_mess}\nSaving results to file: {h_filename}") From 2604d357be111a9ef8ff70b25ff616c3c38c24e4 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 14:05:39 -0500 Subject: [PATCH 128/215] Add gpcam notebook --- .../gpcam_surrogate_model/gpcam.ipynb | 471 ++++++++++++++++++ 1 file changed, 471 insertions(+) create mode 100644 examples/tutorials/gpcam_surrogate_model/gpcam.ipynb diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb new file mode 100644 index 0000000000..cdf0ce2f93 --- /dev/null +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -0,0 +1,471 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Before Beginning\n", + "\n", + "Ensure that NumPy, libEnsemble, and gpCAM are installed via:\n", + "\n", + " pip install libensemble\n", + " pip install gpCAM\n", + " \n", + "**Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", + "To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", + "\n", + "If running online (e.g., in Colab), you can install libEnsemble and gpCAM here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install libensemble\n", + "!pip install gpcam" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## gpCAM Optimization Tutorial\n", + "\n", + "This generation function constructs a global surrogate of `f` values." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generator function\n", + "\n", + "The GP cam generator function is called ``persistent_gpCAM``.\n", + "\n", + "This persistent generator is started at the beginning and runs until the Ensemble closes down.\n", + "\n", + "This is a version of the gpCAM generator that can be found, along with other gpCAM generator functions, at [libensemble/gen_funcs/persistent_gpCAM.py](https://github.com/Libensemble/libensemble/blob/main/libensemble/gen_funcs/persistent_gpCAM.py) and can be imported from that location when libEnsemble is installed as follows:\n", + "\n", + "``from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM``" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from numpy.lib.recfunctions import repack_fields\n", + "from gpcam import GPOptimizer as GP\n", + "\n", + "# Standard options for manager/generator comms\n", + "from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG\n", + "from libensemble.tools.persistent_support import PersistentSupport\n", + "\n", + "def _initialize_gpcAM(user_specs, libE_info):\n", + " \"\"\"Extract user params\"\"\"\n", + " rng_seed = user_specs.get(\"seed\") # will default to None\n", + " b = user_specs[\"batch_size\"]\n", + " lb = np.array(user_specs[\"lb\"])\n", + " ub = np.array(user_specs[\"ub\"])\n", + " n = len(lb) # dimension\n", + " all_x = np.empty((0, n))\n", + " all_y = np.empty((0, 1))\n", + " ps = PersistentSupport(libE_info, EVAL_GEN_TAG) # init comms\n", + " return rng_seed, b, n, lb, ub, all_x, all_y, ps\n", + "\n", + "\n", + "def _read_testpoints(U):\n", + " \"\"\"Read numpy file containing evaluated points for measuring GP error\"\"\"\n", + " test_points_file = U.get(\"test_points_file\")\n", + " print(f\"{test_points_file=}\")\n", + " if test_points_file is None:\n", + " return None\n", + " test_points = np.load(test_points_file)\n", + " test_points = repack_fields(test_points[[\"x\", \"f\"]])\n", + " return test_points\n", + "\n", + "\n", + "def _compare_testpoints(my_gp, test_points, persis_info):\n", + " \"\"\"Compare model at test points\"\"\"\n", + " if test_points is None:\n", + " return\n", + " f_est = my_gp.posterior_mean(test_points[\"x\"])[\"f(x)\"]\n", + " mse = np.mean((f_est - test_points[\"f\"]) ** 2)\n", + " persis_info.setdefault(\"mean_squared_error\", []).append(float(mse))\n", + "\n", + "\n", + "def _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info):\n", + " \"\"\"Update gausian process with new points and train\"\"\"\n", + "\n", + " #TODO - CHECK JUST GIVING X_NEW, y_NEW - NEW GPCAM interface\n", + " all_x = np.vstack((all_x, x_new))\n", + " all_y = np.vstack((all_y, y_new))\n", + " \n", + " if my_gp is None:\n", + " my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", + " else:\n", + " my_gp.tell(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", + " my_gp.train()\n", + " \n", + " if test_points is not None:\n", + " _compare_testpoints(my_gp, test_points, persis_info)\n", + "\n", + " return my_gp, all_x, all_y\n", + "\n", + "\n", + "def persistent_gpCAM(H_in, persis_info, gen_specs, libE_info):\n", + " \"\"\"Run a batched gpCAM model to create a surrogate\"\"\"\n", + "\n", + " # Initialize\n", + " rng_seed, batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", + " ask_max_iter = gen_specs[\"user\"].get(\"ask_max_iter\") or 10\n", + " test_points = _read_testpoints(gen_specs[\"user\"])\n", + " my_gp = None\n", + " \n", + " # Start with a batch of random points\n", + " rng = np.random.default_rng(rng_seed) # Create random stream\n", + " x_new = rng.uniform(lb, ub, (batch_size, n))\n", + " H_o = np.zeros(batch_size, dtype=gen_specs[\"out\"]) \n", + " H_o[\"x\"] = x_new\n", + " tag, Work, calc_in = ps.send_recv(H_o)\n", + "\n", + " while tag not in [STOP_TAG, PERSIS_STOP]:\n", + " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", + " my_gp, all_x, all_y = _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info)\n", + "\n", + " print(f\"ext {my_gp=}\")\n", + " x_new = my_gp.ask(\n", + " input_set=np.column_stack((lb, ub)),\n", + " n=batch_size,\n", + " pop_size=batch_size,\n", + " acquisition_function=\"total correlation\", # \n", + " max_iter=ask_max_iter, # Larger takes longer. gpCAM default is 20.\n", + " )[\"x\"]\n", + " \n", + " H_o = np.zeros(batch_size, dtype=gen_specs[\"out\"])\n", + " H_o[\"x\"] = x_new\n", + " tag, Work, calc_in = ps.send_recv(H_o)\n", + "\n", + " # If final points were returned update the model\n", + " if calc_in is not None:\n", + " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", + " my_gp, all_x, all_y = _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info)\n", + "\n", + " return None, persis_info, FINISHED_PERSISTENT_GEN_TAG" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Common acquisition functions include:\n", + "\n", + "**Uncertainty reduction:**\n", + "- **\"variance\"** (default): The optimizer will find N best points. \n", + "- **\"total correlation\"**: More expensive but points found are self-avoiding.\n", + "\n", + "**Bayesian optimization:**\n", + "\n", + "These produce one point at a time unless using the [HGDL](https://ieeexplore.ieee.org/abstract/document/9652812) option.\n", + "- **\"ucb\" / \"lcb\"**: Upper/Lower Confidence Bound.\n", + "- **\"expected improvement\"**: Expected Improvement.\n", + "\n", + "Some more options see: https://gpcam.lbl.gov/examples/acquisition-functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simulator function\n", + "\n", + "Simulator functions or `sim_f`s perform calculations based on parameters created in the generator function.\n", + "\n", + "The function used here is the simple 2D Six Hump Camel, for demonstration purposes.\n", + "\n", + "For running parallel applications in the simulator see the [forces examples](https://github.com/Libensemble/libensemble/tree/main/libensemble/tests/scaling_tests/forces/forces_simple)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define our simulation function\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def six_hump_camel(H, persis_info, sim_specs, _):\n", + " \"\"\"Six-Hump Camel sim_f.\"\"\"\n", + " \n", + " batch = len(H[\"x\"]) # Num evaluations each sim_f call.\n", + " H_o = np.zeros(batch, dtype=sim_specs[\"out\"]) # Define output array H\n", + " \n", + " for i, x in enumerate(H[\"x\"]):\n", + " H_o[\"f\"][i] = six_hump_camel_func(x) # Function evaluations placed into H\n", + " \n", + " return H_o, persis_info\n", + "\n", + "\n", + "def six_hump_camel_func(x):\n", + " \"\"\"Six-Hump Camel function definition\"\"\"\n", + " x1 = x[0]\n", + " x2 = x[1]\n", + " term1 = (4 - 2.1 * x1**2 + (x1**4) / 3) * x1**2\n", + " term2 = x1 * x2\n", + " term3 = (-4 + 4 * x2**2) * x2**2\n", + " \n", + " return term1 + term2 + term3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Calling Script\n", + "\n", + "Our calling script contains configuration for libEnsemble, the generator function, and the simulator function. We then create the ensemble object and are ready to run the ensemble.\n", + "\n", + "First we will create a cleanup script so we can easily re-run.\n", + "\n", + "*****TODO: EXPLAIN gen_on_manager=True, final_gen_send=True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To rerun this notebook, we need to delete the ensemble directory.\n", + "import shutil\n", + "def cleanup():\n", + " try:\n", + " shutil.rmtree(\"ensemble\")\n", + " except:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from pprint import pprint\n", + "\n", + "from libensemble import Ensemble\n", + "from libensemble.specs import LibeSpecs, GenSpecs, SimSpecs, AllocSpecs, ExitCriteria \n", + "\n", + "from libensemble.tools.live_data.plot2n import Plot2N\n", + "\n", + "# If importing from libensemble\n", + "# from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM\n", + "# from libensemble.sim_funcs.six_hump_camel import six_hump_camel\n", + "from libensemble.alloc_funcs.start_only_persistent import only_persistent_gens\n", + "import warnings\n", + "\n", + "\n", + "warnings.filterwarnings(\"ignore\", message=\"Default hyperparameter_bounds\")\n", + "warnings.filterwarnings(\"ignore\", message=\"Hyperparameters initialized\")\n", + "\n", + "nworkers = 4\n", + "\n", + "# When using gen_on_manager, nworkers is number of concurrent sims.\n", + "libE_specs = LibeSpecs(nworkers=nworkers, gen_on_manager=True, final_gen_send=True)\n", + "\n", + "n = 2 # Input dimensions\n", + "#num_batches = 8\n", + "#batch_size = 10\n", + "\n", + "\n", + "#trmp try\n", + "batch_size = 4\n", + "num_batches = 6\n", + "\n", + "gen_specs = GenSpecs(\n", + " gen_f=persistent_gpCAM, # Generator function\n", + " persis_in=[\"f\"], # Objective, defined in sim, is returned to gen\n", + " outputs=[(\"x\", float, (n,))], # Parameters (name, type, size)\n", + " user={\n", + " \"batch_size\": batch_size,\n", + " \"lb\": np.array([-2, -1]), # lower boundaries for n dimensions\n", + " \"ub\": np.array([2, 1]), # upper boundaries for n dimensions \n", + " \"ask_max_iter\": 5, # Number of iterations for ask (default 20) *****************\n", + " \"rng_seed\": 0,\n", + " },\n", + ")\n", + "\n", + "sim_specs = SimSpecs(\n", + " sim_f=six_hump_camel, # Simulator function\n", + " inputs=[\"x\"], # Input field names. \"x\" defined in gen\n", + " outputs=[(\"f\", float)], # Objective\n", + ")\n", + "\n", + "# Starts one persistent generator. Simulated values are returned in batch.\n", + "alloc_specs = AllocSpecs(\n", + " alloc_f=only_persistent_gens,\n", + " user={\"async_return\": False}, # False = batch returns\n", + ")\n", + "\n", + "exit_criteria = ExitCriteria(sim_max=num_batches*batch_size)\n", + "\n", + "# Initialize and run the ensemble.\n", + "ensemble = Ensemble(\n", + " libE_specs=libE_specs,\n", + " sim_specs=sim_specs,\n", + " gen_specs=gen_specs,\n", + " alloc_specs=alloc_specs,\n", + " exit_criteria=exit_criteria,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At the end of our calling script we run the ensemble. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To ensure re-running works - clean output and reset any persistent information\n", + "cleanup()\n", + "ensemble.persis_info = {}\n", + "\n", + "H, persis_info, flag = ensemble.run() # Start the ensemble. Blocks until completion.\n", + "ensemble.save_output(\"H_array\", append_attrs=False) # Save H (history of all evaluated points) to file\n", + "pprint(H[[\"sim_id\", \"x\", \"f\"]][:16]) # See first 16 results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Rerun and test model at known points\n", + "\n", + "To see how our model improves, we can use our existing points as test_points and run again" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Run again with a different seed. We Can check use last run as test points to see model improvement.\n", + "ensemble.gen_specs.user[\"rng_seed\"] = 123\n", + "ensemble.gen_specs.user[\"test_points_file\"] = \"H_array.npy\" # our previous file\n", + "\n", + "# To ensure re-running works - clean output and reset any persistent information\n", + "cleanup()\n", + "ensemble.persis_info = {}\n", + "\n", + "H, persis_info, flag = ensemble.run()\n", + "print(\"\\n\\n\")\n", + "print(persis_info)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#!/usr/bin/env python\n", + "import matplotlib\n", + "from matplotlib.ticker import ScalarFormatter\n", + "import matplotlib.pyplot as plt\n", + "plt.rc(\"axes\", axisbelow=True)\n", + "# Units\n", + "\n", + "# Get \"mean_squared_error\" from generators return (worker 0 as we ran gen_on_manager)\n", + "mse = persis_info[0][\"mean_squared_error\"]\n", + "niter = len(mse)\n", + "\n", + "num_sims = list(range(batch_size, (niter * batch_size) + 1, batch_size))\n", + "\n", + "\n", + "# Plotting the data\n", + "markersize = 10\n", + "plt.figure(figsize=(10, 5))\n", + "plt.plot(num_sims, mse, marker=\"^\", markeredgecolor=\"black\", markeredgewidth=2, markersize=markersize, linewidth=2, label=\"Mean squared error\")\n", + "plt.xticks(num_sims)\n", + "\n", + "# Get current labels\n", + "labels = [item.get_text() for item in plt.gca().get_xticklabels()]\n", + "new_labels = [str(num) if i % 4 == 0 else \"\" for i, num in enumerate(num_sims)]\n", + "new_labels[-1] = str(labels[-1])\n", + "\n", + "# Set new labels\n", + "plt.xticks(num_sims, new_labels)\n", + "\n", + "# Labeling the axes and the legend\n", + "plt.xlabel(\"Number of simulations\")\n", + "# plt.title('Mean Squared Error at test points')\n", + "legend = plt.legend(framealpha=1, edgecolor=\"black\") # Increase edge width here\n", + "legend.get_frame().set_linewidth(2.0)\n", + "\n", + "# Create a ScalarFormatter object\n", + "y_formatter = ScalarFormatter(useOffset=False)\n", + "y_formatter.set_scientific(True)\n", + "y_formatter.set_powerlimits((-3, 3)) # Adjust power limits as necessary\n", + "\n", + "# Apply the formatter to the y-axis\n", + "plt.gca().yaxis.set_major_formatter(y_formatter)\n", + "plt.tight_layout()\n", + "\n", + "# Show the plot\n", + "plt.grid(True)\n", + "save_str = \"shc_mse_\" + str(niter) + \"x\" + str(batch_size) + \".png\"\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 7b6a5e8c6f760e977a8e79e760d07c329685d55a Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 18:04:58 -0500 Subject: [PATCH 129/215] Fix seed and other mods --- .../gpcam_surrogate_model/gpcam.ipynb | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index cdf0ce2f93..4ded2accd4 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -14,7 +14,7 @@ "**Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", "To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", "\n", - "If running online (e.g., in Colab), you can install libEnsemble and gpCAM here." + "Optionally, you can install libEnsemble and gpCAM here." ] }, { @@ -23,17 +23,22 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install libensemble\n", - "!pip install gpcam" + "import sys\n", + "if 'google.colab' in sys.modules:\n", + " #!pip install libensemble\n", + " !pip install git+https://github.com/Libensemble/libensemble.git@examples/gpcam_notebook ################ tmp\n", + " !pip install gpcam" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, "source": [ - "## gpCAM Optimization Tutorial\n", + "## gpCAM Surrogate Model Tutorial\n", "\n", - "This generation function constructs a global surrogate of `f` values." + "This generation function constructs a global surrogate of `f` values, using a Gaussian process." ] }, { @@ -57,6 +62,7 @@ "metadata": {}, "outputs": [], "source": [ + "# @title Generator function\n", "import numpy as np\n", "from numpy.lib.recfunctions import repack_fields\n", "from gpcam import GPOptimizer as GP\n", @@ -67,7 +73,7 @@ "\n", "def _initialize_gpcAM(user_specs, libE_info):\n", " \"\"\"Extract user params\"\"\"\n", - " rng_seed = user_specs.get(\"seed\") # will default to None\n", + " rng_seed = user_specs.get(\"rng_seed\") # will default to None\n", " b = user_specs[\"batch_size\"]\n", " lb = np.array(user_specs[\"lb\"])\n", " ub = np.array(user_specs[\"ub\"])\n", @@ -81,7 +87,6 @@ "def _read_testpoints(U):\n", " \"\"\"Read numpy file containing evaluated points for measuring GP error\"\"\"\n", " test_points_file = U.get(\"test_points_file\")\n", - " print(f\"{test_points_file=}\")\n", " if test_points_file is None:\n", " return None\n", " test_points = np.load(test_points_file)\n", @@ -104,6 +109,8 @@ " #TODO - CHECK JUST GIVING X_NEW, y_NEW - NEW GPCAM interface\n", " all_x = np.vstack((all_x, x_new))\n", " all_y = np.vstack((all_y, y_new))\n", + "\n", + " # TODO rmeove - or check this - or atleast calc first noise_variances=1e-8 * np.ones(len(all_y))\n", " \n", " if my_gp is None:\n", " my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", @@ -122,6 +129,7 @@ "\n", " # Initialize\n", " rng_seed, batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", + " print(f'{rng_seed=}')\n", " ask_max_iter = gen_specs[\"user\"].get(\"ask_max_iter\") or 10\n", " test_points = _read_testpoints(gen_specs[\"user\"])\n", " my_gp = None\n", @@ -137,7 +145,6 @@ " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", " my_gp, all_x, all_y = _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info)\n", "\n", - " print(f\"ext {my_gp=}\")\n", " x_new = my_gp.ask(\n", " input_set=np.column_stack((lb, ub)),\n", " n=batch_size,\n", @@ -147,6 +154,8 @@ " )[\"x\"]\n", " \n", " H_o = np.zeros(batch_size, dtype=gen_specs[\"out\"])\n", + "\n", + " #print(f'{x_new=}')\n", " H_o[\"x\"] = x_new\n", " tag, Work, calc_in = ps.send_recv(H_o)\n", "\n", @@ -282,11 +291,6 @@ "libE_specs = LibeSpecs(nworkers=nworkers, gen_on_manager=True, final_gen_send=True)\n", "\n", "n = 2 # Input dimensions\n", - "#num_batches = 8\n", - "#batch_size = 10\n", - "\n", - "\n", - "#trmp try\n", "batch_size = 4\n", "num_batches = 6\n", "\n", @@ -349,20 +353,13 @@ "pprint(H[[\"sim_id\", \"x\", \"f\"]][:16]) # See first 16 results" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rerun and test model at known points\n", "\n", - "To see how our model improves, we can use our existing points as test_points and run again" + "To see how our model improves, we can use our existing points as test points and run again with a different seed." ] }, { @@ -384,6 +381,15 @@ "print(persis_info)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Viewing model progression\n", + "Now we can check how our model compared against the known test points at each iteration.\n", + "The comparison is based on the mean square error between model our known values at the test points." + ] + }, { "cell_type": "code", "execution_count": null, From 94d12b0cf52e66eebf361866bc1dbed081bdf21e Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 18:05:31 -0500 Subject: [PATCH 130/215] Link gpcam notebook in README --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 1a27ec7484..1af0715d16 100644 --- a/README.rst +++ b/README.rst @@ -96,6 +96,8 @@ Try some other examples live in Colab. +---------------------------------------------------------------+-------------------------------------+ | Optimization example that finds multiple minima. | |Optimization example| | +---------------------------------------------------------------+-------------------------------------+ +| Surrogate model generation with gpCAM. | |Surrogate Modeling| | ++---------------------------------------------------------------+-------------------------------------+ There are many more examples in the `regression tests`_. @@ -178,3 +180,6 @@ Resources .. |Optimization example| image:: https://colab.research.google.com/assets/colab-badge.svg :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb + +.. |Surrogate Modeling| image:: https://colab.research.google.com/assets/colab-badge.svg + :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb From 46eea2e897f1f23abaa6d8988d10b7541d7f687f Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 18:11:55 -0500 Subject: [PATCH 131/215] Fix README --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 1af0715d16..c5ca2b567c 100644 --- a/README.rst +++ b/README.rst @@ -182,4 +182,4 @@ Resources :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb .. |Surrogate Modeling| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb + :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/examples/gpcam_notebook/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb From 2b2762649e854ae0650837964347603df44d006f Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 13 Mar 2025 18:14:51 -0500 Subject: [PATCH 132/215] Fix README --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index c5ca2b567c..2bea7109c4 100644 --- a/README.rst +++ b/README.rst @@ -182,4 +182,4 @@ Resources :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb .. |Surrogate Modeling| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/examples/gpcam_notebook/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb + :target: https://colab.research.google.com/github/Libensemble/libensemble/blob/examples/gpcam_notebook/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb From 9d832eac23eab383ea629d44b43929dd9de42c58 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 14 Mar 2025 14:11:19 -0500 Subject: [PATCH 133/215] Update gpcam notebook --- .../gpcam_surrogate_model/gpcam.ipynb | 50 ++++++------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 4ded2accd4..4ad576dc6d 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -6,10 +6,7 @@ "source": [ "## Before Beginning\n", "\n", - "Ensure that NumPy, libEnsemble, and gpCAM are installed via:\n", - "\n", - " pip install libensemble\n", - " pip install gpCAM\n", + "Ensure that libEnsemble, and gpCAM are installed via: `pip install libensemble gpcam`\n", " \n", "**Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", "To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", @@ -27,7 +24,9 @@ "if 'google.colab' in sys.modules:\n", " #!pip install libensemble\n", " !pip install git+https://github.com/Libensemble/libensemble.git@examples/gpcam_notebook ################ tmp\n", - " !pip install gpcam" + " !pip install gpcam \n", + " # Prevent downgraded numpy in colab\n", + " !pip install numpy>=2.0 --no-cache-dir --force-reinstall --ignore-installed" ] }, { @@ -62,7 +61,6 @@ "metadata": {}, "outputs": [], "source": [ - "# @title Generator function\n", "import numpy as np\n", "from numpy.lib.recfunctions import repack_fields\n", "from gpcam import GPOptimizer as GP\n", @@ -387,7 +385,11 @@ "source": [ "## Viewing model progression\n", "Now we can check how our model compared against the known test points at each iteration.\n", - "The comparison is based on the mean square error between model our known values at the test points." + "The comparison is based on the ***Mean Squared Error*** between the gpCAM model and our known\n", + "values at the test points.\n", + "\n", + "> **Note:** The graph may differ between runs because, although we seed libEnsemble's random number generator, \n", + "> gpCAM introduces some randomness when initializing hyperparameters." ] }, { @@ -398,50 +400,28 @@ "source": [ "#!/usr/bin/env python\n", "import matplotlib\n", - "from matplotlib.ticker import ScalarFormatter\n", "import matplotlib.pyplot as plt\n", - "plt.rc(\"axes\", axisbelow=True)\n", - "# Units\n", "\n", "# Get \"mean_squared_error\" from generators return (worker 0 as we ran gen_on_manager)\n", "mse = persis_info[0][\"mean_squared_error\"]\n", "niter = len(mse)\n", - "\n", "num_sims = list(range(batch_size, (niter * batch_size) + 1, batch_size))\n", "\n", - "\n", "# Plotting the data\n", "markersize = 10\n", "plt.figure(figsize=(10, 5))\n", - "plt.plot(num_sims, mse, marker=\"^\", markeredgecolor=\"black\", markeredgewidth=2, markersize=markersize, linewidth=2, label=\"Mean squared error\")\n", + "plt.plot(\n", + " num_sims, mse, marker=\"^\", markeredgecolor=\"black\", markeredgewidth=2, \n", + " markersize=markersize, linewidth=2, label=\"Mean squared error\"\n", + ")\n", "plt.xticks(num_sims)\n", "\n", - "# Get current labels\n", - "labels = [item.get_text() for item in plt.gca().get_xticklabels()]\n", - "new_labels = [str(num) if i % 4 == 0 else \"\" for i, num in enumerate(num_sims)]\n", - "new_labels[-1] = str(labels[-1])\n", - "\n", - "# Set new labels\n", - "plt.xticks(num_sims, new_labels)\n", - "\n", "# Labeling the axes and the legend\n", + "plt.title('Mean Squared Error at test points')\n", "plt.xlabel(\"Number of simulations\")\n", - "# plt.title('Mean Squared Error at test points')\n", + "plt.ylabel('Mean squared error (rad$^2$)')\n", "legend = plt.legend(framealpha=1, edgecolor=\"black\") # Increase edge width here\n", - "legend.get_frame().set_linewidth(2.0)\n", - "\n", - "# Create a ScalarFormatter object\n", - "y_formatter = ScalarFormatter(useOffset=False)\n", - "y_formatter.set_scientific(True)\n", - "y_formatter.set_powerlimits((-3, 3)) # Adjust power limits as necessary\n", - "\n", - "# Apply the formatter to the y-axis\n", - "plt.gca().yaxis.set_major_formatter(y_formatter)\n", - "plt.tight_layout()\n", - "\n", - "# Show the plot\n", "plt.grid(True)\n", - "save_str = \"shc_mse_\" + str(niter) + \"x\" + str(batch_size) + \".png\"\n", "plt.show()\n" ] }, From ace81d51833c771c9852f1753c152c1b2bbaaf58 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 14 Mar 2025 14:32:31 -0500 Subject: [PATCH 134/215] Remove prints and spaces --- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 4ad576dc6d..100a80ac80 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -127,7 +127,6 @@ "\n", " # Initialize\n", " rng_seed, batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", - " print(f'{rng_seed=}')\n", " ask_max_iter = gen_specs[\"user\"].get(\"ask_max_iter\") or 10\n", " test_points = _read_testpoints(gen_specs[\"user\"])\n", " my_gp = None\n", @@ -152,8 +151,6 @@ " )[\"x\"]\n", " \n", " H_o = np.zeros(batch_size, dtype=gen_specs[\"out\"])\n", - "\n", - " #print(f'{x_new=}')\n", " H_o[\"x\"] = x_new\n", " tag, Work, calc_in = ps.send_recv(H_o)\n", "\n", @@ -375,7 +372,6 @@ "ensemble.persis_info = {}\n", "\n", "H, persis_info, flag = ensemble.run()\n", - "print(\"\\n\\n\")\n", "print(persis_info)" ] }, @@ -424,13 +420,6 @@ "plt.grid(True)\n", "plt.show()\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 17f7c65b04f42bb0fec7b56555f0283ac09787c7 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 14 Mar 2025 15:42:34 -0500 Subject: [PATCH 135/215] Re-order notebook --- .../gpcam_surrogate_model/gpcam.ipynb | 139 ++++++++++-------- 1 file changed, 74 insertions(+), 65 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 100a80ac80..da572f34e1 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -69,79 +69,26 @@ "from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG\n", "from libensemble.tools.persistent_support import PersistentSupport\n", "\n", - "def _initialize_gpcAM(user_specs, libE_info):\n", - " \"\"\"Extract user params\"\"\"\n", - " rng_seed = user_specs.get(\"rng_seed\") # will default to None\n", - " b = user_specs[\"batch_size\"]\n", - " lb = np.array(user_specs[\"lb\"])\n", - " ub = np.array(user_specs[\"ub\"])\n", - " n = len(lb) # dimension\n", - " all_x = np.empty((0, n))\n", - " all_y = np.empty((0, 1))\n", - " ps = PersistentSupport(libE_info, EVAL_GEN_TAG) # init comms\n", - " return rng_seed, b, n, lb, ub, all_x, all_y, ps\n", - "\n", - "\n", - "def _read_testpoints(U):\n", - " \"\"\"Read numpy file containing evaluated points for measuring GP error\"\"\"\n", - " test_points_file = U.get(\"test_points_file\")\n", - " if test_points_file is None:\n", - " return None\n", - " test_points = np.load(test_points_file)\n", - " test_points = repack_fields(test_points[[\"x\", \"f\"]])\n", - " return test_points\n", - "\n", - "\n", - "def _compare_testpoints(my_gp, test_points, persis_info):\n", - " \"\"\"Compare model at test points\"\"\"\n", - " if test_points is None:\n", - " return\n", - " f_est = my_gp.posterior_mean(test_points[\"x\"])[\"f(x)\"]\n", - " mse = np.mean((f_est - test_points[\"f\"]) ** 2)\n", - " persis_info.setdefault(\"mean_squared_error\", []).append(float(mse))\n", - "\n", - "\n", - "def _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info):\n", - " \"\"\"Update gausian process with new points and train\"\"\"\n", - "\n", - " #TODO - CHECK JUST GIVING X_NEW, y_NEW - NEW GPCAM interface\n", - " all_x = np.vstack((all_x, x_new))\n", - " all_y = np.vstack((all_y, y_new))\n", - "\n", - " # TODO rmeove - or check this - or atleast calc first noise_variances=1e-8 * np.ones(len(all_y))\n", - " \n", - " if my_gp is None:\n", - " my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", - " else:\n", - " my_gp.tell(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", - " my_gp.train()\n", - " \n", - " if test_points is not None:\n", - " _compare_testpoints(my_gp, test_points, persis_info)\n", - "\n", - " return my_gp, all_x, all_y\n", - "\n", - "\n", "def persistent_gpCAM(H_in, persis_info, gen_specs, libE_info):\n", " \"\"\"Run a batched gpCAM model to create a surrogate\"\"\"\n", "\n", " # Initialize\n", - " rng_seed, batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", + " rng, batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", " ask_max_iter = gen_specs[\"user\"].get(\"ask_max_iter\") or 10\n", " test_points = _read_testpoints(gen_specs[\"user\"])\n", " my_gp = None\n", " \n", " # Start with a batch of random points\n", - " rng = np.random.default_rng(rng_seed) # Create random stream\n", " x_new = rng.uniform(lb, ub, (batch_size, n))\n", " H_o = np.zeros(batch_size, dtype=gen_specs[\"out\"]) \n", " H_o[\"x\"] = x_new\n", - " tag, Work, calc_in = ps.send_recv(H_o)\n", + " tag, Work, calc_in = ps.send_recv(H_o) # Send random points for evaluation and wait for results\n", "\n", " while tag not in [STOP_TAG, PERSIS_STOP]:\n", " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", " my_gp, all_x, all_y = _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info)\n", "\n", + " # Request new points\n", " x_new = my_gp.ask(\n", " input_set=np.column_stack((lb, ub)),\n", " n=batch_size,\n", @@ -178,7 +125,73 @@ "- **\"ucb\" / \"lcb\"**: Upper/Lower Confidence Bound.\n", "- **\"expected improvement\"**: Expected Improvement.\n", "\n", - "Some more options see: https://gpcam.lbl.gov/examples/acquisition-functions" + "---\n", + "\n", + "Some more options see: https://gpcam.lbl.gov/examples/acquisition-functions\n", + "\n", + "The following cell adds the functions used by `persistent_gpCAM`.\n", + "\n", + "`_update_gp` is where the GP is fed the data and trained. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def _initialize_gpcAM(user_specs, libE_info):\n", + " \"\"\"Extract user params\"\"\"\n", + " rng_seed = user_specs.get(\"rng_seed\") # will default to None\n", + " rng = np.random.default_rng(rng_seed) # Create random stream\n", + " b = user_specs[\"batch_size\"]\n", + " lb = np.array(user_specs[\"lb\"])\n", + " ub = np.array(user_specs[\"ub\"])\n", + " n = len(lb) # no. of dimensions\n", + " all_x = np.empty((0, n))\n", + " all_y = np.empty((0, 1))\n", + " ps = PersistentSupport(libE_info, EVAL_GEN_TAG) # init comms\n", + " return rng, b, n, lb, ub, all_x, all_y, ps\n", + "\n", + "\n", + "def _read_testpoints(U):\n", + " \"\"\"Read numpy file containing evaluated points for measuring GP error\"\"\"\n", + " test_points_file = U.get(\"test_points_file\")\n", + " if test_points_file is None:\n", + " return None\n", + " test_points = np.load(test_points_file)\n", + " test_points = repack_fields(test_points[[\"x\", \"f\"]])\n", + " return test_points\n", + "\n", + "\n", + "def _compare_testpoints(my_gp, test_points, persis_info):\n", + " \"\"\"Compare model at test points\"\"\"\n", + " if test_points is None:\n", + " return\n", + " f_est = my_gp.posterior_mean(test_points[\"x\"])[\"f(x)\"]\n", + " mse = np.mean((f_est - test_points[\"f\"]) ** 2)\n", + " persis_info.setdefault(\"mean_squared_error\", []).append(float(mse))\n", + "\n", + "\n", + "def _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info):\n", + " \"\"\"Update gausian process with new points and train\"\"\"\n", + "\n", + " #TODO - CHECK JUST GIVING X_NEW, y_NEW - NEW GPCAM interface\n", + " all_x = np.vstack((all_x, x_new))\n", + " all_y = np.vstack((all_y, y_new))\n", + "\n", + " # TODO rmeove - or check this - or atleast calc first noise_variances=1e-8 * np.ones(len(all_y))\n", + " \n", + " if my_gp is None:\n", + " my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", + " else:\n", + " my_gp.tell(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", + " my_gp.train()\n", + " \n", + " if test_points is not None:\n", + " _compare_testpoints(my_gp, test_points, persis_info)\n", + "\n", + " return my_gp, all_x, all_y" ] }, { @@ -189,7 +202,7 @@ "\n", "Simulator functions or `sim_f`s perform calculations based on parameters created in the generator function.\n", "\n", - "The function used here is the simple 2D Six Hump Camel, for demonstration purposes.\n", + "The function used here is the simple 2D `six_hump_camel`, for demonstration purposes.\n", "\n", "For running parallel applications in the simulator see the [forces examples](https://github.com/Libensemble/libensemble/tree/main/libensemble/tests/scaling_tests/forces/forces_simple)." ] @@ -201,10 +214,8 @@ "outputs": [], "source": [ "# Define our simulation function\n", - "\n", "import numpy as np\n", "\n", - "\n", "def six_hump_camel(H, persis_info, sim_specs, _):\n", " \"\"\"Six-Hump Camel sim_f.\"\"\"\n", " \n", @@ -234,11 +245,9 @@ "source": [ "## Calling Script\n", "\n", - "Our calling script contains configuration for libEnsemble, the generator function, and the simulator function. We then create the ensemble object and are ready to run the ensemble.\n", - "\n", - "First we will create a cleanup script so we can easily re-run.\n", + "Our calling script contains the configuration for libEnsemble, the generator function, and the simulator function. We then create the ensemble object and are ready to run the ensemble.\n", "\n", - "*****TODO: EXPLAIN gen_on_manager=True, final_gen_send=True" + "First we will create a cleanup script so we can easily re-run." ] }, { @@ -283,6 +292,7 @@ "nworkers = 4\n", "\n", "# When using gen_on_manager, nworkers is number of concurrent sims.\n", + "# final_gen_send means the last evaluated points are returned to the generator to update the model.\n", "libE_specs = LibeSpecs(nworkers=nworkers, gen_on_manager=True, final_gen_send=True)\n", "\n", "n = 2 # Input dimensions\n", @@ -363,7 +373,6 @@ "metadata": {}, "outputs": [], "source": [ - "# Run again with a different seed. We Can check use last run as test points to see model improvement.\n", "ensemble.gen_specs.user[\"rng_seed\"] = 123\n", "ensemble.gen_specs.user[\"test_points_file\"] = \"H_array.npy\" # our previous file\n", "\n", From fb8c6091669af4eb3d59fdd4dd61ad194b9d9f6d Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 14 Mar 2025 16:34:31 -0500 Subject: [PATCH 136/215] Update submission script examples --- docs/platforms/example_scripts.rst | 31 +++++++++++++++++++ .../bebop_submit_slurm_central.sh | 2 +- .../bridges_submit_slurm_central.sh | 2 +- .../submit_pbs_aurora.sh | 7 +++-- .../submit_pbs_polaris.sh | 2 +- .../submit_pbs_simple.sh | 2 +- .../submit_slurm_simple.sh | 2 +- .../submission_scripts/submit_pbs_aurora.sh | 5 ++- .../submission_scripts/submit_pbs_polaris.sh | 2 +- .../submission_scripts/submit_pbs_simple.sh | 2 +- .../submission_scripts/submit_slurm_simple.sh | 2 +- 11 files changed, 46 insertions(+), 13 deletions(-) diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index df8e0b3942..c8182eaf09 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -5,12 +5,43 @@ Below are example submission scripts used to configure and launch libEnsemble on a variety of high-powered systems. See :doc:`here` for more information about the respective systems and configuration. +General examples +---------------- + .. dropdown:: Slurm - Basic .. literalinclude:: ../../examples/libE_submission_scripts/submit_slurm_simple.sh :caption: /examples/libE_submission_scripts/submit_slurm_simple.sh :language: bash +.. dropdown:: PBS - Basic + + .. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_simple.sh + :caption: /examples/libE_submission_scripts/submit_pbs_simple.sh + :language: bash + +.. dropdown:: LSF - Basic + + .. literalinclude:: ../../examples/libE_submission_scripts/submit_lsf_simple.sh + :caption: /examples/libE_submission_scripts/submit_lsf_simple.sh + :language: bash + + +System Examples +--------------- + +.. dropdown:: Aurora + + .. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_aurora.sh + :caption: /examples/libE_submission_scripts/submit_pbs_aurora.sh + :language: bash + +.. dropdown:: Polaris + + .. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_polaris.sh + :caption: /examples/libE_submission_scripts/submit_pbs_polaris.sh + :language: bash + .. dropdown:: Bridges - Central Mode .. literalinclude:: ../../examples/libE_submission_scripts/bridges_submit_slurm_central.sh diff --git a/examples/libE_submission_scripts/bebop_submit_slurm_central.sh b/examples/libE_submission_scripts/bebop_submit_slurm_central.sh index 011db26eb0..f599a05099 100644 --- a/examples/libE_submission_scripts/bebop_submit_slurm_central.sh +++ b/examples/libE_submission_scripts/bebop_submit_slurm_central.sh @@ -21,4 +21,4 @@ export I_MPI_FABRICS=shm:tmi srun --overcommit --ntasks=$(($NUM_WORKERS+1)) --nodes=1 python $EXE # To use local mode instead of mpi4py (with parse_args()) -# python calling_script.py --comms local --nworkers $NUM_WORKERS +# python calling_script.py -n $NUM_WORKERS diff --git a/examples/libE_submission_scripts/bridges_submit_slurm_central.sh b/examples/libE_submission_scripts/bridges_submit_slurm_central.sh index d00f3d0417..85fff856e3 100644 --- a/examples/libE_submission_scripts/bridges_submit_slurm_central.sh +++ b/examples/libE_submission_scripts/bridges_submit_slurm_central.sh @@ -19,4 +19,4 @@ export NUM_WORKERS=4 mpirun -np $(($NUM_WORKERS+1)) -ppn $(($NUM_WORKERS+1)) python $EXE # To use local mode instead of mpi4py (with parse_args()) -# python $EXE --comms local --nworkers $NUM_WORKERS +# python $EXE -n $NUM_WORKERS diff --git a/examples/libE_submission_scripts/submit_pbs_aurora.sh b/examples/libE_submission_scripts/submit_pbs_aurora.sh index b6b3625d06..0dfa59f6b6 100644 --- a/examples/libE_submission_scripts/submit_pbs_aurora.sh +++ b/examples/libE_submission_scripts/submit_pbs_aurora.sh @@ -4,11 +4,14 @@ #PBS -q #PBS -A -module use /soft/modulefiles module load frameworks export MPICH_GPU_SUPPORT_ENABLED=1 cd $PBS_O_WORKDIR # 2 nodes - 12 sim workers (6 GPUs per node) -python libE_calling_script.py --comms local --nworkers 13 +python libE_calling_script.py -n 13 + +# if using libE_specs["use_tiles_as_gpus"] = True +# 2 nodes 24 sim workers (12 GPU tiles per node) libE_specs["use_tiles_as_gpus"] = True +# python libE_calling_script.py -n 25 diff --git a/examples/libE_submission_scripts/submit_pbs_polaris.sh b/examples/libE_submission_scripts/submit_pbs_polaris.sh index 0746450ec6..f89d59824a 100644 --- a/examples/libE_submission_scripts/submit_pbs_polaris.sh +++ b/examples/libE_submission_scripts/submit_pbs_polaris.sh @@ -7,4 +7,4 @@ export MPICH_GPU_SUPPORT_ENABLED=1 cd $PBS_O_WORKDIR -python libE_calling_script.py --comms local --nworkers 4 +python libE_calling_script.py -n 4 diff --git a/examples/libE_submission_scripts/submit_pbs_simple.sh b/examples/libE_submission_scripts/submit_pbs_simple.sh index 161d38d40a..9e2f4e901b 100644 --- a/examples/libE_submission_scripts/submit_pbs_simple.sh +++ b/examples/libE_submission_scripts/submit_pbs_simple.sh @@ -7,4 +7,4 @@ # We selected 2 nodes - now running with 8 workers. export MPICH_GPU_SUPPORT_ENABLED=1 cd $PBS_O_WORKDIR -python run_libe_forces.py --comms local --nworkers 8 +python libE_calling_script.py -n 8 diff --git a/examples/libE_submission_scripts/submit_slurm_simple.sh b/examples/libE_submission_scripts/submit_slurm_simple.sh index e508acc9b6..79171f1e2a 100644 --- a/examples/libE_submission_scripts/submit_slurm_simple.sh +++ b/examples/libE_submission_scripts/submit_slurm_simple.sh @@ -12,4 +12,4 @@ export SLURM_EXACT=1 export SLURM_MEM_PER_NODE=0 -python libe_calling_script.py --comms local --nworkers 8 +python libe_calling_script.py -n 8 diff --git a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_aurora.sh b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_aurora.sh index fcc3ef80e9..3e5e864fd0 100644 --- a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_aurora.sh +++ b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_aurora.sh @@ -4,15 +4,14 @@ #PBS -q #PBS -A -module use /soft/modulefiles module load frameworks export MPICH_GPU_SUPPORT_ENABLED=1 cd $PBS_O_WORKDIR # 2 nodes - 12 sim workers (6 GPUs per node) -python run_libe_forces.py --comms local --nworkers 13 +python run_libe_forces.py -n 13 # if using libE_specs["use_tiles_as_gpus"] = True # 2 nodes 24 sim workers (12 GPU tiles per node) -# python run_libe_forces.py --comms local --nworkers 25 +# python run_libe_forces.py -n 25 diff --git a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_polaris.sh b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_polaris.sh index 2501b23546..9f5d23f0bb 100644 --- a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_polaris.sh +++ b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_polaris.sh @@ -7,4 +7,4 @@ export MPICH_GPU_SUPPORT_ENABLED=1 cd $PBS_O_WORKDIR -python run_libe_forces.py --comms local --nworkers 5 +python run_libe_forces.py -n 5 diff --git a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_simple.sh b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_simple.sh index 2501b23546..9f5d23f0bb 100644 --- a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_simple.sh +++ b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_pbs_simple.sh @@ -7,4 +7,4 @@ export MPICH_GPU_SUPPORT_ENABLED=1 cd $PBS_O_WORKDIR -python run_libe_forces.py --comms local --nworkers 5 +python run_libe_forces.py -n 5 diff --git a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_slurm_simple.sh b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_slurm_simple.sh index 97b600ac3e..b59bf94f14 100644 --- a/libensemble/tests/scaling_tests/forces/submission_scripts/submit_slurm_simple.sh +++ b/libensemble/tests/scaling_tests/forces/submission_scripts/submit_slurm_simple.sh @@ -12,4 +12,4 @@ export SLURM_EXACT=1 export SLURM_MEM_PER_NODE=0 -python run_libe_forces.py --comms local --nworkers 9 +python run_libe_forces.py -n 9 From 9bb1c4b28f56d07234239fc91c0d4983e60b29b4 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 14 Mar 2025 16:38:48 -0500 Subject: [PATCH 137/215] Add simple LSF script --- examples/libE_submission_scripts/submit_lsf_simple.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 examples/libE_submission_scripts/submit_lsf_simple.sh diff --git a/examples/libE_submission_scripts/submit_lsf_simple.sh b/examples/libE_submission_scripts/submit_lsf_simple.sh new file mode 100644 index 0000000000..bfd86331e9 --- /dev/null +++ b/examples/libE_submission_scripts/submit_lsf_simple.sh @@ -0,0 +1,7 @@ +#!/bin/bash -l +#BSUB -P +#BSUB -J libe_mproc +#BSUB -W 15 +#BSUB -nnodes 2 + +python run_libe_forces.py -n 8 From 2f7001cd251b0bcadc3f1c8928b10386bc5afc0b Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 14 Mar 2025 17:13:52 -0500 Subject: [PATCH 138/215] Mirror submission scripts to examples section --- docs/examples/submission_scripts.rst | 1 + docs/index.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 docs/examples/submission_scripts.rst diff --git a/docs/examples/submission_scripts.rst b/docs/examples/submission_scripts.rst new file mode 100644 index 0000000000..1f853585b5 --- /dev/null +++ b/docs/examples/submission_scripts.rst @@ -0,0 +1 @@ +.. include:: ../platforms/example_scripts.rst diff --git a/docs/index.rst b/docs/index.rst index 3cfa749e97..72dc1e2252 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -34,6 +34,7 @@ examples/sim_funcs examples/alloc_funcs examples/calling_scripts + Submission Scripts .. toctree:: :maxdepth: 1 From 2fbde0050689be0d041036fd4b03c4307850bfee Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Mar 2025 13:22:58 -0500 Subject: [PATCH 139/215] Add example submit scripts perlmutter/frontier --- docs/platforms/example_scripts.rst | 13 +++++++++++++ .../submit_frontier_large.sh | 11 +++++++++++ .../libE_submission_scripts/submit_perlmutter.sh | 16 ++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 examples/libE_submission_scripts/submit_frontier_large.sh create mode 100644 examples/libE_submission_scripts/submit_perlmutter.sh diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index c8182eaf09..188ce78837 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -36,6 +36,19 @@ System Examples :caption: /examples/libE_submission_scripts/submit_pbs_aurora.sh :language: bash +.. dropdown:: Frontier (Large WarpX Ensemble) + + .. literalinclude:: ../../examples/libE_submission_scripts/submit_frontier_large.sh + :caption: /examples/libE_submission_scripts/submit_frontier_large.sh + :language: bash + + +.. dropdown:: Perlmutter + + .. literalinclude:: ../../examples/libE_submission_scripts/submit_perlmutter.sh + :caption: /examples/libE_submission_scripts/submit_perlmutter.sh + :language: bash + .. dropdown:: Polaris .. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_polaris.sh diff --git a/examples/libE_submission_scripts/submit_frontier_large.sh b/examples/libE_submission_scripts/submit_frontier_large.sh new file mode 100644 index 0000000000..0f755179f7 --- /dev/null +++ b/examples/libE_submission_scripts/submit_frontier_large.sh @@ -0,0 +1,11 @@ +#!/bin/bash +#SBATCH -J libE_warpX_full_sim_32x40 +#SBATCH -A +#SBATCH -p batch +#SBATCH --time 6:00:00 +#SBATCH --nodes 240 + +module load cray-python + +# Run one gen and 40 sim workers (6 nodes = 48 GPUs each) +python run_gpcam_warpx.py -n 41 diff --git a/examples/libE_submission_scripts/submit_perlmutter.sh b/examples/libE_submission_scripts/submit_perlmutter.sh new file mode 100644 index 0000000000..ae34d39e56 --- /dev/null +++ b/examples/libE_submission_scripts/submit_perlmutter.sh @@ -0,0 +1,16 @@ +#!/bin/bash +#SBATCH -J libE_small_test +#SBATCH -A +#SBATCH -C gpu +#SBATCH --time 10 +#SBATCH --nodes 1 + +# This script is using GPU partition +export MPICH_GPU_SUPPORT_ENABLED=1 +export SLURM_EXACT=1 + +# One worker for generator and 4 for sims (one GPU each) +python libe_calling_script.py -n 5 + +# Or if libE_specs option gen_on_manager=True +python libe_calling_script.py -n 4 From 2dc0162862acfd9589b38a535ace082b0685de24 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Mar 2025 14:51:53 -0500 Subject: [PATCH 140/215] Prevent Colab downgrading numpy --- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index da572f34e1..38c954ee67 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -8,10 +8,11 @@ "\n", "Ensure that libEnsemble, and gpCAM are installed via: `pip install libensemble gpcam`\n", " \n", - "**Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", - "To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", + "> **Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", + "> To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", "\n", - "Optionally, you can install libEnsemble and gpCAM here." + "> **Note:** If using **Colab** the following cells installs gpCAM and prevents Colab downgrading numpy due to pre-installs.\n", + "> Restart session when prompted (the warnings can be ignored)." ] }, { @@ -24,9 +25,8 @@ "if 'google.colab' in sys.modules:\n", " #!pip install libensemble\n", " !pip install git+https://github.com/Libensemble/libensemble.git@examples/gpcam_notebook ################ tmp\n", - " !pip install gpcam \n", - " # Prevent downgraded numpy in colab\n", - " !pip install numpy>=2.0 --no-cache-dir --force-reinstall --ignore-installed" + " # Prevent downgraded numpy in colab due to preinstalls - \n", + " !pip install --upgrade --force-reinstall numpy==2.1.1 scipy gpcam fvgp" ] }, { From ee9c3943eae40f93f790ae62b6ac8314bf880ad1 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Mar 2025 15:01:17 -0500 Subject: [PATCH 141/215] Update wording --- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 38c954ee67..e3feb13352 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -46,7 +46,7 @@ "source": [ "## Generator function\n", "\n", - "The GP cam generator function is called ``persistent_gpCAM``.\n", + "The gpCAM generator function is called ``persistent_gpCAM``.\n", "\n", "This persistent generator is started at the beginning and runs until the Ensemble closes down.\n", "\n", @@ -125,9 +125,9 @@ "- **\"ucb\" / \"lcb\"**: Upper/Lower Confidence Bound.\n", "- **\"expected improvement\"**: Expected Improvement.\n", "\n", - "---\n", + "For more options see: https://gpcam.lbl.gov/examples/acquisition-functions\n", "\n", - "Some more options see: https://gpcam.lbl.gov/examples/acquisition-functions\n", + "---\n", "\n", "The following cell adds the functions used by `persistent_gpCAM`.\n", "\n", @@ -201,6 +201,7 @@ "## Simulator function\n", "\n", "Simulator functions or `sim_f`s perform calculations based on parameters created in the generator function.\n", + "Each worker will run a copy of this function in parallel.\n", "\n", "The function used here is the simple 2D `six_hump_camel`, for demonstration purposes.\n", "\n", From aaac8ced0b54643830f5a1ae123acfef501833f0 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Mar 2025 15:20:40 -0500 Subject: [PATCH 142/215] Append new points on tell --- .../gpcam_surrogate_model/gpcam.ipynb | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index e3feb13352..d2400cbaf0 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -31,9 +31,7 @@ }, { "cell_type": "markdown", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, + "metadata": {}, "source": [ "## gpCAM Surrogate Model Tutorial\n", "\n", @@ -73,7 +71,7 @@ " \"\"\"Run a batched gpCAM model to create a surrogate\"\"\"\n", "\n", " # Initialize\n", - " rng, batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", + " rng, batch_size, n, lb, ub, x_new, y_new, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", " ask_max_iter = gen_specs[\"user\"].get(\"ask_max_iter\") or 10\n", " test_points = _read_testpoints(gen_specs[\"user\"])\n", " my_gp = None\n", @@ -86,7 +84,7 @@ "\n", " while tag not in [STOP_TAG, PERSIS_STOP]:\n", " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", - " my_gp, all_x, all_y = _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info)\n", + " my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info)\n", "\n", " # Request new points\n", " x_new = my_gp.ask(\n", @@ -99,12 +97,12 @@ " \n", " H_o = np.zeros(batch_size, dtype=gen_specs[\"out\"])\n", " H_o[\"x\"] = x_new\n", - " tag, Work, calc_in = ps.send_recv(H_o)\n", + " tag, Work, calc_in = ps.send_recv(H_o) # Send points for evaluation and wait for results\n", "\n", " # If final points were returned update the model\n", " if calc_in is not None:\n", " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", - " my_gp, all_x, all_y = _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info)\n", + " my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info)\n", "\n", " return None, persis_info, FINISHED_PERSISTENT_GEN_TAG" ] @@ -148,10 +146,10 @@ " lb = np.array(user_specs[\"lb\"])\n", " ub = np.array(user_specs[\"ub\"])\n", " n = len(lb) # no. of dimensions\n", - " all_x = np.empty((0, n))\n", - " all_y = np.empty((0, 1))\n", + " init_x = np.empty((0, n))\n", + " init_y = np.empty((0, 1))\n", " ps = PersistentSupport(libE_info, EVAL_GEN_TAG) # init comms\n", - " return rng, b, n, lb, ub, all_x, all_y, ps\n", + " return rng, b, n, lb, ub, init_x, init_y, ps\n", "\n", "\n", "def _read_testpoints(U):\n", @@ -173,25 +171,19 @@ " persis_info.setdefault(\"mean_squared_error\", []).append(float(mse))\n", "\n", "\n", - "def _update_gp(my_gp, all_x, all_y, x_new, y_new, test_points, persis_info):\n", + "def _update_gp(my_gp, x_new, y_new, test_points, persis_info):\n", " \"\"\"Update gausian process with new points and train\"\"\"\n", - "\n", - " #TODO - CHECK JUST GIVING X_NEW, y_NEW - NEW GPCAM interface\n", - " all_x = np.vstack((all_x, x_new))\n", - " all_y = np.vstack((all_y, y_new))\n", - "\n", - " # TODO rmeove - or check this - or atleast calc first noise_variances=1e-8 * np.ones(len(all_y))\n", - " \n", + " noise = 1e-8 * np.ones(len(y_new)) # Initializes noise - default \n", " if my_gp is None:\n", - " my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", + " my_gp = GP(x_new, y_new.flatten(), noise_variances=noise)\n", " else:\n", - " my_gp.tell(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y)))\n", + " my_gp.tell(x_new, y_new.flatten(), noise_variances=noise, append=True)\n", " my_gp.train()\n", " \n", " if test_points is not None:\n", " _compare_testpoints(my_gp, test_points, persis_info)\n", "\n", - " return my_gp, all_x, all_y" + " return my_gp" ] }, { From 411593cd10eeeecdd1200df7e7f16c0451f553bb Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Mar 2025 15:22:47 -0500 Subject: [PATCH 143/215] Fix spelling --- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index d2400cbaf0..d930e6fe00 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -172,7 +172,7 @@ "\n", "\n", "def _update_gp(my_gp, x_new, y_new, test_points, persis_info):\n", - " \"\"\"Update gausian process with new points and train\"\"\"\n", + " \"\"\"Update Gaussian process with new points and train\"\"\"\n", " noise = 1e-8 * np.ones(len(y_new)) # Initializes noise - default \n", " if my_gp is None:\n", " my_gp = GP(x_new, y_new.flatten(), noise_variances=noise)\n", From e6ac7bdfce159d66a7b2fbf7b3bfcc8160c91e8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 20:36:26 +0000 Subject: [PATCH 144/215] Bump the python-updates group with 2 updates Bumps the python-updates group with 2 updates: [globus-compute-sdk](https://github.com/globus/globus-compute) and [anyio](https://github.com/agronholm/anyio). Updates `globus-compute-sdk` from 3.1.1 to 3.3.1 - [Release notes](https://github.com/globus/globus-compute/releases) - [Changelog](https://github.com/globus/globus-compute/blob/3.3.1/docs/changelog.rst) - [Commits](https://github.com/globus/globus-compute/compare/3.1.1...3.3.1) Updates `anyio` from 4.8.0 to 4.9.0 - [Release notes](https://github.com/agronholm/anyio/releases) - [Changelog](https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst) - [Commits](https://github.com/agronholm/anyio/compare/4.8.0...4.9.0) --- updated-dependencies: - dependency-name: globus-compute-sdk dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates - dependency-name: anyio dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- install/misc_feature_requirements.txt | 2 +- install/testing_requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install/misc_feature_requirements.txt b/install/misc_feature_requirements.txt index 1786efcaf0..626b2bdefd 100644 --- a/install/misc_feature_requirements.txt +++ b/install/misc_feature_requirements.txt @@ -1 +1 @@ -globus-compute-sdk==3.1.1 +globus-compute-sdk==3.3.1 diff --git a/install/testing_requirements.txt b/install/testing_requirements.txt index 20b9b545d0..5e78c8b7e3 100644 --- a/install/testing_requirements.txt +++ b/install/testing_requirements.txt @@ -5,7 +5,7 @@ pytest-cov==6.0.0 pytest-timeout==2.3.1 mock==5.2.0 python-dateutil==2.9.0.post0 -anyio==4.8.0 +anyio==4.9.0 matplotlib==3.10.1 mpmath==1.3.0 rich==13.9.4 From eea565c91a7533961c2e884560c2016c6bdd48b7 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Mar 2025 18:09:53 -0500 Subject: [PATCH 145/215] Update gpCAM gen functions --- .../gpcam_surrogate_model/gpcam.ipynb | 16 +-- libensemble/gen_funcs/persistent_gpCAM.py | 109 +++++++++--------- .../tests/regression_tests/test_gpCAM.py | 5 +- 3 files changed, 67 insertions(+), 63 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index d930e6fe00..994fa18a98 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -74,6 +74,7 @@ " rng, batch_size, n, lb, ub, x_new, y_new, ps = _initialize_gpcAM(gen_specs[\"user\"], libE_info)\n", " ask_max_iter = gen_specs[\"user\"].get(\"ask_max_iter\") or 10\n", " test_points = _read_testpoints(gen_specs[\"user\"])\n", + " noise = 1e-8 # Initializes noise\n", " my_gp = None\n", " \n", " # Start with a batch of random points\n", @@ -84,14 +85,14 @@ "\n", " while tag not in [STOP_TAG, PERSIS_STOP]:\n", " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", - " my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info)\n", + " my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise)\n", "\n", " # Request new points\n", " x_new = my_gp.ask(\n", " input_set=np.column_stack((lb, ub)),\n", " n=batch_size,\n", " pop_size=batch_size,\n", - " acquisition_function=\"total correlation\", # \n", + " acquisition_function=\"total correlation\",\n", " max_iter=ask_max_iter, # Larger takes longer. gpCAM default is 20.\n", " )[\"x\"]\n", " \n", @@ -102,7 +103,7 @@ " # If final points were returned update the model\n", " if calc_in is not None:\n", " y_new = np.atleast_2d(calc_in[\"f\"]).T\n", - " my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info)\n", + " my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise)\n", "\n", " return None, persis_info, FINISHED_PERSISTENT_GEN_TAG" ] @@ -171,13 +172,13 @@ " persis_info.setdefault(\"mean_squared_error\", []).append(float(mse))\n", "\n", "\n", - "def _update_gp(my_gp, x_new, y_new, test_points, persis_info):\n", + "def _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise):\n", " \"\"\"Update Gaussian process with new points and train\"\"\"\n", - " noise = 1e-8 * np.ones(len(y_new)) # Initializes noise - default \n", + " noise_arr = noise * np.ones(len(y_new)) # Initializes noise\n", " if my_gp is None:\n", - " my_gp = GP(x_new, y_new.flatten(), noise_variances=noise)\n", + " my_gp = GP(x_new, y_new.flatten(), noise_variances=noise_arr)\n", " else:\n", - " my_gp.tell(x_new, y_new.flatten(), noise_variances=noise, append=True)\n", + " my_gp.tell(x_new, y_new.flatten(), noise_variances=noise_arr, append=True)\n", " my_gp.train()\n", " \n", " if test_points is not None:\n", @@ -396,7 +397,6 @@ "metadata": {}, "outputs": [], "source": [ - "#!/usr/bin/env python\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "\n", diff --git a/libensemble/gen_funcs/persistent_gpCAM.py b/libensemble/gen_funcs/persistent_gpCAM.py index c95b9cac1a..f130950468 100644 --- a/libensemble/gen_funcs/persistent_gpCAM.py +++ b/libensemble/gen_funcs/persistent_gpCAM.py @@ -15,25 +15,18 @@ ] -def _initialize_gpcAM(user_specs, libE_info): +def _initialize_gpcAM(user_specs, libE_info, persis_info): """Extract user params""" + rng_seed = user_specs.get("rng_seed") # Will default to None + rng = persis_info.get("rand_stream") or np.random.default_rng(rng_seed) b = user_specs["batch_size"] lb = np.array(user_specs["lb"]) ub = np.array(user_specs["ub"]) - n = len(lb) # dimension - assert isinstance(b, int), "Batch size must be an integer" - assert isinstance(n, int), "Dimension must be an integer" - assert isinstance(lb, np.ndarray), "lb must be a numpy array" - assert isinstance(ub, np.ndarray), "ub must be a numpy array" - - all_x = np.empty((0, n)) - all_y = np.empty((0, 1)) - - ps = PersistentSupport(libE_info, EVAL_GEN_TAG) - - np.random.seed(0) - - return b, n, lb, ub, all_x, all_y, ps + n = len(lb) # no. of dimensions + init_x = np.empty((0, n)) + init_y = np.empty((0, 1)) + ps = PersistentSupport(libE_info, EVAL_GEN_TAG) # init comms + return rng, b, n, lb, ub, init_x, init_y, ps def _read_testpoints(U): @@ -41,7 +34,6 @@ def _read_testpoints(U): test_points_file = U.get("test_points_file") if test_points_file is None: return None - test_points = np.load(test_points_file) # Remove any NaNs @@ -54,6 +46,30 @@ def _read_testpoints(U): return test_points +def _compare_testpoints(my_gp, test_points, persis_info): + """Compare model at test points""" + if test_points is None: + return + f_est = my_gp.posterior_mean(test_points["x"])["f(x)"] + mse = np.mean((f_est - test_points["f"]) ** 2) + persis_info.setdefault("mean_squared_error", []).append(float(mse)) + + +def _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise): + """Update Gaussian process with new points and train""" + noise_arr = noise * np.ones(len(y_new)) # Initializes noise + if my_gp is None: + my_gp = GP(x_new, y_new.flatten(), noise_variances=noise_arr) + else: + my_gp.tell(x_new, y_new.flatten(), noise_variances=noise_arr, append=True) + my_gp.train() + + if test_points is not None: + _compare_testpoints(my_gp, test_points, persis_info) + + return my_gp + + def _generate_mesh(lb, ub, num_points=10): """ Generate a mesh of points in n-dimensional space over a hypercube defined by lb and ub. @@ -96,9 +112,7 @@ def _eval_var(my_gp, all_x, all_y, x_for_var, test_points, persis_info): persis_info.setdefault("mean_variance", []).append(np.mean(var_vals)) if test_points is not None: - f_est = my_gp.posterior_mean(test_points["x"])["f(x)"] - mse = np.mean((f_est - test_points["f"]) ** 2) - persis_info.setdefault("mean_squared_error", []).append(mse) + _compare_testpoints(my_gp, test_points, persis_info) return np.array(var_vals) @@ -152,29 +166,23 @@ def persistent_gpCAM(H_in, persis_info, gen_specs, libE_info): `test_gpCAM.py `_ """ # noqa - batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(gen_specs["user"], libE_info) + rng, batch_size, n, lb, ub, x_new, y_new, ps = _initialize_gpcAM(gen_specs["user"], libE_info, persis_info) ask_max_iter = gen_specs["user"].get("ask_max_iter") or 10 + test_points = _read_testpoints(gen_specs["user"]) + noise = 1e-8 # Initializes noise + my_gp = None + # Start with a batch of random points + x_new = rng.uniform(lb, ub, (batch_size, n)) H_o = np.zeros(batch_size, dtype=gen_specs["out"]) - x_new = persis_info["rand_stream"].uniform(lb, ub, (batch_size, n)) H_o["x"] = x_new + tag, Work, calc_in = ps.send_recv(H_o) # Send random points for evaluation and wait - tag, Work, calc_in = ps.send_recv(H_o) - - first_call = True while tag not in [STOP_TAG, PERSIS_STOP]: - all_x = np.vstack((all_x, x_new)) - all_y = np.vstack((all_y, np.atleast_2d(calc_in["f"]).T)) - - if first_call: - # Initialize GP - my_gp = GP(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y))) - first_call = False - else: - my_gp.tell(all_x, all_y.flatten(), noise_variances=1e-8 * np.ones(len(all_y))) - - my_gp.train() + y_new = np.atleast_2d(calc_in["f"]).T + my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise) + # Request new points start = time.time() x_new = my_gp.ask( input_set=np.column_stack((lb, ub)), @@ -184,11 +192,16 @@ def persistent_gpCAM(H_in, persis_info, gen_specs, libE_info): max_iter=ask_max_iter, # Larger takes longer. gpCAM default is 20. )["x"] print(f"Ask time:{time.time() - start}") + H_o = np.zeros(batch_size, dtype=gen_specs["out"]) H_o["x"] = x_new - tag, Work, calc_in = ps.send_recv(H_o) + # If final points were returned update the model + if calc_in is not None: + y_new = np.atleast_2d(calc_in["f"]).T + my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise) + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG @@ -217,8 +230,7 @@ def persistent_gpCAM_covar(H_in, persis_info, gen_specs, libE_info): noise = 1e-12 test_points = _read_testpoints(U) - - batch_size, n, lb, ub, all_x, all_y, ps = _initialize_gpcAM(U, libE_info) + rng, batch_size, n, lb, ub, x_new, y_new, ps = _initialize_gpcAM(gen_specs["user"], libE_info, persis_info) # Send batches until manager sends stop tag tag = None @@ -229,14 +241,14 @@ def persistent_gpCAM_covar(H_in, persis_info, gen_specs, libE_info): x_for_var = _generate_mesh(lb, ub, num_points) r_low_init, r_high_init = _calculate_grid_distances(lb, ub, num_points) else: - x_for_var = persis_info["rand_stream"].uniform(lb, ub, (10 * batch_size, n)) + x_for_var = rng.uniform(lb, ub, (10 * batch_size, n)) while tag not in [STOP_TAG, PERSIS_STOP]: - if all_x.shape[0] == 0: - x_new = persis_info["rand_stream"].uniform(lb, ub, (batch_size, n)) + if x_new.shape[0] == 0: + x_new = rng.uniform(lb, ub, (batch_size, n)) else: if not U.get("use_grid"): - x_for_var = persis_info["rand_stream"].uniform(lb, ub, (10 * batch_size, n)) + x_for_var = rng.uniform(lb, ub, (10 * batch_size, n)) x_new = x_for_var[np.argsort(var_vals)[-batch_size:]] else: r_high = r_high_init @@ -261,17 +273,10 @@ def persistent_gpCAM_covar(H_in, persis_info, gen_specs, libE_info): nan_indices = [i for i, fval in enumerate(y_new) if np.isnan(fval)] x_new = np.delete(x_new, nan_indices, axis=0) y_new = np.delete(y_new, nan_indices, axis=0) - all_x = np.vstack((all_x, x_new)) - all_y = np.vstack((all_y, y_new)) - - if my_gp is None: - my_gp = GP(all_x, all_y.flatten(), noise_variances=noise * np.ones(len(all_y))) - else: - my_gp.tell(all_x, all_y.flatten(), noise_variances=noise * np.ones(len(all_y))) - my_gp.train() + my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise) if not U.get("use_grid"): - x_for_var = persis_info["rand_stream"].uniform(lb, ub, (10 * batch_size, n)) - var_vals = _eval_var(my_gp, all_x, all_y, x_for_var, test_points, persis_info) + x_for_var = rng.uniform(lb, ub, (10 * batch_size, n)) + var_vals = _eval_var(my_gp, x_new, y_new, x_for_var, test_points, persis_info) return None, persis_info, FINISHED_PERSISTENT_GEN_TAG diff --git a/libensemble/tests/regression_tests/test_gpCAM.py b/libensemble/tests/regression_tests/test_gpCAM.py index d59eabdc55..34836d15ab 100644 --- a/libensemble/tests/regression_tests/test_gpCAM.py +++ b/libensemble/tests/regression_tests/test_gpCAM.py @@ -36,11 +36,10 @@ from libensemble.sim_funcs.rosenbrock import rosenbrock_eval as sim_f from libensemble.tools import add_unique_random_streams, parse_args, save_libE_output -# Main block is necessary only when using local comms with spawn start method (default on macOS and Windows). - warnings.filterwarnings("ignore", message="Default hyperparameter_bounds") +warnings.filterwarnings("ignore", message="Hyperparameters initialized") - +# Main block is necessary only when using local comms with spawn start method (default on macOS and Windows). if __name__ == "__main__": nworkers, is_manager, libE_specs, _ = parse_args() From 7320dc70f128f8d1a26fccdc53d2568fcf85f62b Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 17 Mar 2025 18:54:17 -0500 Subject: [PATCH 146/215] Add online gpCAM tutorial --- docs/index.rst | 1 + docs/tutorials/gpcam_tutorial.rst | 332 ++++++++++++++++++ docs/tutorials/tutorials.rst | 1 + .../gpcam_surrogate_model/gpcam.ipynb | 12 +- 4 files changed, 339 insertions(+), 7 deletions(-) create mode 100644 docs/tutorials/gpcam_tutorial.rst diff --git a/docs/index.rst b/docs/index.rst index 72dc1e2252..9f7093ff10 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -23,6 +23,7 @@ tutorials/local_sine_tutorial tutorials/executor_forces_tutorial tutorials/forces_gpu_tutorial + tutorials/gpcam_tutorial tutorials/aposmm_tutorial tutorials/calib_cancel_tutorial diff --git a/docs/tutorials/gpcam_tutorial.rst b/docs/tutorials/gpcam_tutorial.rst new file mode 100644 index 0000000000..3774d15190 --- /dev/null +++ b/docs/tutorials/gpcam_tutorial.rst @@ -0,0 +1,332 @@ +gpCAM Surrogate Model Tutorial +============================== + +This generation function constructs a global surrogate of ``f`` values, using a Gaussian process. + +|Open in Colab| + +Ensure that libEnsemble, and gpCAM are installed via: ``pip install libensemble gpcam`` + +Generator function +----------------- + +The gpCAM generator function is called ``persistent_gpCAM``. + +This persistent generator is started at the beginning and runs until the Ensemble closes down. + +This is a version of the gpCAM generator that can be found, along with other gpCAM generator functions, at `libensemble/gen_funcs/persistent_gpCAM.py `_ and can be imported from that location when libEnsemble is installed as follows: + +``from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM`` + +.. code-block:: python + + import numpy as np + from numpy.lib.recfunctions import repack_fields + from gpcam import GPOptimizer as GP + + # Standard options for manager/generator comms + from libensemble.message_numbers import EVAL_GEN_TAG, FINISHED_PERSISTENT_GEN_TAG, PERSIS_STOP, STOP_TAG + from libensemble.tools.persistent_support import PersistentSupport + + def persistent_gpCAM(H_in, persis_info, gen_specs, libE_info): + """Run a batched gpCAM model to create a surrogate""" + + # Initialize + rng, batch_size, n, lb, ub, x_new, y_new, ps = _initialize_gpcAM(gen_specs["user"], libE_info) + ask_max_iter = gen_specs["user"].get("ask_max_iter") or 10 + test_points = _read_testpoints(gen_specs["user"]) + noise = 1e-8 # Initializes noise + my_gp = None + + # Start with a batch of random points + x_new = rng.uniform(lb, ub, (batch_size, n)) + H_o = np.zeros(batch_size, dtype=gen_specs["out"]) + H_o["x"] = x_new + tag, Work, calc_in = ps.send_recv(H_o) # Send random points for evaluation and wait for results + + while tag not in [STOP_TAG, PERSIS_STOP]: + y_new = np.atleast_2d(calc_in["f"]).T + my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise) + + # Request new points + x_new = my_gp.ask( + input_set=np.column_stack((lb, ub)), + n=batch_size, + pop_size=batch_size, + acquisition_function="total correlation", + max_iter=ask_max_iter, # Larger takes longer. gpCAM default is 20. + )["x"] + + H_o = np.zeros(batch_size, dtype=gen_specs["out"]) + H_o["x"] = x_new + tag, Work, calc_in = ps.send_recv(H_o) # Send points for evaluation and wait for results + + # If final points were returned update the model + if calc_in is not None: + y_new = np.atleast_2d(calc_in["f"]).T + my_gp = _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise) + + return None, persis_info, FINISHED_PERSISTENT_GEN_TAG + +Common acquisition functions include: + +**Uncertainty reduction:** + +- **"variance"** (default): The optimizer will find N best points. +- **"total correlation"**: More expensive but points found are self-avoiding. + +**Bayesian optimization:** + +These produce one point at a time unless using the `HGDL `_ option. + +- **"ucb" / "lcb"**: Upper/Lower Confidence Bound. +- **"expected improvement"**: Expected Improvement. + +For more options see: https://gpcam.lbl.gov/examples/acquisition-functions + +---- + +The following code adds the functions used by ``persistent_gpCAM``. + +``_update_gp`` is where the GP is fed the data and trained. + +.. code-block:: python + + def _initialize_gpcAM(user_specs, libE_info): + """Extract user params""" + rng_seed = user_specs.get("rng_seed") # will default to None + rng = np.random.default_rng(rng_seed) # Create random stream + b = user_specs["batch_size"] + lb = np.array(user_specs["lb"]) + ub = np.array(user_specs["ub"]) + n = len(lb) # no. of dimensions + init_x = np.empty((0, n)) + init_y = np.empty((0, 1)) + ps = PersistentSupport(libE_info, EVAL_GEN_TAG) # init comms + return rng, b, n, lb, ub, init_x, init_y, ps + + + def _read_testpoints(U): + """Read numpy file containing evaluated points for measuring GP error""" + test_points_file = U.get("test_points_file") + if test_points_file is None: + return None + test_points = np.load(test_points_file) + test_points = repack_fields(test_points[["x", "f"]]) + return test_points + + + def _compare_testpoints(my_gp, test_points, persis_info): + """Compare model at test points""" + if test_points is None: + return + f_est = my_gp.posterior_mean(test_points["x"])["f(x)"] + mse = np.mean((f_est - test_points["f"]) ** 2) + persis_info.setdefault("mean_squared_error", []).append(float(mse)) + + + def _update_gp(my_gp, x_new, y_new, test_points, persis_info, noise): + """Update Gaussian process with new points and train""" + noise_arr = noise * np.ones(len(y_new)) # Initializes noise + if my_gp is None: + my_gp = GP(x_new, y_new.flatten(), noise_variances=noise_arr) + else: + my_gp.tell(x_new, y_new.flatten(), noise_variances=noise_arr, append=True) + my_gp.train() + + if test_points is not None: + _compare_testpoints(my_gp, test_points, persis_info) + + return my_gp + +Simulator function +----------------- + +Simulator functions or ``sim_f``\ s perform calculations based on parameters created in the generator function. +Each worker will run a copy of this function in parallel. + +The function used here is the simple 2D ``six_hump_camel``, for demonstration purposes. + +For running parallel applications in the simulator see the `forces examples `_. + +.. code-block:: python + + # Define our simulation function + import numpy as np + + def six_hump_camel(H, persis_info, sim_specs, _): + """Six-Hump Camel sim_f.""" + + batch = len(H["x"]) # Num evaluations each sim_f call. + H_o = np.zeros(batch, dtype=sim_specs["out"]) # Define output array H + + for i, x in enumerate(H["x"]): + H_o["f"][i] = six_hump_camel_func(x) # Function evaluations placed into H + + return H_o, persis_info + + + def six_hump_camel_func(x): + """Six-Hump Camel function definition""" + x1 = x[0] + x2 = x[1] + term1 = (4 - 2.1 * x1**2 + (x1**4) / 3) * x1**2 + term2 = x1 * x2 + term3 = (-4 + 4 * x2**2) * x2**2 + + return term1 + term2 + term3 + +Calling Script +------------- + +Our calling script contains the configuration for libEnsemble, the generator function, and the simulator function. We then create the ensemble object and are ready to run the ensemble. + +First we will create a cleanup script so we can easily re-run. + +.. code-block:: python + + # To rerun this notebook, we need to delete the ensemble directory. + import shutil + def cleanup(): + try: + shutil.rmtree("ensemble") + except: + pass + +This calling script imports the Gen and Sim functions from the locations in the installed libensemble package. +If you wish to make your own functions based on the above, those can be imported instead. + +.. code-block:: python + + import numpy as np + from pprint import pprint + + from libensemble import Ensemble + from libensemble.specs import LibeSpecs, GenSpecs, SimSpecs, AllocSpecs, ExitCriteria + + # If importing from libensemble + from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM + from libensemble.sim_funcs.six_hump_camel import six_hump_camel + + from libensemble.alloc_funcs.start_only_persistent import only_persistent_gens + import warnings + + warnings.filterwarnings("ignore", message="Default hyperparameter_bounds") + warnings.filterwarnings("ignore", message="Hyperparameters initialized") + + nworkers = 4 + + # When using gen_on_manager, nworkers is number of concurrent sims. + # final_gen_send means the last evaluated points are returned to the generator to update the model. + libE_specs = LibeSpecs(nworkers=nworkers, gen_on_manager=True, final_gen_send=True) + + n = 2 # Input dimensions + batch_size = 4 + num_batches = 6 + + gen_specs = GenSpecs( + gen_f=persistent_gpCAM, # Generator function + persis_in=["f"], # Objective, defined in sim, is returned to gen + outputs=[("x", float, (n,))], # Parameters (name, type, size) + user={ + "batch_size": batch_size, + "lb": np.array([-2, -1]), # lower boundaries for n dimensions + "ub": np.array([2, 1]), # upper boundaries for n dimensions + "ask_max_iter": 5, # Number of iterations for ask (default 20) + "rng_seed": 0, + }, + ) + + sim_specs = SimSpecs( + sim_f=six_hump_camel, # Simulator function + inputs=["x"], # Input field names. "x" defined in gen + outputs=[("f", float)], # Objective + ) + + # Starts one persistent generator. Simulated values are returned in batch. + alloc_specs = AllocSpecs( + alloc_f=only_persistent_gens, + user={"async_return": False}, # False = batch returns + ) + + exit_criteria = ExitCriteria(sim_max=num_batches*batch_size) + + # Initialize and run the ensemble. + ensemble = Ensemble( + libE_specs=libE_specs, + sim_specs=sim_specs, + gen_specs=gen_specs, + alloc_specs=alloc_specs, + exit_criteria=exit_criteria, + ) + +At the end of our calling script we run the ensemble. + +.. code-block:: python + + # To ensure re-running works - clean output and reset any persistent information + cleanup() + ensemble.persis_info = {} + + H, persis_info, flag = ensemble.run() # Start the ensemble. Blocks until completion. + ensemble.save_output("H_array", append_attrs=False) # Save H (history of all evaluated points) to file + pprint(H[["sim_id", "x", "f"]][:16]) # See first 16 results + +Rerun and test model at known points +----------------------------------- + +To see how our model improves, we can use our existing points as test points and run again with a different seed. + +.. code-block:: python + + ensemble.gen_specs.user["rng_seed"] = 123 + ensemble.gen_specs.user["test_points_file"] = "H_array.npy" # our previous file + + # To ensure re-running works - clean output and reset any persistent information + cleanup() + ensemble.persis_info = {} + + H, persis_info, flag = ensemble.run() + print(persis_info) + +Viewing model progression +------------------------ + +Now we can check how our model compared against the known test points at each iteration. +The comparison is based on the **Mean Squared Error** between the gpCAM model and our known +values at the test points. + +.. note:: + The graph may differ between runs because, although we seed libEnsemble's random number generator, + gpCAM introduces some randomness when initializing hyperparameters. + +.. code-block:: python + + import matplotlib + import matplotlib.pyplot as plt + + # Get "mean_squared_error" from generators return (worker 0 as we ran gen_on_manager) + mse = persis_info[0]["mean_squared_error"] + niter = len(mse) + num_sims = list(range(batch_size, (niter * batch_size) + 1, batch_size)) + + # Plotting the data + markersize = 10 + plt.figure(figsize=(10, 5)) + plt.plot( + num_sims, mse, marker="^", markeredgecolor="black", markeredgewidth=2, + markersize=markersize, linewidth=2, label="Mean squared error" + ) + plt.xticks(num_sims) + + # Labeling the axes and the legend + plt.title('Mean Squared Error at test points') + plt.xlabel("Number of simulations") + plt.ylabel('Mean squared error (rad$^2$)') + legend = plt.legend(framealpha=1, edgecolor="black") # Increase edge width here + plt.grid(True) + plt.show() + + +.. |Open in Colab| image:: https://colab.research.google.com/assets/colab-badge.svg + :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb diff --git a/docs/tutorials/tutorials.rst b/docs/tutorials/tutorials.rst index f114a7afa0..6b40e4b658 100644 --- a/docs/tutorials/tutorials.rst +++ b/docs/tutorials/tutorials.rst @@ -6,5 +6,6 @@ Tutorials local_sine_tutorial executor_forces_tutorial forces_gpu_tutorial + gpcam_tutorial aposmm_tutorial calib_cancel_tutorial diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 994fa18a98..5befa761fb 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -271,8 +271,6 @@ "from libensemble import Ensemble\n", "from libensemble.specs import LibeSpecs, GenSpecs, SimSpecs, AllocSpecs, ExitCriteria \n", "\n", - "from libensemble.tools.live_data.plot2n import Plot2N\n", - "\n", "# If importing from libensemble\n", "# from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM\n", "# from libensemble.sim_funcs.six_hump_camel import six_hump_camel\n", @@ -294,21 +292,21 @@ "num_batches = 6\n", "\n", "gen_specs = GenSpecs(\n", - " gen_f=persistent_gpCAM, # Generator function\n", - " persis_in=[\"f\"], # Objective, defined in sim, is returned to gen\n", + " gen_f=persistent_gpCAM, # Generator function\n", + " persis_in=[\"f\"], # Objective, defined in sim, is returned to gen\n", " outputs=[(\"x\", float, (n,))], # Parameters (name, type, size)\n", " user={\n", " \"batch_size\": batch_size,\n", " \"lb\": np.array([-2, -1]), # lower boundaries for n dimensions\n", " \"ub\": np.array([2, 1]), # upper boundaries for n dimensions \n", - " \"ask_max_iter\": 5, # Number of iterations for ask (default 20) *****************\n", + " \"ask_max_iter\": 5, # Number of iterations for ask\n", " \"rng_seed\": 0,\n", " },\n", ")\n", "\n", "sim_specs = SimSpecs(\n", - " sim_f=six_hump_camel, # Simulator function\n", - " inputs=[\"x\"], # Input field names. \"x\" defined in gen\n", + " sim_f=six_hump_camel, # Simulator function\n", + " inputs=[\"x\"], # Input field names. \"x\" defined in gen\n", " outputs=[(\"f\", float)], # Objective\n", ")\n", "\n", From 45fb1ddd03b370afed4d82e05123f4da3c04faab Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 18 Mar 2025 10:05:18 -0500 Subject: [PATCH 147/215] Rename gpCAM tutorial --- docs/tutorials/gpcam_tutorial.rst | 4 ++-- .../gpcam_surrogate_model/gpcam.ipynb | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/tutorials/gpcam_tutorial.rst b/docs/tutorials/gpcam_tutorial.rst index 3774d15190..1135227289 100644 --- a/docs/tutorials/gpcam_tutorial.rst +++ b/docs/tutorials/gpcam_tutorial.rst @@ -1,5 +1,5 @@ -gpCAM Surrogate Model Tutorial -============================== +Surrogate Model with gpCAM +========================== This generation function constructs a global surrogate of ``f`` values, using a Gaussian process. diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 5befa761fb..9ebcb0d5f9 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Surrogate Model with gpCAM \n", + "\n", + "This generation function constructs a global surrogate of `f` values, using a Gaussian process." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -29,15 +38,6 @@ " !pip install --upgrade --force-reinstall numpy==2.1.1 scipy gpcam fvgp" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## gpCAM Surrogate Model Tutorial\n", - "\n", - "This generation function constructs a global surrogate of `f` values, using a Gaussian process." - ] - }, { "cell_type": "markdown", "metadata": {}, From 120267c946725b41fedcdce42dfee82fe5072532 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 18 Mar 2025 10:27:57 -0500 Subject: [PATCH 148/215] Update gpCAM intro --- docs/tutorials/gpcam_tutorial.rst | 5 ++++- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/gpcam_tutorial.rst b/docs/tutorials/gpcam_tutorial.rst index 1135227289..1456d728e4 100644 --- a/docs/tutorials/gpcam_tutorial.rst +++ b/docs/tutorials/gpcam_tutorial.rst @@ -1,7 +1,9 @@ Surrogate Model with gpCAM ========================== -This generation function constructs a global surrogate of ``f`` values, using a Gaussian process. +This example uses gpCAM_ to construct a global surrogate of ``f`` values using a Gaussian process. + +In each iteration, a batch of points is produced for concurrent evaluation, maximizing uncertainty reduction. |Open in Colab| @@ -328,5 +330,6 @@ values at the test points. plt.show() +.. _gpCAM: https://github.com/lbl-camera/gpCAM .. |Open in Colab| image:: https://colab.research.google.com/assets/colab-badge.svg :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 9ebcb0d5f9..850bbbf3eb 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -6,7 +6,9 @@ "source": [ "# Surrogate Model with gpCAM \n", "\n", - "This generation function constructs a global surrogate of `f` values, using a Gaussian process." + "This example uses [gpCAM](https://github.com/lbl-camera/gpCAM) to construct a global surrogate of ``f`` values using a Gaussian process.\n", + "\n", + "In each iteration, a batch of points is produced for concurrent evaluation, maximizing uncertainty reduction." ] }, { From 8df51be87f0de601a102b1f5e65506e568f99e16 Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 18 Mar 2025 10:38:56 -0500 Subject: [PATCH 149/215] Add example plot to gpcam tutorial --- docs/images/gpcam_model_improvement.png | Bin 0 -> 39199 bytes docs/tutorials/gpcam_tutorial.rst | 13 +++++++++---- .../tutorials/gpcam_surrogate_model/gpcam.ipynb | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 docs/images/gpcam_model_improvement.png diff --git a/docs/images/gpcam_model_improvement.png b/docs/images/gpcam_model_improvement.png new file mode 100644 index 0000000000000000000000000000000000000000..232469be2fbc4ce598f0aeb74d6dd085d0963715 GIT binary patch literal 39199 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/gpcam_tutorial.rst b/docs/tutorials/gpcam_tutorial.rst index 1456d728e4..e1916f449a 100644 --- a/docs/tutorials/gpcam_tutorial.rst +++ b/docs/tutorials/gpcam_tutorial.rst @@ -298,10 +298,6 @@ Now we can check how our model compared against the known test points at each it The comparison is based on the **Mean Squared Error** between the gpCAM model and our known values at the test points. -.. note:: - The graph may differ between runs because, although we seed libEnsemble's random number generator, - gpCAM introduces some randomness when initializing hyperparameters. - .. code-block:: python import matplotlib @@ -329,6 +325,15 @@ values at the test points. plt.grid(True) plt.show() +The plot should look similar to the following. + +.. note:: + The graph may differ between runs because, although we seed libEnsemble's random number generator, + gpCAM introduces some randomness when initializing hyperparameters. + +.. image:: ../images/gpcam_model_improvement.png + :alt: gpcam_model_improvement + :align: center .. _gpCAM: https://github.com/lbl-camera/gpCAM .. |Open in Colab| image:: https://colab.research.google.com/assets/colab-badge.svg diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 850bbbf3eb..51299fbb72 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -22,7 +22,7 @@ "> **Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", "> To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", "\n", - "> **Note:** If using **Colab** the following cells installs gpCAM and prevents Colab downgrading numpy due to pre-installs.\n", + "> **Note:** If using **Colab** the cell below installs gpCAM and prevents Colab downgrading numpy due to pre-installs.\n", "> Restart session when prompted (the warnings can be ignored)." ] }, From a2909535fbb90f90a645d739d73443cc13a4ed44 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Wed, 19 Mar 2025 13:10:49 -0500 Subject: [PATCH 150/215] Update gpcam_tutorial.rst --- docs/tutorials/gpcam_tutorial.rst | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/tutorials/gpcam_tutorial.rst b/docs/tutorials/gpcam_tutorial.rst index e1916f449a..09b523c7a3 100644 --- a/docs/tutorials/gpcam_tutorial.rst +++ b/docs/tutorials/gpcam_tutorial.rst @@ -1,5 +1,5 @@ -Surrogate Model with gpCAM -========================== +Surrogate Modeling with gpCAM +============================= This example uses gpCAM_ to construct a global surrogate of ``f`` values using a Gaussian process. @@ -14,9 +14,9 @@ Generator function The gpCAM generator function is called ``persistent_gpCAM``. -This persistent generator is started at the beginning and runs until the Ensemble closes down. +This persistent generator is started at the beginning of the Ensemble and runs until the Ensemble closes down. -This is a version of the gpCAM generator that can be found, along with other gpCAM generator functions, at `libensemble/gen_funcs/persistent_gpCAM.py `_ and can be imported from that location when libEnsemble is installed as follows: +This version (and others) of the gpCAM generator can be found at `libensemble/gen_funcs/persistent_gpCAM.py `_ and can be imported from that location when libEnsemble is installed as follows: ``from libensemble.gen_funcs.persistent_gpCAM import persistent_gpCAM`` @@ -74,8 +74,8 @@ Common acquisition functions include: **Uncertainty reduction:** -- **"variance"** (default): The optimizer will find N best points. -- **"total correlation"**: More expensive but points found are self-avoiding. +- **"variance"** (default): The optimizer will produce N best points. +- **"total correlation"**: More expensive but points produced are self-avoiding. **Bayesian optimization:** @@ -142,14 +142,14 @@ The following code adds the functions used by ``persistent_gpCAM``. return my_gp Simulator function ------------------ +------------------ Simulator functions or ``sim_f``\ s perform calculations based on parameters created in the generator function. -Each worker will run a copy of this function in parallel. +Each worker runs a copy of this function in parallel. -The function used here is the simple 2D ``six_hump_camel``, for demonstration purposes. +The function here is the simple 2D ``six_hump_camel``, for demonstration purposes. -For running parallel applications in the simulator see the `forces examples `_. +For running applications using parallel resources in the simulator see the `forces examples `_. .. code-block:: python @@ -181,7 +181,7 @@ For running parallel applications in the simulator see the `forces examples Date: Wed, 19 Mar 2025 13:12:00 -0500 Subject: [PATCH 151/215] Update ensemble.py --- libensemble/ensemble.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libensemble/ensemble.py b/libensemble/ensemble.py index dea04e27f5..9b581a1d1a 100644 --- a/libensemble/ensemble.py +++ b/libensemble/ensemble.py @@ -573,7 +573,7 @@ def save_output(self, basename: str, append_attrs: bool = True): Format: ``_results_History_length=_evals=_ranks=`` - To use just basename as the filename, set append_attrs=False + To have the filename be only the basename, set append_attrs=False Format: ``_results_History_length=_evals=_ranks=`` """ From 59c018c3ab067243239548949fc656093842e707 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 19 Mar 2025 14:52:09 -0500 Subject: [PATCH 152/215] put back summit link in introduction_latex --- docs/introduction_latex.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/introduction_latex.rst b/docs/introduction_latex.rst index 8fa644128f..e7750bac5f 100644 --- a/docs/introduction_latex.rst +++ b/docs/introduction_latex.rst @@ -46,6 +46,7 @@ .. _scipy.optimize: https://docs.scipy.org/doc/scipy/reference/optimize.html .. _setuptools: https://setuptools.pypa.io/en/latest/ .. _Spack: https://spack.readthedocs.io/en/latest +.. _Summit: https://www.olcf.ornl.gov/olcf-resources/compute-systems/summit/ .. _Surmise: https://surmise.readthedocs.io/en/latest/index.html .. _SWIG: http://swig.org/ .. _tarball: https://github.com/Libensemble/libensemble/releases/latest From 60f33b1be4fdd737fb6307388f9afe56dfed2c6b Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 19 Mar 2025 15:31:47 -0500 Subject: [PATCH 153/215] fixes --- docs/platforms/example_scripts.rst | 2 +- docs/platforms/platforms_index.rst | 1 - docs/platforms/summit.rst | 3 ++- pyproject.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index b10a820f3d..8cfe0b2a33 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -2,7 +2,7 @@ Example Scheduler Submission Scripts ==================================== Below are example submission scripts used to configure and launch libEnsemble -on a variety of high-powered systems. See :doc:`here` for more +on a variety of high-powered systems. See :ref:`here` for more information about the respective systems and configuration. General examples diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 814b3e986f..45fd96849f 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -215,7 +215,6 @@ libEnsemble on specific HPC systems. improv perlmutter polaris - spock_crusher summit srun example_scripts diff --git a/docs/platforms/summit.rst b/docs/platforms/summit.rst index 0d9d230ae6..fc5df9f7fc 100644 --- a/docs/platforms/summit.rst +++ b/docs/platforms/summit.rst @@ -19,7 +19,7 @@ Special note on resource sets and Executor submit options When using the portable MPI run configuration options (e.g., num_nodes) to the :doc:`MPIExecutor<../executor/mpi_executor>` ``submit`` function, it is important -to note that, due to the `resource sets`_ used on Summit, the options refer to +to note that, due to the resource sets used on Summit, the options refer to resource sets as follows: - num_procs (int, optional) – The total number resource sets for this run. @@ -156,3 +156,4 @@ launch failure resilience, and ease of use. .. _conda: https://conda.io/en/latest/ .. _LSF: https://www.olcf.ornl.gov/wp-content/uploads/2018/12/summit_workshop_fuson.pdf .. _mpi4py: https://mpi4py.readthedocs.io/en/stable/ +.. _Summit: https://www.olcf.ornl.gov/olcf-resources/compute-systems/summit/ diff --git a/pyproject.toml b/pyproject.toml index a949c6552f..7de7e37c37 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -132,4 +132,4 @@ noy = "noy" extend-exclude = ["*.bib", "*.xml", "docs/nitpicky"] [dependency-groups] -dev = ["pyenchant"] +dev = ["pyenchant", "enchant>=0.0.1,<0.0.2"] From f27639226ec2194a82a840af0cc5581ab1fb5ab6 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 19 Mar 2025 15:48:36 -0500 Subject: [PATCH 154/215] Update links/imports for notebook --- README.rst | 4 ++-- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index cdb8e3582b..df5fa587e4 100644 --- a/README.rst +++ b/README.rst @@ -98,7 +98,7 @@ Try some other examples live in Colab. | Surrogate model generation with gpCAM. | |Surrogate Modeling| | +---------------------------------------------------------------+-------------------------------------+ -There are many more examples in the `Community Examples repository`_ and `regression tests`_. +There are many more examples in the `regression tests`_ and `Community Examples repository`_. Resources ========= @@ -181,4 +181,4 @@ Resources :target: http://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb .. |Surrogate Modeling| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: https://colab.research.google.com/github/Libensemble/libensemble/blob/examples/gpcam_notebook/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb + :target: https://colab.research.google.com/github/Libensemble/libensemble/blob/develop/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 51299fbb72..097a391c91 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -34,9 +34,8 @@ "source": [ "import sys\n", "if 'google.colab' in sys.modules:\n", - " #!pip install libensemble\n", - " !pip install git+https://github.com/Libensemble/libensemble.git@examples/gpcam_notebook ################ tmp\n", - " # Prevent downgraded numpy in colab due to preinstalls - \n", + " !pip install libensemble\n", + " # Prevent downgraded numpy in colab due to preinstalls\n", " !pip install --upgrade --force-reinstall numpy==2.1.1 scipy gpcam fvgp" ] }, From c2c12122e620d9f51ed0af36b79d968e3d15a6ad Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Mar 2025 10:54:01 -0500 Subject: [PATCH 155/215] Organize cleanup --- docs/platforms/example_scripts.rst | 7 +++ docs/platforms/summit.rst | 49 ++++++++++++++++++- libensemble/resources/platforms.py | 21 ++++---- .../test_mpi_gpu_settings.py | 8 +-- .../forces/forces_app/build_forces.sh | 7 +++ 5 files changed, 77 insertions(+), 15 deletions(-) diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 8cfe0b2a33..3f63524520 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -78,3 +78,10 @@ System Examples .. literalinclude:: ../../examples/libE_submission_scripts/summit_submit_mproc.sh :caption: /examples/libE_submission_scripts/summit_submit_mproc.sh :language: bash + +.. dropdown:: Cobalt - Intermediate node with Multiprocessing + + .. literalinclude:: ../../examples/libE_submission_scripts/cobalt_submit_mproc.sh + :caption: /examples/libE_submission_scripts/cobalt_submit_mproc.sh + :language: bash + diff --git a/docs/platforms/summit.rst b/docs/platforms/summit.rst index fc5df9f7fc..9a08a21eb5 100644 --- a/docs/platforms/summit.rst +++ b/docs/platforms/summit.rst @@ -12,9 +12,56 @@ Users on login nodes submit batch runs to the launch nodes. Batch scripts and interactive sessions run on the launch nodes. Only the launch nodes can submit MPI runs to the compute nodes via ``jsrun``. -These docs are maintained to guide libEnsemble's usage on three-tier systems similar to Summit. +These docs are maintained to guide libEnsemble's usage on three-tier systems and/or +`jsrun` systems similar to Summit. +Configuring Python +------------------ + +Begin by loading the Python 3 Anaconda module:: + + $ module load python + +You can now create and activate your own custom conda_ environment:: + + conda create --name myenv python=3.10 + export PYTHONNOUSERSITE=1 # Make sure get python from conda env + . activate myenv + +If you are installing any packages with extensions, ensure that the correct compiler +module is loaded. If using mpi4py_, this must be installed from source, +referencing the compiler. Currently, mpi4py must be built with gcc:: + + module load gcc + +With your environment activated, run :: + + CC=mpicc MPICC=mpicc pip install mpi4py --no-binary mpi4py + +Installing libEnsemble +---------------------- + +Obtaining libEnsemble is now as simple as ``pip install libensemble``. +Your prompt should be similar to the following line: + +.. code-block:: console + + (my_env) user@login5:~$ pip install libensemble + +.. note:: + If you encounter pip errors, run ``python -m pip install --upgrade pip`` first + +Or, you can install via ``conda``: + +.. code-block:: console + + (my_env) user@login5:~$ conda config --add channels conda-forge + (my_env) user@login5:~$ conda install -c conda-forge libensemble + +See :doc:`here<../advanced_installation>` for more information on advanced options +for installing libEnsemble. Special note on resource sets and Executor submit options + --------------------------------------------------------- When using the portable MPI run configuration options (e.g., num_nodes) to the diff --git a/libensemble/resources/platforms.py b/libensemble/resources/platforms.py index c56060031e..46b357540e 100644 --- a/libensemble/resources/platforms.py +++ b/libensemble/resources/platforms.py @@ -143,6 +143,7 @@ class Aurora(Platform): scheduler_match_slots: bool = True +# On SLURM systems, let srun assign free GPUs on the node class Frontier(Platform): mpi_runner: str = "srun" cores_per_node: int = 64 @@ -153,16 +154,6 @@ class Frontier(Platform): scheduler_match_slots: bool = False -class Summit(Platform): - mpi_runner: str = "jsrun" - cores_per_node: int = 42 - logical_cores_per_node: int = 168 - gpus_per_node: int = 6 - gpu_setting_type: str = "option_gpus_per_task" - gpu_setting_name: str = "-g" - scheduler_match_slots: bool = False - - # Example of a ROCM system class GenericROCm(Platform): mpi_runner: str = "mpich" @@ -201,6 +192,16 @@ class Polaris(Platform): scheduler_match_slots: bool = True +class Summit(Platform): + mpi_runner: str = "jsrun" + cores_per_node: int = 42 + logical_cores_per_node: int = 168 + gpus_per_node: int = 6 + gpu_setting_type: str = "option_gpus_per_task" + gpu_setting_name: str = "-g" + scheduler_match_slots: bool = False + + class Known_platforms(BaseModel): """A list of platforms with known configurations. diff --git a/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py b/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py index 321e698b81..b3eee19ae7 100644 --- a/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py +++ b/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py @@ -53,7 +53,7 @@ # Import libEnsemble items for this test from libensemble.libE import libE -from libensemble.resources.platforms import Aurora, Frontier, PerlmutterGPU, Platform, Polaris +from libensemble.resources.platforms import Aurora, Frontier, PerlmutterGPU, Platform, Polaris, Summit from libensemble.sim_funcs import six_hump_camel from libensemble.sim_funcs.var_resources import gpu_variable_resources as sim_f from libensemble.tools import add_unique_random_streams, parse_args @@ -203,7 +203,7 @@ del libE_specs["platform_specs"] # Fourth set - use platform setting ------------------------------------------------------------ - for platform in ["perlmutter_g", "polaris", "aurora"]: + for platform in ["summit", "frontier", "perlmutter_g", "polaris", "aurora"]: print(f"\nRunning GPU setting checks (via known platform) for {platform} ------------------- ") libE_specs["platform"] = platform @@ -221,7 +221,7 @@ del libE_specs["platform"] # Fifth set - use platform environment setting ----------------------------------------------- - for platform in ["perlmutter_g", "polaris", "aurora"]: + for platform in ["summit", "frontier", "perlmutter_g", "polaris", "aurora"]: print(f"\nRunning GPU setting checks (via known platform env. variable) for {platform} ----- ") os.environ["LIBE_PLATFORM"] = platform @@ -239,7 +239,7 @@ del os.environ["LIBE_PLATFORM"] # Sixth set - use platform_specs with known systems ------------------------------------------- - for platform in [Frontier, PerlmutterGPU, Polaris, Aurora]: + for platform in [Summit, Frontier, PerlmutterGPU, Polaris, Aurora]: print(f"\nRunning GPU setting checks (via known platform - platform_specs) for {platform} ------------------- ") libE_specs["platform_specs"] = platform() diff --git a/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh b/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh index 41586f37be..b8b379e0ee 100755 --- a/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh +++ b/libensemble/tests/scaling_tests/forces/forces_app/build_forces.sh @@ -45,3 +45,10 @@ mpicc -O3 -o forces.x forces.c -lm # Nvidia (nvc) compiler with mpicc and on Cray system with target (Perlmutter) # mpicc -DGPU -O3 -fopenmp -mp=gpu -o forces.x forces.c # cc -DGPU -Wl,-znoexecstack -O3 -fopenmp -mp=gpu -target-accel=nvidia80 -o forces.x forces.c + +# xl (plain and using mpicc on Summit) +# xlc_r -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c +# mpicc -DGPU -O3 -qsmp=omp -qoffload -o forces.x forces.c + +# Summit with gcc (Need up to offload capable gcc: module load gcc/12.1.0) - slower than xlc +# mpicc -DGPU -Ofast -fopenmp -Wl,-rpath=/sw/summit/gcc/12.1.0-0/lib64 -lm -foffload=nvptx-none forces.c -o forces.x From b02b59288d2c3bdf8ea887d71165af77768b3262 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Mar 2025 14:47:13 -0500 Subject: [PATCH 156/215] Remove references to --comms local --- .../tests/functionality_tests/test_1d_sampling_from_files.py | 2 +- .../functionality_tests/test_1d_sampling_with_profile.py | 2 +- libensemble/tests/functionality_tests/test_1d_splitcomm.py | 2 +- libensemble/tests/functionality_tests/test_1d_subcomm.py | 2 +- libensemble/tests/functionality_tests/test_1d_super_simple.py | 2 +- .../tests/functionality_tests/test_GPU_gen_resources.py | 2 +- .../test_active_persistent_worker_abort.py | 2 +- libensemble/tests/functionality_tests/test_calc_exception.py | 2 +- libensemble/tests/functionality_tests/test_cancel_in_alloc.py | 2 +- libensemble/tests/functionality_tests/test_comms.py | 2 +- .../tests/functionality_tests/test_elapsed_time_abort.py | 2 +- .../functionality_tests/test_evaluate_existing_plus_gen.py | 2 +- .../functionality_tests/test_executor_hworld_pass_fail.py | 2 +- .../tests/functionality_tests/test_executor_hworld_timeout.py | 2 +- libensemble/tests/functionality_tests/test_executor_simple.py | 2 +- libensemble/tests/functionality_tests/test_fast_alloc.py | 2 +- .../tests/functionality_tests/test_mpi_gpu_settings.py | 2 +- .../tests/functionality_tests/test_mpi_gpu_settings_env.py | 2 +- .../test_mpi_gpu_settings_mock_nodes_multi_task.py | 2 +- libensemble/tests/functionality_tests/test_mpi_runners.py | 2 +- .../tests/functionality_tests/test_mpi_runners_subnode.py | 2 +- .../functionality_tests/test_mpi_runners_subnode_uneven.py | 2 +- .../functionality_tests/test_mpi_runners_supernode_uneven.py | 2 +- .../test_mpi_runners_zrw_subnode_uneven.py | 2 +- .../test_mpi_runners_zrw_supernode_uneven.py | 2 +- libensemble/tests/functionality_tests/test_new_field.py | 2 +- .../test_persistent_sim_uniform_sampling.py | 2 +- .../test_persistent_uniform_gen_decides_stop.py | 2 +- .../functionality_tests/test_persistent_uniform_sampling.py | 2 +- .../test_persistent_uniform_sampling_async.py | 2 +- .../test_persistent_uniform_sampling_cancel.py | 2 +- .../test_persistent_uniform_sampling_nonblocking.py | 2 +- .../test_persistent_uniform_sampling_running_mean.py | 2 +- .../tests/functionality_tests/test_sim_dirs_per_calc.py | 2 +- .../tests/functionality_tests/test_sim_dirs_per_worker.py | 2 +- .../tests/functionality_tests/test_sim_dirs_with_exception.py | 2 +- .../tests/functionality_tests/test_sim_dirs_with_gen_dirs.py | 2 +- .../tests/functionality_tests/test_sim_input_dir_option.py | 2 +- libensemble/tests/functionality_tests/test_stats_output.py | 2 +- .../tests/functionality_tests/test_uniform_sampling.py | 2 +- .../tests/functionality_tests/test_uniform_sampling_cancel.py | 2 +- .../test_uniform_sampling_then_persistent_localopt_runs.py | 2 +- .../test_uniform_sampling_with_variable_resources.py | 2 +- .../tests/functionality_tests/test_worker_exceptions.py | 2 +- libensemble/tests/functionality_tests/test_workflow_dir.py | 2 +- .../tests/functionality_tests/test_zero_resource_workers.py | 2 +- .../functionality_tests/test_zero_resource_workers_subnode.py | 2 +- libensemble/tests/regression_tests/test_1d_sampling.py | 2 +- libensemble/tests/regression_tests/test_2d_sampling.py | 2 +- .../tests/regression_tests/test_GPU_variable_resources.py | 2 +- .../test_GPU_variable_resources_multi_task.py | 2 +- .../tests/regression_tests/test_evaluate_existing_sample.py | 2 +- .../tests/regression_tests/test_evaluate_mixed_sample.py | 2 +- libensemble/tests/regression_tests/test_gpCAM.py | 2 +- .../tests/regression_tests/test_inverse_bayes_example.py | 2 +- .../tests/regression_tests/test_persistent_aposmm_dfols.py | 2 +- .../regression_tests/test_persistent_aposmm_exception.py | 2 +- .../test_persistent_aposmm_ibcdfo_pounders.py | 2 +- .../tests/regression_tests/test_persistent_aposmm_nlopt.py | 2 +- .../tests/regression_tests/test_persistent_aposmm_periodic.py | 2 +- .../tests/regression_tests/test_persistent_aposmm_pounders.py | 2 +- .../tests/regression_tests/test_persistent_aposmm_scipy.py | 2 +- .../regression_tests/test_persistent_aposmm_tao_blmvm.py | 2 +- .../tests/regression_tests/test_persistent_aposmm_tao_nm.py | 2 +- .../tests/regression_tests/test_persistent_aposmm_timeout.py | 2 +- .../regression_tests/test_persistent_aposmm_with_grad.py | 2 +- .../tests/regression_tests/test_persistent_gp_multitask_ax.py | 2 +- .../tests/regression_tests/test_persistent_surmise_calib.py | 2 +- .../regression_tests/test_persistent_surmise_killsims.py | 2 +- .../tests/regression_tests/test_persistent_tasmanian.py | 2 +- .../tests/regression_tests/test_persistent_tasmanian_async.py | 2 +- .../tests/regression_tests/test_proxystore_integration.py | 2 +- .../test_with_app_persistent_aposmm_tao_nm.py | 2 +- .../scaling_tests/forces/forces_multi_app/run_libe_forces.py | 4 ++-- libensemble/tests/scaling_tests/persistent_gp/run_example.py | 2 +- .../tests/scaling_tests/warpx/run_libensemble_on_warpx.py | 2 +- 76 files changed, 77 insertions(+), 77 deletions(-) diff --git a/libensemble/tests/functionality_tests/test_1d_sampling_from_files.py b/libensemble/tests/functionality_tests/test_1d_sampling_from_files.py index 70110ec828..d80025d238 100644 --- a/libensemble/tests/functionality_tests/test_1d_sampling_from_files.py +++ b/libensemble/tests/functionality_tests/test_1d_sampling_from_files.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_1d_sampling_from_yaml.py - python test_1d_sampling_from_yaml.py --nworkers 3 --comms local + python test_1d_sampling_from_yaml.py --nworkers 3 python test_1d_sampling_from_yaml.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_1d_sampling_with_profile.py b/libensemble/tests/functionality_tests/test_1d_sampling_with_profile.py index 4033a4cfad..645228d137 100644 --- a/libensemble/tests/functionality_tests/test_1d_sampling_with_profile.py +++ b/libensemble/tests/functionality_tests/test_1d_sampling_with_profile.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_1d_sampling_with_profile.py - python test_1d_sampling_with_profile.py --nworkers 3 --comms local + python test_1d_sampling_with_profile.py --nworkers 3 python test_1d_sampling_with_profile.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_1d_splitcomm.py b/libensemble/tests/functionality_tests/test_1d_splitcomm.py index 528a456940..de73660d70 100644 --- a/libensemble/tests/functionality_tests/test_1d_splitcomm.py +++ b/libensemble/tests/functionality_tests/test_1d_splitcomm.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_1d_sampling.py - python test_1d_sampling.py --nworkers 3 --comms local + python test_1d_sampling.py --nworkers 3 python test_1d_sampling.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_1d_subcomm.py b/libensemble/tests/functionality_tests/test_1d_subcomm.py index 5dd49d9d3c..7f607c31c9 100644 --- a/libensemble/tests/functionality_tests/test_1d_subcomm.py +++ b/libensemble/tests/functionality_tests/test_1d_subcomm.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_1d_sampling.py - python test_1d_sampling.py --nworkers 3 --comms local + python test_1d_sampling.py --nworkers 3 python test_1d_sampling.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_1d_super_simple.py b/libensemble/tests/functionality_tests/test_1d_super_simple.py index 0bbc4a56c0..e84255714f 100644 --- a/libensemble/tests/functionality_tests/test_1d_super_simple.py +++ b/libensemble/tests/functionality_tests/test_1d_super_simple.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_1d_sampling.py - python test_1d_sampling.py --nworkers 3 --comms local + python test_1d_sampling.py --nworkers 3 python test_1d_sampling.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_GPU_gen_resources.py b/libensemble/tests/functionality_tests/test_GPU_gen_resources.py index 0fc8192f7c..d77088d7e4 100644 --- a/libensemble/tests/functionality_tests/test_GPU_gen_resources.py +++ b/libensemble/tests/functionality_tests/test_GPU_gen_resources.py @@ -17,7 +17,7 @@ Execute via one of the following commands (e.g., 4 workers): mpiexec -np 5 python test_GPU_gen_resources.py - python test_GPU_gen_resources.py --comms local --nworkers 4 + python test_GPU_gen_resources.py --nworkers 4 When running with the above command, the number of concurrent evaluations of the objective function will be 4, as one of the five workers will be the diff --git a/libensemble/tests/functionality_tests/test_active_persistent_worker_abort.py b/libensemble/tests/functionality_tests/test_active_persistent_worker_abort.py index d896d3d848..7d99968629 100644 --- a/libensemble/tests/functionality_tests/test_active_persistent_worker_abort.py +++ b/libensemble/tests/functionality_tests/test_active_persistent_worker_abort.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_6-hump_camel_active_persistent_worker_abort.py - python test_6-hump_camel_active_persistent_worker_abort.py --nworkers 3 --comms local + python test_6-hump_camel_active_persistent_worker_abort.py --nworkers 3 python test_6-hump_camel_active_persistent_worker_abort.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_calc_exception.py b/libensemble/tests/functionality_tests/test_calc_exception.py index 6321bea138..361e1be3a8 100644 --- a/libensemble/tests/functionality_tests/test_calc_exception.py +++ b/libensemble/tests/functionality_tests/test_calc_exception.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_calc_exception.py - python test_calc_exception.py --nworkers 3 --comms local + python test_calc_exception.py --nworkers 3 python test_calc_exception.py --nworkers 3 --comms tcp """ diff --git a/libensemble/tests/functionality_tests/test_cancel_in_alloc.py b/libensemble/tests/functionality_tests/test_cancel_in_alloc.py index de7c25d303..d2c005a040 100644 --- a/libensemble/tests/functionality_tests/test_cancel_in_alloc.py +++ b/libensemble/tests/functionality_tests/test_cancel_in_alloc.py @@ -7,7 +7,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_cancel_in_alloc.py - python test_cancel_in_alloc.py --nworkers 3 --comms local + python test_cancel_in_alloc.py --nworkers 3 python test_cancel_in_alloc.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_comms.py b/libensemble/tests/functionality_tests/test_comms.py index 2e48eb8743..52c3e0771a 100644 --- a/libensemble/tests/functionality_tests/test_comms.py +++ b/libensemble/tests/functionality_tests/test_comms.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_comms.py - python test_comms.py --nworkers 3 --comms local + python test_comms.py --nworkers 3 python test_comms.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be N-1. diff --git a/libensemble/tests/functionality_tests/test_elapsed_time_abort.py b/libensemble/tests/functionality_tests/test_elapsed_time_abort.py index 7c7d6ec823..9e7ab97049 100644 --- a/libensemble/tests/functionality_tests/test_elapsed_time_abort.py +++ b/libensemble/tests/functionality_tests/test_elapsed_time_abort.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_6-hump_camel_elapsed_time_abort.py - python test_6-hump_camel_elapsed_time_abort.py --nworkers 3 --comms local + python test_6-hump_camel_elapsed_time_abort.py --nworkers 3 python test_6-hump_camel_elapsed_time_abort.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_evaluate_existing_plus_gen.py b/libensemble/tests/functionality_tests/test_evaluate_existing_plus_gen.py index 2b601efe33..fe3d8dad8e 100644 --- a/libensemble/tests/functionality_tests/test_evaluate_existing_plus_gen.py +++ b/libensemble/tests/functionality_tests/test_evaluate_existing_plus_gen.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_evaluate_existing_sample.py - python test_evaluate_existing_sample.py --nworkers 3 --comms local + python test_evaluate_existing_sample.py --nworkers 3 python test_evaluate_existing_sample.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_executor_hworld_pass_fail.py b/libensemble/tests/functionality_tests/test_executor_hworld_pass_fail.py index fd96275a20..1b61bf8d25 100644 --- a/libensemble/tests/functionality_tests/test_executor_hworld_pass_fail.py +++ b/libensemble/tests/functionality_tests/test_executor_hworld_pass_fail.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_executor_hworld.py - python test_executor_hworld.py --nworkers 3 --comms local + python test_executor_hworld.py --nworkers 3 python test_executor_hworld.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_executor_hworld_timeout.py b/libensemble/tests/functionality_tests/test_executor_hworld_timeout.py index ec532fe6f0..496eced316 100644 --- a/libensemble/tests/functionality_tests/test_executor_hworld_timeout.py +++ b/libensemble/tests/functionality_tests/test_executor_hworld_timeout.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_executor_hworld.py - python test_executor_hworld.py --nworkers 3 --comms local + python test_executor_hworld.py --nworkers 3 python test_executor_hworld.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_executor_simple.py b/libensemble/tests/functionality_tests/test_executor_simple.py index 64e984dba6..ac4c201a7a 100644 --- a/libensemble/tests/functionality_tests/test_executor_simple.py +++ b/libensemble/tests/functionality_tests/test_executor_simple.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_executor_hworld.py - python test_executor_hworld.py --nworkers 3 --comms local + python test_executor_hworld.py --nworkers 3 python test_executor_hworld.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_fast_alloc.py b/libensemble/tests/functionality_tests/test_fast_alloc.py index 14fc0ecb92..a2b6a75666 100644 --- a/libensemble/tests/functionality_tests/test_fast_alloc.py +++ b/libensemble/tests/functionality_tests/test_fast_alloc.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_fast_alloc.py - python test_fast_alloc.py --nworkers 3 --comms local + python test_fast_alloc.py --nworkers 3 The number of concurrent evaluations of the objective function will be 4-1=3. """ diff --git a/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py b/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py index b3eee19ae7..31e537a31d 100644 --- a/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py +++ b/libensemble/tests/functionality_tests/test_mpi_gpu_settings.py @@ -30,7 +30,7 @@ Execute via one of the following commands (e.g. 5 workers): mpiexec -np 6 python test_mpi_gpu_settings.py - python test_mpi_gpu_settings.py --comms local --nworkers 5 + python test_mpi_gpu_settings.py --nworkers 5 When running with the above command, the number of concurrent evaluations of the objective function will be 4, as one of the five workers will be the diff --git a/libensemble/tests/functionality_tests/test_mpi_gpu_settings_env.py b/libensemble/tests/functionality_tests/test_mpi_gpu_settings_env.py index 2265f71758..814f5086cb 100644 --- a/libensemble/tests/functionality_tests/test_mpi_gpu_settings_env.py +++ b/libensemble/tests/functionality_tests/test_mpi_gpu_settings_env.py @@ -10,7 +10,7 @@ Execute via one of the following commands (e.g., 5 workers): mpiexec -np 6 python test_mpi_gpu_settings_env.py - python test_mpi_gpu_settings_env.py --comms local --nworkers 5 + python test_mpi_gpu_settings_env.py --nworkers 5 When running with the above command, the number of concurrent evaluations of the objective function will be 4, as one of the five workers will be the diff --git a/libensemble/tests/functionality_tests/test_mpi_gpu_settings_mock_nodes_multi_task.py b/libensemble/tests/functionality_tests/test_mpi_gpu_settings_mock_nodes_multi_task.py index f299020f3f..3c884c7dd2 100644 --- a/libensemble/tests/functionality_tests/test_mpi_gpu_settings_mock_nodes_multi_task.py +++ b/libensemble/tests/functionality_tests/test_mpi_gpu_settings_mock_nodes_multi_task.py @@ -11,7 +11,7 @@ Execute via one of the following commands (e.g. 5 workers): mpiexec -np 6 python test_mpi_gpu_settings_mock_nodes_multi_task.py - python test_mpi_gpu_settings_mock_nodes_multi_task.py --comms local --nworkers 5 + python test_mpi_gpu_settings_mock_nodes_multi_task.py --nworkers 5 When running with the above command, the number of concurrent evaluations of the objective function will be 4, as one of the five workers will be the diff --git a/libensemble/tests/functionality_tests/test_mpi_runners.py b/libensemble/tests/functionality_tests/test_mpi_runners.py index 12cc658054..af00471d59 100644 --- a/libensemble/tests/functionality_tests/test_mpi_runners.py +++ b/libensemble/tests/functionality_tests/test_mpi_runners.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_mpi_runners.py - python test_mpi_runners.py --nworkers 3 --comms local + python test_mpi_runners.py --nworkers 3 python test_mpi_runners.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_mpi_runners_subnode.py b/libensemble/tests/functionality_tests/test_mpi_runners_subnode.py index a3d16c2722..7266678ff2 100644 --- a/libensemble/tests/functionality_tests/test_mpi_runners_subnode.py +++ b/libensemble/tests/functionality_tests/test_mpi_runners_subnode.py @@ -5,7 +5,7 @@ Execute via one of the following commands (e.g. 4 workers): mpiexec -np 5 python test_mpi_runners_subnode.py - python test_mpi_runners_subnode.py --nworkers 4 --comms local + python test_mpi_runners_subnode.py --nworkers 4 python test_mpi_runners_subnode.py --nworkers 4 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_mpi_runners_subnode_uneven.py b/libensemble/tests/functionality_tests/test_mpi_runners_subnode_uneven.py index 5ae749c7d4..a5145965b9 100644 --- a/libensemble/tests/functionality_tests/test_mpi_runners_subnode_uneven.py +++ b/libensemble/tests/functionality_tests/test_mpi_runners_subnode_uneven.py @@ -5,7 +5,7 @@ Execute via one of the following commands (e.g. 5 workers): mpiexec -np 6 python test_mpi_runners_subnode_uneven.py - python test_mpi_runners_subnode_uneven.py --nworkers 5 --comms local + python test_mpi_runners_subnode_uneven.py --nworkers 5 python test_mpi_runners_subnode_uneven.py --nworkers 5 --comms tcp """ diff --git a/libensemble/tests/functionality_tests/test_mpi_runners_supernode_uneven.py b/libensemble/tests/functionality_tests/test_mpi_runners_supernode_uneven.py index 45c8f2c493..77975e200d 100644 --- a/libensemble/tests/functionality_tests/test_mpi_runners_supernode_uneven.py +++ b/libensemble/tests/functionality_tests/test_mpi_runners_supernode_uneven.py @@ -5,7 +5,7 @@ Execute via one of the following commands (e.g. 5 workers): mpiexec -np 6 python test_mpi_runners_supernode_uneven.py - python test_mpi_runners_supernode_uneven.py --nworkers 5 --comms local + python test_mpi_runners_supernode_uneven.py --nworkers 5 """ import numpy as np diff --git a/libensemble/tests/functionality_tests/test_mpi_runners_zrw_subnode_uneven.py b/libensemble/tests/functionality_tests/test_mpi_runners_zrw_subnode_uneven.py index 1e189ab47d..cc73d0e427 100644 --- a/libensemble/tests/functionality_tests/test_mpi_runners_zrw_subnode_uneven.py +++ b/libensemble/tests/functionality_tests/test_mpi_runners_zrw_subnode_uneven.py @@ -5,7 +5,7 @@ Execute via one of the following commands (e.g. 6 workers - one is zero resource): mpiexec -np 7 python test_mpi_runners_zrw_subnode_uneven.py - python test_mpi_runners_zrw_subnode_uneven.py --nworkers 6 --comms local + python test_mpi_runners_zrw_subnode_uneven.py --nworkers 6 python test_mpi_runners_zrw_subnode_uneven.py --nworkers 6 --comms tcp The resource sets are split unevenly between the two nodes (e.g. 3 and 2). diff --git a/libensemble/tests/functionality_tests/test_mpi_runners_zrw_supernode_uneven.py b/libensemble/tests/functionality_tests/test_mpi_runners_zrw_supernode_uneven.py index 9b2521ec06..640d613bff 100644 --- a/libensemble/tests/functionality_tests/test_mpi_runners_zrw_supernode_uneven.py +++ b/libensemble/tests/functionality_tests/test_mpi_runners_zrw_supernode_uneven.py @@ -5,7 +5,7 @@ Execute via one of the following commands (e.g. 6 workers - one is zero resource): mpiexec -np 7 python test_mpi_runners_zrw_supernode_uneven.py - python test_mpi_runners_zrw_supernode_uneven.py --nworkers 6 --comms local + python test_mpi_runners_zrw_supernode_uneven.py --nworkers 6 """ import numpy as np diff --git a/libensemble/tests/functionality_tests/test_new_field.py b/libensemble/tests/functionality_tests/test_new_field.py index 2d1f0e3a84..c130b1d6e3 100644 --- a/libensemble/tests/functionality_tests/test_new_field.py +++ b/libensemble/tests/functionality_tests/test_new_field.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_1d_sampling.py - python test_1d_sampling.py --nworkers 3 --comms local + python test_1d_sampling.py --nworkers 3 python test_1d_sampling.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_persistent_sim_uniform_sampling.py b/libensemble/tests/functionality_tests/test_persistent_sim_uniform_sampling.py index 138d3b9e5c..f1f0616663 100644 --- a/libensemble/tests/functionality_tests/test_persistent_sim_uniform_sampling.py +++ b/libensemble/tests/functionality_tests/test_persistent_sim_uniform_sampling.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_sim_uniform_sampling.py - python test_persistent_sim_uniform_sampling.py --nworkers 3 --comms local + python test_persistent_sim_uniform_sampling.py --nworkers 3 python test_persistent_sim_uniform_sampling.py --nworkers 3 --comms tcp When running with the above command, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_persistent_uniform_gen_decides_stop.py b/libensemble/tests/functionality_tests/test_persistent_uniform_gen_decides_stop.py index c61753292c..68c8aaaa05 100644 --- a/libensemble/tests/functionality_tests/test_persistent_uniform_gen_decides_stop.py +++ b/libensemble/tests/functionality_tests/test_persistent_uniform_gen_decides_stop.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 5 python test_persistent_uniform_gen_decides_stop.py - python test_persistent_uniform_gen_decides_stop.py --nworkers 4 --comms local + python test_persistent_uniform_gen_decides_stop.py --nworkers 4 python test_persistent_uniform_gen_decides_stop.py --nworkers 4 --comms tcp The number of concurrent evaluations of the objective function with 2 gens will be 2: diff --git a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling.py b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling.py index 305521a02b..81a18a5285 100644 --- a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling.py +++ b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_uniform_sampling.py - python test_persistent_uniform_sampling.py --nworkers 3 --comms local + python test_persistent_uniform_sampling.py --nworkers 3 python test_persistent_uniform_sampling.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_async.py b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_async.py index 2a68a2061b..77d9a6a7b8 100644 --- a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_async.py +++ b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_async.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_uniform_sampling_async.py - python test_persistent_uniform_sampling_async.py --nworkers 3 --comms local + python test_persistent_uniform_sampling_async.py --nworkers 3 python test_persistent_uniform_sampling_async.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_cancel.py b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_cancel.py index b6bcc033aa..15c2d5b097 100644 --- a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_cancel.py +++ b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_cancel.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_uniform_sampling_cancel.py - python test_persistent_uniform_sampling_cancel.py --nworkers 3 --comms local + python test_persistent_uniform_sampling_cancel.py --nworkers 3 python test_persistent_uniform_sampling_cancel.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_nonblocking.py b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_nonblocking.py index 4fe3928998..5425578849 100644 --- a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_nonblocking.py +++ b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_nonblocking.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_uniform_sampling_nonblocking.py - python test_persistent_uniform_sampling_nonblocking.py --nworkers 3 --comms local + python test_persistent_uniform_sampling_nonblocking.py --nworkers 3 python test_persistent_uniform_sampling_nonblocking.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_running_mean.py b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_running_mean.py index 68decd00f6..9cc92dadd3 100644 --- a/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_running_mean.py +++ b/libensemble/tests/functionality_tests/test_persistent_uniform_sampling_running_mean.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g., 3 workers): mpiexec -np 4 python test_persistent_uniform_sampling_adv.py - python test_persistent_uniform_sampling_running_mean.py --nworkers 3 --comms local + python test_persistent_uniform_sampling_running_mean.py --nworkers 3 python test_persistent_uniform_sampling_running_mean.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_sim_dirs_per_calc.py b/libensemble/tests/functionality_tests/test_sim_dirs_per_calc.py index 3f8380e6ba..b4c30f9d2d 100644 --- a/libensemble/tests/functionality_tests/test_sim_dirs_per_calc.py +++ b/libensemble/tests/functionality_tests/test_sim_dirs_per_calc.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_sim_dirs_per_calc.py - python test_sim_dirs_per_calc.py --nworkers 3 --comms local + python test_sim_dirs_per_calc.py --nworkers 3 python test_sim_dirs_per_calc.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_sim_dirs_per_worker.py b/libensemble/tests/functionality_tests/test_sim_dirs_per_worker.py index d8060d8a4a..69bb34ab84 100644 --- a/libensemble/tests/functionality_tests/test_sim_dirs_per_worker.py +++ b/libensemble/tests/functionality_tests/test_sim_dirs_per_worker.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_sim_dirs_per_worker.py - python test_sim_dirs_per_worker.py --nworkers 3 --comms local + python test_sim_dirs_per_worker.py --nworkers 3 python test_sim_dirs_per_worker.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_sim_dirs_with_exception.py b/libensemble/tests/functionality_tests/test_sim_dirs_with_exception.py index 4487725316..229f6d5f54 100644 --- a/libensemble/tests/functionality_tests/test_sim_dirs_with_exception.py +++ b/libensemble/tests/functionality_tests/test_sim_dirs_with_exception.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_sim_dirs_with_exception.py - python test_sim_dirs_with_exception.py --nworkers 3 --comms local + python test_sim_dirs_with_exception.py --nworkers 3 python test_sim_dirs_with_exception.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_sim_dirs_with_gen_dirs.py b/libensemble/tests/functionality_tests/test_sim_dirs_with_gen_dirs.py index 46e3f6266c..c73eeabadf 100644 --- a/libensemble/tests/functionality_tests/test_sim_dirs_with_gen_dirs.py +++ b/libensemble/tests/functionality_tests/test_sim_dirs_with_gen_dirs.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_sim_dirs_with_gen_dirs.py - python test_sim_dirs_with_gen_dirs.py --nworkers 3 --comms local + python test_sim_dirs_with_gen_dirs.py --nworkers 3 python test_sim_dirs_with_gen_dirs.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_sim_input_dir_option.py b/libensemble/tests/functionality_tests/test_sim_input_dir_option.py index 2621499058..7dc4da7057 100644 --- a/libensemble/tests/functionality_tests/test_sim_input_dir_option.py +++ b/libensemble/tests/functionality_tests/test_sim_input_dir_option.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_sim_input_dir_option.py - python test_sim_input_dir_option.py --nworkers 3 --comms local + python test_sim_input_dir_option.py --nworkers 3 python test_sim_input_dir_option.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_stats_output.py b/libensemble/tests/functionality_tests/test_stats_output.py index 921f55f9c2..58d012cdeb 100644 --- a/libensemble/tests/functionality_tests/test_stats_output.py +++ b/libensemble/tests/functionality_tests/test_stats_output.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_stats_output.py - python test_stats_output.py --nworkers 3 --comms local + python test_stats_output.py --nworkers 3 The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_uniform_sampling.py b/libensemble/tests/functionality_tests/test_uniform_sampling.py index 9af49f0b9a..2867f94df9 100644 --- a/libensemble/tests/functionality_tests/test_uniform_sampling.py +++ b/libensemble/tests/functionality_tests/test_uniform_sampling.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_uniform_sampling.py - python test_uniform_sampling.py --nworkers 3 --comms local + python test_uniform_sampling.py --nworkers 3 python test_uniform_sampling.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_uniform_sampling_cancel.py b/libensemble/tests/functionality_tests/test_uniform_sampling_cancel.py index 17675a7187..6080fc3ce3 100644 --- a/libensemble/tests/functionality_tests/test_uniform_sampling_cancel.py +++ b/libensemble/tests/functionality_tests/test_uniform_sampling_cancel.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_uniform_sampling_cancel.py - python test_uniform_sampling_cancel.py --nworkers 3 --comms local + python test_uniform_sampling_cancel.py --nworkers 3 python test_uniform_sampling_cancel.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_uniform_sampling_then_persistent_localopt_runs.py b/libensemble/tests/functionality_tests/test_uniform_sampling_then_persistent_localopt_runs.py index 14f9b798d6..ec126607ef 100644 --- a/libensemble/tests/functionality_tests/test_uniform_sampling_then_persistent_localopt_runs.py +++ b/libensemble/tests/functionality_tests/test_uniform_sampling_then_persistent_localopt_runs.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_uniform_sampling_then_persistent_localopt_runs.py - python test_uniform_sampling_then_persistent_localopt_runs.py --nworkers 3 --comms local + python test_uniform_sampling_then_persistent_localopt_runs.py --nworkers 3 python test_uniform_sampling_then_persistent_localopt_runs.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/functionality_tests/test_uniform_sampling_with_variable_resources.py b/libensemble/tests/functionality_tests/test_uniform_sampling_with_variable_resources.py index 049f886a7a..9123f7db17 100644 --- a/libensemble/tests/functionality_tests/test_uniform_sampling_with_variable_resources.py +++ b/libensemble/tests/functionality_tests/test_uniform_sampling_with_variable_resources.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_uniform_sampling_with_variable_resources.py - python test_uniform_sampling_with_variable_resources.py --nworkers 3 --comms local + python test_uniform_sampling_with_variable_resources.py --nworkers 3 The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_worker_exceptions.py b/libensemble/tests/functionality_tests/test_worker_exceptions.py index 0e87eb372c..435e621e16 100644 --- a/libensemble/tests/functionality_tests/test_worker_exceptions.py +++ b/libensemble/tests/functionality_tests/test_worker_exceptions.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_worker_exceptions.py - python test_worker_exceptions.py --nworkers 3 --comms local + python test_worker_exceptions.py --nworkers 3 python test_worker_exceptions.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_workflow_dir.py b/libensemble/tests/functionality_tests/test_workflow_dir.py index fd76f8b68f..1abbc10bcf 100644 --- a/libensemble/tests/functionality_tests/test_workflow_dir.py +++ b/libensemble/tests/functionality_tests/test_workflow_dir.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_sim_input_dir_option.py - python test_sim_input_dir_option.py --nworkers 3 --comms local + python test_sim_input_dir_option.py --nworkers 3 python test_sim_input_dir_option.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_zero_resource_workers.py b/libensemble/tests/functionality_tests/test_zero_resource_workers.py index 21ff25f10f..c8f0786d06 100644 --- a/libensemble/tests/functionality_tests/test_zero_resource_workers.py +++ b/libensemble/tests/functionality_tests/test_zero_resource_workers.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_zero_resource_workers.py - python test_zero_resource_workers.py --nworkers 3 --comms local + python test_zero_resource_workers.py --nworkers 3 python test_zero_resource_workers.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/functionality_tests/test_zero_resource_workers_subnode.py b/libensemble/tests/functionality_tests/test_zero_resource_workers_subnode.py index 5ef6e6ff74..69ea2b559c 100644 --- a/libensemble/tests/functionality_tests/test_zero_resource_workers_subnode.py +++ b/libensemble/tests/functionality_tests/test_zero_resource_workers_subnode.py @@ -7,7 +7,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_zero_resource_workers_subnode.py - python test_zero_resource_workers_subnode.py --nworkers 3 --comms local + python test_zero_resource_workers_subnode.py --nworkers 3 python test_zero_resource_workers_subnode.py --nworkers 3 --comms tcp """ diff --git a/libensemble/tests/regression_tests/test_1d_sampling.py b/libensemble/tests/regression_tests/test_1d_sampling.py index b7e196659f..edecabb668 100644 --- a/libensemble/tests/regression_tests/test_1d_sampling.py +++ b/libensemble/tests/regression_tests/test_1d_sampling.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_1d_sampling.py - python test_1d_sampling.py --nworkers 3 --comms local + python test_1d_sampling.py --nworkers 3 python test_1d_sampling.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/regression_tests/test_2d_sampling.py b/libensemble/tests/regression_tests/test_2d_sampling.py index 5e888f51a7..8164c2844a 100644 --- a/libensemble/tests/regression_tests/test_2d_sampling.py +++ b/libensemble/tests/regression_tests/test_2d_sampling.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_2d_sampling.py - python test_2d_sampling.py --nworkers 3 --comms local + python test_2d_sampling.py --nworkers 3 python test_2d_sampling.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/regression_tests/test_GPU_variable_resources.py b/libensemble/tests/regression_tests/test_GPU_variable_resources.py index a44a9d24d0..b6b3197f90 100644 --- a/libensemble/tests/regression_tests/test_GPU_variable_resources.py +++ b/libensemble/tests/regression_tests/test_GPU_variable_resources.py @@ -14,7 +14,7 @@ Execute via one of the following commands (e.g. 5 workers): mpiexec -np 6 python test_GPU_variable_resources.py - python test_GPU_variable_resources.py --comms local --nworkers 5 + python test_GPU_variable_resources.py --nworkers 5 When running with the above command, the number of concurrent evaluations of the objective function will be 4, as one of the five workers will be the diff --git a/libensemble/tests/regression_tests/test_GPU_variable_resources_multi_task.py b/libensemble/tests/regression_tests/test_GPU_variable_resources_multi_task.py index 261945963f..2b583d4f06 100644 --- a/libensemble/tests/regression_tests/test_GPU_variable_resources_multi_task.py +++ b/libensemble/tests/regression_tests/test_GPU_variable_resources_multi_task.py @@ -18,7 +18,7 @@ Execute via one of the following commands (e.g. 9 workers): mpiexec -np 10 python test_GPU_variable_resources_multi_task.py - python test_GPU_variable_resources_multi_task.py --comms local --nworkers 9 + python test_GPU_variable_resources_multi_task.py --nworkers 9 When running with the above command, the number of concurrent evaluations of the objective function will be 8, as one of the nine workers will be the diff --git a/libensemble/tests/regression_tests/test_evaluate_existing_sample.py b/libensemble/tests/regression_tests/test_evaluate_existing_sample.py index 480dd53ec5..8f1ee674ce 100644 --- a/libensemble/tests/regression_tests/test_evaluate_existing_sample.py +++ b/libensemble/tests/regression_tests/test_evaluate_existing_sample.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_evaluate_existing_sample.py - python test_evaluate_existing_sample.py --nworkers 3 --comms local + python test_evaluate_existing_sample.py --nworkers 3 python test_evaluate_existing_sample.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/regression_tests/test_evaluate_mixed_sample.py b/libensemble/tests/regression_tests/test_evaluate_mixed_sample.py index 1574e8d57b..481db84191 100644 --- a/libensemble/tests/regression_tests/test_evaluate_mixed_sample.py +++ b/libensemble/tests/regression_tests/test_evaluate_mixed_sample.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_evaluate_mixed_sample.py - python test_evaluate_mixed_sample.py --nworkers 3 --comms local + python test_evaluate_mixed_sample.py --nworkers 3 python test_evaluate_mixed_sample.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/regression_tests/test_gpCAM.py b/libensemble/tests/regression_tests/test_gpCAM.py index 34836d15ab..b554752eba 100644 --- a/libensemble/tests/regression_tests/test_gpCAM.py +++ b/libensemble/tests/regression_tests/test_gpCAM.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_gpCAM.py - python test_gpCAM.py --nworkers 3 --comms local + python test_gpCAM.py --nworkers 3 When running with the above commands, the number of concurrent evaluations of the objective function will be 2, as one of the three workers will be the diff --git a/libensemble/tests/regression_tests/test_inverse_bayes_example.py b/libensemble/tests/regression_tests/test_inverse_bayes_example.py index 993fdfe12c..f1e5d1cc3a 100644 --- a/libensemble/tests/regression_tests/test_inverse_bayes_example.py +++ b/libensemble/tests/regression_tests/test_inverse_bayes_example.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_inverse_bayes_example.py - python test_inverse_bayes_example.py --nworkers 3 --comms local + python test_inverse_bayes_example.py --nworkers 3 python test_inverse_bayes_example.py --nworkers 3 --comms tcp Debugging: diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_dfols.py b/libensemble/tests/regression_tests/test_persistent_aposmm_dfols.py index 14620c7e07..6e19930691 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_dfols.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_dfols.py @@ -5,7 +5,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_dfols.py - python test_persistent_aposmm_dfols.py --nworkers 3 --comms local + python test_persistent_aposmm_dfols.py --nworkers 3 python test_persistent_aposmm_dfols.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_exception.py b/libensemble/tests/regression_tests/test_persistent_aposmm_exception.py index c5500d3ac9..b197dc3f07 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_exception.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_exception.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_exception.py - python test_persistent_aposmm_exception.py --nworkers 3 --comms local + python test_persistent_aposmm_exception.py --nworkers 3 When running with the above commands, the number of concurrent evaluations of the objective function will be 2, as one of the three workers will be the diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py b/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py index dd0a86b5ba..cf7d611547 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py @@ -15,7 +15,7 @@ Execute via one of the following commands: mpiexec -np 3 python test_persistent_aposmm_ibcdfo.py - python test_persistent_aposmm_ibcdfo.py --nworkers 2 --comms local + python test_persistent_aposmm_ibcdfo.py --nworkers 2 Both will run with 1 manager, 1 worker running APOSMM+IBCDFO), and 1 worker doing the simulation evaluations. """ diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_nlopt.py b/libensemble/tests/regression_tests/test_persistent_aposmm_nlopt.py index 681133016e..3cf69bf5dd 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_nlopt.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_nlopt.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_nlopt.py - python test_persistent_aposmm_nlopt.py --nworkers 3 --comms local + python test_persistent_aposmm_nlopt.py --nworkers 3 python test_persistent_aposmm_nlopt.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_periodic.py b/libensemble/tests/regression_tests/test_persistent_aposmm_periodic.py index 150bc73a1d..d99e8802a0 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_periodic.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_periodic.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_periodic.py - python test_persistent_aposmm_periodic.py --nworkers 3 --comms local + python test_persistent_aposmm_periodic.py --nworkers 3 When running with the above commands, the number of concurrent evaluations of the objective function will be 2, as one of the three workers will be the diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_pounders.py b/libensemble/tests/regression_tests/test_persistent_aposmm_pounders.py index d6787d570c..0a8bfb382c 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_pounders.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_pounders.py @@ -5,7 +5,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_pounders.py - python test_persistent_aposmm_pounders.py --nworkers 3 --comms local + python test_persistent_aposmm_pounders.py --nworkers 3 python test_persistent_aposmm_pounders.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_scipy.py b/libensemble/tests/regression_tests/test_persistent_aposmm_scipy.py index e0c393bc9f..ee4ec225b3 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_scipy.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_scipy.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_scipy.py - python test_persistent_aposmm_scipy.py --nworkers 3 --comms local + python test_persistent_aposmm_scipy.py --nworkers 3 python test_persistent_aposmm_scipy.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_tao_blmvm.py b/libensemble/tests/regression_tests/test_persistent_aposmm_tao_blmvm.py index 30fa297120..4d77df0ee6 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_tao_blmvm.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_tao_blmvm.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_tao_blmvm.py - python test_persistent_aposmm_tao_blmvm.py --nworkers 3 --comms local + python test_persistent_aposmm_tao_blmvm.py --nworkers 3 python test_persistent_aposmm_tao_blmvm.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_tao_nm.py b/libensemble/tests/regression_tests/test_persistent_aposmm_tao_nm.py index 0339e25326..e8401217e0 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_tao_nm.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_tao_nm.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_tao_nm.py - python test_persistent_aposmm_tao_nm.py --nworkers 3 --comms local + python test_persistent_aposmm_tao_nm.py --nworkers 3 python test_persistent_aposmm_tao_nm.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_timeout.py b/libensemble/tests/regression_tests/test_persistent_aposmm_timeout.py index e547beaaff..e61843fd71 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_timeout.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_timeout.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_timeout.py - python test_persistent_aposmm_timeout.py --nworkers 3 --comms local + python test_persistent_aposmm_timeout.py --nworkers 3 python test_persistent_aposmm_timeout.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_with_grad.py b/libensemble/tests/regression_tests/test_persistent_aposmm_with_grad.py index 23e58b134a..f2d2f09cc0 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_with_grad.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_with_grad.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_aposmm_with_grad.py - python test_persistent_aposmm_with_grad.py --nworkers 3 --comms local + python test_persistent_aposmm_with_grad.py --nworkers 3 python test_persistent_aposmm_with_grad.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py index 478b42fcc5..8df0ae006d 100644 --- a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py +++ b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py @@ -7,7 +7,7 @@ Execute via one of the following commands: mpiexec -np 4 python test_persistent_gp_multitask_ax.py - python test_persistent_gp_multitask_ax.py --nworkers 3 --comms local + python test_persistent_gp_multitask_ax.py --nworkers 3 python test_persistent_gp_multitask_ax.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_surmise_calib.py b/libensemble/tests/regression_tests/test_persistent_surmise_calib.py index de8f15597e..39cf11b5de 100644 --- a/libensemble/tests/regression_tests/test_persistent_surmise_calib.py +++ b/libensemble/tests/regression_tests/test_persistent_surmise_calib.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_surmise_calib.py - python test_persistent_surmise_calib.py --nworkers 3 --comms local + python test_persistent_surmise_calib.py --nworkers 3 python test_persistent_surmise_calib.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py b/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py index 7e9b480952..11095f61f2 100644 --- a/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py +++ b/libensemble/tests/regression_tests/test_persistent_surmise_killsims.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_surmise_killsims.py - python test_persistent_surmise_killsims.py --nworkers 3 --comms local + python test_persistent_surmise_killsims.py --nworkers 3 python test_persistent_surmise_killsims.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_tasmanian.py b/libensemble/tests/regression_tests/test_persistent_tasmanian.py index 8083a80df4..269c4ba595 100644 --- a/libensemble/tests/regression_tests/test_persistent_tasmanian.py +++ b/libensemble/tests/regression_tests/test_persistent_tasmanian.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_tasmanian.py - python test_persistent_tasmanian.py --nworkers 3 --comms local + python test_persistent_tasmanian.py --nworkers 3 python test_persistent_tasmanian.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_persistent_tasmanian_async.py b/libensemble/tests/regression_tests/test_persistent_tasmanian_async.py index 6eabed2f6e..f21544d185 100644 --- a/libensemble/tests/regression_tests/test_persistent_tasmanian_async.py +++ b/libensemble/tests/regression_tests/test_persistent_tasmanian_async.py @@ -3,7 +3,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_persistent_tasmanian_async.py - python test_persistent_tasmanian_async.py --nworkers 3 --comms local + python test_persistent_tasmanian_async.py --nworkers 3 python test_persistent_tasmanian_async.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/regression_tests/test_proxystore_integration.py b/libensemble/tests/regression_tests/test_proxystore_integration.py index a900f876d0..885e6fe6bf 100644 --- a/libensemble/tests/regression_tests/test_proxystore_integration.py +++ b/libensemble/tests/regression_tests/test_proxystore_integration.py @@ -4,7 +4,7 @@ Execute via one of the following commands (e.g. 3 workers): mpiexec -np 4 python test_evaluate_existing_sample.py - python test_evaluate_existing_sample.py --nworkers 3 --comms local + python test_evaluate_existing_sample.py --nworkers 3 python test_evaluate_existing_sample.py --nworkers 3 --comms tcp The number of concurrent evaluations of the objective function will be 4-1=3. diff --git a/libensemble/tests/regression_tests/test_with_app_persistent_aposmm_tao_nm.py b/libensemble/tests/regression_tests/test_with_app_persistent_aposmm_tao_nm.py index a314e6bafc..6d21d50d6f 100644 --- a/libensemble/tests/regression_tests/test_with_app_persistent_aposmm_tao_nm.py +++ b/libensemble/tests/regression_tests/test_with_app_persistent_aposmm_tao_nm.py @@ -7,7 +7,7 @@ Execute via one of the following commands (e.g., 3 workers): mpiexec -np 4 python test_persistent_aposmm_tao_nm.py - python test_with_app_persistent_aposmm_tao_nm.py --nworkers 3 --comms local + python test_with_app_persistent_aposmm_tao_nm.py --nworkers 3 python test_with_app_persistent_aposmm_tao_nm.py --nworkers 3 --comms tcp When running with the above commands, the number of concurrent evaluations of diff --git a/libensemble/tests/scaling_tests/forces/forces_multi_app/run_libe_forces.py b/libensemble/tests/scaling_tests/forces/forces_multi_app/run_libe_forces.py index 235aa92279..a55d502ead 100644 --- a/libensemble/tests/scaling_tests/forces/forces_multi_app/run_libe_forces.py +++ b/libensemble/tests/scaling_tests/forces/forces_multi_app/run_libe_forces.py @@ -16,10 +16,10 @@ ((nworkers - 1) - gpus_on_node) >= gen_specs["user"][max_procs] E.g., if running on one node with four GPUs, then use: - python run_libE_forces.py --comms local --nworkers 9 + python run_libE_forces.py --nworkers 9 E.g., if running on one node with eight GPUs, then use: - python run_libE_forces.py --comms local --nworkers 17 + python run_libE_forces.py --nworkers 17 """ import os diff --git a/libensemble/tests/scaling_tests/persistent_gp/run_example.py b/libensemble/tests/scaling_tests/persistent_gp/run_example.py index 5f7d642802..035fa9c1e0 100644 --- a/libensemble/tests/scaling_tests/persistent_gp/run_example.py +++ b/libensemble/tests/scaling_tests/persistent_gp/run_example.py @@ -3,7 +3,7 @@ Usage: ------ -python run_example.py --comms local --nworkers 4 +python run_example.py --nworkers 4 """ import numpy as np diff --git a/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py b/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py index 3fde6a878d..fa0fbc2165 100644 --- a/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py +++ b/libensemble/tests/scaling_tests/warpx/run_libensemble_on_warpx.py @@ -6,7 +6,7 @@ then launches WarpX simulations. Execute locally via the following command: - python run_libensemble_on_warpx.py --comms local --nworkers 3 + python run_libensemble_on_warpx.py --nworkers 3 The number of concurrent evaluations of the objective function will be nworkers=1 as one worker is for the persistent gen_f. From 162afaafbfe808624a0036a9de1e8aadebfdcd86 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Mar 2025 14:52:14 -0500 Subject: [PATCH 157/215] Remove further references to --comms local --- docs/FAQ.rst | 2 +- docs/platforms/bebop.rst | 2 +- docs/platforms/frontier.rst | 2 +- docs/platforms/improv.rst | 2 +- docs/platforms/platforms_index.rst | 2 +- docs/platforms/polaris.rst | 2 +- docs/resource_manager/overview.rst | 2 +- docs/resource_manager/zero_resource_workers.rst | 4 ++-- docs/running_libE.rst | 2 +- docs/tutorials/aposmm_tutorial.rst | 4 ++-- docs/tutorials/executor_forces_tutorial.rst | 8 ++++---- docs/tutorials/forces_gpu_tutorial.rst | 4 ++-- examples/README.rst | 4 ++-- 13 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/FAQ.rst b/docs/FAQ.rst index 2397da52f9..b8a3ea2ce5 100644 --- a/docs/FAQ.rst +++ b/docs/FAQ.rst @@ -90,7 +90,7 @@ Common Errors .. dropdown:: **PETSc and MPI errors with "[unset]: write_line error; fd=-1 buf=:cmd=abort exitcode=59"** - with ``python [test with PETSc].py --comms local --nworkers 4`` + with ``python [test with PETSc].py --nworkers 4`` This error occurs on some platforms when using PETSc with libEnsemble in ``local`` (multiprocessing) mode. We believe this is due to PETSc initializing MPI diff --git a/docs/platforms/bebop.rst b/docs/platforms/bebop.rst index 9f77aa4212..e57172c1b3 100644 --- a/docs/platforms/bebop.rst +++ b/docs/platforms/bebop.rst @@ -69,7 +69,7 @@ Once in the interactive session, you may need to reload your modules:: Now run your script with four workers (one for generator and three for simulations):: - python my_libe_script.py --comms local --nworkers 4 + python my_libe_script.py --nworkers 4 ``mpirun`` should also work. This line launches libEnsemble with a manager and **three** workers to one allocated compute node, with three nodes available for diff --git a/docs/platforms/frontier.rst b/docs/platforms/frontier.rst index 7c7a6b18c3..4fdc7a0b36 100644 --- a/docs/platforms/frontier.rst +++ b/docs/platforms/frontier.rst @@ -64,7 +64,7 @@ Now grab an interactive session on one node:: Then in the session run:: - python run_libe_forces.py --comms local --nworkers 9 + python run_libe_forces.py --nworkers 9 This places the generator on the first worker and runs simulations on the others (each simulation using one GPU). diff --git a/docs/platforms/improv.rst b/docs/platforms/improv.rst index b108fbc46c..bdb2269a85 100644 --- a/docs/platforms/improv.rst +++ b/docs/platforms/improv.rst @@ -56,7 +56,7 @@ Once in the interactive session, you may need to reload the modules:: Now run forces with five workers (one for generator and four for simulations):: - python run_libe_forces.py --comms local --nworkers 5 + python run_libe_forces.py --nworkers 5 mpi4py comms ============ diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 45fd96849f..02e4ace459 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -59,7 +59,7 @@ of the allocation:: or:: - python myscript.py --comms local --nworkers 4 + python myscript.py --nworkers 4 Either of these will run libEnsemble (inc. manager and 4 workers) on the first node. The remaining 4 nodes will be divided among the workers for submitted applications. If the same run was diff --git a/docs/platforms/polaris.rst b/docs/platforms/polaris.rst index bc44d621ab..5fdf82aaae 100644 --- a/docs/platforms/polaris.rst +++ b/docs/platforms/polaris.rst @@ -64,7 +64,7 @@ A simple example batch script for a libEnsemble use case that runs 5 workers cd $PBS_O_WORKDIR - python run_libe_forces.py --comms local --nworkers 5 + python run_libe_forces.py --nworkers 5 The script can be run with:: diff --git a/docs/resource_manager/overview.rst b/docs/resource_manager/overview.rst index d68e35567b..57231962b9 100644 --- a/docs/resource_manager/overview.rst +++ b/docs/resource_manager/overview.rst @@ -276,7 +276,7 @@ Also, this can be set on the command line as a convenience. .. code-block:: bash - python run_ensemble.py --comms local --nworkers 5 --nresource_sets 8 + python run_ensemble.py --nworkers 5 --nresource_sets 8 .. _persistent_sampling_var_resources.py: https://github.com/Libensemble/libensemble/blob/develop/libensemble/gen_funcs/persistent_sampling_var_resources.py .. _test_GPU_variable_resources.py: https://github.com/Libensemble/libensemble/blob/develop/libensemble/tests/regression_tests/test_GPU_variable_resources.py diff --git a/docs/resource_manager/zero_resource_workers.rst b/docs/resource_manager/zero_resource_workers.rst index fe8c243eb1..1dc62095e6 100644 --- a/docs/resource_manager/zero_resource_workers.rst +++ b/docs/resource_manager/zero_resource_workers.rst @@ -9,7 +9,7 @@ only run ``gen_f`` functions in-place (i.e., they do not use the Executor to submit applications to allocated nodes). Suppose the user is using the :meth:`parse_args()` function and runs:: - python run_ensemble_persistent_gen.py --comms local --nworkers 3 + python run_ensemble_persistent_gen.py --nworkers 3 If three nodes are available in the node allocation, the result may look like the following. @@ -21,7 +21,7 @@ following. To avoid the the wasted node above, add an extra worker:: - python run_ensemble_persistent_gen.py --comms local --nworkers 4 + python run_ensemble_persistent_gen.py --nworkers 4 and in the calling script (*run_ensemble_persistent_gen.py*), explicitly set the number of resource sets to the number of workers that will be running simulations. diff --git a/docs/running_libE.rst b/docs/running_libE.rst index cb86262526..ae658e31c6 100644 --- a/docs/running_libE.rst +++ b/docs/running_libE.rst @@ -53,7 +53,7 @@ supercomputers. or an :class:`Ensemble` object with ``Ensemble(parse_args=True)``, you can specify these on the command line:: - python myscript.py --comms local --nworkers N + python myscript.py --nworkers N This will launch one manager and ``N`` workers. diff --git a/docs/tutorials/aposmm_tutorial.rst b/docs/tutorials/aposmm_tutorial.rst index 2caf4b3cd9..84f549753a 100644 --- a/docs/tutorials/aposmm_tutorial.rst +++ b/docs/tutorials/aposmm_tutorial.rst @@ -117,7 +117,7 @@ busy. In practice, since a single worker becomes "persistent" for APOSMM, users should initiate one more worker than the number of parallel simulations:: - python my_aposmm_routine.py --comms local --nworkers 4 + python my_aposmm_routine.py --nworkers 4 results in three workers running simulations and one running APSOMM. @@ -265,7 +265,7 @@ optimization method:: Finally, run this libEnsemble / APOSMM optimization routine with the following:: - python my_first_aposmm.py --comms local --nworkers 4 + python my_first_aposmm.py --nworkers 4 Please note that one worker will be "persistent" for APOSMM for the duration of the routine. diff --git a/docs/tutorials/executor_forces_tutorial.rst b/docs/tutorials/executor_forces_tutorial.rst index d2196d73e3..e01496734b 100644 --- a/docs/tutorials/executor_forces_tutorial.rst +++ b/docs/tutorials/executor_forces_tutorial.rst @@ -211,7 +211,7 @@ This completes our calling script and simulation function. Run libEnsemble with: .. code-block:: bash - python run_libe_forces.py --comms local --nworkers [nworkers] + python run_libe_forces.py --nworkers [nworkers] where ``nworkers`` is one more than the number of concurrent simulations. @@ -226,7 +226,7 @@ and ``ensemble.log`` as usual. .. code-block:: bash - python run_libe_forces.py --comms local --nworkers 3 + python run_libe_forces.py --nworkers 3 my ``libE_stats.txt`` resembled:: @@ -362,13 +362,13 @@ E.g., Instead of: .. code-block:: bash - python run_libe_forces.py --comms local --nworkers 5 + python run_libe_forces.py --nworkers 5 use: .. code-block:: bash - python run_libe_forces.py --comms local --nworkers 4 + python run_libe_forces.py --nworkers 4 Note that as the generator random number seed will be zero instead of one, the checksum will change. diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index ba425e8363..e53687af4e 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -214,7 +214,7 @@ nine workers (the extra worker runs the persistent generator). For example:: - python run_libe_forces.py --comms local --nworkers 9 + python run_libe_forces.py --nworkers 9 See :ref:`zero-resource workers` for more ways to express this. @@ -298,7 +298,7 @@ that runs 8 workers on 2 nodes: export MPICH_GPU_SUPPORT_ENABLED=1 export SLURM_EXACT=1 - python run_libe_forces.py --comms local --nworkers 9 + python run_libe_forces.py --nworkers 9 where ``SLURM_EXACT`` is set to help prevent resource conflicts on each node. diff --git a/examples/README.rst b/examples/README.rst index eced66ddce..3c97602a20 100644 --- a/examples/README.rst +++ b/examples/README.rst @@ -12,9 +12,9 @@ If you wish to clone libEnsemble to try the examples instead of installing from pip install -e . cd libensemble/tests/regression_tests -Any of the tests can be run similarly to the following:: +Any of the tests can be run similarly to the following (-n is also short for --nworkers):: - python test_uniform_sampling.py --comms local --nworkers 3 + python test_uniform_sampling.py --nworkers 3 The command line arguments are parsed by a ``parse_args`` module within each of the scripts. If you have ``mpi4py`` installed you can alternatively run with:: From 47409a3549ba55c87c2c13ed66901998fbd89cd6 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Mar 2025 16:54:53 -0500 Subject: [PATCH 158/215] Rename image --- ...d_new_detailed.png => centralized_dedicated.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/images/{centralized_new_detailed.png => centralized_dedicated.png} (100%) diff --git a/docs/images/centralized_new_detailed.png b/docs/images/centralized_dedicated.png similarity index 100% rename from docs/images/centralized_new_detailed.png rename to docs/images/centralized_dedicated.png From bc6425636f71e63e2815b52bf61e7c63d7958f0e Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 20 Mar 2025 16:56:59 -0500 Subject: [PATCH 159/215] Update HPC running instructions --- docs/data_structures/libE_specs.rst | 4 +- docs/images/centralized_gen_on_manager.png | Bin 0 -> 102982 bytes docs/platforms/platforms_index.rst | 74 +++++++++++++-------- libensemble/specs.py | 4 +- 4 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 docs/images/centralized_gen_on_manager.png diff --git a/docs/data_structures/libE_specs.rst b/docs/data_structures/libE_specs.rst index 2a9195cea5..fb092dce9d 100644 --- a/docs/data_structures/libE_specs.rst +++ b/docs/data_structures/libE_specs.rst @@ -272,8 +272,8 @@ libEnsemble is primarily customized by setting options within a ``LibeSpecs`` cl ``disable_resource_manager`` is set. **dedicated_mode** [bool] = ``False``: - Disallow any resources running libEnsemble processes (manager and workers) - from being valid targets for app submissions. + Instructs libEnsemble’s MPI executor not to run applications on nodes where + libEnsemble processes (manager and workers) are running. **zero_resource_workers** [list of ints]: List of workers (by IDs) that require no resources. For when a fixed mapping of workers diff --git a/docs/images/centralized_gen_on_manager.png b/docs/images/centralized_gen_on_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..949f8e3968653c80503c58acd26b4bb4bf25de24 GIT binary patch literal 102982 zcmX`SbzGC*`#+9=(p{3HLrO)Z87V0s-60LqU85zWq>&Usq#Gm$qd{6a=4g-@Aq?2q zZ@%8Y@8|K@Kiq8heeUaA=Q`IjPQ13JG6^9AAr=-EiK>dC4i*+R5)11=CjKMLl}L52 za4alVELBB0y#R|N^M?U?%8N3d{@1_R9KZZfH+`aAR+gdT$oJCOa=qdXPp=}Iu%!;g zZ)D1Q;>H$19!KThhL%p(2x?k>{2p>*?^YP<=WTcLQ?e--Dt=MuEui8`_#h@+UY4zx zTpOPkmm2%upUdo4)~$lNB)b21<^R5*LIHY-|G#hj-!*D%`$Sm>PGmvDguPU>{@lNR zQz;h@4g9IAto!e_i7XGAIKfePWUcg1t-?cz_Ha@csV-c|cL$*jPDq>iROFdh>d0OzkY$@ZnXafuUjcrgueIncZjv4xU;H zi?m5R$_u-g8~f1_k$whdVAJgsPl+Hv5HjEn4)^dU_a~E-loa);AY$Pp_2sneTI_zG zv#k!PW4lj)`=6XfICua1kqkaQgseY-_4b^(jWQa5&i?J+nFu}0n3VNH-!^C;<-J@o#Yh#Re&5^akyNp1wcD@zQVTN!PwjBwRHitTDMd@S zNjz9xb%gx&I{{|~q~l>+pyAw~7o4ngMc#;*IWIV4K~g{cc($-`ucw8eHb2%kDPFyG z%t#_GBE$J8%s=M2_bgKY?`34i0H^l>ZiwHo-|^Wv_+XOiJHM+X*^^_>wJb|kq{ih< z6Uih6B@6fM4_dT|*WDm`?_sE~?tdv^HH81P-67IKdH3P6gF5h4-_03iX%X}$rlz{t zkH25Mi%>i9!W&LikZj{5_EM0Kk1zDkLd~G>faRw!5f)&j)4yDTkv|P8A!<+dm6Z*r z3kV?xU7}=XbNBDCu^r&Srbqr(g(=xMKe_|@N~YGJl&A9n`Y?UtYm1mafyV8xd!AB| z7iDHbJ)+byOaIFxPVD+g)AQ4+tC&y&*3*T6y=xo=2NGDg3%@qM81%0DWGApdo6XGyihY!9j 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≪88YJcR+9fMv}r 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 gives an +example with a simple MPI application. -The first mode we refer to as **central** mode, where the libEnsemble manager and worker processes -are grouped onto one or more dedicated nodes. Workers launch applications onto -the remaining allocated nodes: +Central Mode +------------ - .. image:: ../images/centralized_new_detailed.png +The default communications scheme places the manager and workers on the first node. +The :doc:`MPI Executor<../executor/mpi_executor>` can then be used on each +simulation worker to distribute user applications across the current node allocation. + +The generator will run on a worker by default, but if running a single generator, +the :ref:`libE_specs` option **gen_on_manager** is recommended, +which runs the generator on the manager (using a thread) as below. + + .. image:: ../images/centralized_gen_on_manager.png + :alt: centralized + :scale: 55 + :align: center + + +If the :ref:`libE_specs` option **dedicated_mode** is set to +True, the MPI executor will not launch applications on nodes where libEnsemble Python +processes (manager and workers) are running. Worker’s launch applications onto the +remaining nodes in the allocation. + + .. image:: ../images/centralized_dedicated.png :alt: centralized :scale: 30 :align: center -Alternatively, in **distributed** mode, the libEnsemble (manager/worker) processes -will share nodes with submitted tasks. This enables libEnsemble, using the *mpi4py* -communicator, to be run with the workers spread across nodes so as to be co-located +.. note:: + Note that **gen_on_manager** is not set in the above example. + +Note that while these diagrams show one application being run per node, configurations +with multiple nodes per worker or multiple workers per node are both common use cases. + +Distributed Mode +---------------- + +In the **distributed** approach, libEnsemble, using the *mpi4py* communicator, +can be run with the workers spread across nodes so as to be co-located with their tasks. .. image:: ../images/distributed_new_detailed.png @@ -30,10 +56,10 @@ with their tasks. :scale: 30 :align: center -Configurations with multiple nodes per worker or multiple workers per node are both -common use cases. The distributed approach allows the libEnsemble worker to read files -produced by the application on local node storage. HPC systems that allow only one -application to be launched to a node at any one time prevent distributed configuration. +The distributed approach allows the libEnsemble worker to read files +produced by the application on local node storage. + +Distributed mode is also useful when workers are running simulations directly through Configuring the Run ------------------- @@ -63,22 +89,16 @@ or:: Either of these will run libEnsemble (inc. manager and 4 workers) on the first node. The remaining 4 nodes will be divided among the workers for submitted applications. If the same run was -performed without ``libE_specs["dedicated_mode"]=True``, runs could be submitted to all 5 nodes. The number of workers -can be modified to allow either multiple workers to map to each node or multiple nodes per worker. +performed without ``libE_specs["dedicated_mode"]=True``, runs could be submitted to all 5 nodes. +The number of workers can be modified to allow either multiple workers to map to each node or +multiple nodes per worker. To launch libEnsemble distributed requires a less trivial libEnsemble run script. For example:: mpirun -np 5 -ppn 1 python myscript.py -would launch libEnsemble with 5 processes across 5 nodes. However, the manager would have its -own node, which is likely wasteful. More often, a ``machinefile`` is used to add the manager to -the first node. In the :doc:`examples` directory, you can find an example submission -script, configured to run libensemble distributed, with multiple workers per node or multiple nodes -per worker, and adding the manager onto the first node. - -HPC systems that only allow one application to be launched to a node at any one time, -will not allow a distributed configuration. +would launch libEnsemble with 5 processes across 5 nodes. Systems with Launch/MOM Nodes ----------------------------- diff --git a/libensemble/specs.py b/libensemble/specs.py index 3b72482fc2..aa70018362 100644 --- a/libensemble/specs.py +++ b/libensemble/specs.py @@ -469,8 +469,8 @@ class LibeSpecs(BaseModel): dedicated_mode: Optional[bool] = False """ - Instructs libEnsemble to not run applications on resources where libEnsemble - processes (manager and workers) are running. + Instructs libEnsemble’s MPI executor not to run applications on nodes where + libEnsemble processes (manager and workers) are running. """ zero_resource_workers: Optional[List[int]] = [] From 2984dffdee89fe52e42a3c97b8991056dd89d104 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Mar 2025 15:51:02 -0500 Subject: [PATCH 160/215] Show code alongside diagram --- docs/platforms/platforms_index.rst | 39 +++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index b61693adfb..afed527d7d 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -17,6 +17,7 @@ Central Mode The default communications scheme places the manager and workers on the first node. The :doc:`MPI Executor<../executor/mpi_executor>` can then be used on each simulation worker to distribute user applications across the current node allocation. +This is the most common approach, when each simulation is running an MPI application. The generator will run on a worker by default, but if running a single generator, the :ref:`libE_specs` option **gen_on_manager** is recommended, @@ -27,6 +28,20 @@ which runs the generator on the manager (using a thread) as below. :scale: 55 :align: center + .. code-block:: python + + ensemble.libE_specs = LibeSpecs( + gen_on_manager=True, + ) + +When using **gen_on_manager**, set ``nworkers`` to the number of workers desired for running +simulations. A batch script may include: + + .. code-block:: bash + + #SBATCH --nodes 3 + + python run_libe_forces.py --nworkers 3 If the :ref:`libE_specs` option **dedicated_mode** is set to True, the MPI executor will not launch applications on nodes where libEnsemble Python @@ -38,28 +53,34 @@ remaining nodes in the allocation. :scale: 30 :align: center -.. note:: - Note that **gen_on_manager** is not set in the above example. +Note that **gen_on_manager** is not set in the above example. + + .. code-block:: python + + ensemble.libE_specs = LibeSpecs( + dedicated_mode=True, + ) + Note that while these diagrams show one application being run per node, configurations -with multiple nodes per worker or multiple workers per node are both common use cases. +with **multiple nodes per worker** or **multiple workers per node** are both common use cases. Distributed Mode ---------------- -In the **distributed** approach, libEnsemble, using the *mpi4py* communicator, -can be run with the workers spread across nodes so as to be co-located -with their tasks. +In the **distributed** approach, libEnsemble can be run using the **mpi4py** +communicator, with workers distributed across nodes to be co-located with their tasks. .. image:: ../images/distributed_new_detailed.png :alt: distributed :scale: 30 :align: center -The distributed approach allows the libEnsemble worker to read files -produced by the application on local node storage. +The distributed approach allows the libEnsemble worker to read files produced by the +application on local node storage. -Distributed mode is also useful when workers are running simulations directly through +Distributed mode is also useful when workers are running simulations directly, via a +Python interface. Configuring the Run ------------------- From c1734275d0d74e9e25780173ff37cba5797d61d8 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Mar 2025 15:54:50 -0500 Subject: [PATCH 161/215] Clarifying wording --- docs/platforms/platforms_index.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index afed527d7d..7451145181 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -15,9 +15,10 @@ Central Mode ------------ The default communications scheme places the manager and workers on the first node. -The :doc:`MPI Executor<../executor/mpi_executor>` can then be used on each -simulation worker to distribute user applications across the current node allocation. -This is the most common approach, when each simulation is running an MPI application. +The :doc:`MPI Executor<../executor/mpi_executor>` can then be invoked on each +simulation worker, and libEnsemble will distribute user applications across the +current node allocation. This is the most common approach, when each simulation +is running an MPI application. The generator will run on a worker by default, but if running a single generator, the :ref:`libE_specs` option **gen_on_manager** is recommended, From bd0c9426cba848a744fb405caf627973d1850775 Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Mar 2025 18:26:49 -0500 Subject: [PATCH 162/215] Restructure HPC docs --- docs/platforms/platforms_index.rst | 85 +++++++++++++------------- docs/tutorials/forces_gpu_tutorial.rst | 2 + 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 7451145181..fd4836b9b8 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -77,6 +77,12 @@ communicator, with workers distributed across nodes to be co-located with their :scale: 30 :align: center + +To run using a 3-node allocation with 3 workers using an `mpich` based MPI. From the +head node of the allocation run the following (inc. manager and 3 workers):: + + mpirun -np 4 -ppn 1 python myscript.py + The distributed approach allows the libEnsemble worker to read files produced by the application on local node storage. @@ -92,35 +98,53 @@ the nodes within that allocation. *How does libEnsemble know where to run tasks (user applications)?* -The libEnsemble :doc:`Executor<../executor/ex_index>` can be initialized from the user calling +The libEnsemble :doc:`MPI Executor<../executor/mpi_executor>` can be initialized from the user calling script, and then used by workers to run tasks. The Executor will automatically detect the nodes available on most systems. Alternatively, the user can provide a file called **node_list** in the run directory. By default, the Executor will divide up the nodes evenly to each worker. -If the argument ``libE_specs["dedicated_mode"]=True`` is used when initializing libEnsemble, then any node -that is running a libEnsemble manager or worker will be removed from the node-list available -to the workers, ensuring libEnsemble has dedicated nodes. -To run in central mode using a 5-node allocation with 4 workers: From the head node -of the allocation:: +Mapping Tasks to Resources +-------------------------- - mpirun -np 5 python myscript.py +The :ref:`resource manager` detects node lists from +:ref:`common batch schedulers`, +and partition these to workers. The :doc:`MPI Executor<../executor/mpi_executor>` +accesses the resources available to the current worker when launching tasks. + +Zero-resource workers +~~~~~~~~~~~~~~~~~~~~~ + +Users with persistent ``gen_f`` functions may notice that the persistent workers +are still automatically assigned system resources. This can be resolved by using +the ``gen_on_manager`` option or by +:ref:`fixing the number of resource sets`. -or:: +Assigning GPUs +-------------- - python myscript.py --nworkers 4 +libEnsemble automatically detects and assigns Nvidia, AMD, and Intel GPUs without modifying the user scripts. This automatically works on many systems, but if the assignment is incorrect or needs to be modified the user can specify :ref:`platform information`. +The :doc:`forces_gpu tutorial<../tutorials/forces_gpu_tutorial>` shows an example of this. -Either of these will run libEnsemble (inc. manager and 4 workers) on the first node. The remaining -4 nodes will be divided among the workers for submitted applications. If the same run was -performed without ``libE_specs["dedicated_mode"]=True``, runs could be submitted to all 5 nodes. -The number of workers can be modified to allow either multiple workers to map to each node or -multiple nodes per worker. +Varying resources +----------------- -To launch libEnsemble distributed requires a less trivial libEnsemble run script. -For example:: +libEnsemble also features :ref:`dynamic resource assignment`, whereby the +number of processes and/or the number of GPUs can be a set for each simulation by the generator. + + +Overriding Auto-Detection +------------------------- + +libEnsemble can automatically detect system information. This includes resource information, such as +available nodes and the number of cores on the node, and information about available MPI runners. + +System detection for resources can be overridden using the :ref:`resource_info` +libE_specs option. + +When using the MPI Executor, it is possible to override the detected information using the +`custom_info` argument. See the :doc:`MPI Executor<../executor/mpi_executor>` for more. - mpirun -np 5 -ppn 1 python myscript.py -would launch libEnsemble with 5 processes across 5 nodes. Systems with Launch/MOM Nodes ----------------------------- @@ -160,31 +184,6 @@ or *to entirely different systems*. Submission scripts for running on launch/MOM nodes and for using Balsam, can be found in the :doc:`examples`. -Mapping Tasks to Resources --------------------------- - -The :ref:`resource manager` can :ref:`detect system resources`, -and partition these to workers. The :doc:`MPI Executor<../executor/mpi_executor>` -accesses the resources available to the current worker when launching tasks. - -Zero-resource workers -~~~~~~~~~~~~~~~~~~~~~ - -Users with persistent ``gen_f`` functions may notice that the persistent workers -are still automatically assigned system resources. This can be resolved by -:ref:`fixing the number of resource sets`. - -Overriding Auto-Detection -------------------------- - -libEnsemble can automatically detect system information. This includes resource information, such as -available nodes and the number of cores on the node, and information about available MPI runners. - -System detection for resources can be overridden using the :ref:`resource_info` -libE_specs option. - -When using the MPI Executor, it is possible to override the detected information using the -`custom_info` argument. See the :doc:`MPI Executor<../executor/mpi_executor>` for more. .. _globus_compute_ref: diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index e53687af4e..7e6423ac54 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -225,6 +225,8 @@ If you want to have two GPUs per worker on the same system (with four GPUs per n you could assign only four workers. You will see that two GPUs are used for each forces run. +.. _var_resources_gpu + Varying resources ----------------- From 0c8165c4286833cc576e37cae4be10f409df108c Mon Sep 17 00:00:00 2001 From: shudson Date: Fri, 21 Mar 2025 18:57:57 -0500 Subject: [PATCH 163/215] Fix broken link --- docs/platforms/platforms_index.rst | 2 +- docs/tutorials/forces_gpu_tutorial.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index fd4836b9b8..a46a4f23e8 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -128,7 +128,7 @@ The :doc:`forces_gpu tutorial<../tutorials/forces_gpu_tutorial>` shows an exampl Varying resources ----------------- -libEnsemble also features :ref:`dynamic resource assignment`, whereby the +libEnsemble also features :ref:`dynamic resource assignment`, whereby the number of processes and/or the number of GPUs can be a set for each simulation by the generator. diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index 7e6423ac54..ab1ee121fc 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -225,7 +225,7 @@ If you want to have two GPUs per worker on the same system (with four GPUs per n you could assign only four workers. You will see that two GPUs are used for each forces run. -.. _var_resources_gpu +.. _var-resources-gpu: Varying resources ----------------- From 2dea88ec9c1be08754a27942db8093add273f6a6 Mon Sep 17 00:00:00 2001 From: shudson Date: Sat, 22 Mar 2025 11:15:47 -0500 Subject: [PATCH 164/215] Put example code beside diagrams --- docs/platforms/platforms_index.rst | 78 ++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index a46a4f23e8..6f5c3e8f33 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -11,8 +11,8 @@ the available nodes. The :doc:`Forces tutorial <../../tutorials/executor_forces_tutorial>` gives an example with a simple MPI application. -Central Mode ------------- +Centralized Running +------------------- The default communications scheme places the manager and workers on the first node. The :doc:`MPI Executor<../executor/mpi_executor>` can then be invoked on each @@ -24,50 +24,76 @@ The generator will run on a worker by default, but if running a single generator the :ref:`libE_specs` option **gen_on_manager** is recommended, which runs the generator on the manager (using a thread) as below. - .. image:: ../images/centralized_gen_on_manager.png - :alt: centralized - :scale: 55 - :align: center +.. list-table:: + :widths: 60 40 - .. code-block:: python + * - .. image:: ../images/centralized_gen_on_manager.png + :alt: centralized + :scale: 55 - ensemble.libE_specs = LibeSpecs( - gen_on_manager=True, - ) + - In calling script: + + .. code-block:: python + :linenos: + + ensemble.libE_specs = LibeSpecs( + gen_on_manager=True, + ) + + A SLURM batch script may include: -When using **gen_on_manager**, set ``nworkers`` to the number of workers desired for running -simulations. A batch script may include: - .. code-block:: bash + .. code-block:: bash - #SBATCH --nodes 3 + #SBATCH --nodes 3 - python run_libe_forces.py --nworkers 3 + python run_libe_forces.py --nworkers 3 + + +When using **gen_on_manager**, set ``nworkers`` to the number of workers desired for running simulations. + +Dedicated Mode +^^^^^^^^^^^^^^ If the :ref:`libE_specs` option **dedicated_mode** is set to True, the MPI executor will not launch applications on nodes where libEnsemble Python processes (manager and workers) are running. Worker’s launch applications onto the remaining nodes in the allocation. - .. image:: ../images/centralized_dedicated.png - :alt: centralized - :scale: 30 - :align: center -Note that **gen_on_manager** is not set in the above example. +.. list-table:: + :widths: 60 40 - .. code-block:: python + * - .. image:: ../images/centralized_dedicated.png + :alt: centralized dedicated mode + :scale: 30 + + - In calling script: + + .. code-block:: python + :linenos: + + ensemble.libE_specs = LibeSpecs( + dedicated_mode=True, + ) + + A SLURM batch script may include: - ensemble.libE_specs = LibeSpecs( - dedicated_mode=True, - ) + .. code-block:: bash + + #SBATCH --nodes 3 + + python run_libe_forces.py --nworkers 3 + + +Note that **gen_on_manager** is not set in the above example. Note that while these diagrams show one application being run per node, configurations with **multiple nodes per worker** or **multiple workers per node** are both common use cases. -Distributed Mode ----------------- +Distributed Running +-------------------- In the **distributed** approach, libEnsemble can be run using the **mpi4py** communicator, with workers distributed across nodes to be co-located with their tasks. From 0d1e13b44a5152560312feed5475630c5b6823e8 Mon Sep 17 00:00:00 2001 From: shudson Date: Sat, 22 Mar 2025 11:23:23 -0500 Subject: [PATCH 165/215] Update example libE specs options and change order --- docs/data_structures/data_structures.rst | 4 ++-- docs/data_structures/libE_specs.rst | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/data_structures/data_structures.rst b/docs/data_structures/data_structures.rst index 1d88d993dd..35a5ba0158 100644 --- a/docs/data_structures/data_structures.rst +++ b/docs/data_structures/data_structures.rst @@ -8,9 +8,9 @@ See :ref:`here` for instruction on constructing a complete workflow :maxdepth: 2 :caption: libEnsemble Specifications: - sim_specs - gen_specs libE_specs + gen_specs + sim_specs alloc_specs platform_specs persis_info diff --git a/docs/data_structures/libE_specs.rst b/docs/data_structures/libE_specs.rst index fb092dce9d..c0ca141403 100644 --- a/docs/data_structures/libE_specs.rst +++ b/docs/data_structures/libE_specs.rst @@ -1,7 +1,7 @@ .. _datastruct-libe-specs: -General Specs -============= +LibE Specs +========== libEnsemble is primarily customized by setting options within a ``LibeSpecs`` class or dictionary. @@ -10,11 +10,10 @@ libEnsemble is primarily customized by setting options within a ``LibeSpecs`` cl from libensemble.specs import LibeSpecs specs = LibeSpecs( - comm=MPI.COMM_WORLD, - comms="mpi", - save_every_k_gens=1000, + gen_on_manager=True, + save_every_k_gens=100, sim_dirs_make=True, - ensemble_dir_path="/scratch/ensemble", + nworkers=4 ) .. dropdown:: Settings by Category From 47cdd6618756754d0c9dc07f4710698ef0d52042 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Mon, 24 Mar 2025 15:33:57 -0500 Subject: [PATCH 166/215] Update platforms_index.rst --- docs/platforms/platforms_index.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 6f5c3e8f33..6af3725f8f 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -3,9 +3,9 @@ Running on HPC Systems ====================== -libEnsemble has been tested on systems of highly varying scales, from laptops to +libEnsemble has been tested on systems of highly varying scales, from laptops to thousands of compute nodes. On multi-node systems, there are a few alternative -ways of configuring libEnsemble to run and launch tasks (user applications) on +ways of configuring libEnsemble to run and launch tasks (i.e., user applications) on the available nodes. The :doc:`Forces tutorial <../../tutorials/executor_forces_tutorial>` gives an @@ -15,12 +15,12 @@ Centralized Running ------------------- The default communications scheme places the manager and workers on the first node. -The :doc:`MPI Executor<../executor/mpi_executor>` can then be invoked on each +The :doc:`MPI Executor<../executor/mpi_executor>` can then be invoked by each simulation worker, and libEnsemble will distribute user applications across the -current node allocation. This is the most common approach, when each simulation -is running an MPI application. +node allocation. This is the most common approach where each simulation +runs an MPI application. -The generator will run on a worker by default, but if running a single generator, +The generator will run on one worker by default, but if running a single generator, the :ref:`libE_specs` option **gen_on_manager** is recommended, which runs the generator on the manager (using a thread) as below. From 4113234a88446fe18b02844364d3453c6be8dd43 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Mon, 24 Mar 2025 15:39:16 -0500 Subject: [PATCH 167/215] Update platforms_index.rst --- docs/platforms/platforms_index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 6af3725f8f..baf57b7ae9 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -57,7 +57,7 @@ Dedicated Mode If the :ref:`libE_specs` option **dedicated_mode** is set to True, the MPI executor will not launch applications on nodes where libEnsemble Python -processes (manager and workers) are running. Worker’s launch applications onto the +processes (manager and workers) are running. Workers launch applications onto the remaining nodes in the allocation. @@ -112,7 +112,7 @@ head node of the allocation run the following (inc. manager and 3 workers):: The distributed approach allows the libEnsemble worker to read files produced by the application on local node storage. -Distributed mode is also useful when workers are running simulations directly, via a +Distributed mode is also useful when workers run simulations directly, via a Python interface. Configuring the Run @@ -134,7 +134,7 @@ Mapping Tasks to Resources The :ref:`resource manager` detects node lists from :ref:`common batch schedulers`, -and partition these to workers. The :doc:`MPI Executor<../executor/mpi_executor>` +and partitions these to workers. The :doc:`MPI Executor<../executor/mpi_executor>` accesses the resources available to the current worker when launching tasks. Zero-resource workers @@ -207,7 +207,7 @@ or *to entirely different systems*. (New) Multi-System: libEnsemble + BalsamExecutor -Submission scripts for running on launch/MOM nodes and for using Balsam, can be found in +Submission scripts for running on launch/MOM nodes and for using Balsam can be found in the :doc:`examples`. From af72a34b5bcb46be8dfdb7b91de6d40476ed5bdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 20:52:27 +0000 Subject: [PATCH 168/215] Update setuptools requirement in the python-updates group Updates the requirements on [setuptools](https://github.com/pypa/setuptools) to permit the latest version. Updates `setuptools` to 78.0.1 - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v75.1.0...v78.0.1) --- updated-dependencies: - dependency-name: setuptools dependency-type: direct:production dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7de7e37c37..7aca0ef7ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ Issues = "https://github.com/Libensemble/libensemble/issues" [build-system] build-backend = "setuptools.build_meta" -requires = ["setuptools", "wheel", "pip>=24.3.1,<26", "setuptools>=75.1.0,<77", ] +requires = ["setuptools", "wheel", "pip>=24.3.1,<26", "setuptools>=75.1.0,<79", ] [tool.setuptools.packages.find] where = ["."] From 2ea7ba69e712773fd715ceb1023be1e0f0f7d4b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:24:57 +0000 Subject: [PATCH 169/215] Bump crate-ci/typos from 1.30.2 to 1.30.3 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.30.2 to 1.30.3. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.30.2...v1.30.3) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index f25437324a..74cf21421a 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.30.2 + - uses: crate-ci/typos@v1.30.3 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index db1ecec979..a2a5ef7fe8 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -180,4 +180,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.30.2 + - uses: crate-ci/typos@v1.30.3 From d946e90492930515090152c07e4e8d5aeac62417 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 26 Mar 2025 16:00:19 -0500 Subject: [PATCH 170/215] slurm_distrib script based on older bebop slurm distrib script, remove pbs_distrib script (that was probably wrong anyway) --- .../bebop_submit_pbs_central.sh | 14 +++ .../bebop_submit_pbs_distrib.sh | 12 --- .../bebop_submit_slurm_central.sh | 24 ----- .../submit_distrib_mpi4py.sh | 89 +++++++++++++++++++ 4 files changed, 103 insertions(+), 36 deletions(-) create mode 100644 examples/libE_submission_scripts/bebop_submit_pbs_central.sh delete mode 100644 examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh delete mode 100644 examples/libE_submission_scripts/bebop_submit_slurm_central.sh create mode 100644 examples/libE_submission_scripts/submit_distrib_mpi4py.sh diff --git a/examples/libE_submission_scripts/bebop_submit_pbs_central.sh b/examples/libE_submission_scripts/bebop_submit_pbs_central.sh new file mode 100644 index 0000000000..4d0aff5894 --- /dev/null +++ b/examples/libE_submission_scripts/bebop_submit_pbs_central.sh @@ -0,0 +1,14 @@ +#!/bin/bash -l +#PBS -l select=4 +#PBS -l walltime=00:15:00 +#PBS -q bdwall +#PBS -A [project] +#PBS -N libE_example + + +cd $PBS_O_WORKDIR +# Choose MPI backend. Note that the built mpi4py in your environment should match. +module load oneapi/mpi +# module load openmpi + +python run_libe_example.py -n 16 diff --git a/examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh b/examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh deleted file mode 100644 index 756471d087..0000000000 --- a/examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -l -#PBS -l select=2:mpiprocs=16 -#PBS -l walltime=00:15:00 -#PBS -q bdwall -#PBS -A [project] -#PBS -N libE_example - - -cd $PBS_O_WORKDIR -module load openmpi - -mpirun -n 16 --ppn 8 python run_libe_example.py diff --git a/examples/libE_submission_scripts/bebop_submit_slurm_central.sh b/examples/libE_submission_scripts/bebop_submit_slurm_central.sh deleted file mode 100644 index f599a05099..0000000000 --- a/examples/libE_submission_scripts/bebop_submit_slurm_central.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -#SBATCH -J libE_test_central -#SBATCH -N 5 -#SBATCH -p knlall -#SBATCH -A -#SBATCH -o tlib.%j.%N.out -#SBATCH -e tlib.%j.%N.error -#SBATCH -t 01:00:00 - -# Launch script for running in central mode with mpi4py. -# libEnsemble will run on a dedicated node (or nodes). -# The remaining nodes in the allocation will be dedicated to worker launched apps. -# Use executor with auto-resources=True and central_mode=True. - -# User to edit these variables -export EXE=libE_calling_script.py -export NUM_WORKERS=4 -export I_MPI_FABRICS=shm:tmi - -# Overcommit will allow ntasks up to the no. of contexts on one node (eg. 320 on Bebop) -srun --overcommit --ntasks=$(($NUM_WORKERS+1)) --nodes=1 python $EXE - -# To use local mode instead of mpi4py (with parse_args()) -# python calling_script.py -n $NUM_WORKERS diff --git a/examples/libE_submission_scripts/submit_distrib_mpi4py.sh b/examples/libE_submission_scripts/submit_distrib_mpi4py.sh new file mode 100644 index 0000000000..d696c1dfa6 --- /dev/null +++ b/examples/libE_submission_scripts/submit_distrib_mpi4py.sh @@ -0,0 +1,89 @@ +#!/bin/bash +#SBATCH -J libE_test +#SBATCH -N 4 +#SBATCH -p [queue] +#SBATCH -A +#SBATCH -o tlib.%j.%N.out +#SBATCH -e tlib.%j.%N.error +#SBATCH -t 01:00:00 + +# Launch script that runs in distributed mode with mpi4py. +# Workers are evenly spread over nodes and manager added to the first node. +# Requires even distribution - either multiple workers per node or nodes per worker +# Option for manager to have a dedicated node. +# Use of MPI Executor will ensure workers co-locate tasks with workers +# If node_list file is kept, this informs libe of resources. Else, libe auto-detects. + +# User to edit these variables +export EXE=libE_calling_script.py +export NUM_WORKERS=4 +export MANAGER_NODE=false # true = Manager has a dedicated node (assign one extra) +export USE_NODE_LIST=true # If false, allow libE to determine node_list from environment. + +# As libE shares nodes with user applications allow fallback if contexts overrun. +unset I_MPI_FABRICS +export I_MPI_FABRICS_LIST=tmi,tcp +export I_MPI_FALLBACK=1 + +# If using in calling script (After N mins manager kills workers and exits cleanly) +export LIBE_WALLCLOCK=55 + +#----------------------------------------------------------------------------- +# Work out distribution +if [[ $MANAGER_NODE = "true" ]]; then + WORKER_NODES=$(($SLURM_NNODES-1)) +else + WORKER_NODES=$SLURM_NNODES +fi + +if [[ $NUM_WORKERS -ge $WORKER_NODES ]]; then + SUB_NODE_WORKERS=true + WORKERS_PER_NODE=$(($NUM_WORKERS/$WORKER_NODES)) +else + SUB_NODE_WORKERS=false + NODES_PER_WORKER=$(($WORKER_NODES/$NUM_WORKERS)) +fi; +#----------------------------------------------------------------------------- + +# A little useful information +echo -e "Manager process running on: $HOSTNAME" +echo -e "Directory is: $PWD" + +# Generate a node list with 1 node per line: +srun hostname | sort -u > node_list + +# Add manager node to machinefile +head -n 1 node_list > machinefile.$SLURM_JOBID + +# Add worker nodes to machinefile +if [[ $SUB_NODE_WORKERS = "true" ]]; then + awk -v repeat=$WORKERS_PER_NODE '{for(i=0; i>machinefile.$SLURM_JOBID +else + awk -v patt="$NODES_PER_WORKER" 'NR % patt == 1' node_list \ + >> machinefile.$SLURM_JOBID +fi; + +if [[ $USE_NODE_LIST = "false" ]]; then + rm node_list + wait +fi; + +# Put in a timestamp +echo Starting execution at: `date` + +# To use srun +export SLURM_HOSTFILE=machinefile.$SLURM_JOBID + +# The "arbitrary" flag should ensure SLURM_HOSTFILE is picked up +# cmd="srun --ntasks $(($NUM_WORKERS+1)) -m arbitrary python $EXE" +cmd="srun --ntasks $(($NUM_WORKERS+1)) -m arbitrary python $EXE $LIBE_WALLCLOCK" + +echo The command is: $cmd +echo End PBS script information. +echo All further output is from the process being run and not the script.\n\n $cmd + +$cmd + +# Print the date again -- when finished +echo Finished at: `date` From 0be3b0dd922af1c5fb89879186f11ae6de4b6155 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:21:53 +0000 Subject: [PATCH 171/215] Bump crate-ci/typos from 1.30.3 to 1.31.1 Bumps [crate-ci/typos](https://github.com/crate-ci/typos) from 1.30.3 to 1.31.1. - [Release notes](https://github.com/crate-ci/typos/releases) - [Changelog](https://github.com/crate-ci/typos/blob/master/CHANGELOG.md) - [Commits](https://github.com/crate-ci/typos/compare/v1.30.3...v1.31.1) --- updated-dependencies: - dependency-name: crate-ci/typos dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/basic.yml | 2 +- .github/workflows/extra.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 74cf21421a..7a008367da 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -129,4 +129,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.30.3 + - uses: crate-ci/typos@v1.31.1 diff --git a/.github/workflows/extra.yml b/.github/workflows/extra.yml index a2a5ef7fe8..e9b0275dda 100644 --- a/.github/workflows/extra.yml +++ b/.github/workflows/extra.yml @@ -180,4 +180,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: crate-ci/typos@v1.30.3 + - uses: crate-ci/typos@v1.31.1 From 3ab5e6c88dd23c99d9d38525a1d9512eb7ed0bf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:32:02 +0000 Subject: [PATCH 172/215] Bump the python-updates group with 2 updates Bumps the python-updates group with 2 updates: [flake8](https://github.com/pycqa/flake8) and [rich](https://github.com/Textualize/rich). Updates `flake8` from 7.1.2 to 7.2.0 - [Commits](https://github.com/pycqa/flake8/compare/7.1.2...7.2.0) Updates `rich` from 13.9.4 to 14.0.0 - [Release notes](https://github.com/Textualize/rich/releases) - [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md) - [Commits](https://github.com/Textualize/rich/compare/v13.9.4...v14.0.0) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates - dependency-name: rich dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- install/testing_requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/testing_requirements.txt b/install/testing_requirements.txt index 5e78c8b7e3..a5fc6d3c0f 100644 --- a/install/testing_requirements.txt +++ b/install/testing_requirements.txt @@ -1,4 +1,4 @@ -flake8==7.1.2 +flake8==7.2.0 coverage>=7.5 pytest==8.3.5 pytest-cov==6.0.0 @@ -8,4 +8,4 @@ python-dateutil==2.9.0.post0 anyio==4.9.0 matplotlib==3.10.1 mpmath==1.3.0 -rich==13.9.4 +rich==14.0.0 From 5dd254a06b73b9a99546dd54f996cbeeaa6ac07c Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 11:05:35 -0500 Subject: [PATCH 173/215] Modify distributed docs --- docs/platforms/platforms_index.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index baf57b7ae9..a70ad05ee5 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -96,24 +96,24 @@ Distributed Running -------------------- In the **distributed** approach, libEnsemble can be run using the **mpi4py** -communicator, with workers distributed across nodes to be co-located with their tasks. +communicator, with workers distributed across nodes. This is most often used +when workers run simulation code directly, via a Python interface, and may be +run an mpirunner, for example (using an `mpich` based MPI):: + + mpirun -np 4 -ppn 1 python myscript.py + +The distributed approach, can also be used with the executor, to co-locate workers +with the applications they submit. To ensure workers are placed as required in this +case, requires a careful MPI rank placement. .. image:: ../images/distributed_new_detailed.png :alt: distributed :scale: 30 :align: center +This allows the libEnsemble worker to read files produced by the application on +local node storage. -To run using a 3-node allocation with 3 workers using an `mpich` based MPI. From the -head node of the allocation run the following (inc. manager and 3 workers):: - - mpirun -np 4 -ppn 1 python myscript.py - -The distributed approach allows the libEnsemble worker to read files produced by the -application on local node storage. - -Distributed mode is also useful when workers run simulations directly, via a -Python interface. Configuring the Run ------------------- From f5be0c4b62b3793ab6d623e0d9ce69992718dbe3 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 11:41:50 -0500 Subject: [PATCH 174/215] Update submission scripts docs add note --- docs/platforms/example_scripts.rst | 43 +++++++++++-------- .../submit_perlmutter.sh | 3 +- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 3f63524520..93ab2a5cfd 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -2,8 +2,22 @@ Example Scheduler Submission Scripts ==================================== Below are example submission scripts used to configure and launch libEnsemble -on a variety of high-powered systems. See :ref:`here` for more -information about the respective systems and configuration. +on a variety of high-powered systems. See :ref:`Running on HPC Systems` +for more information about the respective systems and configuration. + +.. note:: + It is **highly recommended** that the directive lines (e.g., #SBATCH) in batch + submission scripts do **NOT** specify processor, task, or GPU configuration info + --- these lines should only specify the number of nodes required. + + For example, do not specify ``#SBATCH --gpus-per-node=4`` in order to use four + GPUs on the node, when each worker may use less than this, as this may assign + all of the GPUs to a single MPI invocation. Instead, the configuration should + be supplied either + :doc:`in the simulation function<../examples/sim_funcs/forces_simf_gpu>` + or, if using dynamic resources, + :doc:`in the generator<../examples/sim_funcs/forces_simf_gpu_vary_resources>`. + General examples ---------------- @@ -55,22 +69,22 @@ System Examples :caption: /examples/libE_submission_scripts/submit_pbs_polaris.sh :language: bash -.. dropdown:: Bridges - Central Mode +.. dropdown:: Bebop - Central Mode - .. literalinclude:: ../../examples/libE_submission_scripts/bridges_submit_slurm_central.sh - :caption: /examples/libE_submission_scripts/bridges_submit_slurm_central.sh + .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_central.sh + :caption: /examples/libE_submission_scripts/bebop_submit_pbs_central.sh :language: bash -.. dropdown:: Bebop - Central Mode +.. dropdown:: Bridges - MPI / Central Mode - .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_slurm_central.sh - :caption: /examples/libE_submission_scripts/bebop_submit_slurm_central.sh + .. literalinclude:: ../../examples/libE_submission_scripts/bridges_submit_slurm_central.sh + :caption: /examples/libE_submission_scripts/bridges_submit_slurm_central.sh :language: bash -.. dropdown:: Bebop - Distributed Mode +.. dropdown:: SLURM - MPI / Distributed Mode (co-locate workers & MPI applications) - .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh - :caption: /examples/libE_submission_scripts/bebop_submit_pbs_distrib.sh + .. literalinclude:: ../../examples/libE_submission_scripts/submit_distrib_mpi4py.sh + :caption: /examples/libE_submission_scripts/submit_distrib_mpi4py.sh :language: bash .. dropdown:: Summit (Decommissioned) - On Launch Nodes with Multiprocessing @@ -78,10 +92,3 @@ System Examples .. literalinclude:: ../../examples/libE_submission_scripts/summit_submit_mproc.sh :caption: /examples/libE_submission_scripts/summit_submit_mproc.sh :language: bash - -.. dropdown:: Cobalt - Intermediate node with Multiprocessing - - .. literalinclude:: ../../examples/libE_submission_scripts/cobalt_submit_mproc.sh - :caption: /examples/libE_submission_scripts/cobalt_submit_mproc.sh - :language: bash - diff --git a/examples/libE_submission_scripts/submit_perlmutter.sh b/examples/libE_submission_scripts/submit_perlmutter.sh index ae34d39e56..8a029761ab 100644 --- a/examples/libE_submission_scripts/submit_perlmutter.sh +++ b/examples/libE_submission_scripts/submit_perlmutter.sh @@ -7,10 +7,9 @@ # This script is using GPU partition export MPICH_GPU_SUPPORT_ENABLED=1 -export SLURM_EXACT=1 # One worker for generator and 4 for sims (one GPU each) python libe_calling_script.py -n 5 # Or if libE_specs option gen_on_manager=True -python libe_calling_script.py -n 4 +# python libe_calling_script.py -n 4 From df38474ad7ef52ee42324220b0057c1511cc677e Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 11:56:35 -0500 Subject: [PATCH 175/215] Comment out fallback lines --- examples/libE_submission_scripts/submit_distrib_mpi4py.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/libE_submission_scripts/submit_distrib_mpi4py.sh b/examples/libE_submission_scripts/submit_distrib_mpi4py.sh index d696c1dfa6..2d15c07abb 100644 --- a/examples/libE_submission_scripts/submit_distrib_mpi4py.sh +++ b/examples/libE_submission_scripts/submit_distrib_mpi4py.sh @@ -20,10 +20,11 @@ export NUM_WORKERS=4 export MANAGER_NODE=false # true = Manager has a dedicated node (assign one extra) export USE_NODE_LIST=true # If false, allow libE to determine node_list from environment. +# Sometimes may be necessary # As libE shares nodes with user applications allow fallback if contexts overrun. -unset I_MPI_FABRICS -export I_MPI_FABRICS_LIST=tmi,tcp -export I_MPI_FALLBACK=1 +# unset I_MPI_FABRICS +# export I_MPI_FABRICS_LIST=tmi,tcp +# export I_MPI_FALLBACK=1 # If using in calling script (After N mins manager kills workers and exits cleanly) export LIBE_WALLCLOCK=55 From ac9bae32abcadb07a41dc2e2444b46406ff2218f Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 11:57:06 -0500 Subject: [PATCH 176/215] Example scripts - replace dropdowns --- docs/platforms/example_scripts.rst | 100 ++++++++++++++++------------- 1 file changed, 56 insertions(+), 44 deletions(-) diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 93ab2a5cfd..f26a310d0b 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -22,73 +22,85 @@ for more information about the respective systems and configuration. General examples ---------------- -.. dropdown:: Slurm - Basic +Slurm - Basic +^^^^^^^^^^^^^ - .. literalinclude:: ../../examples/libE_submission_scripts/submit_slurm_simple.sh - :caption: /examples/libE_submission_scripts/submit_slurm_simple.sh - :language: bash +.. literalinclude:: ../../examples/libE_submission_scripts/submit_slurm_simple.sh + :caption: /examples/libE_submission_scripts/submit_slurm_simple.sh + :language: bash -.. dropdown:: PBS - Basic +PBS - Basic +^^^^^^^^^^^ - .. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_simple.sh - :caption: /examples/libE_submission_scripts/submit_pbs_simple.sh - :language: bash +.. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_simple.sh + :caption: /examples/libE_submission_scripts/submit_pbs_simple.sh + :language: bash -.. dropdown:: LSF - Basic +LSF - Basic +^^^^^^^^^^^ - .. literalinclude:: ../../examples/libE_submission_scripts/submit_lsf_simple.sh - :caption: /examples/libE_submission_scripts/submit_lsf_simple.sh - :language: bash +.. literalinclude:: ../../examples/libE_submission_scripts/submit_lsf_simple.sh + :caption: /examples/libE_submission_scripts/submit_lsf_simple.sh + :language: bash System Examples --------------- -.. dropdown:: Aurora +Aurora +^^^^^^ - .. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_aurora.sh - :caption: /examples/libE_submission_scripts/submit_pbs_aurora.sh - :language: bash +.. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_aurora.sh + :caption: /examples/libE_submission_scripts/submit_pbs_aurora.sh + :language: bash -.. dropdown:: Frontier (Large WarpX Ensemble) +Frontier (Large WarpX Ensemble) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - .. literalinclude:: ../../examples/libE_submission_scripts/submit_frontier_large.sh - :caption: /examples/libE_submission_scripts/submit_frontier_large.sh - :language: bash +.. literalinclude:: ../../examples/libE_submission_scripts/submit_frontier_large.sh + :caption: /examples/libE_submission_scripts/submit_frontier_large.sh + :language: bash +Perlmutter +^^^^^^^^^^ -.. dropdown:: Perlmutter +.. literalinclude:: ../../examples/libE_submission_scripts/submit_perlmutter.sh + :caption: /examples/libE_submission_scripts/submit_perlmutter.sh + :language: bash - .. literalinclude:: ../../examples/libE_submission_scripts/submit_perlmutter.sh - :caption: /examples/libE_submission_scripts/submit_perlmutter.sh - :language: bash +Polaris +^^^^^^^ -.. dropdown:: Polaris +.. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_polaris.sh + :caption: /examples/libE_submission_scripts/submit_pbs_polaris.sh + :language: bash - .. literalinclude:: ../../examples/libE_submission_scripts/submit_pbs_polaris.sh - :caption: /examples/libE_submission_scripts/submit_pbs_polaris.sh - :language: bash +Bebop - Central Mode +^^^^^^^^^^^^^^^^^^^^ -.. dropdown:: Bebop - Central Mode +.. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_central.sh + :caption: /examples/libE_submission_scripts/bebop_submit_pbs_central.sh + :language: bash - .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_central.sh - :caption: /examples/libE_submission_scripts/bebop_submit_pbs_central.sh - :language: bash +Bridges - MPI / Central Mode +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. dropdown:: Bridges - MPI / Central Mode +.. literalinclude:: ../../examples/libE_submission_scripts/bridges_submit_slurm_central.sh + :caption: /examples/libE_submission_scripts/bridges_submit_slurm_central.sh + :language: bash - .. literalinclude:: ../../examples/libE_submission_scripts/bridges_submit_slurm_central.sh - :caption: /examples/libE_submission_scripts/bridges_submit_slurm_central.sh - :language: bash +.. _slurm_mpi_distributed: -.. dropdown:: SLURM - MPI / Distributed Mode (co-locate workers & MPI applications) +SLURM - MPI / Distributed Mode (co-locate workers & MPI applications) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - .. literalinclude:: ../../examples/libE_submission_scripts/submit_distrib_mpi4py.sh - :caption: /examples/libE_submission_scripts/submit_distrib_mpi4py.sh - :language: bash +.. literalinclude:: ../../examples/libE_submission_scripts/submit_distrib_mpi4py.sh + :caption: /examples/libE_submission_scripts/submit_distrib_mpi4py.sh + :language: bash -.. dropdown:: Summit (Decommissioned) - On Launch Nodes with Multiprocessing +Summit (Decommissioned) - On Launch Nodes with Multiprocessing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - .. literalinclude:: ../../examples/libE_submission_scripts/summit_submit_mproc.sh - :caption: /examples/libE_submission_scripts/summit_submit_mproc.sh - :language: bash +.. literalinclude:: ../../examples/libE_submission_scripts/summit_submit_mproc.sh + :caption: /examples/libE_submission_scripts/summit_submit_mproc.sh + :language: bash From e49626cbc85be75eec149db9ff77415df3e8afa8 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 11:57:43 -0500 Subject: [PATCH 177/215] Link to distrib config script --- docs/platforms/platforms_index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index a70ad05ee5..8d0f01fc69 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -97,14 +97,14 @@ Distributed Running In the **distributed** approach, libEnsemble can be run using the **mpi4py** communicator, with workers distributed across nodes. This is most often used -when workers run simulation code directly, via a Python interface, and may be -run an mpirunner, for example (using an `mpich` based MPI):: +when workers run simulation code directly, via a Python interface. The user +script is invoked with an MPI runner, for example (using an `mpich` based MPI):: mpirun -np 4 -ppn 1 python myscript.py The distributed approach, can also be used with the executor, to co-locate workers with the applications they submit. To ensure workers are placed as required in this -case, requires a careful MPI rank placement. +case, requires :ref:`a careful MPI rank placement `. .. image:: ../images/distributed_new_detailed.png :alt: distributed From 2581de2cd7e5161b8b10f6b61635828289ed0113 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 11:59:04 -0500 Subject: [PATCH 178/215] Fix naming --- docs/platforms/example_scripts.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index f26a310d0b..072cc65f22 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -75,8 +75,8 @@ Polaris :caption: /examples/libE_submission_scripts/submit_pbs_polaris.sh :language: bash -Bebop - Central Mode -^^^^^^^^^^^^^^^^^^^^ +Bebop +^^^^^ .. literalinclude:: ../../examples/libE_submission_scripts/bebop_submit_pbs_central.sh :caption: /examples/libE_submission_scripts/bebop_submit_pbs_central.sh From 6691a9f7700a7de475c8f08e1d502a4266fabbe0 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 12:10:16 -0500 Subject: [PATCH 179/215] Minor reformatting --- docs/platforms/platforms_index.rst | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 8d0f01fc69..1b682480dd 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -5,22 +5,26 @@ Running on HPC Systems libEnsemble has been tested on systems of highly varying scales, from laptops to thousands of compute nodes. On multi-node systems, there are a few alternative -ways of configuring libEnsemble to run and launch tasks (i.e., user applications) on -the available nodes. +ways of configuring libEnsemble to run and launch tasks (i.e., user applications) +on the available nodes. The :doc:`Forces tutorial <../../tutorials/executor_forces_tutorial>` gives an example with a simple MPI application. +Note that while the diagrams below show one application being run per node, +configurations with **multiple nodes per worker** or **multiple workers per node** +are both common use cases. + Centralized Running ------------------- The default communications scheme places the manager and workers on the first node. The :doc:`MPI Executor<../executor/mpi_executor>` can then be invoked by each simulation worker, and libEnsemble will distribute user applications across the -node allocation. This is the most common approach where each simulation +node allocation. This is the **most common approach** where each simulation runs an MPI application. -The generator will run on one worker by default, but if running a single generator, +The generator will run on a worker by default, but if running a single generator, the :ref:`libE_specs` option **gen_on_manager** is recommended, which runs the generator on the manager (using a thread) as below. @@ -89,9 +93,6 @@ remaining nodes in the allocation. Note that **gen_on_manager** is not set in the above example. -Note that while these diagrams show one application being run per node, configurations -with **multiple nodes per worker** or **multiple workers per node** are both common use cases. - Distributed Running -------------------- From 97e6fdbc1d788f70f806938b9c42f33f9e00bbf8 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 13:46:34 -0500 Subject: [PATCH 180/215] Add num_resource_sets setting to example --- docs/platforms/platforms_index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 1b682480dd..c56ab66aa9 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -78,6 +78,7 @@ remaining nodes in the allocation. :linenos: ensemble.libE_specs = LibeSpecs( + num_resource_sets=2, dedicated_mode=True, ) From be47107643f58da81cd4cf2c966db1f96bb35273 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 14:42:58 -0500 Subject: [PATCH 181/215] Update community examples links --- docs/examples/gen_funcs.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 2da06b35f0..19ceec2d98 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -42,10 +42,10 @@ Optimization aposmm uniform_or_localopt ax_multitask - VTMOP - ytopt - consensus - DEAP-NSGA-II + VTMOP + ytopt + consensus + DEAP-NSGA-II - :doc:`APOSMM` From 46b3e2b8fbbf8b33c88907176ce81bbe3628c4d3 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 15:10:24 -0500 Subject: [PATCH 182/215] Add WarpX link and fix side-panel links --- docs/examples/gen_funcs.rst | 8 ++++---- docs/examples/sim_funcs.rst | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 19ceec2d98..60d0c2a388 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -42,10 +42,10 @@ Optimization aposmm uniform_or_localopt ax_multitask - VTMOP - ytopt - consensus - DEAP-NSGA-II + VTMOP + ytopt + consensus + DEAP-NSGA-II - :doc:`APOSMM` diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index 87b69cb969..3cdf8bdc11 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -51,6 +51,7 @@ application on various platforms (use -DGPU to build for GPU). sim_funcs/forces_simf_gpu sim_funcs/forces_simf_gpu_vary_resources sim_funcs/forces_simf_gpu_multi_app + WarpX Example Special simulation functions ---------------------------- From 2d3111966b07aac138aa79dd700ba0048aeeedd4 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 15:19:24 -0500 Subject: [PATCH 183/215] Fix consensus link --- docs/examples/gen_funcs.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/gen_funcs.rst b/docs/examples/gen_funcs.rst index 60d0c2a388..9bdaa311d9 100644 --- a/docs/examples/gen_funcs.rst +++ b/docs/examples/gen_funcs.rst @@ -44,7 +44,7 @@ Optimization ax_multitask VTMOP ytopt - consensus + consensus DEAP-NSGA-II - :doc:`APOSMM` From ced4b92286cd938b51d3296d13447720105acce9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 20:22:20 +0000 Subject: [PATCH 184/215] Bump pytest-cov from 6.0.0 to 6.1.1 in the python-updates group Bumps the python-updates group with 1 update: [pytest-cov](https://github.com/pytest-dev/pytest-cov). Updates `pytest-cov` from 6.0.0 to 6.1.1 - [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-cov/compare/v6.0.0...v6.1.1) --- updated-dependencies: - dependency-name: pytest-cov dependency-version: 6.1.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-updates ... Signed-off-by: dependabot[bot] --- install/testing_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/testing_requirements.txt b/install/testing_requirements.txt index a5fc6d3c0f..935926ca7b 100644 --- a/install/testing_requirements.txt +++ b/install/testing_requirements.txt @@ -1,7 +1,7 @@ flake8==7.2.0 coverage>=7.5 pytest==8.3.5 -pytest-cov==6.0.0 +pytest-cov==6.1.1 pytest-timeout==2.3.1 mock==5.2.0 python-dateutil==2.9.0.post0 From 5966164bef06a5a336fcd6397ee3153dbc90373d Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 17:35:35 -0500 Subject: [PATCH 185/215] Add release notes for v1.5.0 --- CHANGELOG.rst | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b81a395af8..b827dc3d68 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,6 +8,45 @@ GitHub issues are referenced, and can be viewed with hyperlinks on the `github r .. _`github releases page`: https://github.com/Libensemble/libensemble/releases +Release 1.5.0 +-------------- + +:Date: Apr 8, 2025 + +General Updates: + +* Migrate package build system to `pyproject.toml` (with `pixi` support). #1459 +* Improve handling when no MPI found. #1514 +* `ensemble.save_output()` can save without appending attributes `append_attrs=False`. #1531 +* Improved handling of worker-specific `persis_info` fields when they are not initially provided. #1531 + * Bugfix: Fix `final_gen_send` when there are no worker-specific `persis_info` fields. + * Handle worker-generated `persis_info` fields. + * Ensure `persis_info` is initialized to an empty dictionary in user functions instead of None. + +Examples: + +* Update Ax generator for `Ax v0.5.0`. #1508 +* gpCAM generators renamed. #1516 + * `persistent_gpCAM_ask_tell` to `persistent_gpCAM` + * `persistent_gpCAM_simple` to `persistent_gpCAM_covar` (in fact less simple) +* Persistent generators return `None` as first return value unless `H_o` is updated. #1515 + +Documentation: + +* Revamped Examples and HPC section of documentation. #1501, #1536, #1539 +* Added tutorial and notebook demonstrating surrogate model creation with gpCAM. #1531 +* Updated Aurora guide. #1510 +* Updated and documented APOSMM/WarpX example. #1543 + +:Note: + +* Tests were run on Linux and MacOS with Python versions 3.10, 3.11, 3.12, 3.13 +* Heterogeneous workflows tested on Aurora (ALCF), Polaris (ALCF), and Perlmutter (NERSC). + +:Known Issues: + +* See known issues section in the documentation. + Release 1.4.3 -------------- From 31a60692ab60a7d41b19af3b799732813a6c41b9 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 17:41:44 -0500 Subject: [PATCH 186/215] Update version and year --- .wci.yml | 4 ++-- LICENSE | 2 +- libensemble/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.wci.yml b/.wci.yml index 78b37075ff..af395fb9af 100644 --- a/.wci.yml +++ b/.wci.yml @@ -16,8 +16,8 @@ description: | language: Python release: - version: 1.4.3 - date: 2024-12-16 + version: 1.5.0 + date: 2025-04-08 documentation: general: https://libensemble.readthedocs.io diff --git a/LICENSE b/LICENSE index de0d1ca0ea..6a45c6a4cf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2018-2024, UChicago Argonne, LLC and the libEnsemble Development Team +Copyright (c) 2018-2025, UChicago Argonne, LLC and the libEnsemble Development Team All Rights Reserved. Redistribution and use in source and binary forms, with or without diff --git a/libensemble/version.py b/libensemble/version.py index a5467c834a..5b60188613 100644 --- a/libensemble/version.py +++ b/libensemble/version.py @@ -1 +1 @@ -__version__ = "1.4.3+dev" +__version__ = "1.5.0" From 2dc5b4e9909a04367343ccba382637021ef8a0b3 Mon Sep 17 00:00:00 2001 From: shudson Date: Mon, 7 Apr 2025 18:06:41 -0500 Subject: [PATCH 187/215] Use present tense in release notes --- CHANGELOG.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b827dc3d68..9ff1a6c209 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,7 +18,7 @@ General Updates: * Migrate package build system to `pyproject.toml` (with `pixi` support). #1459 * Improve handling when no MPI found. #1514 * `ensemble.save_output()` can save without appending attributes `append_attrs=False`. #1531 -* Improved handling of worker-specific `persis_info` fields when they are not initially provided. #1531 +* Improve handling of worker-specific `persis_info` fields when they are not initially provided. #1531 * Bugfix: Fix `final_gen_send` when there are no worker-specific `persis_info` fields. * Handle worker-generated `persis_info` fields. * Ensure `persis_info` is initialized to an empty dictionary in user functions instead of None. @@ -26,17 +26,17 @@ General Updates: Examples: * Update Ax generator for `Ax v0.5.0`. #1508 -* gpCAM generators renamed. #1516 +* Rename gpCAM generators. #1516 * `persistent_gpCAM_ask_tell` to `persistent_gpCAM` * `persistent_gpCAM_simple` to `persistent_gpCAM_covar` (in fact less simple) * Persistent generators return `None` as first return value unless `H_o` is updated. #1515 Documentation: -* Revamped Examples and HPC section of documentation. #1501, #1536, #1539 -* Added tutorial and notebook demonstrating surrogate model creation with gpCAM. #1531 -* Updated Aurora guide. #1510 -* Updated and documented APOSMM/WarpX example. #1543 +* Revamp Examples and HPC section of documentation. #1501, #1536, #1539 +* Add tutorial and notebook demonstrating surrogate model creation with gpCAM. #1531 +* Update Aurora guide. #1510 +* Update and documented APOSMM/WarpX example. #1543 :Note: From 178253b4010fcc392a0b075884311e70ed593f2e Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 11:03:19 -0500 Subject: [PATCH 188/215] Edit docstring --- .../test_persistent_aposmm_ibcdfo_pounders.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py b/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py index cf7d611547..7523704a0b 100644 --- a/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py +++ b/libensemble/tests/regression_tests/test_persistent_aposmm_ibcdfo_pounders.py @@ -14,9 +14,9 @@ These values are then mapped to the normalized emittance - . Execute via one of the following commands: - mpiexec -np 3 python test_persistent_aposmm_ibcdfo.py - python test_persistent_aposmm_ibcdfo.py --nworkers 2 -Both will run with 1 manager, 1 worker running APOSMM+IBCDFO), and 1 worker + mpiexec -np 3 python test_persistent_aposmm_ibcdfo_pounders.py + python test_persistent_aposmm_ibcdfo_pounders.py --nworkers 2 +Both will run with 1 manager, 1 worker running APOSMM+IBCDFO, and 1 worker doing the simulation evaluations. """ From 36f98a605a26dbc96f7541b470cf93569ca03b28 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 11:05:21 -0500 Subject: [PATCH 189/215] Whitespace --- docs/examples/sim_funcs.rst | 4 ++-- docs/examples/sim_funcs/forces_simf_gpu.rst | 2 +- docs/platforms/example_scripts.rst | 2 -- docs/platforms/platforms_index.rst | 10 ---------- docs/tutorials/forces_gpu_tutorial.rst | 2 -- .../bebop_submit_pbs_central.sh | 1 - 6 files changed, 3 insertions(+), 18 deletions(-) diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index 3cdf8bdc11..dad2609049 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -36,8 +36,8 @@ Functions that run user applications These use the executor to launch applications and in some cases handle dynamic CPU/GPU allocation. -The ``Variable resources`` module contains basic examples, while the ``Template`` -examples use a simple MPI/OpenMP (with GPU offload option) application (``forces``) +The ``Variable resources`` module contains basic examples, while the ``Template`` +examples use a simple MPI/OpenMP (with GPU offload option) application (``forces``) to demonstrate libEnsemble’s capabilities on various HPC systems. The build_forces.sh_ file gives compile lines for building the simple ``forces`` application on various platforms (use -DGPU to build for GPU). diff --git a/docs/examples/sim_funcs/forces_simf_gpu.rst b/docs/examples/sim_funcs/forces_simf_gpu.rst index 38cb8630e8..4c74d254f1 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu.rst @@ -1,4 +1,4 @@ -Template for GPU executables +Template for GPU executables ---------------------------- .. role:: underline diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 072cc65f22..24da78afc8 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -18,7 +18,6 @@ for more information about the respective systems and configuration. or, if using dynamic resources, :doc:`in the generator<../examples/sim_funcs/forces_simf_gpu_vary_resources>`. - General examples ---------------- @@ -43,7 +42,6 @@ LSF - Basic :caption: /examples/libE_submission_scripts/submit_lsf_simple.sh :language: bash - System Examples --------------- diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index c56ab66aa9..a08a823dc8 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -46,14 +46,12 @@ which runs the generator on the manager (using a thread) as below. A SLURM batch script may include: - .. code-block:: bash #SBATCH --nodes 3 python run_libe_forces.py --nworkers 3 - When using **gen_on_manager**, set ``nworkers`` to the number of workers desired for running simulations. Dedicated Mode @@ -64,7 +62,6 @@ True, the MPI executor will not launch applications on nodes where libEnsemble P processes (manager and workers) are running. Workers launch applications onto the remaining nodes in the allocation. - .. list-table:: :widths: 60 40 @@ -84,14 +81,12 @@ remaining nodes in the allocation. A SLURM batch script may include: - .. code-block:: bash #SBATCH --nodes 3 python run_libe_forces.py --nworkers 3 - Note that **gen_on_manager** is not set in the above example. Distributed Running @@ -116,7 +111,6 @@ case, requires :ref:`a careful MPI rank placement `. This allows the libEnsemble worker to read files produced by the application on local node storage. - Configuring the Run ------------------- @@ -159,7 +153,6 @@ Varying resources libEnsemble also features :ref:`dynamic resource assignment`, whereby the number of processes and/or the number of GPUs can be a set for each simulation by the generator. - Overriding Auto-Detection ------------------------- @@ -172,8 +165,6 @@ libE_specs option. When using the MPI Executor, it is possible to override the detected information using the `custom_info` argument. See the :doc:`MPI Executor<../executor/mpi_executor>` for more. - - Systems with Launch/MOM Nodes ----------------------------- @@ -212,7 +203,6 @@ or *to entirely different systems*. Submission scripts for running on launch/MOM nodes and for using Balsam can be found in the :doc:`examples`. - .. _globus_compute_ref: Globus Compute - Remote User Functions diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index ab1ee121fc..870b634648 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -35,7 +35,6 @@ from the simple forces example are highlighted: # Optional - to print GPU settings from libensemble.tools.test_support import check_gpu_setting - def run_forces(H, persis_info, sim_specs, libE_info): """Launches the forces MPI app and auto-assigns ranks and GPU resources. @@ -154,7 +153,6 @@ and use this information however you want. output = np.zeros(1, dtype=sim_specs["out"]) output["energy"][0] = final_energy - return output The above code will assign a GPU to each worker on CUDA-capable systems, diff --git a/examples/libE_submission_scripts/bebop_submit_pbs_central.sh b/examples/libE_submission_scripts/bebop_submit_pbs_central.sh index 4d0aff5894..7fb474194f 100644 --- a/examples/libE_submission_scripts/bebop_submit_pbs_central.sh +++ b/examples/libE_submission_scripts/bebop_submit_pbs_central.sh @@ -5,7 +5,6 @@ #PBS -A [project] #PBS -N libE_example - cd $PBS_O_WORKDIR # Choose MPI backend. Note that the built mpi4py in your environment should match. module load oneapi/mpi From c37db76ddf71e95bb7ab58ae3c0ccad5940af13e Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 11:13:49 -0500 Subject: [PATCH 190/215] Underlines too short --- docs/tutorials/gpcam_tutorial.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/gpcam_tutorial.rst b/docs/tutorials/gpcam_tutorial.rst index 09b523c7a3..a013c1b67e 100644 --- a/docs/tutorials/gpcam_tutorial.rst +++ b/docs/tutorials/gpcam_tutorial.rst @@ -10,7 +10,7 @@ In each iteration, a batch of points is produced for concurrent evaluation, maxi Ensure that libEnsemble, and gpCAM are installed via: ``pip install libensemble gpcam`` Generator function ------------------ +------------------ The gpCAM generator function is called ``persistent_gpCAM``. @@ -179,7 +179,7 @@ For running applications using parallel resources in the simulator see the `forc return term1 + term2 + term3 Calling Script -------------- +-------------- Our calling script configures libEnsemble, the generator function, and the simulator function. It then create the ensemble object and runs the ensemble. @@ -275,7 +275,7 @@ At the end of our calling script we run the ensemble. pprint(H[["sim_id", "x", "f"]][:16]) # See first 16 results Rerun and test model at known points ------------------------------------ +------------------------------------ To see how the accuracy of the surrogate model improves, we can use previously evaluated points as test points and run again with a different seed. @@ -292,7 +292,7 @@ To see how the accuracy of the surrogate model improves, we can use previously e print(persis_info) Viewing model progression ------------------------- +------------------------- Now we can check how our model's values compared against the values at known test points as the ensemble progresses. The comparison is based on the **mean squared error** between the gpCAM model and our known From d9a91c7ef1145899f393b1e39c45b3d9a19b95b7 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 11:15:04 -0500 Subject: [PATCH 191/215] Replacing ~ with - --- docs/platforms/platforms_index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index a08a823dc8..15563cdf79 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -134,7 +134,7 @@ and partitions these to workers. The :doc:`MPI Executor<../executor/mpi_executor accesses the resources available to the current worker when launching tasks. Zero-resource workers -~~~~~~~~~~~~~~~~~~~~~ +--------------------- Users with persistent ``gen_f`` functions may notice that the persistent workers are still automatically assigned system resources. This can be resolved by using From 165c668c3473add3a273475a395913ec8362392d Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 11:35:23 -0500 Subject: [PATCH 192/215] Link update --- docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst index a190e99fea..8a491e8816 100644 --- a/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst +++ b/docs/examples/sim_funcs/forces_simf_gpu_multi_app.rst @@ -10,7 +10,7 @@ ranks and GPU resources as requested by the generator. This makes efficient use of each node as the expensive GPU simulations will use the GPUs on the node/s, while the rest of the CPU cores are assigned to the simple CPU-only simulations. -For a realistic use-case see https://journals.aps.org/prab/abstract/10.1103/PhysRevAccelBeams.26.084601 +See this publication_ for a real-world demonstration of these capabilities. .. automodule:: forces_multi_app.forces_simf :members: @@ -39,5 +39,6 @@ up by each worker and these will be used when the simulation is run, unless over More information is available in the :doc:`Forces GPU tutorial <../../tutorials/forces_gpu_tutorial>` and the video_ demonstration on Frontier_. -.. _video: https://www.youtube.com/watch?v=H2fmbZ6DnVc .. _Frontier: https://docs.olcf.ornl.gov/systems/frontier_user_guide.html +.. _publication: https://doi.org/10.1103/PhysRevAccelBeams.26.084601 +.. _video: https://www.youtube.com/watch?v=H2fmbZ6DnVc From c9ca535b82e28a9c804e1d39b867bfc502ad33fb Mon Sep 17 00:00:00 2001 From: shudson Date: Tue, 8 Apr 2025 11:48:34 -0500 Subject: [PATCH 193/215] Bypass label in include --- docs/examples/submission_scripts.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/examples/submission_scripts.rst b/docs/examples/submission_scripts.rst index 1f853585b5..7c37da40ea 100644 --- a/docs/examples/submission_scripts.rst +++ b/docs/examples/submission_scripts.rst @@ -1 +1,5 @@ .. include:: ../platforms/example_scripts.rst + :end-before: .. _slurm_mpi_distributed: + +.. include:: ../platforms/example_scripts.rst + :start-after: .. _slurm_mpi_distributed: From 71fa984a1de9be32253d9cd42151a8ca606f3665 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 11:58:50 -0500 Subject: [PATCH 194/215] More docs edits --- docs/examples/sim_funcs.rst | 4 ++-- docs/platforms/example_scripts.rst | 6 +++--- docs/platforms/platforms_index.rst | 10 +++++----- docs/resource_manager/resource_detection.rst | 8 ++++---- docs/resource_manager/zero_resource_workers.rst | 2 +- docs/tutorials/forces_gpu_tutorial.rst | 4 ++-- libensemble/gen_funcs/persistent_gpCAM.py | 6 +++--- libensemble/tests/regression_tests/test_gpCAM.py | 2 +- .../test_persistent_gp_multitask_ax.py | 2 +- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/examples/sim_funcs.rst b/docs/examples/sim_funcs.rst index dad2609049..be4374d884 100644 --- a/docs/examples/sim_funcs.rst +++ b/docs/examples/sim_funcs.rst @@ -24,7 +24,7 @@ Ideal for simple debugging of generator processes or system testing. Borehole function with kills Chwirut1 vector-valued function Inverse Bayesian likelihood - Norm + Norm Rosenbrock test optimization function Six Hump Camel Test noisy function @@ -37,7 +37,7 @@ These use the executor to launch applications and in some cases handle dynamic CPU/GPU allocation. The ``Variable resources`` module contains basic examples, while the ``Template`` -examples use a simple MPI/OpenMP (with GPU offload option) application (``forces``) +examples use a simple MPI/OpenMP (with GPU offload option) application (``forces``) to demonstrate libEnsemble’s capabilities on various HPC systems. The build_forces.sh_ file gives compile lines for building the simple ``forces`` application on various platforms (use -DGPU to build for GPU). diff --git a/docs/platforms/example_scripts.rst b/docs/platforms/example_scripts.rst index 24da78afc8..d534f0c662 100644 --- a/docs/platforms/example_scripts.rst +++ b/docs/platforms/example_scripts.rst @@ -7,12 +7,12 @@ for more information about the respective systems and configuration. .. note:: It is **highly recommended** that the directive lines (e.g., #SBATCH) in batch - submission scripts do **NOT** specify processor, task, or GPU configuration info - --- these lines should only specify the number of nodes required. + submission scripts do **NOT** specify processor, task, or GPU configuration + information---these lines should only specify the number of nodes required. For example, do not specify ``#SBATCH --gpus-per-node=4`` in order to use four GPUs on the node, when each worker may use less than this, as this may assign - all of the GPUs to a single MPI invocation. Instead, the configuration should + all of the GPUs to a single MPI invocation. Instead, the configuration should be supplied either :doc:`in the simulation function<../examples/sim_funcs/forces_simf_gpu>` or, if using dynamic resources, diff --git a/docs/platforms/platforms_index.rst b/docs/platforms/platforms_index.rst index 15563cdf79..c06cdbe6fd 100644 --- a/docs/platforms/platforms_index.rst +++ b/docs/platforms/platforms_index.rst @@ -89,19 +89,19 @@ remaining nodes in the allocation. Note that **gen_on_manager** is not set in the above example. -Distributed Running --------------------- +Distributed Running +------------------- In the **distributed** approach, libEnsemble can be run using the **mpi4py** communicator, with workers distributed across nodes. This is most often used when workers run simulation code directly, via a Python interface. The user -script is invoked with an MPI runner, for example (using an `mpich` based MPI):: +script is invoked with an MPI runner, for example (using an `mpich`-based MPI):: mpirun -np 4 -ppn 1 python myscript.py The distributed approach, can also be used with the executor, to co-locate workers -with the applications they submit. To ensure workers are placed as required in this -case, requires :ref:`a careful MPI rank placement `. +with the applications they submit. Ensuring that workers are placed as required in this +case requires :ref:`a careful MPI rank placement `. .. image:: ../images/distributed_new_detailed.png :alt: distributed diff --git a/docs/resource_manager/resource_detection.rst b/docs/resource_manager/resource_detection.rst index 474cc1cade..2048eb2793 100644 --- a/docs/resource_manager/resource_detection.rst +++ b/docs/resource_manager/resource_detection.rst @@ -18,17 +18,17 @@ LSF LSB_HOSTS/LSB_MCPU_HOSTS PBS PBS_NODEFILE =========== =========================== -These environment variable names can be modified via the :ref:`resource_info` +These environment variable names can be modified via the :ref:`resource_info` :class:`libE_specs` option. -On other systems you may have to supply a node list in a file called **node_list** -in your run directory. For example, on ALCF system Cooley_, the session node list +On other systems, you may have to supply a node list in a file called **node_list** +in your run directory. For example, on the ALCF system Cooley_, the session node list can be obtained as follows:: cat $COBALT_NODEFILE > node_list Resource detection can be disabled by setting -``libE_specs["disable_resource_manager"] = True``, and users can simply supply run +``libE_specs["disable_resource_manager"] = True``, and users can supply run configuration options on the Executor submit line. This will usually work sufficiently on diff --git a/docs/resource_manager/zero_resource_workers.rst b/docs/resource_manager/zero_resource_workers.rst index 1dc62095e6..4c72cf5d7b 100644 --- a/docs/resource_manager/zero_resource_workers.rst +++ b/docs/resource_manager/zero_resource_workers.rst @@ -53,7 +53,7 @@ concurrency desired by the ensemble, taking into account generators and simulato Users can set generator resources using the *libE_specs* options ``gen_num_procs`` and/or ``gen_num_gpus``, which take integer values. -If only ``gen_num_gpus`` is set, then the number of processors is set to match. +If only ``gen_num_gpus`` is set, then the number of processors is set to match. To vary generator resources, ``persis_info`` settings can be used in allocation functions before calling the ``gen_work`` support function. This takes the diff --git a/docs/tutorials/forces_gpu_tutorial.rst b/docs/tutorials/forces_gpu_tutorial.rst index 870b634648..be487f33cc 100644 --- a/docs/tutorials/forces_gpu_tutorial.rst +++ b/docs/tutorials/forces_gpu_tutorial.rst @@ -7,9 +7,9 @@ to the GPU. The libEnsemble scripts in this example are available under forces_gpu_ in the libEnsemble repository. This example is based on the -:doc:`simple forces tutorial <../tutorials/executor_forces_tutorial>` with +:doc:`simple forces tutorial <../tutorials/executor_forces_tutorial>` with a slightly modified simulation function (to assign GPUs) and a greatly increased -number of particles (allows live GPU usage to be viewed). +number of particles (to allow real-time GPU usage to be viewed). In the first example, each worker will be using one GPU. The code will assign the GPUs available to each worker, using the appropriate method. This works on systems diff --git a/libensemble/gen_funcs/persistent_gpCAM.py b/libensemble/gen_funcs/persistent_gpCAM.py index f130950468..05b08bb5ed 100644 --- a/libensemble/gen_funcs/persistent_gpCAM.py +++ b/libensemble/gen_funcs/persistent_gpCAM.py @@ -212,10 +212,10 @@ def persistent_gpCAM_covar(H_in, persis_info, gen_specs, libE_info): (lb, ub) and on following iterations samples the GP posterior covariance function to find sample points. - If gen_specs["user"]["use_grid"] is set to True the parameter space is + If gen_specs["user"]["use_grid"] is set to True, the parameter space is divided into a mesh of candidate points (num_points in each dimension). - Subsequent points chosen by maximum covariance that are at least a distance - `r` away from each other to explore difference regions. + Subsequent points are chosen with maximum covariance that are at least a + distance `r` away from each other to explore difference regions. If gen_specs["user"]["test_points_file"] is set to a file of evaluated points, then the gpCAM predications are compared at these points to assess diff --git a/libensemble/tests/regression_tests/test_gpCAM.py b/libensemble/tests/regression_tests/test_gpCAM.py index b554752eba..218ecfc918 100644 --- a/libensemble/tests/regression_tests/test_gpCAM.py +++ b/libensemble/tests/regression_tests/test_gpCAM.py @@ -11,7 +11,7 @@ Runs three variants of gpCAM. The first two use the posterior covariance sampling method, whereby the second run uses the grid approach and uses -the points from the first run as it’s test points.The third run uses the +the points from the first run as it’s test points. The third run uses the gpCAM ask/tell interface. See libensemble.gen_funcs.persistent_gpCAM for more details about the diff --git a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py index 8df0ae006d..8c589161ad 100644 --- a/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py +++ b/libensemble/tests/regression_tests/test_persistent_gp_multitask_ax.py @@ -2,7 +2,7 @@ Example of multi-fidelity optimization using a persistent GP gen_func (calling Ax). -Test is set to use the gen_on_manager option (persistent generator runs on +This test uses the gen_on_manager option (persistent generator runs on a thread). Therefore nworkers is the number of simulation workers. Execute via one of the following commands: From f713522a26c48188d58ea1632cd3130a70f5b7a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 12:06:14 -0500 Subject: [PATCH 195/215] nb-clean to ipynb files --- .../forces_with_executor/forces_tutorial_notebook.ipynb | 4 +--- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/tutorials/forces_with_executor/forces_tutorial_notebook.ipynb b/examples/tutorials/forces_with_executor/forces_tutorial_notebook.ipynb index bf408258a4..b85222e445 100644 --- a/examples/tutorials/forces_with_executor/forces_tutorial_notebook.ipynb +++ b/examples/tutorials/forces_with_executor/forces_tutorial_notebook.ipynb @@ -587,9 +587,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "! ls -l ensemble/sim*" diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 097a391c91..228288c0ee 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -438,8 +438,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" + "pygments_lexer": "ipython3" } }, "nbformat": 4, From d5dcd521a5b7f328241116b3c1dd56f48288581c Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 12:08:28 -0500 Subject: [PATCH 196/215] Update CHANGELOG.rst --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 9ff1a6c209..a4650e9058 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -21,7 +21,7 @@ General Updates: * Improve handling of worker-specific `persis_info` fields when they are not initially provided. #1531 * Bugfix: Fix `final_gen_send` when there are no worker-specific `persis_info` fields. * Handle worker-generated `persis_info` fields. - * Ensure `persis_info` is initialized to an empty dictionary in user functions instead of None. + * Ensure `persis_info` is initialized to an empty dictionary in user functions instead of `None`. Examples: From 5d1278f2c2650ce78b849f38d492b4b657608af3 Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Tue, 8 Apr 2025 12:09:30 -0500 Subject: [PATCH 197/215] mono --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 9ff1a6c209..a4650e9058 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -21,7 +21,7 @@ General Updates: * Improve handling of worker-specific `persis_info` fields when they are not initially provided. #1531 * Bugfix: Fix `final_gen_send` when there are no worker-specific `persis_info` fields. * Handle worker-generated `persis_info` fields. - * Ensure `persis_info` is initialized to an empty dictionary in user functions instead of None. + * Ensure `persis_info` is initialized to an empty dictionary in user functions instead of `None`. Examples: From db26ac9c33819eb5747685090227928cf8d463dc Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 9 Apr 2025 11:36:03 -0500 Subject: [PATCH 198/215] small fixes - adjust version in pyproject.toml, fix pydantic version listed in advanced_installation --- docs/advanced_installation.rst | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/advanced_installation.rst b/docs/advanced_installation.rst index 4d436eb2cd..ad3131ee15 100644 --- a/docs/advanced_installation.rst +++ b/docs/advanced_installation.rst @@ -9,7 +9,7 @@ automatically installed alongside libEnsemble: * Python_ ``>= 3.10`` * NumPy_ ``>= 1.21`` * psutil_ ``>= 5.9.4`` -* `pydantic`_ ``<= 1.10.12`` +* `pydantic`_ ``>= 1.10.12`` * pyyaml_ ``>= v6.0`` * tomli_ ``>= 1.2.1`` diff --git a/pyproject.toml b/pyproject.toml index 7aca0ef7ed..12d06091fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ "Topic :: Scientific/Engineering", "Topic :: Software Development :: Libraries :: Python Modules", ] -version = "1.4.3+dev" +version = "1.5.0" [project.urls] Documentation = "https://libensemble.readthedocs.io/en/main/" From 1a9f3418ce069cfa04e0a982e30af909bfd4626c Mon Sep 17 00:00:00 2001 From: Stephen Hudson Date: Wed, 9 Apr 2025 12:49:15 -0500 Subject: [PATCH 199/215] Add LUMI support (#1546) --- libensemble/resources/platforms.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libensemble/resources/platforms.py b/libensemble/resources/platforms.py index 46b357540e..062d0bab44 100644 --- a/libensemble/resources/platforms.py +++ b/libensemble/resources/platforms.py @@ -162,6 +162,19 @@ class GenericROCm(Platform): scheduler_match_slots: bool = True +class Lumi(Platform): + mpi_runner: str = "srun" + cores_per_node: int = 64 + logical_cores_per_node: int = 128 + + +class LumiGPU(Lumi): + gpus_per_node: int = 8 + gpu_setting_type: str = "env" + gpu_setting_name: str = "ROCR_VISIBLE_DEVICES" + scheduler_match_slots: bool = True + + class Perlmutter(Platform): mpi_runner: str = "srun" @@ -243,6 +256,8 @@ class Known_platforms(BaseModel): aurora: Aurora = Aurora() generic_rocm: GenericROCm = GenericROCm() frontier: Frontier = Frontier() + lumi: Lumi = Lumi() + lumi_g: LumiGPU = LumiGPU() perlmutter: Perlmutter = Perlmutter() perlmutter_c: PerlmutterCPU = PerlmutterCPU() perlmutter_g: PerlmutterGPU = PerlmutterGPU() @@ -272,6 +287,16 @@ def known_envs(): else: name = "perlmutter" logger.manager_warning("Perlmutter detected, but no compute partition detected. Are you on login nodes?") + if os.environ.get("SLURM_CLUSTER_NAME") == "lumi": + partition = os.environ.get("SLURM_JOB_PARTITION") + print(f"Lumi partition: {partition}") + if not partition: + logger.manager_warning("LUMI detected, but no compute partition detected. Are you on login nodes?") + if partition and partition.endswith("-g"): + name = "lumi_g" + print(f"Lumi GPU detected: {name}") + else: + name = "lumi" return name From cbabf5a698d7cd75d4b0f5c85d67fe911dac7ac3 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 9 Apr 2025 13:03:35 -0500 Subject: [PATCH 200/215] Update release notes --- CHANGELOG.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a4650e9058..799fa6dd8f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -30,6 +30,7 @@ Examples: * `persistent_gpCAM_ask_tell` to `persistent_gpCAM` * `persistent_gpCAM_simple` to `persistent_gpCAM_covar` (in fact less simple) * Persistent generators return `None` as first return value unless `H_o` is updated. #1515 +* Add LUMI to known platforms. #1546 Documentation: @@ -41,7 +42,7 @@ Documentation: :Note: * Tests were run on Linux and MacOS with Python versions 3.10, 3.11, 3.12, 3.13 -* Heterogeneous workflows tested on Aurora (ALCF), Polaris (ALCF), and Perlmutter (NERSC). +* Heterogeneous workflows tested on Aurora (ALCF), Polaris (ALCF), LUMI ((EuroHPC JU)), and Perlmutter (NERSC). :Known Issues: From 877f52be365db7df71aec30efc37ef883a24181e Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 9 Apr 2025 13:10:51 -0500 Subject: [PATCH 201/215] make version dynamic in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 12d06091fc..c9c478e191 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ "Topic :: Scientific/Engineering", "Topic :: Software Development :: Libraries :: Python Modules", ] -version = "1.5.0" +dynamic = ["version"] [project.urls] Documentation = "https://libensemble.readthedocs.io/en/main/" From 21f6175e7659de557d4e1c12ca6b33f8d4d01adc Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 9 Apr 2025 13:44:22 -0500 Subject: [PATCH 202/215] Revert "make version dynamic in pyproject.toml" This reverts commit 877f52be365db7df71aec30efc37ef883a24181e. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c9c478e191..12d06091fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ "Topic :: Scientific/Engineering", "Topic :: Software Development :: Libraries :: Python Modules", ] -dynamic = ["version"] +version = "1.5.0" [project.urls] Documentation = "https://libensemble.readthedocs.io/en/main/" From fa951d7acd8bf7fe64368407ecfe1a1371a38438 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 9 Apr 2025 15:38:46 -0500 Subject: [PATCH 203/215] libE_specs *may* always have a workflow_dir_path, as we're getting the attribute from the object. try the dynamic versioning again... --- libensemble/ensemble.py | 19 ++++++++----------- pyproject.toml | 5 ++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libensemble/ensemble.py b/libensemble/ensemble.py index 9b581a1d1a..412b98c495 100644 --- a/libensemble/ensemble.py +++ b/libensemble/ensemble.py @@ -578,14 +578,11 @@ def save_output(self, basename: str, append_attrs: bool = True): Format: ``_results_History_length=_evals=_ranks=`` """ if self.is_manager: - if self._get_option("libE_specs", "workflow_dir_path"): - save_libE_output( - self.H, - self.persis_info, - basename, - self.nworkers, - dest_path=self.libE_specs.workflow_dir_path, - append_attrs=append_attrs, - ) - else: - save_libE_output(self.H, self.persis_info, basename, self.nworkers, append_attrs=append_attrs) + save_libE_output( + self.H, + self.persis_info, + basename, + self.nworkers, + dest_path=self.libE_specs.workflow_dir_path, + append_attrs=append_attrs, + ) diff --git a/pyproject.toml b/pyproject.toml index 12d06091fc..c6a7ea9f36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ "Topic :: Scientific/Engineering", "Topic :: Software Development :: Libraries :: Python Modules", ] -version = "1.5.0" +dynamic = ["version"] [project.urls] Documentation = "https://libensemble.readthedocs.io/en/main/" @@ -45,6 +45,9 @@ requires = ["setuptools", "wheel", "pip>=24.3.1,<26", "setuptools>=75.1.0,<79", where = ["."] include = ["libensemble*"] +[tool.setuptools.dynamic] +version = {attr = "libensemble.version.__version__"} + [tool.pixi.project] channels = ["conda-forge"] platforms = ["osx-arm64", "linux-64", "osx-64"] From 714e7e510535d74bf9b6b10c20f74e9a7839a759 Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 9 Apr 2025 15:46:09 -0500 Subject: [PATCH 204/215] __all__ in tasmanian doesnt need definition if we'll never do: from libensemble.gen_funcs.persistent_tasmanian import * --- libensemble/gen_funcs/persistent_tasmanian.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libensemble/gen_funcs/persistent_tasmanian.py b/libensemble/gen_funcs/persistent_tasmanian.py index ac491cf6a0..5afb9be1bc 100644 --- a/libensemble/gen_funcs/persistent_tasmanian.py +++ b/libensemble/gen_funcs/persistent_tasmanian.py @@ -10,10 +10,10 @@ from libensemble.tools import parse_args from libensemble.tools.persistent_support import PersistentSupport -__all__ = [ - "sparse_grid_batched", - "sparse_grid_async", -] +# __all__ = [ +# "sparse_grid_batched", +# "sparse_grid_async", +# ] def lex_le(x, y, tol=1e-12): From b57d80c639f56a066a11c8fee0f2eca676da556f Mon Sep 17 00:00:00 2001 From: jlnav Date: Wed, 9 Apr 2025 15:49:00 -0500 Subject: [PATCH 205/215] remove lumi prints in platforms.py --- libensemble/resources/platforms.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/libensemble/resources/platforms.py b/libensemble/resources/platforms.py index 062d0bab44..cf4dde324a 100644 --- a/libensemble/resources/platforms.py +++ b/libensemble/resources/platforms.py @@ -289,12 +289,10 @@ def known_envs(): logger.manager_warning("Perlmutter detected, but no compute partition detected. Are you on login nodes?") if os.environ.get("SLURM_CLUSTER_NAME") == "lumi": partition = os.environ.get("SLURM_JOB_PARTITION") - print(f"Lumi partition: {partition}") if not partition: logger.manager_warning("LUMI detected, but no compute partition detected. Are you on login nodes?") if partition and partition.endswith("-g"): name = "lumi_g" - print(f"Lumi GPU detected: {name}") else: name = "lumi" return name From cd178e3deaeebb9cd4debedce140549917590471 Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 9 Apr 2025 18:21:36 -0500 Subject: [PATCH 206/215] Update gpCAM notebook --- CHANGELOG.rst | 2 +- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 799fa6dd8f..71cb1119d4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -42,7 +42,7 @@ Documentation: :Note: * Tests were run on Linux and MacOS with Python versions 3.10, 3.11, 3.12, 3.13 -* Heterogeneous workflows tested on Aurora (ALCF), Polaris (ALCF), LUMI ((EuroHPC JU)), and Perlmutter (NERSC). +* Heterogeneous workflows tested on Aurora (ALCF), Polaris (ALCF), LUMI (EuroHPC JU), and Perlmutter (NERSC). :Known Issues: diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 228288c0ee..75b0c44041 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -20,10 +20,7 @@ "Ensure that libEnsemble, and gpCAM are installed via: `pip install libensemble gpcam`\n", " \n", "> **Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", - "> To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", - "\n", - "> **Note:** If using **Colab** the cell below installs gpCAM and prevents Colab downgrading numpy due to pre-installs.\n", - "> Restart session when prompted (the warnings can be ignored)." + "> To use with `spawn` (default on Windows and macOS), use the `multiprocess` library." ] }, { @@ -35,8 +32,7 @@ "import sys\n", "if 'google.colab' in sys.modules:\n", " !pip install libensemble\n", - " # Prevent downgraded numpy in colab due to preinstalls\n", - " !pip install --upgrade --force-reinstall numpy==2.1.1 scipy gpcam fvgp" + " !pip install gpcam" ] }, { From 79bcd3771cb434c524ff948a528e76916dc51cdd Mon Sep 17 00:00:00 2001 From: shudson Date: Wed, 9 Apr 2025 20:33:24 -0500 Subject: [PATCH 207/215] Replace flashing live animation with clean post-run version --- .../aposmm/aposmm_tutorial_notebook.ipynb | 117 +++++++++++++----- 1 file changed, 88 insertions(+), 29 deletions(-) diff --git a/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb b/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb index 7898ba7661..38eca21677 100644 --- a/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb +++ b/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb @@ -226,28 +226,7 @@ "source": [ "## Run the Ensemble\n", "\n", - "Optionally run the next cell to set up a live graphic of the optimization progress during execution.\n", - "\n", - "**WARNING**: The graphic may flicker when the ensemble is running." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure to view live progress\n", - "from libensemble.tools.live_data.plot2n import Plot2N\n", - "\n", - "libE_specs[\"live_data\"] = Plot2N(plot_type=\"2d\") # Alt: '3d'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, set `persis_info` (to provide random seeds to workers) and run the ensemble:" + "Finally, set persis_info (to provide random seeds to workers) and run the ensemble." ] }, { @@ -290,29 +269,109 @@ " \n", "The first six values correspond to the local minima for the Six-Hump Camel simulation function.\n", "\n", - "The 7th value is a repeat minimum, as APOSMM will continue to start local optimization runs.\n", - "\n", - "Please see the [API reference](https://libensemble.readthedocs.io/en/main/examples/aposmm.html) for more APOSMM configuration options and other information.\n", + "The 7th value is a repeat minimum, as APOSMM will continue to start local optimization runs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Viewing Animation\n", "\n", + "The following cell produces a 3D animation showing the random sampling points, \n", + "and points produced by the optimization runs, under the local Minima. It may take\n", + "a few seconds to produce the animation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.animation as animation\n", + "from IPython.display import HTML\n", + "from matplotlib.lines import Line2D\n", + "\n", + "def animate_aposmm_3d(H, batch_size):\n", + " x_vals = np.linspace(-2, 2, 50)\n", + " y_vals = np.linspace(-1, 1.1, 50)\n", + " X, Y = np.meshgrid(x_vals, y_vals)\n", + " Z = np.array([six_hump_camel_func(np.array([x, y])) for x, y in zip(X.ravel(), Y.ravel())]).reshape(X.shape)\n", + " fig = plt.figure(figsize=(10, 8))\n", + " ax = fig.add_subplot(111, projection=\"3d\")\n", + " ax.plot_surface(X, Y, Z, cmap=\"winter\", edgecolor=\"none\", alpha=0.3)\n", + " sc_normal = ax.scatter3D([], [], [], s=6, color=\"black\", marker=\"o\", label=\"Point\")\n", + " sc_localp = ax.scatter3D([], [], [], s=40, color=\"red\", marker=\"^\", label=\"Optimization point\")\n", + " custom_M_marker = Line2D([0], [0], linestyle='None', marker='$\\\\mathrm{M}$',\n", + " markersize=8, markerfacecolor='black', markeredgecolor='black', color='white')\n", + " ax.legend([sc_normal, sc_localp, custom_M_marker], [\"Point\", \"Optimization point\", \"Local minimum\"],loc=\"upper left\")\n", + " fig.tight_layout()\n", + " annotations = []\n", + "\n", + " def update(frame):\n", + " for ann in annotations:\n", + " ann.remove()\n", + " annotations.clear()\n", + " end = min((frame + 1) * batch_size, len(H))\n", + " H_sub = H[:end]\n", + " masks = [~H_sub[\"local_pt\"] & ~H_sub[\"local_min\"], H_sub[\"local_pt\"], H_sub[\"local_min\"]]\n", + " (x_n, y_n, f_n), (x_lp, y_lp, f_lp), (x_lm, y_lm, f_lm) = [\n", + " (H_sub[\"x\"][m, 0], H_sub[\"x\"][m, 1], H_sub[\"f\"][m]) for m in masks\n", + " ]\n", + " sc_normal._offsets3d = (x_n, y_n, f_n)\n", + " sc_localp._offsets3d = (x_lp, y_lp, f_lp)\n", + " for i in range(len(x_lm)):\n", + " annotations.append(ax.text(x_lm[i], y_lm[i], f_lm[i], \"M\", color=\"white\", fontsize=12,\n", + " bbox=dict(facecolor=\"black\", alpha=0.7, pad=2), zorder=999\n", + " ))\n", + " return sc_normal, sc_localp\n", + " total_frames = (len(H) + batch_size - 1) // batch_size\n", + " ani = animation.FuncAnimation(fig, update, frames=total_frames, interval=500, blit=False, repeat=False)\n", + " plt.close(fig)\n", + " return HTML(ani.to_jshtml())\n", + "\n", + "# Reduce batch_size for more refined steps\n", + "animate_aposmm_3d(H, batch_size=50)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## Applications\n", "\n", "APOSMM is not limited to evaluating minima from pure Python simulation functions.\n", "Many common libEnsemble use-cases involve using libEnsemble's Executor to launch user\n", "applications with parameters requested by APOSMM, then evaluate their output using\n", "APOSMM, and repeat until minima are identified. A currently supported example\n", - "can be found in libEnsemble's [WarpX Scaling Test](https://github.com/Libensemble/libensemble/tree/main/libensemble/tests/scaling_tests/warpx)" + "can be found in libEnsemble's [WarpX Scaling Test](https://github.com/Libensemble/libensemble/tree/main/libensemble/tests/scaling_tests/warpx)\n", + "\n", + "Please see the [API reference](https://libensemble.readthedocs.io/en/main/examples/aposmm.html) for more APOSMM configuration options and other information." ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", + "language": "python", "name": "python3" }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 34339f4a61b3c9d68468bef794d2a989f268bdbf Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 10 Apr 2025 09:22:23 -0500 Subject: [PATCH 208/215] add unit test to ensure persis_info being None gets set to empty dict inside function --- .../tests/unit_tests/test_ufunc_runners.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libensemble/tests/unit_tests/test_ufunc_runners.py b/libensemble/tests/unit_tests/test_ufunc_runners.py index 1d3cbb4b2c..09f17b07ec 100644 --- a/libensemble/tests/unit_tests/test_ufunc_runners.py +++ b/libensemble/tests/unit_tests/test_ufunc_runners.py @@ -54,6 +54,20 @@ def tupilize(arg1, arg2): simrunner.shutdown() +def test_persis_info_from_none(): + calc_in, sim_specs, gen_specs = get_ufunc_args() + + def tupilize(arg1, arg2): + return (arg1, arg2) + + sim_specs["sim_f"] = tupilize + simrunner = Runner(sim_specs) + libE_info = {"H_rows": np.array([2, 3, 4]), "workerID": 1, "comm": "fakecomm"} + + result = simrunner.run(calc_in, {"libE_info": libE_info, "persis_info": None, "tag": 1}) + assert result == (calc_in, {}) + + @pytest.mark.extra def test_globus_compute_runner_init(): calc_in, sim_specs, gen_specs = get_ufunc_args() @@ -122,6 +136,7 @@ def test_globus_compute_runner_fail(): if __name__ == "__main__": test_normal_runners() test_thread_runners() + test_persis_info_from_none() test_globus_compute_runner_init() test_globus_compute_runner_pass() test_globus_compute_runner_fail() From d30259eb1b63eb484e3348fda648a4ee09273bc3 Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 10 Apr 2025 11:23:45 -0500 Subject: [PATCH 209/215] enable coverage for ax and gpcam, disable coverage for tasmanian --- .codecov.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.codecov.yml b/.codecov.yml index 18ef408010..bf866b089c 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -3,5 +3,4 @@ ignore: - "libensemble/tools/forkable_pdb.py" - "libensemble/tools/live_data/*" - "libensemble/sim_funcs/executor_hworld.py" - - "libensemble/gen_funcs/persistent_ax_multitask.py" - - "libensemble/gen_funcs/persistent_gpCAM.py" + - "libensemble/gen_funcs/persistent_tasmanian.py" From deb58af61d1bd978166c161b78de78b71efa2a2a Mon Sep 17 00:00:00 2001 From: Jeffrey Larson Date: Thu, 10 Apr 2025 11:28:38 -0500 Subject: [PATCH 210/215] Updating input fields --- libensemble/gen_funcs/persistent_sampling.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libensemble/gen_funcs/persistent_sampling.py b/libensemble/gen_funcs/persistent_sampling.py index 44611d06b6..ce4fe51515 100644 --- a/libensemble/gen_funcs/persistent_sampling.py +++ b/libensemble/gen_funcs/persistent_sampling.py @@ -29,8 +29,8 @@ def _get_user_params(user_specs): return b, n, lb, ub -@persistent_input_fields(["f", "x", "sim_id"]) -@output_data([("x", float, (2,))]) +@persistent_input_fields(["sim_id"]) +@output_data([("x", float, (2,))]) # The dimesion 2 is only a default... and is overwritten def persistent_uniform(_, persis_info, gen_specs, libE_info): """ This generation function always enters into persistent mode and returns From 026371cd338182feb8b9d4f152953f597181ec7b Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 10 Apr 2025 12:30:56 -0500 Subject: [PATCH 211/215] Add grid lines and up opacity --- .../aposmm/aposmm_tutorial_notebook.ipynb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb b/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb index 38eca21677..594057f3c0 100644 --- a/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb +++ b/examples/tutorials/aposmm/aposmm_tutorial_notebook.ipynb @@ -6,7 +6,7 @@ "source": [ "# Parallel Optimization with APOSMM\n", "\n", - "This tutorial demonstrates libEnsemble’s capability to identify multiple minima of simulation output using the built-in APOSMM (Asynchronously Parallel Optimization Solver for finding Multiple Minima) generator function (`gen_f`). In this tutorial, we’ll create a simple simulation function (`sim_f`) that defines a function with multiple minima, then write a libEnsemble calling script that imports APOSMM and parameterizes it to check for minima over a domain of outputs from our `sim_f`.\n", + "This tutorial demonstrates libEnsemble’s capability to identify multiple minima from simulation outputs using the built-in APOSMM (Asynchronously Parallel Optimization Solver for finding Multiple Minima) generator function (`gen_f`). In this tutorial, we’ll create a simple simulation function (`sim_f`) that defines a function with multiple minima, then write a libEnsemble calling script that imports APOSMM and parameterizes it to check for minima over a domain of outputs from our `sim_f`.\n", "\n", "Besides libEnsemble and NumPy, SciPy and mpmath are also required dependencies.\n", "\n", @@ -43,7 +43,6 @@ "outputs": [], "source": [ "# Define our simulation function\n", - "\n", "import numpy as np\n", "\n", "\n", @@ -122,9 +121,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This allocation function starts a single Persistent APOSMM routine and provides ``sim_f`` output for points requested by APOSMM. Points can be sampled points or points from local optimization runs.\n", + "This allocation function starts a single Persistent APOSMM generator to generate points (simulation input parameters), and returns the resulting values from each simulation (run in parallel). Points can be sampled points or points from the parallel local optimization runs.\n", "\n", - "APOSMM supports a wide variety of external optimizers. The following statements set optimizer settings to ``'scipy'`` to indicate to APOSMM which optimization method to use, and help prevent unnecessary imports or package installations:" + "APOSMM supports a wide variety of external optimizers. The following statement sets the optimizer settings to ``'scipy'`` to indicate to APOSMM which optimization method to use, so it is imported at global scope:" ] }, { @@ -142,6 +141,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "This script uses the dictionary interface to configure the run (the newer object interface is equally valid).\n", "Set up ``nworkers``, ``libE_specs``, ``sim_specs``, ``gen_specs``, and ``alloc_specs``:" ] }, @@ -279,8 +279,9 @@ "## Viewing Animation\n", "\n", "The following cell produces a 3D animation showing the random sampling points, \n", - "and points produced by the optimization runs, under the local Minima. It may take\n", - "a few seconds to produce the animation." + "the points produced by the optimization runs, and the local Minima.\n", + "\n", + "This may take up to about 30 seconds to produce the 3D animation, depending on system." ] }, { @@ -302,7 +303,7 @@ " Z = np.array([six_hump_camel_func(np.array([x, y])) for x, y in zip(X.ravel(), Y.ravel())]).reshape(X.shape)\n", " fig = plt.figure(figsize=(10, 8))\n", " ax = fig.add_subplot(111, projection=\"3d\")\n", - " ax.plot_surface(X, Y, Z, cmap=\"winter\", edgecolor=\"none\", alpha=0.3)\n", + " ax.plot_surface(X, Y, Z, cmap=\"winter\", edgecolor='k', linewidth=0.1, antialiased=True, alpha=0.5) \n", " sc_normal = ax.scatter3D([], [], [], s=6, color=\"black\", marker=\"o\", label=\"Point\")\n", " sc_localp = ax.scatter3D([], [], [], s=40, color=\"red\", marker=\"^\", label=\"Optimization point\")\n", " custom_M_marker = Line2D([0], [0], linestyle='None', marker='$\\\\mathrm{M}$',\n", From 8da45e886e7bc7f3a99fc881597742c77a97cf69 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 10 Apr 2025 13:42:22 -0500 Subject: [PATCH 212/215] Add back gpcam colab import line --- examples/tutorials/gpcam_surrogate_model/gpcam.ipynb | 9 +++++++-- libensemble/gen_funcs/persistent_sampling.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb index 75b0c44041..29616f582e 100644 --- a/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb +++ b/examples/tutorials/gpcam_surrogate_model/gpcam.ipynb @@ -20,7 +20,10 @@ "Ensure that libEnsemble, and gpCAM are installed via: `pip install libensemble gpcam`\n", " \n", "> **Note that for notebooks** the multiprocessing start method should be set to `fork` (default on Linux).\n", - "> To use with `spawn` (default on Windows and macOS), use the `multiprocess` library." + "> To use with `spawn` (default on Windows and macOS), use the `multiprocess` library.\n", + "\n", + "> **Note:** If using **Colab** the cell below installs gpCAM and prevents Colab downgrading numpy due to pre-installs.\n", + "> Restart session when prompted (the warnings can be ignored)." ] }, { @@ -32,7 +35,9 @@ "import sys\n", "if 'google.colab' in sys.modules:\n", " !pip install libensemble\n", - " !pip install gpcam" + " # !pip install gpcam\n", + " # Prevent downgraded numpy in colab due to preinstalls\n", + " !pip install --upgrade --force-reinstall numpy==2.1.1 scipy gpcam fvgp\"" ] }, { diff --git a/libensemble/gen_funcs/persistent_sampling.py b/libensemble/gen_funcs/persistent_sampling.py index ce4fe51515..401ccdaa94 100644 --- a/libensemble/gen_funcs/persistent_sampling.py +++ b/libensemble/gen_funcs/persistent_sampling.py @@ -30,7 +30,7 @@ def _get_user_params(user_specs): @persistent_input_fields(["sim_id"]) -@output_data([("x", float, (2,))]) # The dimesion 2 is only a default... and is overwritten +@output_data([("x", float, (2,))]) # The dimesion of 2 is a default and can be overwritten def persistent_uniform(_, persis_info, gen_specs, libE_info): """ This generation function always enters into persistent mode and returns From ced94fc36bf4ff85a88b3bbd508a51fa010bf432 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 10 Apr 2025 14:06:03 -0500 Subject: [PATCH 213/215] Revert ensemble.py to release/v_1.5.0 version --- libensemble/ensemble.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/libensemble/ensemble.py b/libensemble/ensemble.py index 412b98c495..9b581a1d1a 100644 --- a/libensemble/ensemble.py +++ b/libensemble/ensemble.py @@ -578,11 +578,14 @@ def save_output(self, basename: str, append_attrs: bool = True): Format: ``_results_History_length=_evals=_ranks=`` """ if self.is_manager: - save_libE_output( - self.H, - self.persis_info, - basename, - self.nworkers, - dest_path=self.libE_specs.workflow_dir_path, - append_attrs=append_attrs, - ) + if self._get_option("libE_specs", "workflow_dir_path"): + save_libE_output( + self.H, + self.persis_info, + basename, + self.nworkers, + dest_path=self.libE_specs.workflow_dir_path, + append_attrs=append_attrs, + ) + else: + save_libE_output(self.H, self.persis_info, basename, self.nworkers, append_attrs=append_attrs) From edfa3c1723ac90fe01347f21f1266ad052ddf304 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 10 Apr 2025 14:08:57 -0500 Subject: [PATCH 214/215] Keep __all__ lines for docs --- libensemble/gen_funcs/persistent_tasmanian.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libensemble/gen_funcs/persistent_tasmanian.py b/libensemble/gen_funcs/persistent_tasmanian.py index 5afb9be1bc..ac491cf6a0 100644 --- a/libensemble/gen_funcs/persistent_tasmanian.py +++ b/libensemble/gen_funcs/persistent_tasmanian.py @@ -10,10 +10,10 @@ from libensemble.tools import parse_args from libensemble.tools.persistent_support import PersistentSupport -# __all__ = [ -# "sparse_grid_batched", -# "sparse_grid_async", -# ] +__all__ = [ + "sparse_grid_batched", + "sparse_grid_async", +] def lex_le(x, y, tol=1e-12): From 58735ab04802ccf8a9c35aa944c156d51e9e6437 Mon Sep 17 00:00:00 2001 From: shudson Date: Thu, 10 Apr 2025 14:17:13 -0500 Subject: [PATCH 215/215] Set date for release 1.5.0 --- .wci.yml | 2 +- CHANGELOG.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.wci.yml b/.wci.yml index af395fb9af..f03aa0c635 100644 --- a/.wci.yml +++ b/.wci.yml @@ -17,7 +17,7 @@ language: Python release: version: 1.5.0 - date: 2025-04-08 + date: 2025-04-10 documentation: general: https://libensemble.readthedocs.io diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 71cb1119d4..bbb2bee549 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,7 +11,7 @@ GitHub issues are referenced, and can be viewed with hyperlinks on the `github r Release 1.5.0 -------------- -:Date: Apr 8, 2025 +:Date: Apr 10, 2025 General Updates: