diff --git a/ci/docker_images/ubuntu/jammy/Dockerfile b/ci/docker_images/ubuntu/jammy/Dockerfile index 44c391976d060a7ff56a092f26d6706f1da159f4..0ca26370768ad6f86b9222719c48d5b72004f785 100644 --- a/ci/docker_images/ubuntu/jammy/Dockerfile +++ b/ci/docker_images/ubuntu/jammy/Dockerfile @@ -21,37 +21,38 @@ MAINTAINER Jean-Baptiste.Keck@imag.fr # parallel builds ARG NTHREADS ENV MAKEFLAGS "-j${NTHREADS}" +ENV PYTHON_EXECUTABLE=python3.10 # upgrade initial image ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && apt-get full-upgrade -y # get build tools and required libraries -RUN apt-get update && apt-get install -y --no-install-recommends expat unzip xz-utils automake libtool pkg-config cmake rsync git vim ssh curl wget ca-certificates gcc g++ gfortran lsb-core cpio libnuma1 libpciaccess0 libreadline-dev libblas-dev liblapack-dev libgcc-11-dev libgfortran-11-dev libgmp-dev libmpfr-dev libmpc-dev python3.9-dev opencl-headers swig libgmp-dev libmpfr-dev libmpc-dev libcairo-dev libcairomm-1.0-dev python3.9-tk +RUN apt-get update && apt-get install -y --no-install-recommends expat unzip xz-utils automake libtool pkg-config cmake rsync git vim ssh curl wget ca-certificates gcc g++ gfortran lsb-core cpio libnuma1 libpciaccess0 libreadline-dev libblas-dev liblapack-dev libgcc-11-dev libgfortran-11-dev libgmp-dev libmpfr-dev libmpc-dev ${PYTHON_EXECUTABLE}-dev opencl-headers swig libgmp-dev libmpfr-dev libmpc-dev libcairo-dev libcairomm-1.0-dev ${PYTHON_EXECUTABLE}-tk # python-pip RUN cd /tmp && \ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \ - python3.9 get-pip.py && \ - python3.9 -m pip install --upgrade pip && \ + ${PYTHON_EXECUTABLE} get-pip.py && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade pip && \ rm -f /tmp/get-pip.py -RUN python3.9 -m pip install --upgrade numpy==1.21.5 setuptools cffi wheel pytest pybind11 cython +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade numpy==1.21.5 setuptools cffi wheel pytest pybind11 cython # OpenMPI 4.1.2 + mpi4py (enable mpi1 compatibility for mpi4py) ENV MPI_ROOT "/usr/local" RUN cd /tmp && \ - wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.2.tar.gz && \ + wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.4.tar.gz && \ tar -xvzf openmpi-*.tar.gz && \ rm -f openmpi-*.tar.gz && \ cd openmpi-* && \ - ./configure --enable-shared --disable-static --with-threads=posix --enable-ipv6 --prefix="${MPI_ROOT}" --with-hwloc=internal --with-libevent=internal --enable-mpi1-compatibility && \ + ./configure --enable-shared --disable-static --enable-ipv6 --prefix="${MPI_ROOT}" --with-hwloc=internal --with-libevent=internal --enable-mpi1-compatibility && \ make && \ make install && \ rm -rf /tmp/openmpi-* ENV MPICC "${MPI_ROOT}/bin/mpicc" -RUN ldconfig && python3.9 -m pip install --upgrade mpi4py -vvv +RUN ldconfig && ${PYTHON_EXECUTABLE} -m pip install --upgrade mpi4py -vvv # HPTT (CPU tensor permutation library) RUN cd /tmp && \ @@ -66,7 +67,7 @@ RUN cd /tmp && \ make && \ make install && \ cd ../pythonAPI && \ - python3.9 -m pip install --upgrade . && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade . && \ cd /tmp && \ rm -rf /tmp/hptt @@ -80,16 +81,16 @@ RUN cd /tmp && \ make && \ make install && \ rm -rf /tmp/hdf5-* -RUN CC="${MPICC}" HDF5_MPI="ON" HDF5_VERSION="1.12.1" HDF5_DIR="${MPI_ROOT}" python3.9 -m pip install --upgrade --no-binary=h5py h5py -vvv +RUN CC="${MPICC}" HDF5_MPI="ON" HDF5_VERSION="1.12.1" HDF5_DIR="${MPI_ROOT}" ${PYTHON_EXECUTABLE} -m pip install --upgrade --no-binary=h5py h5py -vvv # other python packages -RUN python3.9 -m pip install --upgrade scipy sympy matplotlib gmpy2 psutil py-cpuinfo Mako editdistance portalocker colors.py tee pycairo argparse_color_formatter networkx pyvis zarr numcodecs jsonpickle memory-tempfile primefac +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade scipy sympy matplotlib gmpy2 psutil py-cpuinfo Mako editdistance portalocker colors.py tee pycairo argparse_color_formatter networkx pyvis zarr numcodecs jsonpickle memory-tempfile primefac # llvm + numba + llvmlite (numba 0.55.1 only supports llvm 11 for now) RUN apt-get update && \ apt-get install -y llvm-11-dev libclang-11-dev clang-11 ENV LLVM_CONFIG=llvm-config-11 -RUN python3.9 -m pip install --upgrade numba llvmlite +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade numba llvmlite # Intel experimental OpenCL platform with SYCL support # OclCpuExp 2021.12 and oneTBB 2021.5.0 @@ -128,10 +129,9 @@ RUN cd /tmp && \ mv ./clinfo /bin/ && \ rm -rf /tmp/clinfo-* -# clpeak 1.1.0 RC2 (2019) +# clpeak 1.1.2 (2022) RUN cd /tmp && \ - wget -O /usr/include/CL/cl.hpp https://www.khronos.org/registry/OpenCL/api/2.1/cl.hpp && \ - wget https://github.com/krrishnarraj/clpeak/archive/1.1.0.tar.gz && \ + wget https://github.com/krrishnarraj/clpeak/archive/1.1.2.tar.gz && \ tar -xvzf *.tar.gz && \ rm -f *.tar.gz && \ cd clpeak-* && \ @@ -146,11 +146,11 @@ RUN cd /tmp && \ RUN cd /tmp && \ git clone https://github.com/inducer/pyopencl.git && \ cd pyopencl && \ - git checkout v2022.1 && \ + git checkout v2022.2.3 && \ git submodule update --init && \ - python3.9 configure.py && \ + ${PYTHON_EXECUTABLE} configure.py && \ make && \ - python3.9 -m pip install --upgrade . && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade . && \ cd - && \ rm -rf /tmp/pyopencl @@ -186,7 +186,7 @@ RUN cd /tmp && \ git clone https://github.com/geggo/gpyfft.git && \ cd gpyfft && \ sed 's#finalize(self, _destroy_plan, self.plan)##' -i gpyfft/gpyfftlib.pyx && \ - python3.9 -m pip install . && \ + ${PYTHON_EXECUTABLE} -m pip install . && \ cd - && \ rm -rf /tmp/gpyfft @@ -211,7 +211,7 @@ RUN cd /tmp && \ make install && \ cd - && \ rm -rf arb-* -RUN python3.9 -m pip install --upgrade python-flint -vvv +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade python-flint -vvv # static fftw + pyfftw (with R2R transforms) # Weird pyfftw bug : not passing -O2 explicitely during build causes a segfault on import... @@ -233,12 +233,13 @@ RUN cd /tmp && \ RUN cd /tmp && \ git clone https://github.com/pyFFTW/pyFFTW && \ cd pyFFTW && \ - STATIC_FFTW_DIR="${FFTW_ROOT}/lib" CFLAGS="-Wl,-Bsymbolic -fopenmp -I${FFTW_ROOT}/include -O2" python3.9 setup.py build_ext --inplace && \ - python3.9 -m pip install --upgrade . && \ + STATIC_FFTW_DIR="${FFTW_ROOT}/lib" CFLAGS="-Wl,-Bsymbolic -fopenmp -I${FFTW_ROOT}/include -O2" ${PYTHON_EXECUTABLE} setup.py build_ext --inplace && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade . && \ rm -rf /tmp/pyFFTW -RUN python3.9 -m pip install ansicolors --ignore-installed -RUN python3.9 -m pip install numpy==1.21.5 +RUN ${PYTHON_EXECUTABLE} -m pip install ansicolors --ignore-installed +RUN ${PYTHON_EXECUTABLE} -m pip install numpy==1.21.5 +RUN ${PYTHON_EXECUTABLE} -m pip install sympy==1.10.0 # ensure all libraries are known by the runtime linker RUN ldconfig diff --git a/ci/docker_images/ubuntu/jammy_cuda/Dockerfile b/ci/docker_images/ubuntu/jammy_cuda/Dockerfile index fe862b1e3b60ffcd484aada031f98ab9efe4ad0b..2ee796fd1eacfd04e5df5875868860c6c61cf5f0 100644 --- a/ci/docker_images/ubuntu/jammy_cuda/Dockerfile +++ b/ci/docker_images/ubuntu/jammy_cuda/Dockerfile @@ -21,22 +21,23 @@ MAINTAINER Jean-Baptiste.Keck@imag.fr # parallel builds ARG NTHREADS ENV MAKEFLAGS "-j${NTHREADS}" +ENV PYTHON_EXECUTABLE=python3.10 # upgrade initial image ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && apt-get full-upgrade -y # get build tools and required libraries -RUN apt-get update && apt-get install -y --no-install-recommends expat unzip xz-utils automake libtool pkg-config cmake rsync git vim ssh curl wget ca-certificates gcc g++ gfortran lsb-core cpio libnuma1 libpciaccess0 libreadline-dev libblas-dev liblapack-dev libgcc-11-dev libgfortran-11-dev libgmp-dev libmpfr-dev libmpc-dev python3.10-dev opencl-headers swig libgmp-dev libmpfr-dev libmpc-dev libcairo-dev libcairomm-1.0-dev python3.10-tk +RUN apt-get update && apt-get install -y --no-install-recommends expat unzip xz-utils automake libtool pkg-config cmake rsync git vim ssh curl wget ca-certificates gcc g++ gfortran lsb-core cpio libnuma1 libpciaccess0 libreadline-dev libblas-dev liblapack-dev libgcc-11-dev libgfortran-11-dev libgmp-dev libmpfr-dev libmpc-dev ${PYTHON_EXECUTABLE}-dev opencl-headers swig libgmp-dev libmpfr-dev libmpc-dev libcairo-dev libcairomm-1.0-dev ${PYTHON_EXECUTABLE}-tk # python-pip RUN cd /tmp && \ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \ - python3.10 get-pip.py && \ - python3.10 -m pip install --upgrade pip && \ + ${PYTHON_EXECUTABLE} get-pip.py && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade pip && \ rm -f /tmp/get-pip.py -RUN python3.10 -m pip install --upgrade numpy==1.21.5 setuptools cffi wheel pytest pybind11 cython +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade numpy==1.21.5 setuptools cffi wheel pytest pybind11 cython # OpenMPI 4.1.2 + mpi4py (enable mpi1 compatibility for mpi4py) ENV MPI_ROOT "/usr/local" @@ -51,7 +52,7 @@ RUN cd /tmp && \ rm -rf /tmp/openmpi-* ENV MPICC "${MPI_ROOT}/bin/mpicc" -RUN ldconfig && python3.10 -m pip install --upgrade mpi4py -vvv +RUN ldconfig && ${PYTHON_EXECUTABLE} -m pip install --upgrade mpi4py -vvv # HPTT (CPU tensor permutation library) RUN cd /tmp && \ @@ -66,7 +67,7 @@ RUN cd /tmp && \ make && \ make install && \ cd ../pythonAPI && \ - python3.10 -m pip install --upgrade . && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade . && \ cd /tmp && \ rm -rf /tmp/hptt @@ -80,19 +81,27 @@ RUN cd /tmp && \ make && \ make install && \ rm -rf /tmp/hdf5-* -RUN CC="${MPICC}" HDF5_MPI="ON" HDF5_VERSION="1.12.1" HDF5_DIR="${MPI_ROOT}" python3.10 -m pip install --upgrade --no-binary=h5py h5py -vvv +RUN CC="${MPICC}" HDF5_MPI="ON" HDF5_VERSION="1.12.1" HDF5_DIR="${MPI_ROOT}" ${PYTHON_EXECUTABLE} -m pip install --upgrade --no-binary=h5py h5py -vvv # other python packages -RUN python3.10 -m pip install --upgrade scipy sympy matplotlib gmpy2 psutil py-cpuinfo Mako editdistance portalocker colors.py tee pycairo argparse_color_formatter networkx pyvis zarr numcodecs jsonpickle memory-tempfile primefac +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade scipy sympy matplotlib gmpy2 psutil py-cpuinfo Mako editdistance portalocker colors.py tee pycairo argparse_color_formatter networkx pyvis zarr numcodecs jsonpickle memory-tempfile primefac # llvm + numba + llvmlite (numba 0.55.1 only supports llvm 11 for now) RUN apt-get update && \ apt-get install -y llvm-11-dev libclang-11-dev clang-11 ENV LLVM_CONFIG=llvm-config-11 -RUN python3.10 -m pip install --upgrade numba llvmlite +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade numba llvmlite + +# Fix nvidia opencl icd loader +ENV LIBRARY_PATH="/lib/x86_64-linux-gnu" +RUN apt-get install -y ocl-icd-libopencl1 \ + && rm /usr/local/cuda/targets/x86_64-linux/lib/libOpenCL.so* \ + && ln -s /lib/x86_64-linux-gnu/libOpenCL.so.1 /lib/x86_64-linux-gnu/libOpenCL.so \ + && ldconfig \ + && mkdir -p /etc/OpenCL/vendors \ + && echo "/lib/x86_64-linux-gnu/libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd # clinfo 3.0.21.02.21 (2021) -ENV LIBRARY_PATH="/usr/local/cuda/targets/x86_64-linux/lib" RUN cd /tmp && \ wget https://github.com/Oblomov/clinfo/archive/refs/tags/3.0.21.02.21.tar.gz && \ tar -xvzf *.tar.gz && \ @@ -122,9 +131,9 @@ RUN cd /tmp && \ cd pyopencl && \ git checkout v2022.2.3 && \ git submodule update --init && \ - python3.10 configure.py && \ + ${PYTHON_EXECUTABLE} configure.py && \ make && \ - python3.10 -m pip install --upgrade . && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade . && \ cd - && \ rm -rf /tmp/pyopencl @@ -160,7 +169,7 @@ RUN cd /tmp && \ git clone https://github.com/geggo/gpyfft.git && \ cd gpyfft && \ sed 's#finalize(self, _destroy_plan, self.plan)##' -i gpyfft/gpyfftlib.pyx && \ - python3.10 -m pip install . && \ + ${PYTHON_EXECUTABLE} -m pip install . && \ cd - && \ rm -rf /tmp/gpyfft @@ -185,7 +194,7 @@ RUN cd /tmp && \ make install && \ cd - && \ rm -rf arb-* -RUN python3.10 -m pip install --upgrade python-flint -vvv +RUN ${PYTHON_EXECUTABLE} -m pip install --upgrade python-flint -vvv # static fftw + pyfftw (with R2R transforms) # Weird pyfftw bug : not passing -O2 explicitely during build causes a segfault on import... @@ -207,12 +216,13 @@ RUN cd /tmp && \ RUN cd /tmp && \ git clone https://github.com/pyFFTW/pyFFTW && \ cd pyFFTW && \ - STATIC_FFTW_DIR="${FFTW_ROOT}/lib" CFLAGS="-Wl,-Bsymbolic -fopenmp -I${FFTW_ROOT}/include -O2" python3.10 setup.py build_ext --inplace && \ - python3.10 -m pip install --upgrade . && \ + STATIC_FFTW_DIR="${FFTW_ROOT}/lib" CFLAGS="-Wl,-Bsymbolic -fopenmp -I${FFTW_ROOT}/include -O2" ${PYTHON_EXECUTABLE} setup.py build_ext --inplace && \ + ${PYTHON_EXECUTABLE} -m pip install --upgrade . && \ rm -rf /tmp/pyFFTW -RUN python3.10 -m pip install ansicolors --ignore-installed -RUN python3.10 -m pip install numpy==1.21.5 +RUN ${PYTHON_EXECUTABLE} -m pip install ansicolors --ignore-installed +RUN ${PYTHON_EXECUTABLE} -m pip install numpy==1.21.5 +RUN ${PYTHON_EXECUTABLE} -m pip install sympy==1.10.0 # ensure all libraries are known by the runtime linker RUN ldconfig diff --git a/ci/scripts/build_and_debug.sh b/ci/scripts/build_and_debug.sh index cb76cd3b6693d9ca53272988793dd165767a2d91..ec507fb54ca004341c6714de7fcb17ab8312a36d 100755 --- a/ci/scripts/build_and_debug.sh +++ b/ci/scripts/build_and_debug.sh @@ -16,7 +16,7 @@ ## set -feu -o pipefail -PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3.9)"} +PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3)"} PYTHON_INCLUDE_DIR=$(${PYTHON_EXECUTABLE} -c "import sysconfig as sc; print(sc.get_paths()['include'])") PYTHON_LIBRARY=$(${PYTHON_EXECUTABLE} -c "import sysconfig as sc, os; print(os.path.normpath(os.path.sep.join(sc.get_config_vars('LIBDIR', 'INSTSONAME'))))") diff --git a/ci/scripts/config.sh b/ci/scripts/config.sh index 57a33d84cfc19dd1c136586fb82fb8a0c0c61a06..b8f7dde3728060a325180492bee4a71b0421edae 100755 --- a/ci/scripts/config.sh +++ b/ci/scripts/config.sh @@ -16,7 +16,7 @@ ## set -feu -o pipefail -PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3.9)"} +PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3)"} PYTHON_INCLUDE_DIR=$(${PYTHON_EXECUTABLE} -c "import sysconfig as sc; print(sc.get_paths()['include'])") PYTHON_LIBRARY=$(${PYTHON_EXECUTABLE} -c "import sysconfig as sc, os; print(os.path.normpath(os.path.sep.join(sc.get_config_vars('LIBDIR', 'INSTSONAME'))))") diff --git a/ci/scripts/install.sh b/ci/scripts/install.sh index f294ddc2bc25aa03f1fca73437167580b71a30a8..06daa6b3826b065bc8a6e265bcaa359197c98aa1 100755 --- a/ci/scripts/install.sh +++ b/ci/scripts/install.sh @@ -16,7 +16,8 @@ ## set -feu -o pipefail -PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3.9)"} +PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3)"} +PYTHON_VERSION=$(${PYTHON_EXECUTABLE} -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') if [ $# -ne 2 ]; then echo "Usage ./install build_folder install_folder" @@ -39,12 +40,12 @@ INSTALL_FOLDER="$2" cd "${BUILD_FOLDER}" make install -if [ ! -d "${INSTALL_FOLDER}/lib/python3.9/site-packages/hysop" ]; then - echo "${INSTALL_FOLDER}/lib/python3.9/site-packages/hysop was not created." +if [ ! -d "${INSTALL_FOLDER}/lib/python${PYTHON_VERSION}/site-packages/hysop" ]; then + echo "${INSTALL_FOLDER}/lib/python${PYTHON_VERSION}/site-packages/hysop was not created." exit 1 fi -export PYTHONPATH="${INSTALL_FOLDER}/lib/python3.9/site-packages" +export PYTHONPATH="${INSTALL_FOLDER}/lib/python${PYTHON_VERSION}/site-packages" "${PYTHON_EXECUTABLE}" -c 'import hysop; print(hysop)' exit 0 diff --git a/ci/scripts/test.sh b/ci/scripts/test.sh index 1a8fec26f697e5f64ac42b4bb3daf2267c84d384..621d7386bc7ae3912a8435711a243677090f5c64 100755 --- a/ci/scripts/test.sh +++ b/ci/scripts/test.sh @@ -16,7 +16,8 @@ ## set -feu -o pipefail -PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3.9)"} +PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE:-"$(which python3)"} +PYTHON_VERSION=$(${PYTHON_EXECUTABLE} -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') if [ $# -lt 2 ]; then echo "Usage ./test install_folder hysop_folder [cache_dir] [backup_cache_dir]" @@ -82,7 +83,7 @@ if [ "${HAS_CACHE_DIR}" = true ]; then fi # Environment variables -export PYTHONPATH="${INSTALL_DIR}/lib/python3.9/site-packages:${INSTALL_DIR}" +export PYTHONPATH="${INSTALL_DIR}/lib/python${PYTHON_VERSION}/site-packages:${INSTALL_DIR}" export PYTHONHASHSEED=42 # get consistent hashes accross MPI processes export PYOPENCL_COMPILER_OUTPUT=0 export MPLBACKEND='cairo' @@ -133,6 +134,7 @@ example_test() { echo } + if [ "$RUN_TESTS" = true ]; then hysop_test "core/arrays/tests/test_array.py" hysop_test "core/graph/tests/test_graph.py" diff --git a/hysop/core/graph/computational_graph.py b/hysop/core/graph/computational_graph.py index fb68c2240b6c4ee714ff9f22e693bb4d6f39dca7..34c971e69cc894009ca13882674d57d8a66aaf94 100644 --- a/hysop/core/graph/computational_graph.py +++ b/hysop/core/graph/computational_graph.py @@ -872,7 +872,10 @@ class ComputationalGraph(ComputationalGraphNode, metaclass=ABCMeta): net = self.to_pyvis() if (net is None): return - net.write_html(path) + + html = net.generate_html() + with open(path, "w+") as f: + f.write(html) @graph_built def to_pyvis(self, width=None, height=None, with_custom_nodes=True): diff --git a/hysop/core/graph/graph.py b/hysop/core/graph/graph.py index 718fb64a5ebc0bf7dc1cb578bcd507fb8c31eb1c..35bbe1db03e55444550b481cada1b48d61389a85 100644 --- a/hysop/core/graph/graph.py +++ b/hysop/core/graph/graph.py @@ -79,9 +79,8 @@ def generate_vertex_colors(): import matplotlib except ImportError: return None - from matplotlib import cm - c0 = cm.get_cmap('tab20c').colors - c1 = cm.get_cmap('tab20b').colors + c0 = matplotlib.colormaps['tab20c'].colors + c1 = matplotlib.colormaps['tab20b'].colors colors = [] for i in (2, 3, 0, 1): colors += c0[i::4] + c1[i::4] diff --git a/requirements.txt b/requirements.txt index 7aad1a2cc8c6a85db3d3106471abca6a48d2c95f..5bd420b406a7faafd9c8ce2daa596911d3df6bd8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ wheel numpy==1.21.5 +sympy==1.10.0 scipy -sympy h5py psutil py-cpuinfo