diff --git a/.ci/write-dockerfile.sh b/.ci/write-dockerfile.sh index 973444bec72..7a3512dafd9 100755 --- a/.ci/write-dockerfile.sh +++ b/.ci/write-dockerfile.sh @@ -275,7 +275,7 @@ cat <- - && mamba env create --file environment-dev-3.11-linux.yml --prefix venv + && mamba env create --file environment-3.11-linux.yml --prefix venv && conda config --append envs_dirs $(pwd) && conda activate $(pwd)/venv && ./bootstrap diff --git a/CITATION.cff b/CITATION.cff index b3774971e4a..ae97bd81ee5 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,8 +4,8 @@ title: SageMath abstract: SageMath is a free open-source mathematics software system. authors: - name: "The SageMath Developers" -version: 10.6.beta0 +version: 10.6.beta2 doi: 10.5281/zenodo.8042260 -date-released: 2024-12-08 +date-released: 2024-12-22 repository-code: "https://github.com/sagemath/sage" url: "https://www.sagemath.org/" diff --git a/Makefile b/Makefile index 4bfe8e5c0e4..9990af924c2 100644 --- a/Makefile +++ b/Makefile @@ -174,7 +174,7 @@ bootstrap-clean: rm -rf config/install-sh config/compile config/config.guess config/config.sub config/missing configure build/make/Makefile-auto.in rm -f src/doc/en/installation/*.txt find src/doc/en/reference/spkg -name index.rst -prune -o -maxdepth 1 -name "*.rst" -exec rm -f {} \+ - for a in environment environment-optional src/environment src/environment-dev src/environment-optional; do rm -f $$a.yml $$a-3.[89].yml $$a-3.1[0-9].yml; done + for a in environment environment-optional src/environment src/environment-optional; do rm -f $$a.yml $$a-3.[89].yml $$a-3.1[0-9].yml; done rm -f src/requirements.txt rm -f src/setup.cfg rm -f build/pkgs/cypari/version_requirements.txt diff --git a/VERSION.txt b/VERSION.txt index 75a4802e431..a5da045ce22 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -SageMath version 10.6.beta0, Release Date: 2024-12-08 +SageMath version 10.6.beta2, Release Date: 2024-12-22 diff --git a/bootstrap b/bootstrap index 695e3a1550c..57dd5652d0b 100755 --- a/bootstrap +++ b/bootstrap @@ -139,7 +139,6 @@ EOF # ONLY stderr, and to re-output the results back to stderr leaving # stdout alone. Basically we swap the two descriptors using a # third, filter, and then swap them back. - ./bootstrap-conda && \ aclocal -I m4 && \ automake --add-missing --copy build/make/Makefile-auto 3>&1 1>&2 2>&3 \ | sed "${QUIET_SED_FILTER}" 3>&1 1>&2 2>&3 && \ @@ -226,7 +225,7 @@ save () { build/make/Makefile-auto.in \ src/doc/en/installation/*.txt \ $(find src/doc/en/reference/spkg -name index.rst -prune -o -maxdepth 1 -name "*.rst" -print) \ - environment-3.[89].yml environment-3.1[0-9].yml \ + environment-3.[89]-*.yml environment-3.1[0-9]-*.yml \ src/pyproject.toml \ src/requirements.txt \ src/setup.cfg \ @@ -236,6 +235,7 @@ save () { build/pkgs/gmpy2/version_requirements.txt \ build/pkgs/jupyter_core/version_requirements.txt \ build/pkgs/memory_allocator/version_requirements.txt \ + build/pkgs/meson/version_requirements.txt \ build/pkgs/numpy/version_requirements.txt \ build/pkgs/pkgconfig/version_requirements.txt \ build/pkgs/pplpy/version_requirements.txt \ diff --git a/bootstrap-conda b/bootstrap-conda deleted file mode 100755 index 157700ee809..00000000000 --- a/bootstrap-conda +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env bash - -######################################################################## -# Generate auto-generated conda environment files -######################################################################### - -export PATH="$(pwd)/build/bin:$PATH" - -STRIP_COMMENTS="sed s/#.*//;" - -shopt -s extglob - -DEVELOP_SPKG_PATTERN="@(_develop$(for a in $(head -n 1 build/pkgs/_develop/dependencies); do echo -n "|"$a; done))" -BOOTSTRAP_PACKAGES=_bootstrap -PACKAGES= -OPTIONAL_PACKAGES= -SAGELIB_PACKAGES= -SAGELIB_OPTIONAL_PACKAGES= -DEVELOP_PACKAGES= - -eval $(sage-package properties --format=shell :all:) - -for PKG_BASE in $(sage-package list --has-file distros/conda.txt --exclude _sagemath); do - eval PKG_SCRIPTS=\$path_$PKG_BASE PKG_TYPE=\$type_$PKG_BASE - SYSTEM_PACKAGES_FILE=$PKG_SCRIPTS/distros/conda.txt - PKG_SYSTEM_PACKAGES=$(echo $(${STRIP_COMMENTS} $SYSTEM_PACKAGES_FILE)) - if [ -n "$PKG_SYSTEM_PACKAGES" ]; then - if [ -f $PKG_SCRIPTS/spkg-configure.m4 ]; then - if grep -q SAGE_PYTHON_PACKAGE_CHECK $PKG_SCRIPTS/spkg-configure.m4; then - # Python package that would need --enable-system-site-packages to be used - # with the Sage distribution, but we do not recommend that for conda. - PKG_SAGELIB_ONLY=yes - else - PKG_SAGELIB_ONLY=no - fi - else - # No spkg-configure, so the Sage distribution is not able to make use of this package. - PKG_SAGELIB_ONLY=yes - fi - [ -n "$BOOTSTRAP_VERBOSE" ] && echo "$PKG_BASE:$PKG_TYPE:$PKG_SAGELIB_ONLY" - if [ $PKG_SAGELIB_ONLY = no ]; then - case "$PKG_BASE:$PKG_TYPE" in - *:standard) - PACKAGES+=" $PKG_BASE" - ;; - $DEVELOP_SPKG_PATTERN:*) - DEVELOP_PACKAGES+=" $PKG_BASE" - ;; - *) - OPTIONAL_PACKAGES+=" $PKG_BASE" - ;; - esac - else - case "$PKG_BASE:$PKG_TYPE" in - *:standard) - SAGELIB_PACKAGES+=" $PKG_BASE" - ;; - $DEVELOP_SPKG_PATTERN:*) - DEVELOP_PACKAGES+=" $PKG_BASE" - ;; - *) - SAGELIB_OPTIONAL_PACKAGES+=" $PKG_BASE" - ;; - esac - fi - fi -done -unset PKG_SYSTEM_PACKAGES - -[ -n "$BOOTSTRAP_VERBOSE" ] && echo "## Collected:" && set | grep PACKAGES= - -# Translate to system packages -export ENABLE_SYSTEM_SITE_PACKAGES=yes # Disable filtering in sage-get-system-packages -SYSTEM_PACKAGES=$(sage-get-system-packages conda $PACKAGES) -BOOTSTRAP_SYSTEM_PACKAGES=$(sage-get-system-packages conda $BOOTSTRAP_PACKAGES) -OPTIONAL_SYSTEM_PACKAGES=$(sage-get-system-packages conda $OPTIONAL_PACKAGES) -SAGELIB_SYSTEM_PACKAGES=$(sage-get-system-packages conda $SAGELIB_PACKAGES) -SAGELIB_OPTIONAL_SYSTEM_PACKAGES=$(sage-get-system-packages conda $SAGELIB_OPTIONAL_PACKAGES) -DEVELOP_SYSTEM_PACKAGES=$(sage-get-system-packages conda $DEVELOP_PACKAGES) -unset ENABLE_SYSTEM_SITE_PACKAGES - -[ -n "$BOOTSTRAP_VERBOSE" ] && echo "## Translated to system:" && set | grep SYSTEM_PACKAGES= - -echo >&2 $0:$LINENO: generate conda environment files - - ( - echo "name: sage" - echo "channels:" - echo " - conda-forge" - echo " - nodefaults" - echo "dependencies:" - for pkg in $SYSTEM_PACKAGES; do - echo " - $pkg" - done - echo " # Packages needed for ./bootstrap" - for pkg in $BOOTSTRAP_SYSTEM_PACKAGES; do - echo " - $pkg" - done - ) > environment-template.yml - ( - sed 's/name: sage-build/name: sage/' environment-template.yml - echo " - meson" - echo " - meson-python" - echo " - pytest" - echo " # Additional packages providing all dependencies for the Sage library" - for pkg in $SAGELIB_SYSTEM_PACKAGES; do - echo " - $pkg" - done - ) > environment-template.yml - - ( - sed 's/name: sage/name: sage-dev/' environment-template.yml - echo " # Additional dev tools" - echo " - conda-lock" - for pkg in $DEVELOP_SYSTEM_PACKAGES; do - echo " - $pkg" - done - ) > environment-dev-template.yml - -for f in environment environment-dev; do - for python_version in 3.9 3.10 3.11; do - sed -E 's/^( *- *)python *$/\1python='$python_version'/' $f-template.yml > $f-$python_version.yml - done - rm -f $f-template.yml -done diff --git a/build/bin/sage-dist-helpers b/build/bin/sage-dist-helpers index 520b6ceec5a..f8d07741612 100644 --- a/build/bin/sage-dist-helpers +++ b/build/bin/sage-dist-helpers @@ -71,10 +71,9 @@ # # - sdh_cmake [...] # -# Runs `cmake` in the current directory with the given arguments, as well as -# additional arguments passed to cmake (assuming packages are using the -# GNUInstallDirs module) so that `CMAKE_INSTALL_PREFIX` and -# `CMAKE_INSTALL_LIBDIR` are set correctly. +# Runs `cmake` with the given arguments, as well as additional arguments +# (assuming packages are using the GNUInstallDirs module) so that +# `CMAKE_INSTALL_PREFIX` and `CMAKE_INSTALL_LIBDIR` are set correctly. # # - sdh_install [-T] SRC [SRC...] DEST # @@ -416,9 +415,9 @@ sdh_pip_uninstall() { sdh_cmake() { echo "Configuring $PKG_NAME with cmake" - cmake . -DCMAKE_INSTALL_PREFIX="${SAGE_INST_LOCAL}" \ - -DCMAKE_INSTALL_LIBDIR=lib \ - "$@" + cmake -DCMAKE_INSTALL_PREFIX="${SAGE_INST_LOCAL}" \ + -DCMAKE_INSTALL_LIBDIR=lib \ + "$@" if [ $? -ne 0 ]; then if [ -f "$(pwd)/CMakeFiles/CMakeOutput.log" ]; then sdh_die <<_EOF_ diff --git a/build/pkgs/bliss/spkg-install.in b/build/pkgs/bliss/spkg-install.in index b988d6262ce..b203f30dcab 100644 --- a/build/pkgs/bliss/spkg-install.in +++ b/build/pkgs/bliss/spkg-install.in @@ -3,6 +3,6 @@ if [ "$UNAME" = "Darwin" ]; then export LDFLAGS fi cd src -sdh_cmake -DUSE_GMP=OFF -DCMAKE_VERBOSE_MAKEFILE=ON +sdh_cmake -DUSE_GMP=OFF -DCMAKE_VERBOSE_MAKEFILE=ON . sdh_make sdh_make_install diff --git a/build/pkgs/ccache/checksums.ini b/build/pkgs/ccache/checksums.ini index 2b4b1895243..23eadcfc9b7 100644 --- a/build/pkgs/ccache/checksums.ini +++ b/build/pkgs/ccache/checksums.ini @@ -1,3 +1,4 @@ -tarball=ccache-VERSION.tar.bz2 -sha1=3653e0765f01697c449f7026c479fbd9526323a7 -sha256=fa9d7f38367431bc86b19ad107d709ca7ecf1574fdacca01698bdf0a47cd8567 +tarball=ccache-VERSION.tar.xz +sha1=cff97f7592f5042eb43cb54a6d12a1ce7e49da62 +sha256=c0b85ddfc1a3e77b105ec9ada2d24aad617fa0b447c6a94d55890972810f0f5a +upstream_url=https://github.com/ccache/ccache/releases/download/vVERSION/ccache-VERSION.tar.xz diff --git a/build/pkgs/ccache/dependencies b/build/pkgs/ccache/dependencies index a1eb8a80d3d..e1c0b124beb 100644 --- a/build/pkgs/ccache/dependencies +++ b/build/pkgs/ccache/dependencies @@ -1,4 +1,4 @@ -zlib +cmake xz ---------- All lines of this file are ignored except the first. diff --git a/build/pkgs/ccache/distros/arch.txt b/build/pkgs/ccache/distros/arch.txt new file mode 100644 index 00000000000..812b9efc0c5 --- /dev/null +++ b/build/pkgs/ccache/distros/arch.txt @@ -0,0 +1 @@ +ccache diff --git a/build/pkgs/ccache/package-version.txt b/build/pkgs/ccache/package-version.txt index a0891f563f3..0216ba38478 100644 --- a/build/pkgs/ccache/package-version.txt +++ b/build/pkgs/ccache/package-version.txt @@ -1 +1 @@ -3.3.4 +4.10.2 diff --git a/build/pkgs/ccache/patches/01-apple-gcc-id.patch b/build/pkgs/ccache/patches/01-apple-gcc-id.patch deleted file mode 100644 index fec64b61d85..00000000000 --- a/build/pkgs/ccache/patches/01-apple-gcc-id.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/test.sh b/test.sh -index b4c95b1..e51b4bc 100755 ---- a/test.sh -+++ b/test.sh -@@ -3354,6 +3354,10 @@ case $compiler_version in - *clang*) - COMPILER_TYPE_CLANG=true - ;; -+ *Xcode.app*) -+# /usr/bin/gcc on OS X which is a front end to clang doesn't have gcc or clang in the first line. -+ COMPILER_TYPE_CLANG=true -+ ;; - *) - echo "WARNING: Compiler $COMPILER not supported (version: $compiler_version) -- not running tests" >&2 - exit 0 diff --git a/build/pkgs/ccache/spkg-install.in b/build/pkgs/ccache/spkg-install.in index 3ed82ae521c..6e7bcf1fc55 100644 --- a/build/pkgs/ccache/spkg-install.in +++ b/build/pkgs/ccache/spkg-install.in @@ -1,14 +1,14 @@ cd src -# Use newer version of config.guess and config.sub (see Issue #23710) -cp "$SAGE_ROOT"/config/config.* . - -export CPPFLAGS="-I$SAGE_LOCAL/include $CPPFLAGS" -sdh_configure +mkdir build +cd build +sdh_cmake -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_TESTING=OFF \ + -DREDIS_STORAGE_BACKEND=OFF \ + .. sdh_make sdh_make_install - set -e mkdir -p "$SAGE_LOCAL/libexec/ccache" @@ -21,4 +21,4 @@ ln -sf ../../bin/ccache "$SAGE_LOCAL/libexec/ccache/clang++" # Copy a reasonable default configuration for Sage # (cache size of 4G and compression enabled) -cp -p ../ccache.conf "$SAGE_LOCAL/etc" +cp -p ../../ccache.conf "$SAGE_LOCAL/etc" diff --git a/build/pkgs/cmake/checksums.ini b/build/pkgs/cmake/checksums.ini index 477a967711a..812e28398b0 100644 --- a/build/pkgs/cmake/checksums.ini +++ b/build/pkgs/cmake/checksums.ini @@ -1,4 +1,4 @@ tarball=cmake-VERSION.tar.gz -sha1=05de9ac807fefeb2a36ed5e8fcea376a00dd3d57 -sha256=fece24563f697870fbb982ea8bf17482c9d5f855d8c9bf0b82463d76c9e8d0cc +sha1=b87bd9de209a60d7bc81b8fed594ea26adb4f716 +sha256=42abb3f48f37dbd739cdfeb19d3712db0c5935ed5c2aef6c340f9ae9114238a2 upstream_url=https://github.com/Kitware/CMake/releases/download/vVERSION/cmake-VERSION.tar.gz diff --git a/build/pkgs/cmake/package-version.txt b/build/pkgs/cmake/package-version.txt index f641ba7ef04..4464a71f413 100644 --- a/build/pkgs/cmake/package-version.txt +++ b/build/pkgs/cmake/package-version.txt @@ -1 +1 @@ -3.27.8 +3.31.2 diff --git a/build/pkgs/configure/checksums.ini b/build/pkgs/configure/checksums.ini index af25b3b9917..e337163151d 100644 --- a/build/pkgs/configure/checksums.ini +++ b/build/pkgs/configure/checksums.ini @@ -1,3 +1,3 @@ tarball=configure-VERSION.tar.gz -sha1=ca942ace2e5104f3ae9e57946c8228b0bdb580c5 -sha256=99c0a76943170a85d2eb868d72dd673c6b0df529d99b808458bdb3b285dec8fe +sha1=a03b8a505678cba0d652514d739bd32eb30bb925 +sha256=6525b44fea6b9d0238ca4790e8be5168e8d08c350787704a59ada9b6075a1f0f diff --git a/build/pkgs/configure/package-version.txt b/build/pkgs/configure/package-version.txt index 036f9ad2756..84217b4b61b 100644 --- a/build/pkgs/configure/package-version.txt +++ b/build/pkgs/configure/package-version.txt @@ -1 +1 @@ -d129e08e85a0c6530fa140dfc04c86ac0b74e05e +291e54bf234b1753909f22a043e91a4a639693c1 diff --git a/build/pkgs/dsdp/spkg-install.in b/build/pkgs/dsdp/spkg-install.in index 5d0ecadf030..238cc83b279 100644 --- a/build/pkgs/dsdp/spkg-install.in +++ b/build/pkgs/dsdp/spkg-install.in @@ -5,6 +5,7 @@ sdh_cmake -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=ON \ -DBLA_VENDOR=OpenBLAS \ -DBLAS_LIBRARIES="$(pkg-config --libs blas)" \ - -DLAPACK_LIBRARIES="$(pkg-config --libs lapack)" + -DLAPACK_LIBRARIES="$(pkg-config --libs lapack)" \ + . sdh_make sdh_make_install diff --git a/build/pkgs/execnet/distros/arch.txt b/build/pkgs/execnet/distros/arch.txt new file mode 100644 index 00000000000..3462eb00113 --- /dev/null +++ b/build/pkgs/execnet/distros/arch.txt @@ -0,0 +1 @@ +python-execnet diff --git a/build/pkgs/execnet/distros/debian.txt b/build/pkgs/execnet/distros/debian.txt new file mode 100644 index 00000000000..242410655f3 --- /dev/null +++ b/build/pkgs/execnet/distros/debian.txt @@ -0,0 +1 @@ +python3-execnet diff --git a/build/pkgs/execnet/distros/fedora.txt b/build/pkgs/execnet/distros/fedora.txt new file mode 100644 index 00000000000..242410655f3 --- /dev/null +++ b/build/pkgs/execnet/distros/fedora.txt @@ -0,0 +1 @@ +python3-execnet diff --git a/build/pkgs/execnet/distros/gentoo.txt b/build/pkgs/execnet/distros/gentoo.txt new file mode 100644 index 00000000000..ce0a8471ea6 --- /dev/null +++ b/build/pkgs/execnet/distros/gentoo.txt @@ -0,0 +1 @@ +dev-python/execnet diff --git a/build/pkgs/execnet/distros/void.txt b/build/pkgs/execnet/distros/void.txt new file mode 100644 index 00000000000..242410655f3 --- /dev/null +++ b/build/pkgs/execnet/distros/void.txt @@ -0,0 +1 @@ +python3-execnet diff --git a/build/pkgs/execnet/spkg-configure.m4 b/build/pkgs/execnet/spkg-configure.m4 new file mode 100644 index 00000000000..82f8824ba87 --- /dev/null +++ b/build/pkgs/execnet/spkg-configure.m4 @@ -0,0 +1 @@ +SAGE_SPKG_CONFIGURE([execnet], [SAGE_PYTHON_PACKAGE_CHECK([execnet])]) diff --git a/build/pkgs/iniconfig/distros/arch.txt b/build/pkgs/iniconfig/distros/arch.txt new file mode 100644 index 00000000000..3b2e261329f --- /dev/null +++ b/build/pkgs/iniconfig/distros/arch.txt @@ -0,0 +1 @@ +python-iniconfig diff --git a/build/pkgs/iniconfig/distros/debian.txt b/build/pkgs/iniconfig/distros/debian.txt new file mode 100644 index 00000000000..db703500b14 --- /dev/null +++ b/build/pkgs/iniconfig/distros/debian.txt @@ -0,0 +1 @@ +python3-iniconfig diff --git a/build/pkgs/iniconfig/distros/fedora.txt b/build/pkgs/iniconfig/distros/fedora.txt new file mode 100644 index 00000000000..db703500b14 --- /dev/null +++ b/build/pkgs/iniconfig/distros/fedora.txt @@ -0,0 +1 @@ +python3-iniconfig diff --git a/build/pkgs/iniconfig/distros/gentoo.txt b/build/pkgs/iniconfig/distros/gentoo.txt new file mode 100644 index 00000000000..962de2510d3 --- /dev/null +++ b/build/pkgs/iniconfig/distros/gentoo.txt @@ -0,0 +1 @@ +dev-python/iniconfig diff --git a/build/pkgs/iniconfig/distros/void.txt b/build/pkgs/iniconfig/distros/void.txt new file mode 100644 index 00000000000..db703500b14 --- /dev/null +++ b/build/pkgs/iniconfig/distros/void.txt @@ -0,0 +1 @@ +python3-iniconfig diff --git a/build/pkgs/iniconfig/spkg-configure.m4 b/build/pkgs/iniconfig/spkg-configure.m4 new file mode 100644 index 00000000000..8c94fdf4986 --- /dev/null +++ b/build/pkgs/iniconfig/spkg-configure.m4 @@ -0,0 +1 @@ +SAGE_SPKG_CONFIGURE([iniconfig], [SAGE_PYTHON_PACKAGE_CHECK([iniconfig])]) diff --git a/build/pkgs/planarity/spkg-configure.m4 b/build/pkgs/planarity/spkg-configure.m4 index 9ec8ddc64f6..355332a72e7 100644 --- a/build/pkgs/planarity/spkg-configure.m4 +++ b/build/pkgs/planarity/spkg-configure.m4 @@ -1,6 +1,6 @@ SAGE_SPKG_CONFIGURE([planarity], [ AC_LANG_PUSH([C]) - AC_CHECK_HEADER([planarity/planarity.h], [ + AC_CHECK_HEADER([planarity/graph.h], [ AC_CHECK_LIB([planarity], [gp_InitGraph], [ AC_MSG_CHECKING([for planarity version 3.0 or later]) AC_COMPILE_IFELSE( diff --git a/build/pkgs/primecount/spkg-install.in b/build/pkgs/primecount/spkg-install.in index 7589fad8cb9..19b88753127 100644 --- a/build/pkgs/primecount/spkg-install.in +++ b/build/pkgs/primecount/spkg-install.in @@ -36,6 +36,7 @@ sdh_cmake -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH \ -DCMAKE_INSTALL_PREFIX=$SAGE_LOCAL \ -DWITH_POPCNT=OFF \ + . \ && sdh_make_install } diff --git a/build/pkgs/primesieve/spkg-install.in b/build/pkgs/primesieve/spkg-install.in index c7669a664e9..52968c86587 100644 --- a/build/pkgs/primesieve/spkg-install.in +++ b/build/pkgs/primesieve/spkg-install.in @@ -9,6 +9,7 @@ sdh_cmake -DCMAKE_VERBOSE_MAKEFILE=ON \ -DBUILD_STATIC_LIBS=OFF \ -DBUILD_SHARED_LIBS=ON \ -DBUILD_TESTS=ON \ - ${EXTRA_OPTS} + ${EXTRA_OPTS} \ + . sdh_make_install diff --git a/build/pkgs/pyproject_api/distros/arch.txt b/build/pkgs/pyproject_api/distros/arch.txt new file mode 100644 index 00000000000..7d778992044 --- /dev/null +++ b/build/pkgs/pyproject_api/distros/arch.txt @@ -0,0 +1 @@ +python-pyproject-api diff --git a/build/pkgs/pyproject_api/distros/debian.txt b/build/pkgs/pyproject_api/distros/debian.txt new file mode 100644 index 00000000000..0d2d5b563c5 --- /dev/null +++ b/build/pkgs/pyproject_api/distros/debian.txt @@ -0,0 +1 @@ +python3-pyproject-api diff --git a/build/pkgs/pyproject_api/distros/fedora.txt b/build/pkgs/pyproject_api/distros/fedora.txt new file mode 100644 index 00000000000..0d2d5b563c5 --- /dev/null +++ b/build/pkgs/pyproject_api/distros/fedora.txt @@ -0,0 +1 @@ +python3-pyproject-api diff --git a/build/pkgs/pyproject_api/distros/gentoo.txt b/build/pkgs/pyproject_api/distros/gentoo.txt new file mode 100644 index 00000000000..69d2b03e990 --- /dev/null +++ b/build/pkgs/pyproject_api/distros/gentoo.txt @@ -0,0 +1 @@ +dev-python/pyproject-api diff --git a/build/pkgs/pyproject_api/distros/void.txt b/build/pkgs/pyproject_api/distros/void.txt new file mode 100644 index 00000000000..0d2d5b563c5 --- /dev/null +++ b/build/pkgs/pyproject_api/distros/void.txt @@ -0,0 +1 @@ +python3-pyproject-api diff --git a/build/pkgs/pyproject_hooks/distros/arch.txt b/build/pkgs/pyproject_hooks/distros/arch.txt new file mode 100644 index 00000000000..71c493f0851 --- /dev/null +++ b/build/pkgs/pyproject_hooks/distros/arch.txt @@ -0,0 +1 @@ +python-pyproject-hooks diff --git a/build/pkgs/pyproject_hooks/distros/debian.txt b/build/pkgs/pyproject_hooks/distros/debian.txt new file mode 100644 index 00000000000..010de587955 --- /dev/null +++ b/build/pkgs/pyproject_hooks/distros/debian.txt @@ -0,0 +1 @@ +python3-pyproject-hooks diff --git a/build/pkgs/pyproject_hooks/distros/fedora.txt b/build/pkgs/pyproject_hooks/distros/fedora.txt new file mode 100644 index 00000000000..010de587955 --- /dev/null +++ b/build/pkgs/pyproject_hooks/distros/fedora.txt @@ -0,0 +1 @@ +python3-pyproject-hooks diff --git a/build/pkgs/pyproject_hooks/distros/gentoo.txt b/build/pkgs/pyproject_hooks/distros/gentoo.txt new file mode 100644 index 00000000000..4034186504e --- /dev/null +++ b/build/pkgs/pyproject_hooks/distros/gentoo.txt @@ -0,0 +1 @@ +dev-python/pyproject-hooks diff --git a/build/pkgs/pyproject_hooks/distros/void.txt b/build/pkgs/pyproject_hooks/distros/void.txt new file mode 100644 index 00000000000..010de587955 --- /dev/null +++ b/build/pkgs/pyproject_hooks/distros/void.txt @@ -0,0 +1 @@ +python3-pyproject-hooks diff --git a/build/pkgs/pyproject_hooks/spkg-configure.m4 b/build/pkgs/pyproject_hooks/spkg-configure.m4 new file mode 100644 index 00000000000..acec0fc4902 --- /dev/null +++ b/build/pkgs/pyproject_hooks/spkg-configure.m4 @@ -0,0 +1 @@ +SAGE_SPKG_CONFIGURE([pyproject_hooks], [SAGE_PYTHON_PACKAGE_CHECK([pyproject_hooks])]) diff --git a/build/pkgs/pyproject_metadata/distros/arch.txt b/build/pkgs/pyproject_metadata/distros/arch.txt new file mode 100644 index 00000000000..31f99621fe0 --- /dev/null +++ b/build/pkgs/pyproject_metadata/distros/arch.txt @@ -0,0 +1 @@ +python-pyproject-metadata diff --git a/build/pkgs/pyproject_metadata/distros/debian.txt b/build/pkgs/pyproject_metadata/distros/debian.txt new file mode 100644 index 00000000000..5180a07a0cc --- /dev/null +++ b/build/pkgs/pyproject_metadata/distros/debian.txt @@ -0,0 +1 @@ +python3-pyproject-metadata diff --git a/build/pkgs/pyproject_metadata/distros/void.txt b/build/pkgs/pyproject_metadata/distros/void.txt new file mode 100644 index 00000000000..5180a07a0cc --- /dev/null +++ b/build/pkgs/pyproject_metadata/distros/void.txt @@ -0,0 +1 @@ +python3-pyproject-metadata diff --git a/build/pkgs/qhull/spkg-install.in b/build/pkgs/qhull/spkg-install.in index c3df534ad86..e649712ac43 100644 --- a/build/pkgs/qhull/spkg-install.in +++ b/build/pkgs/qhull/spkg-install.in @@ -1,7 +1,8 @@ cd src/ sdh_cmake -DCMAKE_VERBOSE_MAKEFILE=ON \ - -DLIB_INSTALL_DIR="${SAGE_LOCAL}"/lib + -DLIB_INSTALL_DIR="${SAGE_LOCAL}"/lib \ + . sdh_make diff --git a/build/pkgs/sage_conf/version_requirements.txt b/build/pkgs/sage_conf/version_requirements.txt index 1528604151d..dac4c2ff0f5 100644 --- a/build/pkgs/sage_conf/version_requirements.txt +++ b/build/pkgs/sage_conf/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sage-conf ~= 10.6b0 +sage-conf ~= 10.6b2 diff --git a/build/pkgs/sage_docbuild/version_requirements.txt b/build/pkgs/sage_docbuild/version_requirements.txt index 64078134018..1042c4d84b3 100644 --- a/build/pkgs/sage_docbuild/version_requirements.txt +++ b/build/pkgs/sage_docbuild/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sage-docbuild ~= 10.6b0 +sage-docbuild ~= 10.6b2 diff --git a/build/pkgs/sage_setup/version_requirements.txt b/build/pkgs/sage_setup/version_requirements.txt index e5b0998d572..be5c8645b19 100644 --- a/build/pkgs/sage_setup/version_requirements.txt +++ b/build/pkgs/sage_setup/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sage-setup ~= 10.6b0 +sage-setup ~= 10.6b2 diff --git a/build/pkgs/sage_sws2rst/version_requirements.txt b/build/pkgs/sage_sws2rst/version_requirements.txt index 1aec16d1739..734ca51955f 100644 --- a/build/pkgs/sage_sws2rst/version_requirements.txt +++ b/build/pkgs/sage_sws2rst/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sage-sws2rst ~= 10.6b0 +sage-sws2rst ~= 10.6b2 diff --git a/build/pkgs/sagelib/version_requirements.txt b/build/pkgs/sagelib/version_requirements.txt index a01ffdf92ed..9db5148c938 100644 --- a/build/pkgs/sagelib/version_requirements.txt +++ b/build/pkgs/sagelib/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-standard ~= 10.6b0 +sagemath-standard ~= 10.6b2 diff --git a/build/pkgs/sagemath_bliss/version_requirements.txt b/build/pkgs/sagemath_bliss/version_requirements.txt index 637c4611451..bcd0492a487 100644 --- a/build/pkgs/sagemath_bliss/version_requirements.txt +++ b/build/pkgs/sagemath_bliss/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-bliss ~= 10.6b0 +sagemath-bliss ~= 10.6b2 diff --git a/build/pkgs/sagemath_categories/version_requirements.txt b/build/pkgs/sagemath_categories/version_requirements.txt index 8e37771c3f9..71d3e4365fb 100644 --- a/build/pkgs/sagemath_categories/version_requirements.txt +++ b/build/pkgs/sagemath_categories/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-categories ~= 10.6b0 +sagemath-categories ~= 10.6b2 diff --git a/build/pkgs/sagemath_coxeter3/version_requirements.txt b/build/pkgs/sagemath_coxeter3/version_requirements.txt index 06dc600cfd7..fc343e41411 100644 --- a/build/pkgs/sagemath_coxeter3/version_requirements.txt +++ b/build/pkgs/sagemath_coxeter3/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-coxeter3 ~= 10.6b0 +sagemath-coxeter3 ~= 10.6b2 diff --git a/build/pkgs/sagemath_environment/version_requirements.txt b/build/pkgs/sagemath_environment/version_requirements.txt index 7e0f787af06..837e63fe820 100644 --- a/build/pkgs/sagemath_environment/version_requirements.txt +++ b/build/pkgs/sagemath_environment/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-environment ~= 10.6b0 +sagemath-environment ~= 10.6b2 diff --git a/build/pkgs/sagemath_mcqd/version_requirements.txt b/build/pkgs/sagemath_mcqd/version_requirements.txt index 3a2722024c4..21dcc676acf 100644 --- a/build/pkgs/sagemath_mcqd/version_requirements.txt +++ b/build/pkgs/sagemath_mcqd/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-mcqd ~= 10.6b0 +sagemath-mcqd ~= 10.6b2 diff --git a/build/pkgs/sagemath_meataxe/version_requirements.txt b/build/pkgs/sagemath_meataxe/version_requirements.txt index 3cb0d050fa5..510a8736cf5 100644 --- a/build/pkgs/sagemath_meataxe/version_requirements.txt +++ b/build/pkgs/sagemath_meataxe/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-meataxe ~= 10.6b0 +sagemath-meataxe ~= 10.6b2 diff --git a/build/pkgs/sagemath_objects/version_requirements.txt b/build/pkgs/sagemath_objects/version_requirements.txt index e8c44e2142e..b5877570307 100644 --- a/build/pkgs/sagemath_objects/version_requirements.txt +++ b/build/pkgs/sagemath_objects/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-objects ~= 10.6b0 +sagemath-objects ~= 10.6b2 diff --git a/build/pkgs/sagemath_repl/version_requirements.txt b/build/pkgs/sagemath_repl/version_requirements.txt index 3df75b7c62a..8d7fca3395c 100644 --- a/build/pkgs/sagemath_repl/version_requirements.txt +++ b/build/pkgs/sagemath_repl/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-repl ~= 10.6b0 +sagemath-repl ~= 10.6b2 diff --git a/build/pkgs/sagemath_sirocco/version_requirements.txt b/build/pkgs/sagemath_sirocco/version_requirements.txt index 2c8db8e59f7..18111e8fa2d 100644 --- a/build/pkgs/sagemath_sirocco/version_requirements.txt +++ b/build/pkgs/sagemath_sirocco/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-sirocco ~= 10.6b0 +sagemath-sirocco ~= 10.6b2 diff --git a/build/pkgs/sagemath_tdlib/version_requirements.txt b/build/pkgs/sagemath_tdlib/version_requirements.txt index 1732fe39010..b297935ac75 100644 --- a/build/pkgs/sagemath_tdlib/version_requirements.txt +++ b/build/pkgs/sagemath_tdlib/version_requirements.txt @@ -1,2 +1,2 @@ # This file is updated on every release by the sage-update-version script -sagemath-tdlib ~= 10.6b0 +sagemath-tdlib ~= 10.6b2 diff --git a/build/pkgs/scip/spkg-install.in b/build/pkgs/scip/spkg-install.in index 69bbdfae266..2ec391fc2bc 100644 --- a/build/pkgs/scip/spkg-install.in +++ b/build/pkgs/scip/spkg-install.in @@ -2,16 +2,16 @@ cd src mkdir build cd build sdh_cmake -DCMAKE_INSTALL_LIBDIR=lib \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -DCMAKE_BUILD_WITH_INSTALL_NAME_DIR=ON \ - -DGMP_DIR="${SAGE_GMP_PREFIX}" \ - -DReadline_ROOT_DIR=$(pkg-config --variable=prefix readline) \ - -DHistory_ROOT_DIR=$(pkg-config --variable=prefix readline) \ - -DIPOPT=off \ - -DPAPILO=on -DPAPILO_DIR="${SAGE_LOCAL}" \ - -DZIMPL=off \ - -DAMPL=off \ - -DSYM=bliss \ - .. + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_BUILD_WITH_INSTALL_NAME_DIR=ON \ + -DGMP_DIR="${SAGE_GMP_PREFIX}" \ + -DReadline_ROOT_DIR=$(pkg-config --variable=prefix readline) \ + -DHistory_ROOT_DIR=$(pkg-config --variable=prefix readline) \ + -DIPOPT=off \ + -DPAPILO=on -DPAPILO_DIR="${SAGE_LOCAL}" \ + -DZIMPL=off \ + -DAMPL=off \ + -DSYM=bliss \ + .. sdh_make sdh_make_install diff --git a/build/pkgs/scip_sdp/spkg-install.in b/build/pkgs/scip_sdp/spkg-install.in index 3a65a004219..bc202b1262b 100644 --- a/build/pkgs/scip_sdp/spkg-install.in +++ b/build/pkgs/scip_sdp/spkg-install.in @@ -2,14 +2,14 @@ cd src mkdir build cd build sdh_cmake -DCMAKE_INSTALL_LIBDIR=lib \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -DCMAKE_BUILD_WITH_INSTALL_NAME_DIR=ON \ - -DBLA_VENDOR=OpenBLAS \ - -DBLAS_LIBRARIES="$(pkg-config --libs blas)" \ - -DLAPACK_LIBRARIES="$(pkg-config --libs lapack)" \ - -DSCIP_DIR="${SAGE_LOCAL}" \ - -DSYM=bliss \ - -DSDPS=dsdp \ - .. + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_BUILD_WITH_INSTALL_NAME_DIR=ON \ + -DBLA_VENDOR=OpenBLAS \ + -DBLAS_LIBRARIES="$(pkg-config --libs blas)" \ + -DLAPACK_LIBRARIES="$(pkg-config --libs lapack)" \ + -DSCIP_DIR="${SAGE_LOCAL}" \ + -DSYM=bliss \ + -DSDPS=dsdp \ + .. sdh_make sdh_make_install diff --git a/build/pkgs/suitesparse/spkg-install.in b/build/pkgs/suitesparse/spkg-install.in index f7ef16bb48b..cfc8b176d71 100644 --- a/build/pkgs/suitesparse/spkg-install.in +++ b/build/pkgs/suitesparse/spkg-install.in @@ -5,7 +5,7 @@ echo "Configuring suitesparse" # Hopefully these sill be normalised in the future. # * SUITESPARSE_INCLUDEDIR_POSTFIX sets the subfolder in which to install headers. # It default to "suitesparse" if not defined, which currently breaks dependencies. -# * SUITESPARSE_USE_FORTRAN make sure the fortran interface is off. There is trouble when +# * SUITESPARSE_USE_FORTRAN make sure the fortran interface is off. There is trouble when # gcc and gfortran version are not matching. # * SUITESPARSE_ENABLE_PROJECTS semi column separated list of the desired packages. Default is # all the packages in the suitesparse tarball. @@ -16,6 +16,7 @@ sdh_cmake -DCMAKE_VERBOSE_MAKEFILE=ON \ -DNSTATIC=ON \ -DSUITESPARSE_USE_FORTRAN=OFF \ -DSUITESPARSE_INCLUDEDIR_POSTFIX="" \ - -DSUITESPARSE_ENABLE_PROJECTS="suitesparse_config;amd;camd;ccolamd;colamd;cholmod;umfpack" + -DSUITESPARSE_ENABLE_PROJECTS="suitesparse_config;amd;camd;ccolamd;colamd;cholmod;umfpack" \ + . sdh_make_install diff --git a/build/pkgs/symengine/spkg-install.in b/build/pkgs/symengine/spkg-install.in index 8eaaf6fbcbe..3e9c4b05fcf 100644 --- a/build/pkgs/symengine/spkg-install.in +++ b/build/pkgs/symengine/spkg-install.in @@ -2,18 +2,18 @@ cd src mkdir build cd build sdh_cmake -DCMAKE_PREFIX_PATH="$SAGE_LOCAL" \ - -DWITH_SYMENGINE_THREAD_SAFE=yes \ - -DWITH_ECM=yes \ - -DWITH_FLINT=yes \ - -DWITH_ARB=yes \ - -DWITH_MPFR=yes \ - -DWITH_MPC=yes \ - -DWITH_LLVM=no \ - -DINTEGER_CLASS="flint" \ - -DBUILD_BENCHMARKS=no \ - -DBUILD_SHARED_LIBS=yes \ - -DBUILD_TESTS=yes \ - .. + -DWITH_SYMENGINE_THREAD_SAFE=yes \ + -DWITH_ECM=yes \ + -DWITH_FLINT=yes \ + -DWITH_ARB=yes \ + -DWITH_MPFR=yes \ + -DWITH_MPC=yes \ + -DWITH_LLVM=no \ + -DINTEGER_CLASS="flint" \ + -DBUILD_BENCHMARKS=no \ + -DBUILD_SHARED_LIBS=yes \ + -DBUILD_TESTS=yes \ + .. sdh_make sdh_make install diff --git a/environment-3.10-linux-aarch64.yml b/environment-3.10-linux-aarch64.yml index 1ec845735bf..f5504885ec5 100644 --- a/environment-3.10-linux-aarch64.yml +++ b/environment-3.10-linux-aarch64.yml @@ -1,436 +1,335 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: linux-aarch64 -# input_hash: 50ecbf09a118347f6c002960a184cf81c369d83e8e8555c2db3282013254eca1 +# input_hash: db49741f7e4afa9923e001ba84b429b390761405055f59782e7fd09d34903087 channels: - conda-forge dependencies: - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - _sysroot_linux-aarch64_curr_repodata_hack=4=h57d6b7b_14 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.11=h31becfc_1 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310hb299538_4 + - alabaster=1.0.0=pyhd8ed1ab_0 + - alsa-lib=1.2.13=h86ecc28_0 - arpack=3.9.1=nompi_hd363cd0_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321h2148fe1_1 - - automake=1.16.5=pl5321h8af1aa0_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=hf897c2e_0 + - automake=1.17=pl5321h8af1aa0_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=hd62202e_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=hf1166c9_7 - - binutils_impl_linux-aarch64=2.40=hf54a868_7 - - binutils_linux-aarch64=2.40=h1f91aba_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linuxaarch64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=ha990451_2 + - binutils=2.43=hf1166c9_2 + - binutils_impl_linux-aarch64=2.43=h4c662bb_2 + - binutils_linux-aarch64=2.43=hf1166c9_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_linuxaarch64_openblas + - boost-cpp=1.85.0=hdad291f_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h31becfc_1 - - brotli-bin=1.1.0=h31becfc_1 - - brotli-python=1.1.0=py310hbb3657e_1 - - bwidget=1.9.14=h8af1aa0_1 - - bzip2=1.0.8=h31becfc_5 - - c-ares=1.28.1=h31becfc_0 - - c-compiler=1.7.0=h31becfc_1 - - ca-certificates=2024.6.2=hcefe29a_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=h5c54ea9_2 + - brotli=1.1.0=h86ecc28_2 + - brotli-bin=1.1.0=h86ecc28_2 + - brotli-python=1.1.0=py310he30c3ed_2 + - bzip2=1.0.8=h68df207_7 + - c-ares=1.34.3=h86ecc28_1 + - c-compiler=1.8.0=h6561dab_1 + - ca-certificates=2024.8.30=hcefe29a_0 + - cairo=1.18.0=hdb1a16f_3 - cddlib=1!0.94m=h719063d_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310hce94938_0 - - chardet=5.2.0=py310hbbe02a8_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py310h1451162_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 - cliquer=1.22=h31becfc_1 - - cmake=3.29.6=h7042e5d_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310h4c7bcd0_0 - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=h8af1aa0_1 - - contourpy=1.2.1=py310h586407a_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=h7daf2e0_0 - - cvxopt=1.3.2=py310he29a27f_2 - - cxx-compiler=1.7.0=h2a328a1_1 + - contourpy=1.3.1=py310hf54e67a_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py310h66848f9_0 + - cpython=3.10.15=py310hd8ed1ab_2 + - cxx-compiler=1.8.0=heb6c788_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py310h4cbba44_0 + - cyrus-sasl=2.1.27=hf6b2984_7 - cysignals=1.11.2=py310h485802a_3 - - cython=3.0.10=py310hbb3657e_0 - - debugpy=1.8.1=py310hbb3657e_0 + - cython=3.0.11=py310he223470_3 + - dbus=1.13.6=h12b9eeb_3 + - debugpy=1.8.9=py310he30c3ed_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hb12102e_1203 - - ecl=23.9.9=h6475f26_0 + - double-conversion=3.3.0=h2f0025b_0 + - ecl=24.5.10=h5567cc5_0 - eclib=20231212=he26bab5_0 - ecm=7.0.5=ha2d0fc4_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h2f0025b_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h5ad3122_0 - fflas-ffpack=2.5.0=h503e619_0 - - fftw=3.3.10=nompi_h020dacd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=ha9a116f_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h8dda3cd_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310hb52b2da_0 - - fortran-compiler=1.7.0=h7048d53_1 + - fonttools=4.55.0=py310heeae437_0 + - fortran-compiler=1.8.0=h25a59a9_1 - fplll=5.4.5=hb3a790e_0 - fpylll=0.6.1=py310hfdbf2a6_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=hf0a5ef3_2 - - fribidi=1.0.10=hb9de7d4_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=h597289e_3 - - gap-defaults=4.12.2=h8af1aa0_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=hdb0cc85_13 - - gcc_impl_linux-aarch64=12.3.0=h3d98823_13 - - gcc_linux-aarch64=12.3.0=ha52a6ea_9 - - gengetopt=2.23=h01db608_0 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h16511ff_0 + - gap-defaults=4.13.1=h8af1aa0_0 + - gcc=13.3.0=h8a56e6e_1 + - gcc_impl_linux-aarch64=13.3.0=hcdea9b6_1 + - gcc_linux-aarch64=13.3.0=h1cd514b_7 - gf2x=1.3.0=h1b3b3a3_2 - gfan=0.6.2=h5f589ec_1003 - - gfortran=12.3.0=hdb0cc85_13 - - gfortran_impl_linux-aarch64=12.3.0=h97ebfd2_13 - - gfortran_linux-aarch64=12.3.0=ha7b8e4b_9 + - gfortran=13.3.0=h8a56e6e_1 + - gfortran_impl_linux-aarch64=13.3.0=h174a3c4_1 + - gfortran_linux-aarch64=13.3.0=h2809cf8_7 - giac=1.9.0.21=h04922a4_1 - - giflib=5.2.2=h31becfc_0 - givaro=4.2.0=h364d21b_0 - glpk=5.0=h66325d0_0 - gmp=6.3.0=h0a1ffab_2 - - gmpy2=2.1.5=py310h05bcf56_1 + - gmpy2=2.1.5=py310h615e639_2 - graphite2=1.3.13=h2f0025b_1003 - gsl=2.7=h294027d_0 - - gxx=12.3.0=hdb0cc85_13 - - gxx_impl_linux-aarch64=12.3.0=hba91e99_13 - - gxx_linux-aarch64=12.3.0=h9d1f256_9 - - h11=0.14.0=pyhd8ed1ab_0 + - gxx=13.3.0=h8a56e6e_1 + - gxx_impl_linux-aarch64=13.3.0=h1211b58_1 + - gxx_linux-aarch64=13.3.0=h2864abd_7 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h9812418_0 - - hatchling=1.25.0=pyhd8ed1ab_0 + - harfbuzz=9.0.0=hbf49d6b_1 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h787c7f5_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h197073e_1 + - icu=75.1=hf9b3779_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h207f3e5_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h15043fe_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh3099207_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=h8af1aa0_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310h4c7bcd0_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310h4c7bcd0_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-aarch64=4.18.0=h5b4a56d_14 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kernel-headers_linux-aarch64=4.18.0=h05a177a_18 - keyutils=1.6.1=h4e544f5_0 - - kiwisolver=1.4.5=py310he290b8a_1 - - krb5=1.21.2=hc419048_0 + - kiwisolver=1.4.7=py310h5d7f10c_0 + - krb5=1.21.3=h50a48e9_0 - lcalc=2.0.5=he588f68_2 - lcms2=2.16=h922389a_0 - - ld_impl_linux-aarch64=2.40=h9fc2d93_7 + - ld_impl_linux-aarch64=2.43=h80caac9_2 - lerc=4.0.0=h4de3ea5_0 - - libatomic_ops=7.6.14=h4e544f5_0 - - libblas=3.9.0=20_linuxaarch64_openblas - - libboost=1.85.0=hb41fec8_2 - - libboost-devel=1.85.0=h37bb5a9_2 - - libboost-headers=1.85.0=h8af1aa0_2 - - libbraiding=1.2=hd600fc2_0 + - libblas=3.9.0=25_linuxaarch64_openblas + - libboost=1.85.0=h9fa81b4_4 + - libboost-devel=1.85.0=h37bb5a9_4 + - libboost-headers=1.85.0=h8af1aa0_4 + - libbraiding=1.3=h5ad3122_0 - libbrial=1.2.12=h9429f74_3 - - libbrotlicommon=1.1.0=h31becfc_1 - - libbrotlidec=1.1.0=h31becfc_1 - - libbrotlienc=1.1.0=h31becfc_1 - - libcblas=3.9.0=20_linuxaarch64_openblas + - libbrotlicommon=1.1.0=h86ecc28_2 + - libbrotlidec=1.1.0=h86ecc28_2 + - libbrotlienc=1.1.0=h86ecc28_2 + - libcblas=3.9.0=25_linuxaarch64_openblas + - libclang-cpp19.1=19.1.4=default_he324ac1_0 + - libclang13=19.1.4=default_h4390ef5_0 - libcups=2.3.3=h405e4a8_4 - - libcurl=8.8.0=h4e8248e_0 - - libdeflate=1.20=h31becfc_0 + - libcurl=8.10.1=h3ec0cbf_0 + - libdeflate=1.22=h86ecc28_0 + - libdrm=2.4.123=h86ecc28_0 - libedit=3.1.20191231=he28a2e2_2 + - libegl=1.7.0=hd24410f_2 - libev=4.33=h31becfc_2 - - libexpat=2.6.2=h2f0025b_0 + - libexpat=2.6.4=h5ad3122_0 - libffi=3.4.2=h3557bc0_5 - - libflint=3.0.1=hc392af7_ntl_100 - - libgcc-devel_linux-aarch64=12.3.0=h6144e03_113 - - libgcc-ng=13.2.0=he277a41_13 - - libgd=2.3.3=hcd22fd5_9 - - libgfortran-ng=13.2.0=he9431aa_13 - - libgfortran5=13.2.0=h2af0866_13 - - libglib=2.80.2=haee52c6_1 - - libgomp=13.2.0=he277a41_13 + - libflint=3.0.1=h0433c20_103 + - libgcc=14.2.0=he277a41_1 + - libgcc-devel_linux-aarch64=13.3.0=h0c07274_101 + - libgcc-ng=14.2.0=he9431aa_1 + - libgd=2.3.3=h6818b27_10 + - libgfortran=14.2.0=he9431aa_1 + - libgfortran-ng=14.2.0=he9431aa_1 + - libgfortran5=14.2.0=hb6113d0_1 + - libgl=1.7.0=hd24410f_2 + - libglib=2.82.2=hc486b8e_0 + - libglvnd=1.7.0=hd24410f_2 + - libglx=1.7.0=hd24410f_2 + - libgomp=14.2.0=he277a41_1 - libhomfly=1.02r6=h31becfc_1 - - libhwloc=2.10.0=default_h3030c0e_1001 - libiconv=1.17=h31becfc_2 - libjpeg-turbo=3.0.0=h31becfc_1 - - liblapack=3.9.0=20_linuxaarch64_openblas - - liblapacke=3.9.0=20_linuxaarch64_openblas - - libnghttp2=1.58.0=hb0e430d_1 + - liblapack=3.9.0=25_linuxaarch64_openblas + - liblapacke=3.9.0=25_linuxaarch64_openblas + - libllvm19=19.1.4=h2edbd07_1 + - libnghttp2=1.64.0=hc8609a4_0 - libnsl=2.0.1=h31becfc_0 - - libopenblas=0.3.25=pthreads_h5a5ec62_0 - - libpng=1.6.43=h194ca79_0 - - libsanitizer=12.3.0=h57e2e72_13 - - libsodium=1.0.18=hb9de7d4_1 - - libsqlite=3.46.0=hf51ef55_0 - - libssh2=1.11.0=h492db2e_0 - - libstdcxx-devel_linux-aarch64=12.3.0=h6144e03_113 - - libstdcxx-ng=13.2.0=h3f4de04_13 - - libtiff=4.6.0=hf980d43_3 - - libtool=2.4.7=h4de3ea5_0 + - libntlm=1.4=hf897c2e_1002 + - libopenblas=0.3.28=pthreads_h9d3fd7e_1 + - libopengl=1.7.0=hd24410f_2 + - libpciaccess=0.18=h31becfc_0 + - libpng=1.6.44=hc4a20ef_0 + - libpq=17.2=h081282e_0 + - libsanitizer=13.3.0=ha58e236_1 + - libsodium=1.0.20=h68df207_0 + - libsqlite=3.47.0=hc4a20ef_1 + - libssh2=1.11.1=ha41c0db_0 + - libstdcxx=14.2.0=h3f4de04_1 + - libstdcxx-devel_linux-aarch64=13.3.0=h0c07274_101 + - libstdcxx-ng=14.2.0=hf1166c9_1 + - libtiff=4.7.0=hec21d91_1 - libuuid=2.38.1=hb4cce97_0 - - libuv=1.48.0=h31becfc_0 - - libwebp=1.4.0=h8b4e01b_0 - libwebp-base=1.4.0=h31becfc_0 - - libxcb=1.16=h7935292_0 + - libxcb=1.17.0=h262b8f6_0 - libxcrypt=4.4.36=h31becfc_1 - - libxml2=2.12.7=h49dc7a2_1 - - libzlib=1.3.1=h68df207_1 + - libxkbcommon=1.7.0=h46f2afe_1 + - libxml2=2.13.5=hf4efe5d_0 + - libxslt=1.1.39=h1cc9640_0 + - libzlib=1.3.1=h86ecc28_2 - linbox=1.7.0=h681a5ee_0 - - llvm-openmp=18.1.8=hb063fc5_0 - - lrcalc=2.1=h2f0025b_6 + - llvm-openmp=19.1.4=h013ceaa_0 + - lrcalc=2.1=h5ad3122_7 - m4=1.4.18=h516909a_1001 - m4ri=20140914=hedfd65a_1006 - m4rie=20150908=hf0a5ef3_1002 - - make=4.3=h309ac5b_1 - - markupsafe=2.1.5=py310h7c1f4a2_0 - - mathjax=3.2.2=h8af1aa0_0 - - matplotlib=3.8.4=py310hbbe02a8_2 - - matplotlib-base=3.8.4=py310h84f21c1_2 + - markupsafe=3.0.2=py310h66848f9_0 + - matplotlib=3.9.2=py310hbbe02a8_2 + - matplotlib-base=3.9.2=py310h2cc5e2d_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h6475f26_2 - - memory-allocator=0.1.3=py310hb299538_0 - - metis=5.1.0=h2f0025b_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=hf4c8f4c_0 + - maxima=5.47.0=h043f013_3 + - memory-allocator=0.1.3=py310ha766c32_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h783934e_1 - mpfi=1.5.4=h846f343_1001 - - mpfr=4.2.1=ha2d0fc4_1 + - mpfr=4.2.1=h2305555_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 + - mysql-common=9.0.1=h3f5c77f_2 + - mysql-libs=9.0.1=h11569fd_2 - nauty=2.8.8=h31becfc_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h0425590_0 + - ncurses=6.5=hcccb83c_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h70be974_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=h0d7519b_1 - numpy=1.26.4=py310hcbab775_0 - - openblas=0.3.25=pthreads_h339cbfa_0 - - openjdk=22.0.1=h3d4cd67_0 + - openblas=0.3.28=pthreads_h3a8cbd8_1 - openjpeg=2.5.2=h0d9d63b_0 - - openssl=3.3.1=h68df207_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openldap=2.6.9=h30c48ee_0 + - openssl=3.4.0=h86ecc28_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=hb9de7d4_0 - - pandoc=3.2.1=h8af1aa0_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h399c48b_0 - pari=2.15.5=h169c2a7_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=hf897c2e_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h070dd5b_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=h070dd5b_2 - perl=5.32.1=7_h31becfc_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310h611336f_1 - - pip=24.0=pyhd8ed1ab_0 + - pillow=11.0.0=py310h825f53c_0 + - pip=24.3.1=pyh8b19718_0 - pixman=0.43.4=h2f0025b_0 - - pkg-config=0.29.2=hb9de7d4_1008 + - pkg-config=0.29.2=hce167ba_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h31becfc_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h984aac9_1006 - pplpy=0.8.9=py310h6665419_1 - primecount=7.9=hd600fc2_0 - primecountpy=0.1.0=py310h586407a_4 - primesieve=11.1=h2f0025b_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310hb52b2da_0 - - pthread-stubs=0.4=hb9de7d4_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py310ha766c32_0 + - pthread-stubs=0.4=h86ecc28_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310h586407a_0 - - pybind11-global=2.12.0=py310h586407a_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py310h7c1f4a2_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 + - pyside6=6.8.0.2=py310hee8ad4f_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.10.14=hbbe8eec_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310hbb3657e_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310h5e48e15_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310h4c7bcd0_4 - - pyyaml=6.0.1=py310hb299538_1 - - pyzmq=26.0.3=py310he875deb_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.10.15=hbf90c55_2_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py310he30c3ed_7 + - python_abi=3.10=5_cp310 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py310h55e1596_3 - qd=2.3.22=h05efe27_1004 - - qhull=2020.2=hd62202e_2 - - r-base=4.3.3=h7f20121_3 - - r-lattice=0.22_6=r43h25e906a_0 + - qhull=2020.2=h70be974_5 + - qt6-main=6.8.0=h666f7c6_0 - readline=8.2=h8fc344f_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h31becfc_0 - - rpds-py=0.18.1=py310h59d1b7a_0 - - rpy2=3.5.11=py310r43h8b6b5fc_3 - rw=0.9=h31becfc_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.3=py310hcbab775_1 - - sed=4.8=ha0d5d3d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hbe76a8a_1 + - scipy=1.14.1=py310h317fb5c_1 + - setuptools=75.6.0=pyhff2d567_1 + - singular=4.4.0=h9a92511_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=hdc7ab3c_0 + - sqlite=3.47.0=h578a6b9_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=h3944111_1 - symmetrica=3.0.1=hd600fc2_0 - sympow=2.023.6=h157afb5_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-aarch64=2.17=h5b4a56d_14 + - sympy=1.13.3=pyh2585a3b_104 + - sysroot_linux-aarch64=2.17=h5b4a56d_18 - tachyon=0.99b6=ha0bfc61_1002 - - tar=1.34=h048efde_0 - - tbb=2021.12.0=h70be974_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h17f021e_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - tk=8.6.13=h194ca79_0 - - tktable=2.10=h52f7bd3_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310h03727f4_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py310h78583b1_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310h4c7bcd0_0 - - unicodedata2=15.1.0=py310hb299538_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py310ha766c32_1 + - urllib3=2.2.3=pyhd8ed1ab_0 + - wayland=1.23.1=h698ed42_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-fixesproto=5.0=h3557bc0_1002 - - xorg-inputproto=2.3.2=h3557bc0_1002 - - xorg-kbproto=1.0.7=h3557bc0_1002 - - xorg-libice=1.1.1=h7935292_0 - - xorg-libsm=1.2.4=h5a01bc2_0 - - xorg-libx11=1.8.9=h08be655_1 - - xorg-libxau=1.0.11=h31becfc_0 - - xorg-libxdmcp=1.1.3=h3557bc0_0 - - xorg-libxext=1.3.4=h2a766a3_2 - - xorg-libxfixes=5.0.3=h3557bc0_1004 - - xorg-libxi=1.7.10=h3557bc0_0 - - xorg-libxrender=0.9.11=h7935292_0 - - xorg-libxt=1.3.0=h7935292_1 - - xorg-libxtst=1.2.3=hf897c2e_1002 - - xorg-recordproto=1.14.2=hf897c2e_1002 - - xorg-renderproto=0.11.1=h3557bc0_1002 - - xorg-xextproto=7.3.0=h2a766a3_1003 - - xorg-xproto=7.0.31=h3557bc0_1007 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xcb-util=0.4.1=h5c728e9_2 + - xcb-util-cursor=0.1.5=h86ecc28_0 + - xcb-util-image=0.4.0=h5c728e9_2 + - xcb-util-keysyms=0.4.1=h5c728e9_0 + - xcb-util-renderutil=0.3.10=h5c728e9_0 + - xcb-util-wm=0.4.2=h5c728e9_0 + - xkeyboard-config=2.43=h86ecc28_0 + - xorg-libice=1.1.1=h57736b2_1 + - xorg-libsm=1.2.4=hbac51e1_1 + - xorg-libx11=1.8.9=he755bbd_2 + - xorg-libxau=1.0.11=h86ecc28_1 + - xorg-libxcomposite=0.4.6=h86ecc28_2 + - xorg-libxcursor=1.2.3=h86ecc28_0 + - xorg-libxdamage=1.1.6=h86ecc28_0 + - xorg-libxdmcp=1.1.5=h57736b2_0 + - xorg-libxext=1.3.6=h57736b2_0 + - xorg-libxfixes=6.0.1=h57736b2_0 + - xorg-libxi=1.8.2=h57736b2_0 + - xorg-libxrandr=1.5.4=h86ecc28_0 + - xorg-libxrender=0.9.11=h57736b2_1 + - xorg-libxtst=1.2.5=h57736b2_3 + - xorg-libxxf86vm=1.1.5=h57736b2_4 + - xorg-xorgproto=2024.1=h86ecc28_1 - xz=5.2.6=h9cdd2b7_0 - - yaml=0.2.5=hf897c2e_2 - - zeromq=4.3.5=h28faeed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h68df207_1 + - zeromq=4.3.5=h5efb499_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=h86ecc28_2 + - zstandard=0.23.0=py310h6a57b22_1 - zstd=1.5.6=h02f22dd_0 diff --git a/environment-3.10-linux.yml b/environment-3.10-linux.yml index b764f92d2d7..2a6bea964fd 100644 --- a/environment-3.10-linux.yml +++ b/environment-3.10-linux.yml @@ -1,484 +1,336 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: linux-64 -# input_hash: 5dc443f6ceb3674d099e0ec613ba37acf67d72b0b26699816fc7afb3c9523b1f +# input_hash: 03730b69363db4869061e8fcbd2108c24d97003d10dd9719ff461b66cc7d1046 channels: - conda-forge dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.12=h4ab18f5_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310h2372a71_4 + - alabaster=1.0.0=pyhd8ed1ab_0 + - alsa-lib=1.2.13=hb9d3cd8_0 - arpack=3.9.1=nompi_h77f6705_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h166bdaf_1 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321h2b4cb7a_1 - - automake=1.16.5=pl5321ha770c72_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h7f98852_0 + - automake=1.17=pl5321ha770c72_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=h4bd325d_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=h4852527_7 - - binutils_impl_linux-64=2.40=ha1999f0_7 - - binutils_linux-64=2.40=hb3c18ed_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linux64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h44aadfe_2 + - binutils=2.43=h4852527_2 + - binutils_impl_linux-64=2.43=h4bf12b8_2 + - binutils_linux-64=2.43=h4852527_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_linux64_openblas + - boost-cpp=1.85.0=h3c6214e_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hd590300_1 - - brotli-bin=1.1.0=hd590300_1 - - brotli-python=1.1.0=py310hc6cd4ac_1 - - bwidget=1.9.14=ha770c72_1 - - bzip2=1.0.8=hd590300_5 - - c-ares=1.28.1=hd590300_0 - - c-compiler=1.7.0=hd590300_1 - - ca-certificates=2024.6.2=hbcca054_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=hbb29018_2 + - brotli=1.1.0=hb9d3cd8_2 + - brotli-bin=1.1.0=hb9d3cd8_2 + - brotli-python=1.1.0=py310hf71b8c6_2 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.3=hb9d3cd8_1 + - c-compiler=1.8.0=h2b85faf_1 + - ca-certificates=2024.8.30=hbcca054_0 + - cairo=1.18.0=hebfffa5_3 - cddlib=1!0.94m=h9202a9a_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310h2fee648_0 - - chardet=5.2.0=py310hff52083_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py310h8deb56e_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 - cliquer=1.22=hd590300_1 - - cmake=3.29.6=hcafd917_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310hff52083_0 - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=ha770c72_1 - - contourpy=1.2.1=py310hd41b1e2_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=he654da7_0 - - cvxopt=1.3.2=py310h7b0674a_2 - - cxx-compiler=1.7.0=h00ab1b0_1 + - contourpy=1.3.1=py310h3788b33_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py310h89163eb_0 + - cpython=3.10.15=py310hd8ed1ab_2 + - cxx-compiler=1.8.0=h1a2810e_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py310h14ed79e_0 + - cyrus-sasl=2.1.27=h54b06d7_7 - cysignals=1.11.2=py310h945e7c7_3 - - cython=3.0.10=py310hc6cd4ac_0 + - cython=3.0.11=py310h5b1441d_3 - dbus=1.13.6=h5008d03_3 - - debugpy=1.8.1=py310hc6cd4ac_0 + - debugpy=1.8.9=py310hf71b8c6_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hd9d9efa_1203 - - ecl=23.9.9=hed6455c_0 + - double-conversion=3.3.0=h59595ed_0 + - ecl=24.5.10=h0f3afd4_0 - eclib=20231212=h96f522a_0 - ecm=7.0.5=h9458935_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h59595ed_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h5888daf_0 - fflas-ffpack=2.5.0=h4f9960b_0 - - fftw=3.3.10=nompi_hf1063bd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h14ed4e7_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h7e30c49_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310hc51659f_0 - - fortran-compiler=1.7.0=heb67821_1 + - fonttools=4.55.0=py310h89163eb_0 + - fortran-compiler=1.8.0=h36df796_1 - fplll=5.4.5=h384768b_0 - fpylll=0.6.1=py310h7e26f94_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=h267a509_2 - - fribidi=1.0.10=h36c2ea0_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he9a28a4_3 - - gap-defaults=4.12.2=ha770c72_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=h915e2ae_13 - - gcc_impl_linux-64=12.3.0=h58ffeeb_13 - - gcc_linux-64=12.3.0=h9528a6a_9 - - gengetopt=2.23=h9c3ff4c_0 - - gettext=0.22.5=h59595ed_2 - - gettext-tools=0.22.5=h59595ed_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h94f18e1_0 + - gap-defaults=4.13.1=ha770c72_0 + - gcc=13.3.0=h9576a4e_1 + - gcc_impl_linux-64=13.3.0=hfea6d02_1 + - gcc_linux-64=13.3.0=hc28eda2_7 - gf2x=1.3.0=ha476b99_2 - gfan=0.6.2=hb86e20a_1003 - - gfortran=12.3.0=h915e2ae_13 - - gfortran_impl_linux-64=12.3.0=h8f2110c_13 - - gfortran_linux-64=12.3.0=h5877db1_9 + - gfortran=13.3.0=h9576a4e_1 + - gfortran_impl_linux-64=13.3.0=h10434e7_1 + - gfortran_linux-64=13.3.0=hb919d3a_7 - giac=1.9.0.21=h673759e_1 - - giflib=5.2.2=hd590300_0 - givaro=4.2.0=hb789bce_0 - - glib=2.80.2=h8a4344b_1 - - glib-tools=2.80.2=h73ef956_1 - glpk=5.0=h445213a_0 - gmp=6.3.0=hac33072_2 - - gmpy2=2.1.5=py310hc7909c9_1 + - gmpy2=2.1.5=py310he8512ff_2 - graphite2=1.3.13=h59595ed_1003 - gsl=2.7=he838d99_0 - - gst-plugins-base=1.24.5=hbaaba92_0 - - gstreamer=1.24.5=haf2f30d_0 - - gxx=12.3.0=h915e2ae_13 - - gxx_impl_linux-64=12.3.0=h2a574ab_13 - - gxx_linux-64=12.3.0=ha28b414_9 - - h11=0.14.0=pyhd8ed1ab_0 + - gxx=13.3.0=h9576a4e_1 + - gxx_impl_linux-64=13.3.0=hdbfa832_1 + - gxx_linux-64=13.3.0=h6834431_7 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=hfac3d4d_0 - - hatchling=1.25.0=pyhd8ed1ab_0 + - harfbuzz=9.0.0=hda332d3_1 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h59595ed_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hef0740d_1 + - icu=75.1=he02047a_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=he44f51b_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h623f65a_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh3099207_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=ha770c72_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310hff52083_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310hff52083_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-64=2.6.32=he073ed8_17 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kernel-headers_linux-64=3.10.0=he073ed8_18 - keyutils=1.6.1=h166bdaf_0 - - kiwisolver=1.4.5=py310hd41b1e2_1 - - krb5=1.21.2=h659d440_0 - - lame=3.100=h166bdaf_1003 + - kiwisolver=1.4.7=py310h3788b33_0 + - krb5=1.21.3=h659f571_0 - lcalc=2.0.5=h5aac1b6_2 - lcms2=2.16=hb7c19ff_0 - - ld_impl_linux-64=2.40=hf3520f5_7 + - ld_impl_linux-64=2.43=h712a8e2_2 - lerc=4.0.0=h27087fc_0 - - libasprintf=0.22.5=h661eb56_2 - - libasprintf-devel=0.22.5=h661eb56_2 - - libatomic_ops=7.6.14=h166bdaf_0 - - libblas=3.9.0=20_linux64_openblas - - libboost=1.85.0=hba137d9_2 - - libboost-devel=1.85.0=h00ab1b0_2 - - libboost-headers=1.85.0=ha770c72_2 - - libbraiding=1.2=hcb278e6_0 + - libblas=3.9.0=25_linux64_openblas + - libboost=1.85.0=h0ccab89_4 + - libboost-devel=1.85.0=h00ab1b0_4 + - libboost-headers=1.85.0=ha770c72_4 + - libbraiding=1.3=h5888daf_0 - libbrial=1.2.12=h76af697_3 - - libbrotlicommon=1.1.0=hd590300_1 - - libbrotlidec=1.1.0=hd590300_1 - - libbrotlienc=1.1.0=hd590300_1 - - libcap=2.69=h0f662aa_0 - - libcblas=3.9.0=20_linux64_openblas - - libclang-cpp15=15.0.7=default_h127d8a8_5 - - libclang13=18.1.8=default_h6ae225f_0 + - libbrotlicommon=1.1.0=hb9d3cd8_2 + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=25_linux64_openblas + - libclang-cpp19.1=19.1.4=default_hb5137d0_0 + - libclang13=19.1.4=default_h9c6a7e4_0 - libcups=2.3.3=h4637d8d_4 - - libcurl=8.8.0=hca28451_0 - - libdeflate=1.20=hd590300_0 + - libcurl=8.10.1=hbbe4b11_0 + - libdeflate=1.22=hb9d3cd8_0 + - libdrm=2.4.123=hb9d3cd8_0 - libedit=3.1.20191231=he28a2e2_2 + - libegl=1.7.0=ha4b6fd6_2 - libev=4.33=hd590300_2 - - libevent=2.1.12=hf998b51_1 - - libexpat=2.6.2=h59595ed_0 + - libexpat=2.6.4=h5888daf_0 - libffi=3.4.2=h7f98852_5 - - libflac=1.4.3=h59595ed_0 - - libflint=3.0.1=h5f2e117_ntl_100 - - libgcc-devel_linux-64=12.3.0=h6b66f73_113 - - libgcc-ng=13.2.0=h77fa898_13 - - libgcrypt=1.10.3=hd590300_0 - - libgd=2.3.3=h119a65a_9 - - libgettextpo=0.22.5=h59595ed_2 - - libgettextpo-devel=0.22.5=h59595ed_2 - - libgfortran-ng=13.2.0=h69a702a_13 - - libgfortran5=13.2.0=h3d2ce59_13 - - libglib=2.80.2=h8a4344b_1 - - libgomp=13.2.0=h77fa898_13 - - libgpg-error=1.49=h4f305b6_0 + - libflint=3.0.1=h6fb9888_103 + - libgcc=14.2.0=h77fa898_1 + - libgcc-devel_linux-64=13.3.0=h84ea5a7_101 + - libgcc-ng=14.2.0=h69a702a_1 + - libgd=2.3.3=hd3e95f3_10 + - libgfortran=14.2.0=h69a702a_1 + - libgfortran-ng=14.2.0=h69a702a_1 + - libgfortran5=14.2.0=hd5240d6_1 + - libgl=1.7.0=ha4b6fd6_2 + - libglib=2.82.2=h2ff4ddf_0 + - libglvnd=1.7.0=ha4b6fd6_2 + - libglx=1.7.0=ha4b6fd6_2 + - libgomp=14.2.0=h77fa898_1 - libhomfly=1.02r6=hd590300_1 - - libhwloc=2.10.0=default_h5622ce7_1001 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_openblas - - liblapacke=3.9.0=20_linux64_openblas - - libllvm15=15.0.7=hb3ce162_4 - - libllvm18=18.1.8=hc9dba70_0 - - libnghttp2=1.58.0=h47da74e_1 + - liblapack=3.9.0=25_linux64_openblas + - liblapacke=3.9.0=25_linux64_openblas + - libllvm19=19.1.4=ha7bfdaf_1 + - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - - libogg=1.3.5=h4ab18f5_0 - - libopenblas=0.3.25=pthreads_h413a1c8_0 - - libopus=1.3.1=h7f98852_1 - - libpng=1.6.43=h2797004_0 - - libpq=16.3=ha72fbe1_0 - - libsanitizer=12.3.0=hb8811af_13 - - libsndfile=1.2.2=hc60ed4a_1 - - libsodium=1.0.18=h36c2ea0_1 - - libsqlite=3.46.0=hde9e2c9_0 - - libssh2=1.11.0=h0841786_0 - - libstdcxx-devel_linux-64=12.3.0=h6b66f73_113 - - libstdcxx-ng=13.2.0=hc0a3c3a_13 - - libsystemd0=255=h3516f8a_1 - - libtiff=4.6.0=h1dd3fc0_3 - - libtool=2.4.7=h27087fc_0 + - libntlm=1.4=h7f98852_1002 + - libopenblas=0.3.28=pthreads_h94d23a6_1 + - libopengl=1.7.0=ha4b6fd6_2 + - libpciaccess=0.18=hd590300_0 + - libpng=1.6.44=hadc24fc_0 + - libpq=17.2=h04577a9_0 + - libsanitizer=13.3.0=heb74ff8_1 + - libsodium=1.0.20=h4ab18f5_0 + - libsqlite=3.47.0=hadc24fc_1 + - libssh2=1.11.1=hf672d98_0 + - libstdcxx=14.2.0=hc0a3c3a_1 + - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101 + - libstdcxx-ng=14.2.0=h4852527_1 + - libtiff=4.7.0=he137b08_1 - libuuid=2.38.1=h0b41bf4_0 - - libuv=1.48.0=hd590300_0 - - libvorbis=1.3.7=h9c3ff4c_0 - - libwebp=1.4.0=h2c329e2_0 - libwebp-base=1.4.0=hd590300_0 - - libxcb=1.16=hd590300_0 + - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - libxkbcommon=1.7.0=h2c5496b_1 - - libxml2=2.12.7=hc051c1a_1 - - libzlib=1.3.1=h4ab18f5_1 + - libxml2=2.13.5=hb346dea_0 + - libxslt=1.1.39=h76b75d6_0 + - libzlib=1.3.1=hb9d3cd8_2 - linbox=1.7.0=ha329b40_0 - - llvm-openmp=18.1.8=hf5423f3_0 - - lrcalc=2.1=h59595ed_6 - - lz4-c=1.9.4=hcb278e6_0 + - llvm-openmp=19.1.4=h024ca30_0 + - lrcalc=2.1=h5888daf_7 - m4=1.4.18=h516909a_1001 - m4ri=20140914=hae5d5c5_1006 - m4rie=20150908=h267a509_1002 - - make=4.3=hd18ef5c_1 - - markupsafe=2.1.5=py310h2372a71_0 - - mathjax=3.2.2=ha770c72_0 - - matplotlib=3.8.4=py310hff52083_2 - - matplotlib-base=3.8.4=py310hef631a5_2 + - markupsafe=3.0.2=py310h89163eb_0 + - matplotlib=3.9.2=py310hff52083_2 + - matplotlib-base=3.9.2=py310h68603db_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=hed6455c_2 - - memory-allocator=0.1.3=py310h2372a71_0 - - metis=5.1.0=h59595ed_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=hfe3b2da_0 + - maxima=5.47.0=h75482ee_3 + - memory-allocator=0.1.3=py310ha75aee5_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h24ddda3_1 - mpfi=1.5.4=h9f54685_1001 - - mpfr=4.2.1=h9458935_1 - - mpg123=1.32.6=h59595ed_0 + - mpfr=4.2.1=h90cbb55_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - - mysql-common=8.3.0=hf1915f5_4 - - mysql-libs=8.3.0=hca2cd23_4 + - mysql-common=9.0.1=h266115a_2 + - mysql-libs=9.0.1=he0572af_2 - nauty=2.8.8=hd590300_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h59595ed_0 + - ncurses=6.5=he02047a_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h297d8ca_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - nspr=4.35=h27087fc_0 - - nss=3.101=h593d115_0 - ntl=11.4.3=hef3c4d3_1 - numpy=1.26.4=py310hb13e2d6_0 - - openblas=0.3.25=pthreads_h7a3da1a_0 - - openjdk=21.0.2=haa376d0_0 + - openblas=0.3.28=pthreads_h6ec200e_1 - openjpeg=2.5.2=h488ebb8_0 - - openssl=3.3.1=h4ab18f5_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openldap=2.6.9=he970967_0 + - openssl=3.4.0=hb9d3cd8_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=h36c2ea0_0 - - pandoc=3.2.1=ha770c72_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h84a9a3c_0 - pari=2.15.5=h4d4ae9b_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=h7f98852_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h0f59acf_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=hba22ea6_2 - perl=5.32.1=7_hd590300_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310hebfe307_1 - - pip=24.0=pyhd8ed1ab_0 + - pillow=11.0.0=py310hfeaa1f3_0 + - pip=24.3.1=pyh8b19718_0 - pixman=0.43.2=h59595ed_0 - - pkg-config=0.29.2=h36c2ea0_1008 + - pkg-config=0.29.2=h4bc722e_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=hd590300_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h6ec01c2_1006 - pplpy=0.8.9=py310h18554fa_1 - primecount=7.9=hcb278e6_0 - primecountpy=0.1.0=py310hd41b1e2_4 - primesieve=11.1=h59595ed_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310hc51659f_0 - - pthread-stubs=0.4=h36c2ea0_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py310ha75aee5_0 + - pthread-stubs=0.4=hb9d3cd8_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pulseaudio-client=17.0=hb77b528_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310hd41b1e2_0 - - pybind11-global=2.12.0=py310hd41b1e2_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyqt=5.15.9=py310h04931ad_5 - - pyqt5-sip=12.12.2=py310hc6cd4ac_5 - - pyrsistent=0.20.0=py310h2372a71_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 + - pyside6=6.8.0.2=py310hfd10a26_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.10.14=hd12c33a_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310hc6cd4ac_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310hcb52e73_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310hff52083_4 - - pyyaml=6.0.1=py310h2372a71_1 - - pyzmq=26.0.3=py310h6883aea_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.10.15=h4a871b0_2_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py310hf71b8c6_7 + - python_abi=3.10=5_cp310 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py310h71f11fc_3 - qd=2.3.22=h2cc385e_1004 - - qhull=2020.2=h4bd325d_2 - - qt-main=5.15.8=ha2b5568_22 - - r-base=4.3.3=he2d9a6e_3 - - r-lattice=0.22_6=r43h57805ef_0 + - qhull=2020.2=h434a139_5 + - qt6-main=6.8.0=h6e8976b_0 - readline=8.2=h8228510_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hd590300_0 - - rpds-py=0.18.1=py310he421c4c_0 - - rpy2=3.5.11=py310r43h1f7b6fc_3 - rw=0.9=hd590300_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py310hb13e2d6_0 - - sed=4.8=he412f7d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h33f5c3f_1 - - sip=6.7.12=py310hc6cd4ac_0 + - scipy=1.14.1=py310hfcf56fc_1 + - setuptools=75.6.0=pyhff2d567_1 + - singular=4.4.0=h8a38e62_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h6d4b2fc_0 + - sqlite=3.47.0=h9eae976_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf4753ba_1 - symmetrica=3.0.1=hcb278e6_0 - sympow=2.023.6=hc6ab17c_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-64=2.12=he073ed8_17 + - sympy=1.13.3=pyh2585a3b_104 + - sysroot_linux-64=2.17=h4a8ded7_18 - tachyon=0.99b6=hba7d16a_1002 - - tar=1.34=hb2e2bae_1 - - tbb=2021.12.0=h297d8ca_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h0f457ee_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - tk=8.6.13=noxft_h4845f30_101 - - tktable=2.10=h8bc8fbc_6 - - toml=0.10.2=pyhd8ed1ab_0 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310hc51659f_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py310ha75aee5_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310hff52083_0 - - unicodedata2=15.1.0=py310h2372a71_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py310ha75aee5_1 + - urllib3=2.2.3=pyhd8ed1ab_0 + - wayland=1.23.1=h3e06ad9_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 - xcb-util=0.4.1=hb711507_2 + - xcb-util-cursor=0.1.5=hb9d3cd8_0 - xcb-util-image=0.4.0=hb711507_2 - xcb-util-keysyms=0.4.1=hb711507_0 - xcb-util-renderutil=0.3.10=hb711507_0 - xcb-util-wm=0.4.2=hb711507_0 - - xkeyboard-config=2.42=h4ab18f5_0 - - xorg-fixesproto=5.0=h7f98852_1002 - - xorg-inputproto=2.3.2=h7f98852_1002 - - xorg-kbproto=1.0.7=h7f98852_1002 - - xorg-libice=1.1.1=hd590300_0 - - xorg-libsm=1.2.4=h7391055_0 - - xorg-libx11=1.8.9=hb711507_1 - - xorg-libxau=1.0.11=hd590300_0 - - xorg-libxdmcp=1.1.3=h7f98852_0 - - xorg-libxext=1.3.4=h0b41bf4_2 - - xorg-libxfixes=5.0.3=h7f98852_1004 - - xorg-libxi=1.7.10=h7f98852_0 - - xorg-libxrender=0.9.11=hd590300_0 - - xorg-libxt=1.3.0=hd590300_1 - - xorg-libxtst=1.2.3=h7f98852_1002 - - xorg-recordproto=1.14.2=h7f98852_1002 - - xorg-renderproto=0.11.1=h7f98852_1002 - - xorg-xextproto=7.3.0=h0b41bf4_1003 - - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - - xorg-xproto=7.0.31=h7f98852_1007 + - xkeyboard-config=2.43=hb9d3cd8_0 + - xorg-libice=1.1.1=hb9d3cd8_1 + - xorg-libsm=1.2.4=he73a12e_1 + - xorg-libx11=1.8.10=h4f16b4b_0 + - xorg-libxau=1.0.11=hb9d3cd8_1 + - xorg-libxcomposite=0.4.6=hb9d3cd8_2 + - xorg-libxcursor=1.2.3=hb9d3cd8_0 + - xorg-libxdamage=1.1.6=hb9d3cd8_0 + - xorg-libxdmcp=1.1.5=hb9d3cd8_0 + - xorg-libxext=1.3.6=hb9d3cd8_0 + - xorg-libxfixes=6.0.1=hb9d3cd8_0 + - xorg-libxi=1.8.2=hb9d3cd8_0 + - xorg-libxrandr=1.5.4=hb9d3cd8_0 + - xorg-libxrender=0.9.11=hb9d3cd8_1 + - xorg-libxtst=1.2.5=hb9d3cd8_3 + - xorg-libxxf86vm=1.1.5=hb9d3cd8_4 + - xorg-xorgproto=2024.1=hb9d3cd8_1 - xz=5.2.6=h166bdaf_0 - - yaml=0.2.5=h7f98852_2 - - zeromq=4.3.5=h75354e8_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h4ab18f5_1 + - zeromq=4.3.5=h3b0a872_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=hb9d3cd8_2 + - zstandard=0.23.0=py310ha39cb0e_1 - zstd=1.5.6=ha6fb4c9_0 diff --git a/environment-3.10-macos-x86_64.yml b/environment-3.10-macos-x86_64.yml index ebac3ba4872..11b09eca6d1 100644 --- a/environment-3.10-macos-x86_64.yml +++ b/environment-3.10-macos-x86_64.yml @@ -1,424 +1,288 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: osx-64 -# input_hash: 831a1103cbcd8c06cbae982446953e3de30517fdd302ac5aa70454b8d19f63d9 +# input_hash: 547d430073dcad6960849dd76e5cedcc0a4840137033d18ceaa468c8e61b5642 channels: - conda-forge dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 + - alabaster=1.0.0=pyhd8ed1ab_0 - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310h6729b98_4 - arpack=3.9.1=nompi_hf81eadf_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321hed12c24_1 - - automake=1.16.5=pl5321h694c41f_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h0d85af4_0 + - automake=1.17=pl5321h694c41f_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=h940c156_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osx64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h07eb623_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_osx64_openblas + - boost-cpp=1.85.0=hfcd56d9_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h0dc2134_1 - - brotli-bin=1.1.0=h0dc2134_1 - - brotli-python=1.1.0=py310h9e9d8ca_1 - - bwidget=1.9.14=h694c41f_1 - - bzip2=1.0.8=h10d778d_5 - - c-ares=1.28.1=h10d778d_0 - - c-compiler=1.7.0=h282daa2_1 - - ca-certificates=2024.6.2=h8857fd0_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=h9f650ed_2 - - cctools=986=h40f6528_0 - - cctools_osx-64=986=ha1c5b94_0 + - brotli=1.1.0=h00291cd_2 + - brotli-bin=1.1.0=h00291cd_2 + - brotli-python=1.1.0=py310h53e7c6a_2 + - bzip2=1.0.8=hfdf4475_7 + - c-ares=1.34.3=hf13058a_1 + - c-compiler=1.8.0=hfc4bf79_1 + - ca-certificates=2024.8.30=h8857fd0_0 + - cctools=1010.6=h5b2de21_2 + - cctools_osx-64=1010.6=hea4301f_2 - cddlib=1!0.94m=h0f52abe_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310hdca579f_0 - - chardet=5.2.0=py310h2ec42d9_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_ha3b9224_8 - - clang-16=16.0.6=default_h4c8afb6_8 - - clang_impl_osx-64=16.0.6=h8787910_16 - - clang_osx-64=16.0.6=hb91bd55_16 - - clangxx=16.0.6=default_ha3b9224_8 - - clangxx_impl_osx-64=16.0.6=h6d92fbe_16 - - clangxx_osx-64=16.0.6=hb91bd55_16 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py310hfce808e_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 + - clang=17.0.6=default_he371ed4_7 + - clang-17=17.0.6=default_hb173f14_7 + - clang_impl_osx-64=17.0.6=h1af8efd_23 + - clang_osx-64=17.0.6=h7e5c614_23 + - clangxx=17.0.6=default_he371ed4_7 + - clangxx_impl_osx-64=17.0.6=hc3430b7_23 + - clangxx_osx-64=17.0.6=h7e5c614_23 - cliquer=1.22=h10d778d_1 - - cmake=3.29.6=h749d262_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310h2ec42d9_0 - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=ha38d28d_2 - - compiler-rt_osx-64=16.0.6=ha38d28d_2 - - compilers=1.7.0=h694c41f_1 - - contourpy=1.2.1=py310hb3b189b_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=hea67d85_0 - - cvxopt=1.3.2=py310h1fac3e1_2 - - cxx-compiler=1.7.0=h7728843_1 + - compiler-rt=17.0.6=h1020d70_2 + - compiler-rt_osx-64=17.0.6=hf2b8a54_2 + - contourpy=1.3.1=py310hf166250_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py310h8e2f543_0 + - cpython=3.10.15=py310hd8ed1ab_2 + - cxx-compiler=1.8.0=h385f146_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py310hc7df965_0 - cysignals=1.11.2=py310h8c82e65_3 - - cython=3.0.10=py310h5daac23_0 - - debugpy=1.8.1=py310h5daac23_0 + - cython=3.0.11=py310h62447e2_3 + - debugpy=1.8.9=py310h6954a95_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h6e329d1_1203 - - ecl=23.9.9=h2b27fa8_0 + - ecl=24.5.10=h56bac16_0 - eclib=20231212=h02435c3_0 - ecm=7.0.5=h4f6b447_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h73e2aa4_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h240833e_0 - fflas-ffpack=2.5.0=h5898d61_0 - - fftw=3.3.10=nompi_h292e606_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h5bb23bf_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h37eeddb_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310h936d840_0 - - fortran-compiler=1.7.0=h6c2ab21_1 + - fonttools=4.55.0=py310h8e2f543_0 + - fortran-compiler=1.8.0=h33d1f46_1 - fplll=5.4.5=hb7981ad_0 - fpylll=0.6.1=py310h65a3d7e_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=h60636b9_2 - - fribidi=1.0.10=hbcb3906_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=hc16eb5f_3 - - gap-defaults=4.12.2=h694c41f_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=he49afe7_0 - - gettext=0.22.5=h5ff76d1_2 - - gettext-tools=0.22.5=h5ff76d1_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h2299be9_0 + - gap-defaults=4.13.1=h694c41f_0 + - gettext=0.22.5=hdfe23c8_3 + - gettext-tools=0.22.5=hdfe23c8_3 - gf2x=1.3.0=hb2a7efb_2 - gfan=0.6.2=hd793b56_1003 - - gfortran=12.3.0=h2c809b3_1 - - gfortran_impl_osx-64=12.3.0=hc328e78_3 - - gfortran_osx-64=12.3.0=h18f7dce_1 + - gfortran=13.2.0=h2c809b3_1 + - gfortran_impl_osx-64=13.2.0=h2bc304d_3 + - gfortran_osx-64=13.2.0=h18f7dce_1 - giac=1.9.0.21=h92f3f65_1 - - giflib=5.2.2=h10d778d_0 - givaro=4.2.0=h1b3d6f7_0 - glpk=5.0=h3cb5acd_0 - gmp=6.3.0=hf036a51_2 - - gmpy2=2.1.5=py310h0310db1_1 - - graphite2=1.3.13=h73e2aa4_1003 + - gmpy2=2.1.5=py310hade44e5_2 - gsl=2.7=h93259b0_0 - - h11=0.14.0=pyhd8ed1ab_0 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h053f038_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hf5e326d_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hde4452d_1 + - icu=75.1=h120a0e1_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h5479cbe_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h61918c1_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh57ce528_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 - isl=0.26=imath32_h2e86a7b_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.9=h694c41f_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310h2ec42d9_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310h2ec42d9_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kiwisolver=1.4.5=py310h88cfcbd_1 - - krb5=1.21.2=hb884880_0 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kiwisolver=1.4.7=py310hfa8da69_0 + - krb5=1.21.3=h37d8d59_0 - lcalc=2.0.5=h547a6ed_2 - lcms2=2.16=ha2f27b4_0 - - ld64=711=ha02d983_0 - - ld64_osx-64=711=ha20a434_0 + - ld64=951.9=h0a3eb4e_2 + - ld64_osx-64=951.9=h5ffbe8e_2 - lerc=4.0.0=hb486fe8_0 - - libasprintf=0.22.5=h5ff76d1_2 - - libasprintf-devel=0.22.5=h5ff76d1_2 - - libatomic_ops=7.6.14=hb7f2c08_0 - - libblas=3.9.0=20_osx64_openblas - - libboost=1.85.0=h739af76_2 - - libboost-devel=1.85.0=h2b186f8_2 - - libboost-headers=1.85.0=h694c41f_2 - - libbraiding=1.2=hf0c8a7f_0 + - libasprintf=0.22.5=hdfe23c8_3 + - libasprintf-devel=0.22.5=hdfe23c8_3 + - libblas=3.9.0=25_osx64_openblas + - libboost=1.85.0=hcca3243_4 + - libboost-devel=1.85.0=h2b186f8_4 + - libboost-headers=1.85.0=h694c41f_4 + - libbraiding=1.3=h240833e_0 - libbrial=1.2.12=h81e9653_3 - - libbrotlicommon=1.1.0=h0dc2134_1 - - libbrotlidec=1.1.0=h0dc2134_1 - - libbrotlienc=1.1.0=h0dc2134_1 - - libcblas=3.9.0=20_osx64_openblas - - libclang-cpp16=16.0.6=default_h4c8afb6_8 - - libcurl=8.8.0=hf9fcc65_0 - - libcxx=17.0.6=h88467a6_0 - - libdeflate=1.20=h49d49c5_0 + - libbrotlicommon=1.1.0=h00291cd_2 + - libbrotlidec=1.1.0=h00291cd_2 + - libbrotlienc=1.1.0=h00291cd_2 + - libcblas=3.9.0=25_osx64_openblas + - libclang-cpp17=17.0.6=default_hb173f14_7 + - libcurl=8.10.1=h58e7537_0 + - libcxx=19.1.4=hf95d169_0 + - libcxx-devel=17.0.6=h8f8a49f_6 + - libdeflate=1.22=h00291cd_0 - libedit=3.1.20191231=h0678c8f_2 - libev=4.33=h10d778d_2 - - libexpat=2.6.2=h73e2aa4_0 + - libexpat=2.6.4=h240833e_0 - libffi=3.4.2=h0d85af4_5 - - libflint=3.0.1=h5d15de0_ntl_100 - - libgd=2.3.3=h0dceb68_9 - - libgettextpo=0.22.5=h5ff76d1_2 - - libgettextpo-devel=0.22.5=h5ff76d1_2 + - libflint=3.0.1=h1d27844_103 + - libgd=2.3.3=h2e77e4f_10 + - libgettextpo=0.22.5=hdfe23c8_3 + - libgettextpo-devel=0.22.5=hdfe23c8_3 - libgfortran=5.0.0=13_2_0_h97931a8_3 - - libgfortran-devel_osx-64=12.3.0=h0b6f5ec_3 + - libgfortran-devel_osx-64=13.2.0=h80d4556_3 - libgfortran5=13.2.0=h2873a65_3 - - libglib=2.80.2=h736d271_1 - libhomfly=1.02r6=h10d778d_1 - - libhwloc=2.10.0=default_h456cccd_1001 - libiconv=1.17=hd75f5a5_2 - - libintl=0.22.5=h5ff76d1_2 - - libintl-devel=0.22.5=h5ff76d1_2 + - libintl=0.22.5=hdfe23c8_3 + - libintl-devel=0.22.5=hdfe23c8_3 - libjpeg-turbo=3.0.0=h0dc2134_1 - - liblapack=3.9.0=20_osx64_openblas - - liblapacke=3.9.0=20_osx64_openblas - - libllvm16=16.0.6=hbedff68_3 - - libnghttp2=1.58.0=h64cf6d3_1 - - libopenblas=0.3.25=openmp_hfef2a42_0 - - libpng=1.6.43=h92b6c6a_0 - - libsodium=1.0.18=hbcb3906_1 - - libsqlite=3.46.0=h1b8f9f3_0 - - libssh2=1.11.0=hd019ec5_0 - - libtiff=4.6.0=h129831d_3 - - libtool=2.4.7=hf0c8a7f_0 - - libuv=1.48.0=h67532ce_0 - - libwebp=1.4.0=hc207709_0 + - liblapack=3.9.0=25_osx64_openblas + - liblapacke=3.9.0=25_osx64_openblas + - libllvm17=17.0.6=hbedff68_1 + - libnghttp2=1.64.0=hc7306c3_0 + - libopenblas=0.3.28=openmp_hbf64a52_1 + - libpng=1.6.44=h4b8f8c9_0 + - libsodium=1.0.20=hfdf4475_0 + - libsqlite=3.47.0=h2f8c449_1 + - libssh2=1.11.1=h3dc7d44_0 + - libtiff=4.7.0=h583c2ba_1 - libwebp-base=1.4.0=h10d778d_0 - - libxcb=1.16=h0dc2134_0 - - libxml2=2.12.7=h3e169fe_1 - - libzlib=1.3.1=h87427d6_1 + - libxcb=1.17.0=hf1f96e2_0 + - libxml2=2.13.5=h495214b_0 + - libzlib=1.3.1=hd23fc13_2 - linbox=1.7.0=h7061c92_0 - - llvm-openmp=18.1.8=h15ab845_0 - - llvm-tools=16.0.6=hbedff68_3 - - lrcalc=2.1=h73e2aa4_6 + - llvm-openmp=19.1.4=ha54dae1_0 + - llvm-tools=17.0.6=hbedff68_1 + - lrcalc=2.1=hac325c4_7 - m4=1.4.18=haf1e3a3_1001 - m4ri=20140914=hd82a5f3_1006 - m4rie=20150908=hc616cfc_1002 - - make=4.3=h22f3db7_1 - - markupsafe=2.1.5=py310hb372a2b_0 - - mathjax=3.2.2=h694c41f_0 - - matplotlib=3.8.4=py310h2ec42d9_2 - - matplotlib-base=3.8.4=py310h7ea1ff3_2 + - markupsafe=3.0.2=py310h72eadd2_0 + - matplotlib=3.9.2=py310h2ec42d9_2 + - matplotlib-base=3.9.2=py310h449bdf7_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2b27fa8_2 - - memory-allocator=0.1.3=py310h6729b98_0 - - metis=5.1.0=he965462_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=h81bd1dd_0 + - maxima=5.47.0=h3080a4d_3 + - memory-allocator=0.1.3=py310h837254d_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h9d8efa1_1 - mpfi=1.5.4=h52b28e3_1001 - - mpfr=4.2.1=h4f6b447_1 + - mpfr=4.2.1=haed47dc_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - nauty=2.8.8=h10d778d_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h5846eda_0 + - ncurses=6.5=hf036a51_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h3c5361c_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=h0ab3c2f_1 - numpy=1.26.4=py310h4bfa8fc_0 - - openblas=0.3.25=openmp_h6794695_0 - - openjdk=22.0.1=h2d185b6_0 + - openblas=0.3.28=openmp_h30af337_1 - openjpeg=2.5.2=h7310d3a_0 - - openssl=3.3.1=h87427d6_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openssl=3.4.0=hd471939_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=hbcb3906_0 - - pandoc=3.2.1=h694c41f_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h880b76c_0 - pari=2.15.5=h7ba67ff_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=hbcf498f_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h7634a1b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - perl=5.32.1=7_h10d778d_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310h2fdc51f_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h73e2aa4_0 - - pkg-config=0.29.2=ha3d46e9_1008 + - pillow=11.0.0=py310h32d1d24_0 + - pip=24.3.1=pyh8b19718_0 + - pkg-config=0.29.2=hf7e621a_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h10d778d_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=ha60d53e_1006 - pplpy=0.8.9=py310hbe8aec3_1 - primecount=7.6=ha894c9a_0 - primecountpy=0.1.0=py310h88cfcbd_4 - primesieve=11.0=hf0c8a7f_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310h936d840_0 - - pthread-stubs=0.4=hc929b4f_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py310hb9d19b6_0 + - pthread-stubs=0.4=h00291cd_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310hb3b189b_0 - - pybind11-global=2.12.0=py310hb3b189b_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py310h445dc1f_0 - - pyobjc-framework-cocoa=10.3.1=py310h445dc1f_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py310hb372a2b_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.10.14=h00d2728_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310h5daac23_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310h076e4b7_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310h2ec42d9_4 - - pyyaml=6.0.1=py310h6729b98_1 - - pyzmq=26.0.3=py310he0bbd50_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.10.15=hd8744da_2_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py310h53e7c6a_7 + - python_abi=3.10=5_cp310 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py310h0c870a2_3 - qd=2.3.22=h2beb688_1004 - - qhull=2020.2=h940c156_2 - - r-base=4.3.3=h4648a1f_3 - - r-lattice=0.22_6=r43hb2c329c_0 + - qhull=2020.2=h3c5361c_5 - readline=8.2=h9e318b2_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h0dc2134_0 - - rpds-py=0.18.1=py310h12a1ced_0 - - rpy2=3.5.11=py310r43hf0b6da5_3 - rw=0.9=h10d778d_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py310h3f1db6d_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 + - scipy=1.14.1=py310h9ad1863_1 + - setuptools=75.6.0=pyhff2d567_1 - sigtool=0.1.3=h88f4db0_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h0d51a9f_1 + - singular=4.4.0=h0c52cc7_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h28673e1_0 + - sqlite=3.47.0=h6285a30_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hd2b2131_1 - symmetrica=3.0.1=hf0c8a7f_0 - sympow=2.023.6=h115ba6a_3 - - sympy=1.12.1=pypyh2585a3b_103 + - sympy=1.13.3=pyh2585a3b_104 - tachyon=0.99b6=h3a1d103_1002 - - tapi=1100.0.11=h9ce4665_0 - - tar=1.34=hcb2f6ea_1 - - tbb=2021.12.0=h3c5361c_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321hc47821c_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 + - tapi=1300.6.5=h390ca13_0 - tk=8.6.13=h1abcd95_1 - - tktable=2.10=hba9d6f1_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310h936d840_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py310hbb8c376_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310h2ec42d9_0 - - unicodedata2=15.1.0=py310h6729b98_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py310hb9d19b6_1 + - urllib3=2.2.3=pyhd8ed1ab_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=h0dc2134_0 - - xorg-libxdmcp=1.1.3=h35c211d_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xorg-libxau=1.0.11=h00291cd_1 + - xorg-libxdmcp=1.1.5=h00291cd_0 - xz=5.2.6=h775f41a_0 - - yaml=0.2.5=h0d85af4_2 - - zeromq=4.3.5=hde137ed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h87427d6_1 + - zeromq=4.3.5=h7130eaa_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=hd23fc13_2 + - zstandard=0.23.0=py310h41d873f_1 - zstd=1.5.6=h915ae27_0 diff --git a/environment-3.10-macos.yml b/environment-3.10-macos.yml index 0c5d09880a1..d6cc0969531 100644 --- a/environment-3.10-macos.yml +++ b/environment-3.10-macos.yml @@ -1,424 +1,290 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: osx-arm64 -# input_hash: fce4b9b5cdb20ebb2d93612fa27b4d6584379772c37a8cccd6c2390e2ce5f3b1 +# input_hash: a20846f94d8c398a77c7b0e2aabc5eb61c1c7fbabb5979b5da5d7b7b56c7b7be channels: - conda-forge dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 + - alabaster=1.0.0=pyhd8ed1ab_0 - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310h2aa6e3c_4 - arpack=3.9.1=nompi_h593882a_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321hcd07c0c_1 - - automake=1.16.5=pl5321hce30654_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h3422bc3_0 + - automake=1.17=pl5321hce30654_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=hc021e02_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osxarm64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=hca5e981_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_osxarm64_openblas + - boost-cpp=1.85.0=h103c1d6_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hb547adb_1 - - brotli-bin=1.1.0=hb547adb_1 - - brotli-python=1.1.0=py310h1253130_1 - - bwidget=1.9.14=hce30654_1 - - bzip2=1.0.8=h93a5062_5 - - c-ares=1.28.1=h93a5062_0 - - c-compiler=1.7.0=h6aa9301_1 - - ca-certificates=2024.6.2=hf0a4a13_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=hc6c324b_2 - - cctools=986=h4faf515_0 - - cctools_osx-arm64=986=h62378fb_0 + - brotli=1.1.0=hd74edd7_2 + - brotli-bin=1.1.0=hd74edd7_2 + - brotli-python=1.1.0=py310hb4ad77e_2 + - bzip2=1.0.8=h99b78c6_7 + - c-ares=1.34.3=h5505292_1 + - c-compiler=1.8.0=hf48404e_1 + - ca-certificates=2024.8.30=hf0a4a13_0 + - cctools=1010.6=hf67d63f_2 + - cctools_osx-arm64=1010.6=h623e0ac_2 - cddlib=1!0.94m=h6d7a090_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310hdcd7c05_0 - - chardet=5.2.0=py310hbe9552e_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_h095aff0_8 - - clang-16=16.0.6=default_hb63da90_8 - - clang_impl_osx-arm64=16.0.6=hc421ffc_16 - - clang_osx-arm64=16.0.6=h54d7cd3_16 - - clangxx=16.0.6=default_h095aff0_8 - - clangxx_impl_osx-arm64=16.0.6=hcd7bac0_16 - - clangxx_osx-arm64=16.0.6=h54d7cd3_16 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py310h497396d_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 + - clang=17.0.6=default_h360f5da_7 + - clang-17=17.0.6=default_h146c034_7 + - clang_impl_osx-arm64=17.0.6=he47c785_23 + - clang_osx-arm64=17.0.6=h07b0088_23 + - clangxx=17.0.6=default_h360f5da_7 + - clangxx_impl_osx-arm64=17.0.6=h50f59cd_23 + - clangxx_osx-arm64=17.0.6=h07b0088_23 - cliquer=1.22=h93a5062_1 - - cmake=3.29.6=had79d8f_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310hbe9552e_0 - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=h3808999_2 - - compiler-rt_osx-arm64=16.0.6=h3808999_2 - - compilers=1.7.0=hce30654_1 - - contourpy=1.2.1=py310h21239e6_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=h653d890_0 - - cvxopt=1.3.2=py310h7e4e7d1_2 - - cxx-compiler=1.7.0=h2ffa867_1 + - compiler-rt=17.0.6=h856b3c1_2 + - compiler-rt_osx-arm64=17.0.6=h832e737_2 + - contourpy=1.3.1=py310h7f4e7e6_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py310hc74094e_0 + - cpython=3.10.15=py310hd8ed1ab_2 + - cxx-compiler=1.8.0=h18dbf2f_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py310h5e3d6bc_0 - cysignals=1.11.2=py310hfd3b3fe_3 - - cython=3.0.10=py310h692a8b6_0 - - debugpy=1.8.1=py310h692a8b6_0 + - cython=3.0.11=py310h1dbcdd0_3 + - debugpy=1.8.9=py310h853098b_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h9397a75_1203 - ecl=23.9.9=h1d9728a_0 - eclib=20231212=h7f07de4_0 - ecm=7.0.5=h41d338b_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=hebf3989_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h286801f_0 - fflas-ffpack=2.5.0=h4bc3318_0 - - fftw=3.3.10=nompi_h6637ab6_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h82840c6_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h1383a14_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310ha6dd24b_0 - - fortran-compiler=1.7.0=hafb19e3_1 + - fonttools=4.55.0=py310hc74094e_0 + - fortran-compiler=1.8.0=hc3477c4_1 - fplll=5.4.5=hb7d509d_0 - fpylll=0.6.1=py310hd9be144_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=hadb7bae_2 - - fribidi=1.0.10=h27ca646_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he8f4e70_3 - - gap-defaults=4.12.2=hce30654_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=hbdafb3b_0 - - gettext=0.22.5=h8fbad5d_2 - - gettext-tools=0.22.5=h8fbad5d_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h4cbeff9_0 + - gap-defaults=4.13.1=hce30654_0 + - gettext=0.22.5=h8414b35_3 + - gettext-tools=0.22.5=h8414b35_3 - gf2x=1.3.0=hdaa854c_2 - gfan=0.6.2=hec08f5c_1003 - - gfortran=12.3.0=h1ca8e4b_1 - - gfortran_impl_osx-arm64=12.3.0=h53ed385_3 - - gfortran_osx-arm64=12.3.0=h57527a5_1 + - gfortran=13.2.0=h1ca8e4b_1 + - gfortran_impl_osx-arm64=13.2.0=h252ada1_3 + - gfortran_osx-arm64=13.2.0=h57527a5_1 - giac=1.9.0.21=h1c96721_1 - - giflib=5.2.2=h93a5062_0 - givaro=4.2.0=h018886a_0 - glpk=5.0=h6d7a090_0 - gmp=6.3.0=h7bae524_2 - - gmpy2=2.1.5=py310h3bc658a_1 - - graphite2=1.3.13=hebf3989_1003 + - gmpy2=2.1.5=py310heb17c8b_2 - gsl=2.7=h6e638da_0 - - h11=0.14.0=pyhd8ed1ab_0 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h1836168_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hc8870d7_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h762ac30_1 + - icu=75.1=hfee45f7_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h3fe6531_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=hd73f12c_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh57ce528_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 - isl=0.26=imath32_h347afa1_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=hce30654_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310hbe9552e_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310hbe9552e_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kiwisolver=1.4.5=py310h38f39d4_1 - - krb5=1.21.2=h92f50d5_0 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kiwisolver=1.4.7=py310h7306fd8_0 + - krb5=1.21.3=h237132a_0 - lcalc=2.0.5=h4a402bc_2 - lcms2=2.16=ha0e7c42_0 - - ld64=711=h634c8be_0 - - ld64_osx-arm64=711=ha4bd21c_0 + - ld64=951.9=h39a299f_2 + - ld64_osx-arm64=951.9=h3f9b568_2 - lerc=4.0.0=h9a09cb3_0 - - libasprintf=0.22.5=h8fbad5d_2 - - libasprintf-devel=0.22.5=h8fbad5d_2 - - libatomic_ops=7.6.14=h1a8c8d9_0 - - libblas=3.9.0=20_osxarm64_openblas - - libboost=1.85.0=h17eb2be_2 - - libboost-devel=1.85.0=hf450f58_2 - - libboost-headers=1.85.0=hce30654_2 - - libbraiding=1.2=hb7217d7_0 + - libasprintf=0.22.5=h8414b35_3 + - libasprintf-devel=0.22.5=h8414b35_3 + - libblas=3.9.0=25_osxarm64_openblas + - libboost=1.85.0=hf763ba5_4 + - libboost-devel=1.85.0=hf450f58_4 + - libboost-headers=1.85.0=hce30654_4 + - libbraiding=1.3=h286801f_0 - libbrial=1.2.12=h56a29cd_3 - - libbrotlicommon=1.1.0=hb547adb_1 - - libbrotlidec=1.1.0=hb547adb_1 - - libbrotlienc=1.1.0=hb547adb_1 - - libcblas=3.9.0=20_osxarm64_openblas - - libclang-cpp16=16.0.6=default_hb63da90_8 - - libcurl=8.8.0=h7b6f9a7_0 - - libcxx=17.0.6=h5f092b4_0 - - libdeflate=1.20=h93a5062_0 + - libbrotlicommon=1.1.0=hd74edd7_2 + - libbrotlidec=1.1.0=hd74edd7_2 + - libbrotlienc=1.1.0=hd74edd7_2 + - libcblas=3.9.0=25_osxarm64_openblas + - libclang-cpp17=17.0.6=default_h146c034_7 + - libcurl=8.10.1=h13a7ad3_0 + - libcxx=19.1.4=ha82da77_0 + - libcxx-devel=17.0.6=h86353a2_6 + - libdeflate=1.22=hd74edd7_0 - libedit=3.1.20191231=hc8eb9b7_2 - libev=4.33=h93a5062_2 - - libexpat=2.6.2=hebf3989_0 + - libexpat=2.6.4=h286801f_0 - libffi=3.4.2=h3422bc3_5 - - libflint=3.0.1=h28749a5_ntl_100 - - libgd=2.3.3=hfdf3952_9 - - libgettextpo=0.22.5=h8fbad5d_2 - - libgettextpo-devel=0.22.5=h8fbad5d_2 + - libflint=3.0.1=he28cf6d_103 + - libgd=2.3.3=hac1b3a8_10 + - libgettextpo=0.22.5=h8414b35_3 + - libgettextpo-devel=0.22.5=h8414b35_3 - libgfortran=5.0.0=13_2_0_hd922786_3 - - libgfortran-devel_osx-arm64=12.3.0=hc62be1c_3 + - libgfortran-devel_osx-arm64=13.2.0=h5d7a38c_3 - libgfortran5=13.2.0=hf226fd6_3 - - libglib=2.80.2=h59d46d9_1 + - libglib=2.82.2=h07bd6cf_0 - libhomfly=1.02r6=h93a5062_1 - - libhwloc=2.10.0=default_h7685b71_1001 - libiconv=1.17=h0d3ecfb_2 - - libintl=0.22.5=h8fbad5d_2 - - libintl-devel=0.22.5=h8fbad5d_2 + - libintl=0.22.5=h8414b35_3 + - libintl-devel=0.22.5=h8414b35_3 - libjpeg-turbo=3.0.0=hb547adb_1 - - liblapack=3.9.0=20_osxarm64_openblas - - liblapacke=3.9.0=20_osxarm64_openblas - - libllvm16=16.0.6=haab561b_3 - - libnghttp2=1.58.0=ha4dd798_1 - - libopenblas=0.3.25=openmp_h6c19121_0 - - libpng=1.6.43=h091b4b1_0 - - libsodium=1.0.18=h27ca646_1 - - libsqlite=3.46.0=hfb93653_0 - - libssh2=1.11.0=h7a5bd25_0 - - libtiff=4.6.0=h07db509_3 - - libtool=2.4.7=hb7217d7_0 - - libuv=1.48.0=h93a5062_0 - - libwebp=1.4.0=h54798ee_0 + - liblapack=3.9.0=25_osxarm64_openblas + - liblapacke=3.9.0=25_osxarm64_openblas + - libllvm17=17.0.6=h5090b49_2 + - libnghttp2=1.64.0=h6d7220d_0 + - libopenblas=0.3.28=openmp_hf332438_1 + - libpng=1.6.44=hc14010f_0 + - libsodium=1.0.20=h99b78c6_0 + - libsqlite=3.47.0=hbaaea75_1 + - libssh2=1.11.1=h9cc3647_0 + - libtiff=4.7.0=hfce79cd_1 - libwebp-base=1.4.0=h93a5062_0 - - libxcb=1.16=hf2054a2_0 - - libxml2=2.12.7=ha661575_1 - - libzlib=1.3.1=hfb2fe0b_1 + - libxcb=1.17.0=hdb1d25a_0 + - libxml2=2.13.5=hbbdcc80_0 + - libzlib=1.3.1=h8359307_2 - linbox=1.7.0=h3afee3a_0 - - llvm-openmp=18.1.8=hde57baf_0 - - llvm-tools=16.0.6=haab561b_3 - - lrcalc=2.1=hebf3989_6 + - llvm-openmp=19.1.4=hdb05f8b_0 + - llvm-tools=17.0.6=h5090b49_2 + - lrcalc=2.1=hf9b8971_7 - m4=1.4.18=h642e427_1001 - m4ri=20140914=hc97c1ff_1006 - m4rie=20150908=h22b9e9d_1002 - - make=4.3=he57ea6c_1 - - markupsafe=2.1.5=py310hd125d64_0 - - mathjax=3.2.2=hce30654_0 - - matplotlib=3.8.4=py310hb6292c7_2 - - matplotlib-base=3.8.4=py310hedb7998_2 + - markupsafe=3.0.2=py310h5799be4_0 + - matplotlib=3.9.2=py310hb6292c7_2 + - matplotlib-base=3.9.2=py310h2a20ac7_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - maxima=5.47.0=h2bbcd85_2 - - memory-allocator=0.1.3=py310h2aa6e3c_0 - - metis=5.1.0=h13dd4ca_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=h91ba8db_0 + - memory-allocator=0.1.3=py310h493c2e1_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h8f1351a_1 - mpfi=1.5.4=hbde5f5b_1001 - - mpfr=4.2.1=h41d338b_1 + - mpfr=4.2.1=hb693164_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - nauty=2.8.8=h93a5062_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=hb89a1cb_0 + - ncurses=6.5=h7bae524_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h420ef59_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=hbb3f309_1 - numpy=1.26.4=py310hd45542a_0 - - openblas=0.3.25=openmp_h55c453e_0 - - openjdk=22.0.1=hbeb2e11_0 + - openblas=0.3.28=openmp_hea878ba_1 - openjpeg=2.5.2=h9f1df11_0 - - openssl=3.3.1=hfb2fe0b_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openssl=3.4.0=h39f12f2_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=h27ca646_0 - - pandoc=3.2.1=hce30654_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h5cb9fbc_0 - pari=2.15.5=h4f2304c_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=h27ca646_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h297a79d_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=h297a79d_2 - perl=5.32.1=7_h4614cfb_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310h01af8b1_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=hebf3989_0 - - pkg-config=0.29.2=hab62308_1008 + - pillow=11.0.0=py310h530beaf_0 + - pip=24.3.1=pyh8b19718_0 + - pkg-config=0.29.2=hde07d2e_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h93a5062_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h8b147cf_1006 - pplpy=0.8.9=py310hc3af9bb_1 - primecount=7.6=hb6e4faa_0 - primecountpy=0.1.0=py310h38f39d4_4 - primesieve=11.0=hb7217d7_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310ha6dd24b_0 - - pthread-stubs=0.4=h27ca646_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py310hf9df320_0 + - pthread-stubs=0.4=hd74edd7_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310h21239e6_0 - - pybind11-global=2.12.0=py310h21239e6_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py310h4b7648a_0 - - pyobjc-framework-cocoa=10.3.1=py310h4b7648a_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py310hd125d64_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.10.14=h2469fbe_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310h692a8b6_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310h1359cc7_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310hbe9552e_4 - - pyyaml=6.0.1=py310h2aa6e3c_1 - - pyzmq=26.0.3=py310h16e08c9_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.10.15=hdce6c4c_2_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py310hb4ad77e_7 + - python_abi=3.10=5_cp310 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py310h82ef58e_3 - qd=2.3.22=hbec66e7_1004 - - qhull=2020.2=hc021e02_2 - - r-base=4.3.3=h8112bfe_3 - - r-lattice=0.22_6=r43hd2d937b_0 + - qhull=2020.2=h420ef59_5 - readline=8.2=h92ec313_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hb547adb_0 - - rpds-py=0.18.1=py310h947b723_0 - - rpy2=3.5.11=py310r43h280b8fa_3 - rw=0.9=h93a5062_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py310h2b794db_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 + - scipy=1.14.1=py310hc05a576_1 + - setuptools=75.6.0=pyhff2d567_1 - sigtool=0.1.3=h44b9a77_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hb460b52_1 + - singular=4.4.0=h8aafc33_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h5838104_0 + - sqlite=3.47.0=hcd14bea_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf6fcff2_1 - symmetrica=3.0.1=hb7217d7_0 - sympow=2.023.6=hb0babe8_3 - - sympy=1.12.1=pypyh2585a3b_103 + - sympy=1.13.3=pyh2585a3b_104 - tachyon=0.99b6=hb8a568e_1002 - - tapi=1100.0.11=he4954df_0 - - tar=1.34=h7cb298e_1 - - tbb=2021.12.0=h420ef59_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321h9ea1dce_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 + - tapi=1300.6.5=h03f4b80_0 - tk=8.6.13=h5083fa2_1 - - tktable=2.10=h1e387b8_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310ha6dd24b_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py310h078409c_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310hbe9552e_0 - - unicodedata2=15.1.0=py310h2aa6e3c_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py310hf9df320_1 + - urllib3=2.2.3=pyhd8ed1ab_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=hb547adb_0 - - xorg-libxdmcp=1.1.3=h27ca646_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xorg-libxau=1.0.11=hd74edd7_1 + - xorg-libxdmcp=1.1.5=hd74edd7_0 - xz=5.2.6=h57fd34a_0 - - yaml=0.2.5=h3422bc3_2 - - zeromq=4.3.5=hcc0f68c_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=hfb2fe0b_1 + - zeromq=4.3.5=hc1bb282_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=h8359307_2 + - zstandard=0.23.0=py310h2665a74_1 - zstd=1.5.6=hb46c0d2_0 diff --git a/environment-3.11-linux-aarch64.yml b/environment-3.11-linux-aarch64.yml index e6a24cbe706..daa751968c1 100644 --- a/environment-3.11-linux-aarch64.yml +++ b/environment-3.11-linux-aarch64.yml @@ -1,435 +1,335 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: linux-aarch64 -# input_hash: 53cce21c9c8a4b11b84e96405de20cc945c84809a7997b8508761fc9ca727ee0 +# input_hash: 5270b05aa1455cb2fb4e045553ae697357d66135a4d3a7e7bc0f417323eb4d22 channels: - conda-forge dependencies: - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - _sysroot_linux-aarch64_curr_repodata_hack=4=h57d6b7b_14 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.11=h31becfc_1 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311hcd402e7_4 + - alabaster=1.0.0=pyhd8ed1ab_0 + - alsa-lib=1.2.13=h86ecc28_0 - arpack=3.9.1=nompi_hd363cd0_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321h2148fe1_1 - - automake=1.16.5=pl5321h8af1aa0_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=hf897c2e_0 + - automake=1.17=pl5321h8af1aa0_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=hd62202e_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=hf1166c9_7 - - binutils_impl_linux-aarch64=2.40=hf54a868_7 - - binutils_linux-aarch64=2.40=h1f91aba_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linuxaarch64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=ha990451_2 + - binutils=2.43=hf1166c9_2 + - binutils_impl_linux-aarch64=2.43=h4c662bb_2 + - binutils_linux-aarch64=2.43=hf1166c9_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_linuxaarch64_openblas + - boost-cpp=1.85.0=hdad291f_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h31becfc_1 - - brotli-bin=1.1.0=h31becfc_1 - - brotli-python=1.1.0=py311h8715677_1 - - bwidget=1.9.14=h8af1aa0_1 - - bzip2=1.0.8=h31becfc_5 - - c-ares=1.28.1=h31becfc_0 - - c-compiler=1.7.0=h31becfc_1 - - ca-certificates=2024.6.2=hcefe29a_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=h5c54ea9_2 + - brotli=1.1.0=h86ecc28_2 + - brotli-bin=1.1.0=h86ecc28_2 + - brotli-python=1.1.0=py311h89d996e_2 + - bzip2=1.0.8=h68df207_7 + - c-ares=1.34.3=h86ecc28_1 + - c-compiler=1.8.0=h6561dab_1 + - ca-certificates=2024.8.30=hcefe29a_0 + - cairo=1.18.0=hdb1a16f_3 - cddlib=1!0.94m=h719063d_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311h7963103_0 - - chardet=5.2.0=py311hfecb2dc_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py311h14e8bb7_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 - cliquer=1.22=h31becfc_1 - - cmake=3.29.6=h7042e5d_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311hec3470c_0 - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=h8af1aa0_1 - - contourpy=1.2.1=py311h098ece5_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=h7daf2e0_0 - - cvxopt=1.3.2=py311ha095bbf_2 - - cxx-compiler=1.7.0=h2a328a1_1 + - contourpy=1.3.1=py311hc07b1fb_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py311ha09ea12_0 + - cpython=3.11.10=py311hd8ed1ab_3 + - cxx-compiler=1.8.0=heb6c788_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py311h5ab95f0_0 + - cyrus-sasl=2.1.27=hf6b2984_7 - cysignals=1.11.2=py311h644d908_3 - - cython=3.0.10=py311h8715677_0 - - debugpy=1.8.1=py311h8715677_0 + - cython=3.0.11=py311hac78f04_3 + - dbus=1.13.6=h12b9eeb_3 + - debugpy=1.8.9=py311h89d996e_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hb12102e_1203 - - ecl=23.9.9=h6475f26_0 + - double-conversion=3.3.0=h2f0025b_0 + - ecl=24.5.10=h5567cc5_0 - eclib=20231212=he26bab5_0 - ecm=7.0.5=ha2d0fc4_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h2f0025b_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h5ad3122_0 - fflas-ffpack=2.5.0=h503e619_0 - - fftw=3.3.10=nompi_h020dacd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=ha9a116f_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h8dda3cd_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311hf4892ed_0 - - fortran-compiler=1.7.0=h7048d53_1 + - fonttools=4.55.0=py311h58d527c_0 + - fortran-compiler=1.8.0=h25a59a9_1 - fplll=5.4.5=hb3a790e_0 - fpylll=0.6.1=py311h5d3d69a_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=hf0a5ef3_2 - - fribidi=1.0.10=hb9de7d4_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=h597289e_3 - - gap-defaults=4.12.2=h8af1aa0_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=hdb0cc85_13 - - gcc_impl_linux-aarch64=12.3.0=h3d98823_13 - - gcc_linux-aarch64=12.3.0=ha52a6ea_9 - - gengetopt=2.23=h01db608_0 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h16511ff_0 + - gap-defaults=4.13.1=h8af1aa0_0 + - gcc=13.3.0=h8a56e6e_1 + - gcc_impl_linux-aarch64=13.3.0=hcdea9b6_1 + - gcc_linux-aarch64=13.3.0=h1cd514b_7 - gf2x=1.3.0=h1b3b3a3_2 - gfan=0.6.2=h5f589ec_1003 - - gfortran=12.3.0=hdb0cc85_13 - - gfortran_impl_linux-aarch64=12.3.0=h97ebfd2_13 - - gfortran_linux-aarch64=12.3.0=ha7b8e4b_9 + - gfortran=13.3.0=h8a56e6e_1 + - gfortran_impl_linux-aarch64=13.3.0=h174a3c4_1 + - gfortran_linux-aarch64=13.3.0=h2809cf8_7 - giac=1.9.0.21=h04922a4_1 - - giflib=5.2.2=h31becfc_0 - givaro=4.2.0=h364d21b_0 - glpk=5.0=h66325d0_0 - gmp=6.3.0=h0a1ffab_2 - - gmpy2=2.1.5=py311h3c136a7_1 + - gmpy2=2.1.5=py311h8dd2ae4_2 - graphite2=1.3.13=h2f0025b_1003 - gsl=2.7=h294027d_0 - - gxx=12.3.0=hdb0cc85_13 - - gxx_impl_linux-aarch64=12.3.0=hba91e99_13 - - gxx_linux-aarch64=12.3.0=h9d1f256_9 - - h11=0.14.0=pyhd8ed1ab_0 + - gxx=13.3.0=h8a56e6e_1 + - gxx_impl_linux-aarch64=13.3.0=h1211b58_1 + - gxx_linux-aarch64=13.3.0=h2864abd_7 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h9812418_0 - - hatchling=1.25.0=pyhd8ed1ab_0 + - harfbuzz=9.0.0=hbf49d6b_1 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h787c7f5_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h197073e_1 + - icu=75.1=hf9b3779_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h207f3e5_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h15043fe_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh3099207_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=h8af1aa0_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311hec3470c_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311hec3470c_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-aarch64=4.18.0=h5b4a56d_14 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kernel-headers_linux-aarch64=4.18.0=h05a177a_18 - keyutils=1.6.1=h4e544f5_0 - - kiwisolver=1.4.5=py311h0d5d7b0_1 - - krb5=1.21.2=hc419048_0 + - kiwisolver=1.4.7=py311h75754e6_0 + - krb5=1.21.3=h50a48e9_0 - lcalc=2.0.5=he588f68_2 - lcms2=2.16=h922389a_0 - - ld_impl_linux-aarch64=2.40=h9fc2d93_7 + - ld_impl_linux-aarch64=2.43=h80caac9_2 - lerc=4.0.0=h4de3ea5_0 - - libatomic_ops=7.6.14=h4e544f5_0 - - libblas=3.9.0=20_linuxaarch64_openblas - - libboost=1.85.0=hb41fec8_2 - - libboost-devel=1.85.0=h37bb5a9_2 - - libboost-headers=1.85.0=h8af1aa0_2 - - libbraiding=1.2=hd600fc2_0 + - libblas=3.9.0=25_linuxaarch64_openblas + - libboost=1.85.0=h9fa81b4_4 + - libboost-devel=1.85.0=h37bb5a9_4 + - libboost-headers=1.85.0=h8af1aa0_4 + - libbraiding=1.3=h5ad3122_0 - libbrial=1.2.12=h9429f74_3 - - libbrotlicommon=1.1.0=h31becfc_1 - - libbrotlidec=1.1.0=h31becfc_1 - - libbrotlienc=1.1.0=h31becfc_1 - - libcblas=3.9.0=20_linuxaarch64_openblas + - libbrotlicommon=1.1.0=h86ecc28_2 + - libbrotlidec=1.1.0=h86ecc28_2 + - libbrotlienc=1.1.0=h86ecc28_2 + - libcblas=3.9.0=25_linuxaarch64_openblas + - libclang-cpp19.1=19.1.4=default_he324ac1_0 + - libclang13=19.1.4=default_h4390ef5_0 - libcups=2.3.3=h405e4a8_4 - - libcurl=8.8.0=h4e8248e_0 - - libdeflate=1.20=h31becfc_0 + - libcurl=8.10.1=h3ec0cbf_0 + - libdeflate=1.22=h86ecc28_0 + - libdrm=2.4.123=h86ecc28_0 - libedit=3.1.20191231=he28a2e2_2 + - libegl=1.7.0=hd24410f_2 - libev=4.33=h31becfc_2 - - libexpat=2.6.2=h2f0025b_0 + - libexpat=2.6.4=h5ad3122_0 - libffi=3.4.2=h3557bc0_5 - - libflint=3.0.1=hc392af7_ntl_100 - - libgcc-devel_linux-aarch64=12.3.0=h6144e03_113 - - libgcc-ng=13.2.0=he277a41_13 - - libgd=2.3.3=hcd22fd5_9 - - libgfortran-ng=13.2.0=he9431aa_13 - - libgfortran5=13.2.0=h2af0866_13 - - libglib=2.80.2=haee52c6_1 - - libgomp=13.2.0=he277a41_13 + - libflint=3.0.1=h0433c20_103 + - libgcc=14.2.0=he277a41_1 + - libgcc-devel_linux-aarch64=13.3.0=h0c07274_101 + - libgcc-ng=14.2.0=he9431aa_1 + - libgd=2.3.3=h6818b27_10 + - libgfortran=14.2.0=he9431aa_1 + - libgfortran-ng=14.2.0=he9431aa_1 + - libgfortran5=14.2.0=hb6113d0_1 + - libgl=1.7.0=hd24410f_2 + - libglib=2.82.2=hc486b8e_0 + - libglvnd=1.7.0=hd24410f_2 + - libglx=1.7.0=hd24410f_2 + - libgomp=14.2.0=he277a41_1 - libhomfly=1.02r6=h31becfc_1 - - libhwloc=2.10.0=default_h3030c0e_1001 - libiconv=1.17=h31becfc_2 - libjpeg-turbo=3.0.0=h31becfc_1 - - liblapack=3.9.0=20_linuxaarch64_openblas - - liblapacke=3.9.0=20_linuxaarch64_openblas - - libnghttp2=1.58.0=hb0e430d_1 + - liblapack=3.9.0=25_linuxaarch64_openblas + - liblapacke=3.9.0=25_linuxaarch64_openblas + - libllvm19=19.1.4=h2edbd07_1 + - libnghttp2=1.64.0=hc8609a4_0 - libnsl=2.0.1=h31becfc_0 - - libopenblas=0.3.25=pthreads_h5a5ec62_0 - - libpng=1.6.43=h194ca79_0 - - libsanitizer=12.3.0=h57e2e72_13 - - libsodium=1.0.18=hb9de7d4_1 - - libsqlite=3.46.0=hf51ef55_0 - - libssh2=1.11.0=h492db2e_0 - - libstdcxx-devel_linux-aarch64=12.3.0=h6144e03_113 - - libstdcxx-ng=13.2.0=h3f4de04_13 - - libtiff=4.6.0=hf980d43_3 - - libtool=2.4.7=h4de3ea5_0 + - libntlm=1.4=hf897c2e_1002 + - libopenblas=0.3.28=pthreads_h9d3fd7e_1 + - libopengl=1.7.0=hd24410f_2 + - libpciaccess=0.18=h31becfc_0 + - libpng=1.6.44=hc4a20ef_0 + - libpq=17.2=h081282e_0 + - libsanitizer=13.3.0=ha58e236_1 + - libsodium=1.0.20=h68df207_0 + - libsqlite=3.47.0=hc4a20ef_1 + - libssh2=1.11.1=ha41c0db_0 + - libstdcxx=14.2.0=h3f4de04_1 + - libstdcxx-devel_linux-aarch64=13.3.0=h0c07274_101 + - libstdcxx-ng=14.2.0=hf1166c9_1 + - libtiff=4.7.0=hec21d91_1 - libuuid=2.38.1=hb4cce97_0 - - libuv=1.48.0=h31becfc_0 - - libwebp=1.4.0=h8b4e01b_0 - libwebp-base=1.4.0=h31becfc_0 - - libxcb=1.16=h7935292_0 + - libxcb=1.17.0=h262b8f6_0 - libxcrypt=4.4.36=h31becfc_1 - - libxml2=2.12.7=h49dc7a2_1 - - libzlib=1.3.1=h68df207_1 + - libxkbcommon=1.7.0=h46f2afe_1 + - libxml2=2.13.5=hf4efe5d_0 + - libxslt=1.1.39=h1cc9640_0 + - libzlib=1.3.1=h86ecc28_2 - linbox=1.7.0=h681a5ee_0 - - llvm-openmp=18.1.8=hb063fc5_0 - - lrcalc=2.1=h2f0025b_6 + - llvm-openmp=19.1.4=h013ceaa_0 + - lrcalc=2.1=h5ad3122_7 - m4=1.4.18=h516909a_1001 - m4ri=20140914=hedfd65a_1006 - m4rie=20150908=hf0a5ef3_1002 - - make=4.3=h309ac5b_1 - - markupsafe=2.1.5=py311hc8f2f60_0 - - mathjax=3.2.2=h8af1aa0_0 - - matplotlib=3.8.4=py311hfecb2dc_2 - - matplotlib-base=3.8.4=py311h55059f0_2 + - markupsafe=3.0.2=py311ha09ea12_0 + - matplotlib=3.9.2=py311hfecb2dc_2 + - matplotlib-base=3.9.2=py311h0385ec1_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h6475f26_2 - - memory-allocator=0.1.3=py311hcd402e7_0 - - metis=5.1.0=h2f0025b_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=hf4c8f4c_0 + - maxima=5.47.0=h043f013_3 + - memory-allocator=0.1.3=py311ha879c10_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h783934e_1 - mpfi=1.5.4=h846f343_1001 - - mpfr=4.2.1=ha2d0fc4_1 + - mpfr=4.2.1=h2305555_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 + - mysql-common=9.0.1=h3f5c77f_2 + - mysql-libs=9.0.1=h11569fd_2 - nauty=2.8.8=h31becfc_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h0425590_0 + - ncurses=6.5=hcccb83c_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h70be974_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=h0d7519b_1 - numpy=1.26.4=py311h69ead2a_0 - - openblas=0.3.25=pthreads_h339cbfa_0 - - openjdk=22.0.1=h3d4cd67_0 + - openblas=0.3.28=pthreads_h3a8cbd8_1 - openjpeg=2.5.2=h0d9d63b_0 - - openssl=3.3.1=h68df207_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openldap=2.6.9=h30c48ee_0 + - openssl=3.4.0=h86ecc28_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=hb9de7d4_0 - - pandoc=3.2.1=h8af1aa0_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h399c48b_0 - pari=2.15.5=h169c2a7_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=hf897c2e_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h070dd5b_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=h070dd5b_2 - perl=5.32.1=7_h31becfc_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311h54289d1_1 - - pip=24.0=pyhd8ed1ab_0 + - pillow=11.0.0=py311hb2a0dd2_0 + - pip=24.3.1=pyh8b19718_0 - pixman=0.43.4=h2f0025b_0 - - pkg-config=0.29.2=hb9de7d4_1008 + - pkg-config=0.29.2=hce167ba_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h31becfc_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h984aac9_1006 - pplpy=0.8.9=py311ha3770eb_1 - primecount=7.9=hd600fc2_0 - primecountpy=0.1.0=py311h098ece5_4 - primesieve=11.1=h2f0025b_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311hf4892ed_0 - - pthread-stubs=0.4=hb9de7d4_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py311ha879c10_0 + - pthread-stubs=0.4=h86ecc28_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311h098ece5_0 - - pybind11-global=2.12.0=py311h098ece5_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py311hc8f2f60_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 + - pyside6=6.8.0.2=py311habb2604_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.11.9=hddfb980_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311h8715677_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311hec5c23b_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311hec3470c_4 - - pyyaml=6.0.1=py311hcd402e7_1 - - pyzmq=26.0.3=py311hb8d4657_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.11.10=h5d932e8_3_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py311h89d996e_7 + - python_abi=3.11=5_cp311 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py311h826da9f_3 - qd=2.3.22=h05efe27_1004 - - qhull=2020.2=hd62202e_2 - - r-base=4.3.3=h7f20121_3 - - r-lattice=0.22_6=r43h25e906a_0 + - qhull=2020.2=h70be974_5 + - qt6-main=6.8.0=h666f7c6_0 - readline=8.2=h8fc344f_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h31becfc_0 - - rpds-py=0.18.1=py311h949f54a_0 - - rpy2=3.5.11=py311r43hf13da56_3 - rw=0.9=h31becfc_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.3=py311h69ead2a_1 - - sed=4.8=ha0d5d3d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hbe76a8a_1 + - scipy=1.14.1=py311h5912639_1 + - setuptools=75.6.0=pyhff2d567_1 + - singular=4.4.0=h9a92511_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=hdc7ab3c_0 + - sqlite=3.47.0=h578a6b9_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=h3944111_1 - symmetrica=3.0.1=hd600fc2_0 - sympow=2.023.6=h157afb5_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-aarch64=2.17=h5b4a56d_14 + - sympy=1.13.3=pyh2585a3b_104 + - sysroot_linux-aarch64=2.17=h5b4a56d_18 - tachyon=0.99b6=ha0bfc61_1002 - - tar=1.34=h048efde_0 - - tbb=2021.12.0=h70be974_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h17f021e_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - tk=8.6.13=h194ca79_0 - - tktable=2.10=h52f7bd3_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311h323e239_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py311h5487e9b_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311hec3470c_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py311ha879c10_1 + - urllib3=2.2.3=pyhd8ed1ab_0 + - wayland=1.23.1=h698ed42_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-fixesproto=5.0=h3557bc0_1002 - - xorg-inputproto=2.3.2=h3557bc0_1002 - - xorg-kbproto=1.0.7=h3557bc0_1002 - - xorg-libice=1.1.1=h7935292_0 - - xorg-libsm=1.2.4=h5a01bc2_0 - - xorg-libx11=1.8.9=h08be655_1 - - xorg-libxau=1.0.11=h31becfc_0 - - xorg-libxdmcp=1.1.3=h3557bc0_0 - - xorg-libxext=1.3.4=h2a766a3_2 - - xorg-libxfixes=5.0.3=h3557bc0_1004 - - xorg-libxi=1.7.10=h3557bc0_0 - - xorg-libxrender=0.9.11=h7935292_0 - - xorg-libxt=1.3.0=h7935292_1 - - xorg-libxtst=1.2.3=hf897c2e_1002 - - xorg-recordproto=1.14.2=hf897c2e_1002 - - xorg-renderproto=0.11.1=h3557bc0_1002 - - xorg-xextproto=7.3.0=h2a766a3_1003 - - xorg-xproto=7.0.31=h3557bc0_1007 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xcb-util=0.4.1=h5c728e9_2 + - xcb-util-cursor=0.1.5=h86ecc28_0 + - xcb-util-image=0.4.0=h5c728e9_2 + - xcb-util-keysyms=0.4.1=h5c728e9_0 + - xcb-util-renderutil=0.3.10=h5c728e9_0 + - xcb-util-wm=0.4.2=h5c728e9_0 + - xkeyboard-config=2.43=h86ecc28_0 + - xorg-libice=1.1.1=h57736b2_1 + - xorg-libsm=1.2.4=hbac51e1_1 + - xorg-libx11=1.8.9=he755bbd_2 + - xorg-libxau=1.0.11=h86ecc28_1 + - xorg-libxcomposite=0.4.6=h86ecc28_2 + - xorg-libxcursor=1.2.3=h86ecc28_0 + - xorg-libxdamage=1.1.6=h86ecc28_0 + - xorg-libxdmcp=1.1.5=h57736b2_0 + - xorg-libxext=1.3.6=h57736b2_0 + - xorg-libxfixes=6.0.1=h57736b2_0 + - xorg-libxi=1.8.2=h57736b2_0 + - xorg-libxrandr=1.5.4=h86ecc28_0 + - xorg-libxrender=0.9.11=h57736b2_1 + - xorg-libxtst=1.2.5=h57736b2_3 + - xorg-libxxf86vm=1.1.5=h57736b2_4 + - xorg-xorgproto=2024.1=h86ecc28_1 - xz=5.2.6=h9cdd2b7_0 - - yaml=0.2.5=hf897c2e_2 - - zeromq=4.3.5=h28faeed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h68df207_1 + - zeromq=4.3.5=h5efb499_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=h86ecc28_2 + - zstandard=0.23.0=py311hd5293d8_1 - zstd=1.5.6=h02f22dd_0 diff --git a/environment-3.11-linux.yml b/environment-3.11-linux.yml index e169439f85d..c18abc2b254 100644 --- a/environment-3.11-linux.yml +++ b/environment-3.11-linux.yml @@ -1,483 +1,336 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: linux-64 -# input_hash: 042b3b9a5ce5e44ed6334284078d156e424e41f02852c8c6a155cb9b4e620e60 +# input_hash: 48b95e0f20684f5ff684784c6c674a2251078ce14af62d4a59b6cc8c47dcd320 channels: - conda-forge dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.12=h4ab18f5_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311h459d7ec_4 + - alabaster=1.0.0=pyhd8ed1ab_0 + - alsa-lib=1.2.13=hb9d3cd8_0 - arpack=3.9.1=nompi_h77f6705_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h166bdaf_1 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321h2b4cb7a_1 - - automake=1.16.5=pl5321ha770c72_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h7f98852_0 + - automake=1.17=pl5321ha770c72_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=h4bd325d_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=h4852527_7 - - binutils_impl_linux-64=2.40=ha1999f0_7 - - binutils_linux-64=2.40=hb3c18ed_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linux64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h44aadfe_2 + - binutils=2.43=h4852527_2 + - binutils_impl_linux-64=2.43=h4bf12b8_2 + - binutils_linux-64=2.43=h4852527_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_linux64_openblas + - boost-cpp=1.85.0=h3c6214e_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hd590300_1 - - brotli-bin=1.1.0=hd590300_1 - - brotli-python=1.1.0=py311hb755f60_1 - - bwidget=1.9.14=ha770c72_1 - - bzip2=1.0.8=hd590300_5 - - c-ares=1.28.1=hd590300_0 - - c-compiler=1.7.0=hd590300_1 - - ca-certificates=2024.6.2=hbcca054_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=hbb29018_2 + - brotli=1.1.0=hb9d3cd8_2 + - brotli-bin=1.1.0=hb9d3cd8_2 + - brotli-python=1.1.0=py311hfdbb021_2 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.3=hb9d3cd8_1 + - c-compiler=1.8.0=h2b85faf_1 + - ca-certificates=2024.8.30=hbcca054_0 + - cairo=1.18.0=hebfffa5_3 - cddlib=1!0.94m=h9202a9a_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311hb3a22ac_0 - - chardet=5.2.0=py311h38be061_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py311hf29c0ef_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 - cliquer=1.22=hd590300_1 - - cmake=3.29.6=hcafd917_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311h38be061_0 - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=ha770c72_1 - - contourpy=1.2.1=py311h9547e67_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=he654da7_0 - - cvxopt=1.3.2=py311hec6cc1f_2 - - cxx-compiler=1.7.0=h00ab1b0_1 + - contourpy=1.3.1=py311hd18a35c_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py311h2dc5d0c_0 + - cpython=3.11.10=py311hd8ed1ab_3 + - cxx-compiler=1.8.0=h1a2810e_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py311hd2352ae_0 + - cyrus-sasl=2.1.27=h54b06d7_7 - cysignals=1.11.2=py311h82528dc_3 - - cython=3.0.10=py311hb755f60_0 + - cython=3.0.11=py311h55d416d_3 - dbus=1.13.6=h5008d03_3 - - debugpy=1.8.1=py311hb755f60_0 + - debugpy=1.8.9=py311hfdbb021_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hd9d9efa_1203 - - ecl=23.9.9=hed6455c_0 + - double-conversion=3.3.0=h59595ed_0 + - ecl=24.5.10=h0f3afd4_0 - eclib=20231212=h96f522a_0 - ecm=7.0.5=h9458935_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h59595ed_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h5888daf_0 - fflas-ffpack=2.5.0=h4f9960b_0 - - fftw=3.3.10=nompi_hf1063bd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h14ed4e7_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h7e30c49_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311h331c9d8_0 - - fortran-compiler=1.7.0=heb67821_1 + - fonttools=4.55.0=py311h2dc5d0c_0 + - fortran-compiler=1.8.0=h36df796_1 - fplll=5.4.5=h384768b_0 - fpylll=0.6.1=py311hcfae7cf_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=h267a509_2 - - fribidi=1.0.10=h36c2ea0_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he9a28a4_3 - - gap-defaults=4.12.2=ha770c72_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=h915e2ae_13 - - gcc_impl_linux-64=12.3.0=h58ffeeb_13 - - gcc_linux-64=12.3.0=h9528a6a_9 - - gengetopt=2.23=h9c3ff4c_0 - - gettext=0.22.5=h59595ed_2 - - gettext-tools=0.22.5=h59595ed_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h94f18e1_0 + - gap-defaults=4.13.1=ha770c72_0 + - gcc=13.3.0=h9576a4e_1 + - gcc_impl_linux-64=13.3.0=hfea6d02_1 + - gcc_linux-64=13.3.0=hc28eda2_7 - gf2x=1.3.0=ha476b99_2 - gfan=0.6.2=hb86e20a_1003 - - gfortran=12.3.0=h915e2ae_13 - - gfortran_impl_linux-64=12.3.0=h8f2110c_13 - - gfortran_linux-64=12.3.0=h5877db1_9 + - gfortran=13.3.0=h9576a4e_1 + - gfortran_impl_linux-64=13.3.0=h10434e7_1 + - gfortran_linux-64=13.3.0=hb919d3a_7 - giac=1.9.0.21=h673759e_1 - - giflib=5.2.2=hd590300_0 - givaro=4.2.0=hb789bce_0 - - glib=2.80.2=h8a4344b_1 - - glib-tools=2.80.2=h73ef956_1 - glpk=5.0=h445213a_0 - gmp=6.3.0=hac33072_2 - - gmpy2=2.1.5=py311hc4f1f91_1 + - gmpy2=2.1.5=py311h0f6cedb_2 - graphite2=1.3.13=h59595ed_1003 - gsl=2.7=he838d99_0 - - gst-plugins-base=1.24.5=hbaaba92_0 - - gstreamer=1.24.5=haf2f30d_0 - - gxx=12.3.0=h915e2ae_13 - - gxx_impl_linux-64=12.3.0=h2a574ab_13 - - gxx_linux-64=12.3.0=ha28b414_9 - - h11=0.14.0=pyhd8ed1ab_0 + - gxx=13.3.0=h9576a4e_1 + - gxx_impl_linux-64=13.3.0=hdbfa832_1 + - gxx_linux-64=13.3.0=h6834431_7 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=hfac3d4d_0 - - hatchling=1.25.0=pyhd8ed1ab_0 + - harfbuzz=9.0.0=hda332d3_1 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h59595ed_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hef0740d_1 + - icu=75.1=he02047a_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=he44f51b_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h623f65a_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh3099207_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=ha770c72_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311h38be061_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311h38be061_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-64=2.6.32=he073ed8_17 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kernel-headers_linux-64=3.10.0=he073ed8_18 - keyutils=1.6.1=h166bdaf_0 - - kiwisolver=1.4.5=py311h9547e67_1 - - krb5=1.21.2=h659d440_0 - - lame=3.100=h166bdaf_1003 + - kiwisolver=1.4.7=py311hd18a35c_0 + - krb5=1.21.3=h659f571_0 - lcalc=2.0.5=h5aac1b6_2 - lcms2=2.16=hb7c19ff_0 - - ld_impl_linux-64=2.40=hf3520f5_7 + - ld_impl_linux-64=2.43=h712a8e2_2 - lerc=4.0.0=h27087fc_0 - - libasprintf=0.22.5=h661eb56_2 - - libasprintf-devel=0.22.5=h661eb56_2 - - libatomic_ops=7.6.14=h166bdaf_0 - - libblas=3.9.0=20_linux64_openblas - - libboost=1.85.0=hba137d9_2 - - libboost-devel=1.85.0=h00ab1b0_2 - - libboost-headers=1.85.0=ha770c72_2 - - libbraiding=1.2=hcb278e6_0 + - libblas=3.9.0=25_linux64_openblas + - libboost=1.85.0=h0ccab89_4 + - libboost-devel=1.85.0=h00ab1b0_4 + - libboost-headers=1.85.0=ha770c72_4 + - libbraiding=1.3=h5888daf_0 - libbrial=1.2.12=h76af697_3 - - libbrotlicommon=1.1.0=hd590300_1 - - libbrotlidec=1.1.0=hd590300_1 - - libbrotlienc=1.1.0=hd590300_1 - - libcap=2.69=h0f662aa_0 - - libcblas=3.9.0=20_linux64_openblas - - libclang-cpp15=15.0.7=default_h127d8a8_5 - - libclang13=18.1.8=default_h6ae225f_0 + - libbrotlicommon=1.1.0=hb9d3cd8_2 + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=25_linux64_openblas + - libclang-cpp19.1=19.1.4=default_hb5137d0_0 + - libclang13=19.1.4=default_h9c6a7e4_0 - libcups=2.3.3=h4637d8d_4 - - libcurl=8.8.0=hca28451_0 - - libdeflate=1.20=hd590300_0 + - libcurl=8.10.1=hbbe4b11_0 + - libdeflate=1.22=hb9d3cd8_0 + - libdrm=2.4.123=hb9d3cd8_0 - libedit=3.1.20191231=he28a2e2_2 + - libegl=1.7.0=ha4b6fd6_2 - libev=4.33=hd590300_2 - - libevent=2.1.12=hf998b51_1 - - libexpat=2.6.2=h59595ed_0 + - libexpat=2.6.4=h5888daf_0 - libffi=3.4.2=h7f98852_5 - - libflac=1.4.3=h59595ed_0 - - libflint=3.0.1=h5f2e117_ntl_100 - - libgcc-devel_linux-64=12.3.0=h6b66f73_113 - - libgcc-ng=13.2.0=h77fa898_13 - - libgcrypt=1.10.3=hd590300_0 - - libgd=2.3.3=h119a65a_9 - - libgettextpo=0.22.5=h59595ed_2 - - libgettextpo-devel=0.22.5=h59595ed_2 - - libgfortran-ng=13.2.0=h69a702a_13 - - libgfortran5=13.2.0=h3d2ce59_13 - - libglib=2.80.2=h8a4344b_1 - - libgomp=13.2.0=h77fa898_13 - - libgpg-error=1.49=h4f305b6_0 + - libflint=3.0.1=h6fb9888_103 + - libgcc=14.2.0=h77fa898_1 + - libgcc-devel_linux-64=13.3.0=h84ea5a7_101 + - libgcc-ng=14.2.0=h69a702a_1 + - libgd=2.3.3=hd3e95f3_10 + - libgfortran=14.2.0=h69a702a_1 + - libgfortran-ng=14.2.0=h69a702a_1 + - libgfortran5=14.2.0=hd5240d6_1 + - libgl=1.7.0=ha4b6fd6_2 + - libglib=2.82.2=h2ff4ddf_0 + - libglvnd=1.7.0=ha4b6fd6_2 + - libglx=1.7.0=ha4b6fd6_2 + - libgomp=14.2.0=h77fa898_1 - libhomfly=1.02r6=hd590300_1 - - libhwloc=2.10.0=default_h5622ce7_1001 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_openblas - - liblapacke=3.9.0=20_linux64_openblas - - libllvm15=15.0.7=hb3ce162_4 - - libllvm18=18.1.8=hc9dba70_0 - - libnghttp2=1.58.0=h47da74e_1 + - liblapack=3.9.0=25_linux64_openblas + - liblapacke=3.9.0=25_linux64_openblas + - libllvm19=19.1.4=ha7bfdaf_1 + - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - - libogg=1.3.5=h4ab18f5_0 - - libopenblas=0.3.25=pthreads_h413a1c8_0 - - libopus=1.3.1=h7f98852_1 - - libpng=1.6.43=h2797004_0 - - libpq=16.3=ha72fbe1_0 - - libsanitizer=12.3.0=hb8811af_13 - - libsndfile=1.2.2=hc60ed4a_1 - - libsodium=1.0.18=h36c2ea0_1 - - libsqlite=3.46.0=hde9e2c9_0 - - libssh2=1.11.0=h0841786_0 - - libstdcxx-devel_linux-64=12.3.0=h6b66f73_113 - - libstdcxx-ng=13.2.0=hc0a3c3a_13 - - libsystemd0=255=h3516f8a_1 - - libtiff=4.6.0=h1dd3fc0_3 - - libtool=2.4.7=h27087fc_0 + - libntlm=1.4=h7f98852_1002 + - libopenblas=0.3.28=pthreads_h94d23a6_1 + - libopengl=1.7.0=ha4b6fd6_2 + - libpciaccess=0.18=hd590300_0 + - libpng=1.6.44=hadc24fc_0 + - libpq=17.2=h04577a9_0 + - libsanitizer=13.3.0=heb74ff8_1 + - libsodium=1.0.20=h4ab18f5_0 + - libsqlite=3.47.0=hadc24fc_1 + - libssh2=1.11.1=hf672d98_0 + - libstdcxx=14.2.0=hc0a3c3a_1 + - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101 + - libstdcxx-ng=14.2.0=h4852527_1 + - libtiff=4.7.0=he137b08_1 - libuuid=2.38.1=h0b41bf4_0 - - libuv=1.48.0=hd590300_0 - - libvorbis=1.3.7=h9c3ff4c_0 - - libwebp=1.4.0=h2c329e2_0 - libwebp-base=1.4.0=hd590300_0 - - libxcb=1.16=hd590300_0 + - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - libxkbcommon=1.7.0=h2c5496b_1 - - libxml2=2.12.7=hc051c1a_1 - - libzlib=1.3.1=h4ab18f5_1 + - libxml2=2.13.5=hb346dea_0 + - libxslt=1.1.39=h76b75d6_0 + - libzlib=1.3.1=hb9d3cd8_2 - linbox=1.7.0=ha329b40_0 - - llvm-openmp=18.1.8=hf5423f3_0 - - lrcalc=2.1=h59595ed_6 - - lz4-c=1.9.4=hcb278e6_0 + - llvm-openmp=19.1.4=h024ca30_0 + - lrcalc=2.1=h5888daf_7 - m4=1.4.18=h516909a_1001 - m4ri=20140914=hae5d5c5_1006 - m4rie=20150908=h267a509_1002 - - make=4.3=hd18ef5c_1 - - markupsafe=2.1.5=py311h459d7ec_0 - - mathjax=3.2.2=ha770c72_0 - - matplotlib=3.8.4=py311h38be061_2 - - matplotlib-base=3.8.4=py311ha4ca890_2 + - markupsafe=3.0.2=py311h2dc5d0c_0 + - matplotlib=3.9.2=py311h38be061_2 + - matplotlib-base=3.9.2=py311h2b939e6_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=hed6455c_2 - - memory-allocator=0.1.3=py311h459d7ec_0 - - metis=5.1.0=h59595ed_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=hfe3b2da_0 + - maxima=5.47.0=h75482ee_3 + - memory-allocator=0.1.3=py311h9ecbd09_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h24ddda3_1 - mpfi=1.5.4=h9f54685_1001 - - mpfr=4.2.1=h9458935_1 - - mpg123=1.32.6=h59595ed_0 + - mpfr=4.2.1=h90cbb55_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - - mysql-common=8.3.0=hf1915f5_4 - - mysql-libs=8.3.0=hca2cd23_4 + - mysql-common=9.0.1=h266115a_2 + - mysql-libs=9.0.1=he0572af_2 - nauty=2.8.8=hd590300_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h59595ed_0 + - ncurses=6.5=he02047a_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h297d8ca_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - nspr=4.35=h27087fc_0 - - nss=3.101=h593d115_0 - ntl=11.4.3=hef3c4d3_1 - numpy=1.26.4=py311h64a7726_0 - - openblas=0.3.25=pthreads_h7a3da1a_0 - - openjdk=21.0.2=haa376d0_0 + - openblas=0.3.28=pthreads_h6ec200e_1 - openjpeg=2.5.2=h488ebb8_0 - - openssl=3.3.1=h4ab18f5_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openldap=2.6.9=he970967_0 + - openssl=3.4.0=hb9d3cd8_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=h36c2ea0_0 - - pandoc=3.2.1=ha770c72_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h84a9a3c_0 - pari=2.15.5=h4d4ae9b_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=h7f98852_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h0f59acf_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=hba22ea6_2 - perl=5.32.1=7_hd590300_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311h82a398c_1 - - pip=24.0=pyhd8ed1ab_0 + - pillow=11.0.0=py311h49e9ac3_0 + - pip=24.3.1=pyh8b19718_0 - pixman=0.43.2=h59595ed_0 - - pkg-config=0.29.2=h36c2ea0_1008 + - pkg-config=0.29.2=h4bc722e_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=hd590300_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h6ec01c2_1006 - pplpy=0.8.9=py311ha9f9f00_1 - primecount=7.9=hcb278e6_0 - primecountpy=0.1.0=py311h9547e67_4 - primesieve=11.1=h59595ed_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311h331c9d8_0 - - pthread-stubs=0.4=h36c2ea0_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py311h9ecbd09_0 + - pthread-stubs=0.4=hb9d3cd8_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pulseaudio-client=17.0=hb77b528_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311h9547e67_0 - - pybind11-global=2.12.0=py311h9547e67_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyqt=5.15.9=py311hf0fb5b6_5 - - pyqt5-sip=12.12.2=py311hb755f60_5 - - pyrsistent=0.20.0=py311h459d7ec_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 + - pyside6=6.8.0.2=py311h9053184_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.11.9=hb806964_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311hb755f60_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311h92ebd52_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311h38be061_4 - - pyyaml=6.0.1=py311h459d7ec_1 - - pyzmq=26.0.3=py311h08a0b41_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.11.10=hc5c86c4_3_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py311hfdbb021_7 + - python_abi=3.11=5_cp311 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py311h7deb3e3_3 - qd=2.3.22=h2cc385e_1004 - - qhull=2020.2=h4bd325d_2 - - qt-main=5.15.8=ha2b5568_22 - - r-base=4.3.3=he2d9a6e_3 - - r-lattice=0.22_6=r43h57805ef_0 + - qhull=2020.2=h434a139_5 + - qt6-main=6.8.0=h6e8976b_0 - readline=8.2=h8228510_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hd590300_0 - - rpds-py=0.18.1=py311h5ecf98a_0 - - rpy2=3.5.11=py311r43h1f0f07a_3 - rw=0.9=hd590300_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py311h64a7726_0 - - sed=4.8=he412f7d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h33f5c3f_1 - - sip=6.7.12=py311hb755f60_0 + - scipy=1.14.1=py311he9a78e4_1 + - setuptools=75.6.0=pyhff2d567_1 + - singular=4.4.0=h8a38e62_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h6d4b2fc_0 + - sqlite=3.47.0=h9eae976_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf4753ba_1 - symmetrica=3.0.1=hcb278e6_0 - sympow=2.023.6=hc6ab17c_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-64=2.12=he073ed8_17 + - sympy=1.13.3=pyh2585a3b_104 + - sysroot_linux-64=2.17=h4a8ded7_18 - tachyon=0.99b6=hba7d16a_1002 - - tar=1.34=hb2e2bae_1 - - tbb=2021.12.0=h297d8ca_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h0f457ee_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - tk=8.6.13=noxft_h4845f30_101 - - tktable=2.10=h8bc8fbc_6 - - toml=0.10.2=pyhd8ed1ab_0 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311h331c9d8_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py311h9ecbd09_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311h38be061_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py311h9ecbd09_1 + - urllib3=2.2.3=pyhd8ed1ab_0 + - wayland=1.23.1=h3e06ad9_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 - xcb-util=0.4.1=hb711507_2 + - xcb-util-cursor=0.1.5=hb9d3cd8_0 - xcb-util-image=0.4.0=hb711507_2 - xcb-util-keysyms=0.4.1=hb711507_0 - xcb-util-renderutil=0.3.10=hb711507_0 - xcb-util-wm=0.4.2=hb711507_0 - - xkeyboard-config=2.42=h4ab18f5_0 - - xorg-fixesproto=5.0=h7f98852_1002 - - xorg-inputproto=2.3.2=h7f98852_1002 - - xorg-kbproto=1.0.7=h7f98852_1002 - - xorg-libice=1.1.1=hd590300_0 - - xorg-libsm=1.2.4=h7391055_0 - - xorg-libx11=1.8.9=hb711507_1 - - xorg-libxau=1.0.11=hd590300_0 - - xorg-libxdmcp=1.1.3=h7f98852_0 - - xorg-libxext=1.3.4=h0b41bf4_2 - - xorg-libxfixes=5.0.3=h7f98852_1004 - - xorg-libxi=1.7.10=h7f98852_0 - - xorg-libxrender=0.9.11=hd590300_0 - - xorg-libxt=1.3.0=hd590300_1 - - xorg-libxtst=1.2.3=h7f98852_1002 - - xorg-recordproto=1.14.2=h7f98852_1002 - - xorg-renderproto=0.11.1=h7f98852_1002 - - xorg-xextproto=7.3.0=h0b41bf4_1003 - - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - - xorg-xproto=7.0.31=h7f98852_1007 + - xkeyboard-config=2.43=hb9d3cd8_0 + - xorg-libice=1.1.1=hb9d3cd8_1 + - xorg-libsm=1.2.4=he73a12e_1 + - xorg-libx11=1.8.10=h4f16b4b_0 + - xorg-libxau=1.0.11=hb9d3cd8_1 + - xorg-libxcomposite=0.4.6=hb9d3cd8_2 + - xorg-libxcursor=1.2.3=hb9d3cd8_0 + - xorg-libxdamage=1.1.6=hb9d3cd8_0 + - xorg-libxdmcp=1.1.5=hb9d3cd8_0 + - xorg-libxext=1.3.6=hb9d3cd8_0 + - xorg-libxfixes=6.0.1=hb9d3cd8_0 + - xorg-libxi=1.8.2=hb9d3cd8_0 + - xorg-libxrandr=1.5.4=hb9d3cd8_0 + - xorg-libxrender=0.9.11=hb9d3cd8_1 + - xorg-libxtst=1.2.5=hb9d3cd8_3 + - xorg-libxxf86vm=1.1.5=hb9d3cd8_4 + - xorg-xorgproto=2024.1=hb9d3cd8_1 - xz=5.2.6=h166bdaf_0 - - yaml=0.2.5=h7f98852_2 - - zeromq=4.3.5=h75354e8_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h4ab18f5_1 + - zeromq=4.3.5=h3b0a872_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=hb9d3cd8_2 + - zstandard=0.23.0=py311hbc35293_1 - zstd=1.5.6=ha6fb4c9_0 diff --git a/environment-3.11-macos-x86_64.yml b/environment-3.11-macos-x86_64.yml index ddfef2df9d4..bb44b958990 100644 --- a/environment-3.11-macos-x86_64.yml +++ b/environment-3.11-macos-x86_64.yml @@ -1,423 +1,288 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: osx-64 -# input_hash: 2d3e06919a9241aca6e25ca728e3013423030e7220d74f404ad621f0ad0ff5bd +# input_hash: 2555438d4f4434f9195688dd6b45c84e2c965157dd440bc593c0f833080e765a channels: - conda-forge dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 + - alabaster=1.0.0=pyhd8ed1ab_0 - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311h2725bcf_4 - arpack=3.9.1=nompi_hf81eadf_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321hed12c24_1 - - automake=1.16.5=pl5321h694c41f_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h0d85af4_0 + - automake=1.17=pl5321h694c41f_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=h940c156_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osx64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h07eb623_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_osx64_openblas + - boost-cpp=1.85.0=hfcd56d9_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h0dc2134_1 - - brotli-bin=1.1.0=h0dc2134_1 - - brotli-python=1.1.0=py311hdf8f085_1 - - bwidget=1.9.14=h694c41f_1 - - bzip2=1.0.8=h10d778d_5 - - c-ares=1.28.1=h10d778d_0 - - c-compiler=1.7.0=h282daa2_1 - - ca-certificates=2024.6.2=h8857fd0_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=h9f650ed_2 - - cctools=986=h40f6528_0 - - cctools_osx-64=986=ha1c5b94_0 + - brotli=1.1.0=h00291cd_2 + - brotli-bin=1.1.0=h00291cd_2 + - brotli-python=1.1.0=py311hd89902b_2 + - bzip2=1.0.8=hfdf4475_7 + - c-ares=1.34.3=hf13058a_1 + - c-compiler=1.8.0=hfc4bf79_1 + - ca-certificates=2024.8.30=h8857fd0_0 + - cctools=1010.6=h5b2de21_2 + - cctools_osx-64=1010.6=hea4301f_2 - cddlib=1!0.94m=h0f52abe_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311hc0b63fd_0 - - chardet=5.2.0=py311h6eed73b_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_ha3b9224_8 - - clang-16=16.0.6=default_h4c8afb6_8 - - clang_impl_osx-64=16.0.6=h8787910_16 - - clang_osx-64=16.0.6=hb91bd55_16 - - clangxx=16.0.6=default_ha3b9224_8 - - clangxx_impl_osx-64=16.0.6=h6d92fbe_16 - - clangxx_osx-64=16.0.6=hb91bd55_16 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py311h137bacd_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 + - clang=17.0.6=default_he371ed4_7 + - clang-17=17.0.6=default_hb173f14_7 + - clang_impl_osx-64=17.0.6=h1af8efd_23 + - clang_osx-64=17.0.6=h7e5c614_23 + - clangxx=17.0.6=default_he371ed4_7 + - clangxx_impl_osx-64=17.0.6=hc3430b7_23 + - clangxx_osx-64=17.0.6=h7e5c614_23 - cliquer=1.22=h10d778d_1 - - cmake=3.29.6=h749d262_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311h6eed73b_0 - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=ha38d28d_2 - - compiler-rt_osx-64=16.0.6=ha38d28d_2 - - compilers=1.7.0=h694c41f_1 - - contourpy=1.2.1=py311h1d816ee_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=hea67d85_0 - - cvxopt=1.3.2=py311he94735a_2 - - cxx-compiler=1.7.0=h7728843_1 + - compiler-rt=17.0.6=h1020d70_2 + - compiler-rt_osx-64=17.0.6=hf2b8a54_2 + - contourpy=1.3.1=py311h4e34fa0_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py311ha3cf9ac_0 + - cpython=3.11.10=py311hd8ed1ab_3 + - cxx-compiler=1.8.0=h385f146_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py311h4fde0ae_0 - cysignals=1.11.2=py311h8a58447_3 - - cython=3.0.10=py311hdd0406b_0 - - debugpy=1.8.1=py311hdd0406b_0 + - cython=3.0.11=py311h4cb39f0_3 + - debugpy=1.8.9=py311hc356e98_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h6e329d1_1203 - - ecl=23.9.9=h2b27fa8_0 + - ecl=24.5.10=h56bac16_0 - eclib=20231212=h02435c3_0 - ecm=7.0.5=h4f6b447_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h73e2aa4_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h240833e_0 - fflas-ffpack=2.5.0=h5898d61_0 - - fftw=3.3.10=nompi_h292e606_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h5bb23bf_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h37eeddb_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311h72ae277_0 - - fortran-compiler=1.7.0=h6c2ab21_1 + - fonttools=4.55.0=py311ha3cf9ac_0 + - fortran-compiler=1.8.0=h33d1f46_1 - fplll=5.4.5=hb7981ad_0 - fpylll=0.6.1=py311h85fbf69_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=h60636b9_2 - - fribidi=1.0.10=hbcb3906_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=hc16eb5f_3 - - gap-defaults=4.12.2=h694c41f_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=he49afe7_0 - - gettext=0.22.5=h5ff76d1_2 - - gettext-tools=0.22.5=h5ff76d1_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h2299be9_0 + - gap-defaults=4.13.1=h694c41f_0 + - gettext=0.22.5=hdfe23c8_3 + - gettext-tools=0.22.5=hdfe23c8_3 - gf2x=1.3.0=hb2a7efb_2 - gfan=0.6.2=hd793b56_1003 - - gfortran=12.3.0=h2c809b3_1 - - gfortran_impl_osx-64=12.3.0=hc328e78_3 - - gfortran_osx-64=12.3.0=h18f7dce_1 + - gfortran=13.2.0=h2c809b3_1 + - gfortran_impl_osx-64=13.2.0=h2bc304d_3 + - gfortran_osx-64=13.2.0=h18f7dce_1 - giac=1.9.0.21=h92f3f65_1 - - giflib=5.2.2=h10d778d_0 - givaro=4.2.0=h1b3d6f7_0 - glpk=5.0=h3cb5acd_0 - gmp=6.3.0=hf036a51_2 - - gmpy2=2.1.5=py311hab17429_1 - - graphite2=1.3.13=h73e2aa4_1003 + - gmpy2=2.1.5=py311hf411314_2 - gsl=2.7=h93259b0_0 - - h11=0.14.0=pyhd8ed1ab_0 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h053f038_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hf5e326d_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hde4452d_1 + - icu=75.1=h120a0e1_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h5479cbe_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h61918c1_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh57ce528_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 - isl=0.26=imath32_h2e86a7b_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.9=h694c41f_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311h6eed73b_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311h6eed73b_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kiwisolver=1.4.5=py311h5fe6e05_1 - - krb5=1.21.2=hb884880_0 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kiwisolver=1.4.7=py311hf2f7c97_0 + - krb5=1.21.3=h37d8d59_0 - lcalc=2.0.5=h547a6ed_2 - lcms2=2.16=ha2f27b4_0 - - ld64=711=ha02d983_0 - - ld64_osx-64=711=ha20a434_0 + - ld64=951.9=h0a3eb4e_2 + - ld64_osx-64=951.9=h5ffbe8e_2 - lerc=4.0.0=hb486fe8_0 - - libasprintf=0.22.5=h5ff76d1_2 - - libasprintf-devel=0.22.5=h5ff76d1_2 - - libatomic_ops=7.6.14=hb7f2c08_0 - - libblas=3.9.0=20_osx64_openblas - - libboost=1.85.0=h739af76_2 - - libboost-devel=1.85.0=h2b186f8_2 - - libboost-headers=1.85.0=h694c41f_2 - - libbraiding=1.2=hf0c8a7f_0 + - libasprintf=0.22.5=hdfe23c8_3 + - libasprintf-devel=0.22.5=hdfe23c8_3 + - libblas=3.9.0=25_osx64_openblas + - libboost=1.85.0=hcca3243_4 + - libboost-devel=1.85.0=h2b186f8_4 + - libboost-headers=1.85.0=h694c41f_4 + - libbraiding=1.3=h240833e_0 - libbrial=1.2.12=h81e9653_3 - - libbrotlicommon=1.1.0=h0dc2134_1 - - libbrotlidec=1.1.0=h0dc2134_1 - - libbrotlienc=1.1.0=h0dc2134_1 - - libcblas=3.9.0=20_osx64_openblas - - libclang-cpp16=16.0.6=default_h4c8afb6_8 - - libcurl=8.8.0=hf9fcc65_0 - - libcxx=17.0.6=h88467a6_0 - - libdeflate=1.20=h49d49c5_0 + - libbrotlicommon=1.1.0=h00291cd_2 + - libbrotlidec=1.1.0=h00291cd_2 + - libbrotlienc=1.1.0=h00291cd_2 + - libcblas=3.9.0=25_osx64_openblas + - libclang-cpp17=17.0.6=default_hb173f14_7 + - libcurl=8.10.1=h58e7537_0 + - libcxx=19.1.4=hf95d169_0 + - libcxx-devel=17.0.6=h8f8a49f_6 + - libdeflate=1.22=h00291cd_0 - libedit=3.1.20191231=h0678c8f_2 - libev=4.33=h10d778d_2 - - libexpat=2.6.2=h73e2aa4_0 + - libexpat=2.6.4=h240833e_0 - libffi=3.4.2=h0d85af4_5 - - libflint=3.0.1=h5d15de0_ntl_100 - - libgd=2.3.3=h0dceb68_9 - - libgettextpo=0.22.5=h5ff76d1_2 - - libgettextpo-devel=0.22.5=h5ff76d1_2 + - libflint=3.0.1=h1d27844_103 + - libgd=2.3.3=h2e77e4f_10 + - libgettextpo=0.22.5=hdfe23c8_3 + - libgettextpo-devel=0.22.5=hdfe23c8_3 - libgfortran=5.0.0=13_2_0_h97931a8_3 - - libgfortran-devel_osx-64=12.3.0=h0b6f5ec_3 + - libgfortran-devel_osx-64=13.2.0=h80d4556_3 - libgfortran5=13.2.0=h2873a65_3 - - libglib=2.80.2=h736d271_1 - libhomfly=1.02r6=h10d778d_1 - - libhwloc=2.10.0=default_h456cccd_1001 - libiconv=1.17=hd75f5a5_2 - - libintl=0.22.5=h5ff76d1_2 - - libintl-devel=0.22.5=h5ff76d1_2 + - libintl=0.22.5=hdfe23c8_3 + - libintl-devel=0.22.5=hdfe23c8_3 - libjpeg-turbo=3.0.0=h0dc2134_1 - - liblapack=3.9.0=20_osx64_openblas - - liblapacke=3.9.0=20_osx64_openblas - - libllvm16=16.0.6=hbedff68_3 - - libnghttp2=1.58.0=h64cf6d3_1 - - libopenblas=0.3.25=openmp_hfef2a42_0 - - libpng=1.6.43=h92b6c6a_0 - - libsodium=1.0.18=hbcb3906_1 - - libsqlite=3.46.0=h1b8f9f3_0 - - libssh2=1.11.0=hd019ec5_0 - - libtiff=4.6.0=h129831d_3 - - libtool=2.4.7=hf0c8a7f_0 - - libuv=1.48.0=h67532ce_0 - - libwebp=1.4.0=hc207709_0 + - liblapack=3.9.0=25_osx64_openblas + - liblapacke=3.9.0=25_osx64_openblas + - libllvm17=17.0.6=hbedff68_1 + - libnghttp2=1.64.0=hc7306c3_0 + - libopenblas=0.3.28=openmp_hbf64a52_1 + - libpng=1.6.44=h4b8f8c9_0 + - libsodium=1.0.20=hfdf4475_0 + - libsqlite=3.47.0=h2f8c449_1 + - libssh2=1.11.1=h3dc7d44_0 + - libtiff=4.7.0=h583c2ba_1 - libwebp-base=1.4.0=h10d778d_0 - - libxcb=1.16=h0dc2134_0 - - libxml2=2.12.7=h3e169fe_1 - - libzlib=1.3.1=h87427d6_1 + - libxcb=1.17.0=hf1f96e2_0 + - libxml2=2.13.5=h495214b_0 + - libzlib=1.3.1=hd23fc13_2 - linbox=1.7.0=h7061c92_0 - - llvm-openmp=18.1.8=h15ab845_0 - - llvm-tools=16.0.6=hbedff68_3 - - lrcalc=2.1=h73e2aa4_6 + - llvm-openmp=19.1.4=ha54dae1_0 + - llvm-tools=17.0.6=hbedff68_1 + - lrcalc=2.1=hac325c4_7 - m4=1.4.18=haf1e3a3_1001 - m4ri=20140914=hd82a5f3_1006 - m4rie=20150908=hc616cfc_1002 - - make=4.3=h22f3db7_1 - - markupsafe=2.1.5=py311he705e18_0 - - mathjax=3.2.2=h694c41f_0 - - matplotlib=3.8.4=py311h6eed73b_2 - - matplotlib-base=3.8.4=py311hff79762_2 + - markupsafe=3.0.2=py311h8b4e8a7_0 + - matplotlib=3.9.2=py311h6eed73b_2 + - matplotlib-base=3.9.2=py311h8b21175_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2b27fa8_2 - - memory-allocator=0.1.3=py311h2725bcf_0 - - metis=5.1.0=he965462_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=h81bd1dd_0 + - maxima=5.47.0=h3080a4d_3 + - memory-allocator=0.1.3=py311h3336109_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h9d8efa1_1 - mpfi=1.5.4=h52b28e3_1001 - - mpfr=4.2.1=h4f6b447_1 + - mpfr=4.2.1=haed47dc_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - nauty=2.8.8=h10d778d_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h5846eda_0 + - ncurses=6.5=hf036a51_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h3c5361c_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=h0ab3c2f_1 - numpy=1.26.4=py311hc43a94b_0 - - openblas=0.3.25=openmp_h6794695_0 - - openjdk=22.0.1=h2d185b6_0 + - openblas=0.3.28=openmp_h30af337_1 - openjpeg=2.5.2=h7310d3a_0 - - openssl=3.3.1=h87427d6_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openssl=3.4.0=hd471939_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=hbcb3906_0 - - pandoc=3.2.1=h694c41f_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h880b76c_0 - pari=2.15.5=h7ba67ff_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=hbcf498f_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h7634a1b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - perl=5.32.1=7_h10d778d_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311h2755ac0_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h73e2aa4_0 - - pkg-config=0.29.2=ha3d46e9_1008 + - pillow=11.0.0=py311h1f68098_0 + - pip=24.3.1=pyh8b19718_0 + - pkg-config=0.29.2=hf7e621a_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h10d778d_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=ha60d53e_1006 - pplpy=0.8.9=py311h922ec50_1 - primecount=7.6=ha894c9a_0 - primecountpy=0.1.0=py311h5fe6e05_4 - primesieve=11.0=hf0c8a7f_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311h72ae277_0 - - pthread-stubs=0.4=hc929b4f_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py311h1314207_0 + - pthread-stubs=0.4=h00291cd_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311h1d816ee_0 - - pybind11-global=2.12.0=py311h1d816ee_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py311h9d23797_0 - - pyobjc-framework-cocoa=10.3.1=py311h9d23797_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py311he705e18_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.11.9=h657bba9_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311hdd0406b_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311ha853786_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311h6eed73b_4 - - pyyaml=6.0.1=py311h2725bcf_1 - - pyzmq=26.0.3=py311h89e2aaa_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.11.10=ha513fb2_3_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py311hd89902b_7 + - python_abi=3.11=5_cp311 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py311h4d3da15_3 - qd=2.3.22=h2beb688_1004 - - qhull=2020.2=h940c156_2 - - r-base=4.3.3=h4648a1f_3 - - r-lattice=0.22_6=r43hb2c329c_0 + - qhull=2020.2=h3c5361c_5 - readline=8.2=h9e318b2_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h0dc2134_0 - - rpds-py=0.18.1=py311h295b1db_0 - - rpy2=3.5.11=py311r43h4a70a88_3 - rw=0.9=h10d778d_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py311he0bea55_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 + - scipy=1.14.1=py311hed734c1_1 + - setuptools=75.6.0=pyhff2d567_1 - sigtool=0.1.3=h88f4db0_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h0d51a9f_1 + - singular=4.4.0=h0c52cc7_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h28673e1_0 + - sqlite=3.47.0=h6285a30_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hd2b2131_1 - symmetrica=3.0.1=hf0c8a7f_0 - sympow=2.023.6=h115ba6a_3 - - sympy=1.12.1=pypyh2585a3b_103 + - sympy=1.13.3=pyh2585a3b_104 - tachyon=0.99b6=h3a1d103_1002 - - tapi=1100.0.11=h9ce4665_0 - - tar=1.34=hcb2f6ea_1 - - tbb=2021.12.0=h3c5361c_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321hc47821c_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 + - tapi=1300.6.5=h390ca13_0 - tk=8.6.13=h1abcd95_1 - - tktable=2.10=hba9d6f1_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311h72ae277_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py311h4d7f069_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311h6eed73b_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py311h1314207_1 + - urllib3=2.2.3=pyhd8ed1ab_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=h0dc2134_0 - - xorg-libxdmcp=1.1.3=h35c211d_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xorg-libxau=1.0.11=h00291cd_1 + - xorg-libxdmcp=1.1.5=h00291cd_0 - xz=5.2.6=h775f41a_0 - - yaml=0.2.5=h0d85af4_2 - - zeromq=4.3.5=hde137ed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h87427d6_1 + - zeromq=4.3.5=h7130eaa_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=hd23fc13_2 + - zstandard=0.23.0=py311hdf6fcd6_1 - zstd=1.5.6=h915ae27_0 diff --git a/environment-3.11-macos.yml b/environment-3.11-macos.yml index 8ae6a449026..7a5da98494f 100644 --- a/environment-3.11-macos.yml +++ b/environment-3.11-macos.yml @@ -1,423 +1,290 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: osx-arm64 -# input_hash: fd2f5edaba32b4c1f22d499071de74bde7eb804a27ac64e89ee82df0d733a829 +# input_hash: b9cf5847a6035915dcfdcda638f2e631b4f5776a7a21e332d8bc6ef819fc55c3 channels: - conda-forge dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 + - alabaster=1.0.0=pyhd8ed1ab_0 - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311heffc1b2_4 - arpack=3.9.1=nompi_h593882a_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321hcd07c0c_1 - - automake=1.16.5=pl5321hce30654_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h3422bc3_0 + - automake=1.17=pl5321hce30654_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=hc021e02_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osxarm64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=hca5e981_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_osxarm64_openblas + - boost-cpp=1.85.0=h103c1d6_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hb547adb_1 - - brotli-bin=1.1.0=hb547adb_1 - - brotli-python=1.1.0=py311ha891d26_1 - - bwidget=1.9.14=hce30654_1 - - bzip2=1.0.8=h93a5062_5 - - c-ares=1.28.1=h93a5062_0 - - c-compiler=1.7.0=h6aa9301_1 - - ca-certificates=2024.6.2=hf0a4a13_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=hc6c324b_2 - - cctools=986=h4faf515_0 - - cctools_osx-arm64=986=h62378fb_0 + - brotli=1.1.0=hd74edd7_2 + - brotli-bin=1.1.0=hd74edd7_2 + - brotli-python=1.1.0=py311h3f08180_2 + - bzip2=1.0.8=h99b78c6_7 + - c-ares=1.34.3=h5505292_1 + - c-compiler=1.8.0=hf48404e_1 + - ca-certificates=2024.8.30=hf0a4a13_0 + - cctools=1010.6=hf67d63f_2 + - cctools_osx-arm64=1010.6=h623e0ac_2 - cddlib=1!0.94m=h6d7a090_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311h4a08483_0 - - chardet=5.2.0=py311h267d04e_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_h095aff0_8 - - clang-16=16.0.6=default_hb63da90_8 - - clang_impl_osx-arm64=16.0.6=hc421ffc_16 - - clang_osx-arm64=16.0.6=h54d7cd3_16 - - clangxx=16.0.6=default_h095aff0_8 - - clangxx_impl_osx-arm64=16.0.6=hcd7bac0_16 - - clangxx_osx-arm64=16.0.6=h54d7cd3_16 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py311h3a79f62_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 + - clang=17.0.6=default_h360f5da_7 + - clang-17=17.0.6=default_h146c034_7 + - clang_impl_osx-arm64=17.0.6=he47c785_23 + - clang_osx-arm64=17.0.6=h07b0088_23 + - clangxx=17.0.6=default_h360f5da_7 + - clangxx_impl_osx-arm64=17.0.6=h50f59cd_23 + - clangxx_osx-arm64=17.0.6=h07b0088_23 - cliquer=1.22=h93a5062_1 - - cmake=3.29.6=had79d8f_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311h267d04e_0 - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=h3808999_2 - - compiler-rt_osx-arm64=16.0.6=h3808999_2 - - compilers=1.7.0=hce30654_1 - - contourpy=1.2.1=py311hcc98501_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=h653d890_0 - - cvxopt=1.3.2=py311h77cf4c7_2 - - cxx-compiler=1.7.0=h2ffa867_1 + - compiler-rt=17.0.6=h856b3c1_2 + - compiler-rt_osx-arm64=17.0.6=h832e737_2 + - contourpy=1.3.1=py311h210dab8_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py311h4921393_0 + - cpython=3.11.10=py311hd8ed1ab_3 + - cxx-compiler=1.8.0=h18dbf2f_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py311h2c49a9d_0 - cysignals=1.11.2=py311he42fc87_3 - - cython=3.0.10=py311h92babd0_0 - - debugpy=1.8.1=py311h92babd0_0 + - cython=3.0.11=py311hf7f79b8_3 + - debugpy=1.8.9=py311h155a34a_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h9397a75_1203 - ecl=23.9.9=h1d9728a_0 - eclib=20231212=h7f07de4_0 - ecm=7.0.5=h41d338b_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=hebf3989_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h286801f_0 - fflas-ffpack=2.5.0=h4bc3318_0 - - fftw=3.3.10=nompi_h6637ab6_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h82840c6_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h1383a14_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311hd3f4193_0 - - fortran-compiler=1.7.0=hafb19e3_1 + - fonttools=4.55.0=py311h4921393_0 + - fortran-compiler=1.8.0=hc3477c4_1 - fplll=5.4.5=hb7d509d_0 - fpylll=0.6.1=py311h341b96b_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=hadb7bae_2 - - fribidi=1.0.10=h27ca646_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he8f4e70_3 - - gap-defaults=4.12.2=hce30654_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=hbdafb3b_0 - - gettext=0.22.5=h8fbad5d_2 - - gettext-tools=0.22.5=h8fbad5d_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h4cbeff9_0 + - gap-defaults=4.13.1=hce30654_0 + - gettext=0.22.5=h8414b35_3 + - gettext-tools=0.22.5=h8414b35_3 - gf2x=1.3.0=hdaa854c_2 - gfan=0.6.2=hec08f5c_1003 - - gfortran=12.3.0=h1ca8e4b_1 - - gfortran_impl_osx-arm64=12.3.0=h53ed385_3 - - gfortran_osx-arm64=12.3.0=h57527a5_1 + - gfortran=13.2.0=h1ca8e4b_1 + - gfortran_impl_osx-arm64=13.2.0=h252ada1_3 + - gfortran_osx-arm64=13.2.0=h57527a5_1 - giac=1.9.0.21=h1c96721_1 - - giflib=5.2.2=h93a5062_0 - givaro=4.2.0=h018886a_0 - glpk=5.0=h6d7a090_0 - gmp=6.3.0=h7bae524_2 - - gmpy2=2.1.5=py311h1e33d93_1 - - graphite2=1.3.13=hebf3989_1003 + - gmpy2=2.1.5=py311hb5ce3a2_2 - gsl=2.7=h6e638da_0 - - h11=0.14.0=pyhd8ed1ab_0 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h1836168_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hc8870d7_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h762ac30_1 + - icu=75.1=hfee45f7_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h3fe6531_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=hd73f12c_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh57ce528_0 + - ipython=8.29.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 - isl=0.26=imath32_h347afa1_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=hce30654_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311h267d04e_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311h267d04e_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kiwisolver=1.4.5=py311he4fd1f5_1 - - krb5=1.21.2=h92f50d5_0 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kiwisolver=1.4.7=py311h2c37856_0 + - krb5=1.21.3=h237132a_0 - lcalc=2.0.5=h4a402bc_2 - lcms2=2.16=ha0e7c42_0 - - ld64=711=h634c8be_0 - - ld64_osx-arm64=711=ha4bd21c_0 + - ld64=951.9=h39a299f_2 + - ld64_osx-arm64=951.9=h3f9b568_2 - lerc=4.0.0=h9a09cb3_0 - - libasprintf=0.22.5=h8fbad5d_2 - - libasprintf-devel=0.22.5=h8fbad5d_2 - - libatomic_ops=7.6.14=h1a8c8d9_0 - - libblas=3.9.0=20_osxarm64_openblas - - libboost=1.85.0=h17eb2be_2 - - libboost-devel=1.85.0=hf450f58_2 - - libboost-headers=1.85.0=hce30654_2 - - libbraiding=1.2=hb7217d7_0 + - libasprintf=0.22.5=h8414b35_3 + - libasprintf-devel=0.22.5=h8414b35_3 + - libblas=3.9.0=25_osxarm64_openblas + - libboost=1.85.0=hf763ba5_4 + - libboost-devel=1.85.0=hf450f58_4 + - libboost-headers=1.85.0=hce30654_4 + - libbraiding=1.3=h286801f_0 - libbrial=1.2.12=h56a29cd_3 - - libbrotlicommon=1.1.0=hb547adb_1 - - libbrotlidec=1.1.0=hb547adb_1 - - libbrotlienc=1.1.0=hb547adb_1 - - libcblas=3.9.0=20_osxarm64_openblas - - libclang-cpp16=16.0.6=default_hb63da90_8 - - libcurl=8.8.0=h7b6f9a7_0 - - libcxx=17.0.6=h5f092b4_0 - - libdeflate=1.20=h93a5062_0 + - libbrotlicommon=1.1.0=hd74edd7_2 + - libbrotlidec=1.1.0=hd74edd7_2 + - libbrotlienc=1.1.0=hd74edd7_2 + - libcblas=3.9.0=25_osxarm64_openblas + - libclang-cpp17=17.0.6=default_h146c034_7 + - libcurl=8.10.1=h13a7ad3_0 + - libcxx=19.1.4=ha82da77_0 + - libcxx-devel=17.0.6=h86353a2_6 + - libdeflate=1.22=hd74edd7_0 - libedit=3.1.20191231=hc8eb9b7_2 - libev=4.33=h93a5062_2 - - libexpat=2.6.2=hebf3989_0 + - libexpat=2.6.4=h286801f_0 - libffi=3.4.2=h3422bc3_5 - - libflint=3.0.1=h28749a5_ntl_100 - - libgd=2.3.3=hfdf3952_9 - - libgettextpo=0.22.5=h8fbad5d_2 - - libgettextpo-devel=0.22.5=h8fbad5d_2 + - libflint=3.0.1=he28cf6d_103 + - libgd=2.3.3=hac1b3a8_10 + - libgettextpo=0.22.5=h8414b35_3 + - libgettextpo-devel=0.22.5=h8414b35_3 - libgfortran=5.0.0=13_2_0_hd922786_3 - - libgfortran-devel_osx-arm64=12.3.0=hc62be1c_3 + - libgfortran-devel_osx-arm64=13.2.0=h5d7a38c_3 - libgfortran5=13.2.0=hf226fd6_3 - - libglib=2.80.2=h59d46d9_1 + - libglib=2.82.2=h07bd6cf_0 - libhomfly=1.02r6=h93a5062_1 - - libhwloc=2.10.0=default_h7685b71_1001 - libiconv=1.17=h0d3ecfb_2 - - libintl=0.22.5=h8fbad5d_2 - - libintl-devel=0.22.5=h8fbad5d_2 + - libintl=0.22.5=h8414b35_3 + - libintl-devel=0.22.5=h8414b35_3 - libjpeg-turbo=3.0.0=hb547adb_1 - - liblapack=3.9.0=20_osxarm64_openblas - - liblapacke=3.9.0=20_osxarm64_openblas - - libllvm16=16.0.6=haab561b_3 - - libnghttp2=1.58.0=ha4dd798_1 - - libopenblas=0.3.25=openmp_h6c19121_0 - - libpng=1.6.43=h091b4b1_0 - - libsodium=1.0.18=h27ca646_1 - - libsqlite=3.46.0=hfb93653_0 - - libssh2=1.11.0=h7a5bd25_0 - - libtiff=4.6.0=h07db509_3 - - libtool=2.4.7=hb7217d7_0 - - libuv=1.48.0=h93a5062_0 - - libwebp=1.4.0=h54798ee_0 + - liblapack=3.9.0=25_osxarm64_openblas + - liblapacke=3.9.0=25_osxarm64_openblas + - libllvm17=17.0.6=h5090b49_2 + - libnghttp2=1.64.0=h6d7220d_0 + - libopenblas=0.3.28=openmp_hf332438_1 + - libpng=1.6.44=hc14010f_0 + - libsodium=1.0.20=h99b78c6_0 + - libsqlite=3.47.0=hbaaea75_1 + - libssh2=1.11.1=h9cc3647_0 + - libtiff=4.7.0=hfce79cd_1 - libwebp-base=1.4.0=h93a5062_0 - - libxcb=1.16=hf2054a2_0 - - libxml2=2.12.7=ha661575_1 - - libzlib=1.3.1=hfb2fe0b_1 + - libxcb=1.17.0=hdb1d25a_0 + - libxml2=2.13.5=hbbdcc80_0 + - libzlib=1.3.1=h8359307_2 - linbox=1.7.0=h3afee3a_0 - - llvm-openmp=18.1.8=hde57baf_0 - - llvm-tools=16.0.6=haab561b_3 - - lrcalc=2.1=hebf3989_6 + - llvm-openmp=19.1.4=hdb05f8b_0 + - llvm-tools=17.0.6=h5090b49_2 + - lrcalc=2.1=hf9b8971_7 - m4=1.4.18=h642e427_1001 - m4ri=20140914=hc97c1ff_1006 - m4rie=20150908=h22b9e9d_1002 - - make=4.3=he57ea6c_1 - - markupsafe=2.1.5=py311h05b510d_0 - - mathjax=3.2.2=hce30654_0 - - matplotlib=3.8.4=py311ha1ab1f8_2 - - matplotlib-base=3.8.4=py311h000fb6e_2 + - markupsafe=3.0.2=py311h56c23cb_0 + - matplotlib=3.9.2=py311ha1ab1f8_2 + - matplotlib-base=3.9.2=py311hbe3227e_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - maxima=5.47.0=h2bbcd85_2 - - memory-allocator=0.1.3=py311heffc1b2_0 - - metis=5.1.0=h13dd4ca_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=h91ba8db_0 + - memory-allocator=0.1.3=py311h460d6c5_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h8f1351a_1 - mpfi=1.5.4=hbde5f5b_1001 - - mpfr=4.2.1=h41d338b_1 + - mpfr=4.2.1=hb693164_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - nauty=2.8.8=h93a5062_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=hb89a1cb_0 + - ncurses=6.5=h7bae524_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 + - networkx=3.4.2=pyh267e887_2 - ninja=1.12.1=h420ef59_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=hbb3f309_1 - numpy=1.26.4=py311h7125741_0 - - openblas=0.3.25=openmp_h55c453e_0 - - openjdk=22.0.1=hbeb2e11_0 + - openblas=0.3.28=openmp_hea878ba_1 - openjpeg=2.5.2=h9f1df11_0 - - openssl=3.3.1=hfb2fe0b_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openssl=3.4.0=h39f12f2_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=h27ca646_0 - - pandoc=3.2.1=hce30654_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h5cb9fbc_0 - pari=2.15.5=h4f2304c_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=h27ca646_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h297a79d_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=h297a79d_2 - perl=5.32.1=7_h4614cfb_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311hd7951ec_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=hebf3989_0 - - pkg-config=0.29.2=hab62308_1008 + - pillow=11.0.0=py311h3894ae9_0 + - pip=24.3.1=pyh8b19718_0 + - pkg-config=0.29.2=hde07d2e_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h93a5062_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h8b147cf_1006 - pplpy=0.8.9=py311h3d77d83_1 - primecount=7.6=hb6e4faa_0 - primecountpy=0.1.0=py311he4fd1f5_4 - primesieve=11.0=hb7217d7_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311hd3f4193_0 - - pthread-stubs=0.4=h27ca646_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py311hae2e1ce_0 + - pthread-stubs=0.4=hd74edd7_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311hcc98501_0 - - pybind11-global=2.12.0=py311hcc98501_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py311h5f135c3_0 - - pyobjc-framework-cocoa=10.3.1=py311h5f135c3_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py311h05b510d_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.11.9=h932a869_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311h92babd0_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311hceb3b21_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311h267d04e_4 - - pyyaml=6.0.1=py311heffc1b2_1 - - pyzmq=26.0.3=py311h9bed540_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.11.10=hc51fdd5_3_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py311h3f08180_7 + - python_abi=3.11=5_cp311 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py311h730b646_3 - qd=2.3.22=hbec66e7_1004 - - qhull=2020.2=hc021e02_2 - - r-base=4.3.3=h8112bfe_3 - - r-lattice=0.22_6=r43hd2d937b_0 + - qhull=2020.2=h420ef59_5 - readline=8.2=h92ec313_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hb547adb_0 - - rpds-py=0.18.1=py311h98c6a39_0 - - rpy2=3.5.11=py311r43hb49d859_3 - rw=0.9=h93a5062_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py311h2b215a9_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 + - scipy=1.14.1=py311hf1db568_1 + - setuptools=75.6.0=pyhff2d567_1 - sigtool=0.1.3=h44b9a77_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hb460b52_1 + - singular=4.4.0=h8aafc33_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=8.1.3=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h5838104_0 + - sqlite=3.47.0=hcd14bea_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf6fcff2_1 - symmetrica=3.0.1=hb7217d7_0 - sympow=2.023.6=hb0babe8_3 - - sympy=1.12.1=pypyh2585a3b_103 + - sympy=1.13.3=pyh2585a3b_104 - tachyon=0.99b6=hb8a568e_1002 - - tapi=1100.0.11=he4954df_0 - - tar=1.34=h7cb298e_1 - - tbb=2021.12.0=h420ef59_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321h9ea1dce_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 + - tapi=1300.6.5=h03f4b80_0 - tk=8.6.13=h5083fa2_1 - - tktable=2.10=h1e387b8_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311hd3f4193_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py311h917b07b_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311h267d04e_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py311hae2e1ce_1 + - urllib3=2.2.3=pyhd8ed1ab_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=hb547adb_0 - - xorg-libxdmcp=1.1.3=h27ca646_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xorg-libxau=1.0.11=hd74edd7_1 + - xorg-libxdmcp=1.1.5=hd74edd7_0 - xz=5.2.6=h57fd34a_0 - - yaml=0.2.5=h3422bc3_2 - - zeromq=4.3.5=hcc0f68c_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=hfb2fe0b_1 + - zeromq=4.3.5=hc1bb282_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=h8359307_2 + - zstandard=0.23.0=py311ha60cc69_1 - zstd=1.5.6=hb46c0d2_0 diff --git a/environment-3.9-linux-aarch64.yml b/environment-3.9-linux-aarch64.yml index 97c6b302ce6..e2445733524 100644 --- a/environment-3.9-linux-aarch64.yml +++ b/environment-3.9-linux-aarch64.yml @@ -1,436 +1,337 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: linux-aarch64 -# input_hash: ff1dc47da14265a884b6d8aae2cde457456f547babfa735ad39ad330bb83aa6a +# input_hash: 2baa194fde0ce285ceeba30a5c1ca2c6a9cc6e1193e7ae4eef4469a870d93e14 channels: - conda-forge dependencies: - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - _sysroot_linux-aarch64_curr_repodata_hack=4=h57d6b7b_14 - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.11=h31becfc_1 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39h898b7ef_4 + - alsa-lib=1.2.13=h86ecc28_0 - arpack=3.9.1=nompi_hd363cd0_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321h2148fe1_1 - - automake=1.16.5=pl5321h8af1aa0_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=hf897c2e_0 + - automake=1.17=pl5321h8af1aa0_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=hd62202e_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=hf1166c9_7 - - binutils_impl_linux-aarch64=2.40=hf54a868_7 - - binutils_linux-aarch64=2.40=h1f91aba_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linuxaarch64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=ha990451_2 + - binutils=2.43=hf1166c9_2 + - binutils_impl_linux-aarch64=2.43=h4c662bb_2 + - binutils_linux-aarch64=2.43=hf1166c9_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_linuxaarch64_openblas + - boost-cpp=1.85.0=hdad291f_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h31becfc_1 - - brotli-bin=1.1.0=h31becfc_1 - - brotli-python=1.1.0=py39h387a81e_1 - - bwidget=1.9.14=h8af1aa0_1 - - bzip2=1.0.8=h31becfc_5 - - c-ares=1.28.1=h31becfc_0 - - c-compiler=1.7.0=h31becfc_1 - - ca-certificates=2024.6.2=hcefe29a_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=h5c54ea9_2 + - brotli=1.1.0=h86ecc28_2 + - brotli-bin=1.1.0=h86ecc28_2 + - brotli-python=1.1.0=py39h7dbf29c_2 + - bzip2=1.0.8=h68df207_7 + - c-ares=1.34.3=h86ecc28_1 + - c-compiler=1.8.0=h6561dab_1 + - ca-certificates=2024.8.30=hcefe29a_0 + - cairo=1.18.0=hdb1a16f_3 - cddlib=1!0.94m=h719063d_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39hdf53b9e_0 - - chardet=5.2.0=py39ha65689a_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py39hecfc5ed_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 - cliquer=1.22=h31becfc_1 - - cmake=3.29.6=h7042e5d_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39h4420490_0 - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=h8af1aa0_1 - - contourpy=1.2.1=py39hd16970a_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=h7daf2e0_0 - - cvxopt=1.3.2=py39h093dae0_2 - - cxx-compiler=1.7.0=h2a328a1_1 + - contourpy=1.3.0=py39hbd2ca3f_2 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py39h36a3f59_0 + - cpython=3.9.20=py39hd8ed1ab_1 + - cxx-compiler=1.8.0=heb6c788_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py39h532d932_0 + - cyrus-sasl=2.1.27=hf6b2984_7 - cysignals=1.11.2=py39hfa81392_3 - - cython=3.0.10=py39h387a81e_0 - - debugpy=1.8.1=py39h387a81e_0 + - cython=3.0.11=py39h3e5e1bb_3 + - dbus=1.13.6=h12b9eeb_3 + - debugpy=1.8.9=py39h7dbf29c_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hb12102e_1203 - - ecl=23.9.9=h6475f26_0 + - double-conversion=3.3.0=h2f0025b_0 + - ecl=24.5.10=h5567cc5_0 - eclib=20231212=he26bab5_0 - ecm=7.0.5=ha2d0fc4_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h2f0025b_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h5ad3122_0 - fflas-ffpack=2.5.0=h503e619_0 - - fftw=3.3.10=nompi_h020dacd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=ha9a116f_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h8dda3cd_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39he257ee7_0 - - fortran-compiler=1.7.0=h7048d53_1 + - fonttools=4.55.0=py39hbebea31_0 + - fortran-compiler=1.8.0=h25a59a9_1 - fplll=5.4.5=hb3a790e_0 - fpylll=0.6.1=py39h97065f7_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=hf0a5ef3_2 - - fribidi=1.0.10=hb9de7d4_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=h597289e_3 - - gap-defaults=4.12.2=h8af1aa0_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=hdb0cc85_13 - - gcc_impl_linux-aarch64=12.3.0=h3d98823_13 - - gcc_linux-aarch64=12.3.0=ha52a6ea_9 - - gengetopt=2.23=h01db608_0 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h16511ff_0 + - gap-defaults=4.13.1=h8af1aa0_0 + - gcc=13.3.0=h8a56e6e_1 + - gcc_impl_linux-aarch64=13.3.0=hcdea9b6_1 + - gcc_linux-aarch64=13.3.0=h1cd514b_7 - gf2x=1.3.0=h1b3b3a3_2 - gfan=0.6.2=h5f589ec_1003 - - gfortran=12.3.0=hdb0cc85_13 - - gfortran_impl_linux-aarch64=12.3.0=h97ebfd2_13 - - gfortran_linux-aarch64=12.3.0=ha7b8e4b_9 + - gfortran=13.3.0=h8a56e6e_1 + - gfortran_impl_linux-aarch64=13.3.0=h174a3c4_1 + - gfortran_linux-aarch64=13.3.0=h2809cf8_7 - giac=1.9.0.21=h04922a4_1 - - giflib=5.2.2=h31becfc_0 - givaro=4.2.0=h364d21b_0 - glpk=5.0=h66325d0_0 - gmp=6.3.0=h0a1ffab_2 - - gmpy2=2.1.5=py39hcc1b389_1 + - gmpy2=2.1.5=py39h7dc50c5_2 - graphite2=1.3.13=h2f0025b_1003 - gsl=2.7=h294027d_0 - - gxx=12.3.0=hdb0cc85_13 - - gxx_impl_linux-aarch64=12.3.0=hba91e99_13 - - gxx_linux-aarch64=12.3.0=h9d1f256_9 - - h11=0.14.0=pyhd8ed1ab_0 + - gxx=13.3.0=h8a56e6e_1 + - gxx_impl_linux-aarch64=13.3.0=h1211b58_1 + - gxx_linux-aarch64=13.3.0=h2864abd_7 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h9812418_0 - - hatchling=1.25.0=pyhd8ed1ab_0 + - harfbuzz=9.0.0=hbf49d6b_1 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h787c7f5_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h197073e_1 + - icu=75.1=hf9b3779_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h207f3e5_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h15043fe_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - importlib-resources=6.4.5=pyhd8ed1ab_0 + - importlib_resources=6.4.5=pyhd8ed1ab_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh3099207_0 - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=h8af1aa0_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39h4420490_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py39h4420490_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-aarch64=4.18.0=h5b4a56d_14 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kernel-headers_linux-aarch64=4.18.0=h05a177a_18 - keyutils=1.6.1=h4e544f5_0 - - kiwisolver=1.4.5=py39had2cf8c_1 - - krb5=1.21.2=hc419048_0 + - kiwisolver=1.4.7=py39h78c8b8d_0 + - krb5=1.21.3=h50a48e9_0 - lcalc=2.0.5=he588f68_2 - lcms2=2.16=h922389a_0 - - ld_impl_linux-aarch64=2.40=h9fc2d93_7 + - ld_impl_linux-aarch64=2.43=h80caac9_2 - lerc=4.0.0=h4de3ea5_0 - - libatomic_ops=7.6.14=h4e544f5_0 - - libblas=3.9.0=20_linuxaarch64_openblas - - libboost=1.85.0=hb41fec8_2 - - libboost-devel=1.85.0=h37bb5a9_2 - - libboost-headers=1.85.0=h8af1aa0_2 - - libbraiding=1.2=hd600fc2_0 + - libblas=3.9.0=25_linuxaarch64_openblas + - libboost=1.85.0=h9fa81b4_4 + - libboost-devel=1.85.0=h37bb5a9_4 + - libboost-headers=1.85.0=h8af1aa0_4 + - libbraiding=1.3=h5ad3122_0 - libbrial=1.2.12=h9429f74_3 - - libbrotlicommon=1.1.0=h31becfc_1 - - libbrotlidec=1.1.0=h31becfc_1 - - libbrotlienc=1.1.0=h31becfc_1 - - libcblas=3.9.0=20_linuxaarch64_openblas + - libbrotlicommon=1.1.0=h86ecc28_2 + - libbrotlidec=1.1.0=h86ecc28_2 + - libbrotlienc=1.1.0=h86ecc28_2 + - libcblas=3.9.0=25_linuxaarch64_openblas + - libclang-cpp19.1=19.1.4=default_he324ac1_0 + - libclang13=19.1.4=default_h4390ef5_0 - libcups=2.3.3=h405e4a8_4 - - libcurl=8.8.0=h4e8248e_0 - - libdeflate=1.20=h31becfc_0 + - libcurl=8.10.1=h3ec0cbf_0 + - libdeflate=1.22=h86ecc28_0 + - libdrm=2.4.123=h86ecc28_0 - libedit=3.1.20191231=he28a2e2_2 + - libegl=1.7.0=hd24410f_2 - libev=4.33=h31becfc_2 - - libexpat=2.6.2=h2f0025b_0 + - libexpat=2.6.4=h5ad3122_0 - libffi=3.4.2=h3557bc0_5 - - libflint=3.0.1=hc392af7_ntl_100 - - libgcc-devel_linux-aarch64=12.3.0=h6144e03_113 - - libgcc-ng=13.2.0=he277a41_13 - - libgd=2.3.3=hcd22fd5_9 - - libgfortran-ng=13.2.0=he9431aa_13 - - libgfortran5=13.2.0=h2af0866_13 - - libglib=2.80.2=haee52c6_1 - - libgomp=13.2.0=he277a41_13 + - libflint=3.0.1=h0433c20_103 + - libgcc=14.2.0=he277a41_1 + - libgcc-devel_linux-aarch64=13.3.0=h0c07274_101 + - libgcc-ng=14.2.0=he9431aa_1 + - libgd=2.3.3=h6818b27_10 + - libgfortran=14.2.0=he9431aa_1 + - libgfortran-ng=14.2.0=he9431aa_1 + - libgfortran5=14.2.0=hb6113d0_1 + - libgl=1.7.0=hd24410f_2 + - libglib=2.82.2=hc486b8e_0 + - libglvnd=1.7.0=hd24410f_2 + - libglx=1.7.0=hd24410f_2 + - libgomp=14.2.0=he277a41_1 - libhomfly=1.02r6=h31becfc_1 - - libhwloc=2.10.0=default_h3030c0e_1001 - libiconv=1.17=h31becfc_2 - libjpeg-turbo=3.0.0=h31becfc_1 - - liblapack=3.9.0=20_linuxaarch64_openblas - - liblapacke=3.9.0=20_linuxaarch64_openblas - - libnghttp2=1.58.0=hb0e430d_1 + - liblapack=3.9.0=25_linuxaarch64_openblas + - liblapacke=3.9.0=25_linuxaarch64_openblas + - libllvm19=19.1.4=h2edbd07_1 + - libnghttp2=1.64.0=hc8609a4_0 - libnsl=2.0.1=h31becfc_0 - - libopenblas=0.3.25=pthreads_h5a5ec62_0 - - libpng=1.6.43=h194ca79_0 - - libsanitizer=12.3.0=h57e2e72_13 - - libsodium=1.0.18=hb9de7d4_1 - - libsqlite=3.46.0=hf51ef55_0 - - libssh2=1.11.0=h492db2e_0 - - libstdcxx-devel_linux-aarch64=12.3.0=h6144e03_113 - - libstdcxx-ng=13.2.0=h3f4de04_13 - - libtiff=4.6.0=hf980d43_3 - - libtool=2.4.7=h4de3ea5_0 + - libntlm=1.4=hf897c2e_1002 + - libopenblas=0.3.28=pthreads_h9d3fd7e_1 + - libopengl=1.7.0=hd24410f_2 + - libpciaccess=0.18=h31becfc_0 + - libpng=1.6.44=hc4a20ef_0 + - libpq=17.2=h081282e_0 + - libsanitizer=13.3.0=ha58e236_1 + - libsodium=1.0.20=h68df207_0 + - libsqlite=3.47.0=hc4a20ef_1 + - libssh2=1.11.1=ha41c0db_0 + - libstdcxx=14.2.0=h3f4de04_1 + - libstdcxx-devel_linux-aarch64=13.3.0=h0c07274_101 + - libstdcxx-ng=14.2.0=hf1166c9_1 + - libtiff=4.7.0=hec21d91_1 - libuuid=2.38.1=hb4cce97_0 - - libuv=1.48.0=h31becfc_0 - - libwebp=1.4.0=h8b4e01b_0 - libwebp-base=1.4.0=h31becfc_0 - - libxcb=1.16=h7935292_0 + - libxcb=1.17.0=h262b8f6_0 - libxcrypt=4.4.36=h31becfc_1 - - libxml2=2.12.7=h49dc7a2_1 - - libzlib=1.3.1=h68df207_1 + - libxkbcommon=1.7.0=h46f2afe_1 + - libxml2=2.13.5=hf4efe5d_0 + - libxslt=1.1.39=h1cc9640_0 + - libzlib=1.3.1=h86ecc28_2 - linbox=1.7.0=h681a5ee_0 - - llvm-openmp=18.1.8=hb063fc5_0 - - lrcalc=2.1=h2f0025b_6 + - llvm-openmp=19.1.4=h013ceaa_0 + - lrcalc=2.1=h5ad3122_7 - m4=1.4.18=h516909a_1001 - m4ri=20140914=hedfd65a_1006 - m4rie=20150908=hf0a5ef3_1002 - - make=4.3=h309ac5b_1 - - markupsafe=2.1.5=py39h7cc1d5f_0 - - mathjax=3.2.2=h8af1aa0_0 - - matplotlib=3.8.4=py39ha65689a_2 - - matplotlib-base=3.8.4=py39hf44f4b6_2 + - markupsafe=3.0.2=py39h36a3f59_0 + - matplotlib=3.9.2=py39ha65689a_2 + - matplotlib-base=3.9.2=py39hd333c8e_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h6475f26_2 - - memory-allocator=0.1.3=py39h898b7ef_0 - - metis=5.1.0=h2f0025b_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=hf4c8f4c_0 + - maxima=5.47.0=h043f013_3 + - memory-allocator=0.1.3=py39h060674a_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h783934e_1 - mpfi=1.5.4=h846f343_1001 - - mpfr=4.2.1=ha2d0fc4_1 + - mpfr=4.2.1=h2305555_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 + - mysql-common=9.0.1=h3f5c77f_2 + - mysql-libs=9.0.1=h11569fd_2 - nauty=2.8.8=h31becfc_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h0425590_0 + - ncurses=6.5=hcccb83c_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - networkx=3.2.1=pyhd8ed1ab_0 - ninja=1.12.1=h70be974_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=h0d7519b_1 - numpy=1.26.4=py39h91c28bb_0 - - openblas=0.3.25=pthreads_h339cbfa_0 - - openjdk=22.0.1=h3d4cd67_0 + - openblas=0.3.28=pthreads_h3a8cbd8_1 - openjpeg=2.5.2=h0d9d63b_0 - - openssl=3.3.1=h68df207_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openldap=2.6.9=h30c48ee_0 + - openssl=3.4.0=h86ecc28_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=hb9de7d4_0 - - pandoc=3.2.1=h8af1aa0_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h399c48b_0 - pari=2.15.5=h169c2a7_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=hf897c2e_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h070dd5b_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=h070dd5b_2 - perl=5.32.1=7_h31becfc_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39h4a8821f_1 - - pip=24.0=pyhd8ed1ab_0 + - pillow=11.0.0=py39hb20fde8_0 + - pip=24.3.1=pyh8b19718_0 - pixman=0.43.4=h2f0025b_0 - - pkg-config=0.29.2=hb9de7d4_1008 + - pkg-config=0.29.2=hce167ba_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h31becfc_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h984aac9_1006 - pplpy=0.8.9=py39hf652505_1 - primecount=7.6=hd600fc2_0 - primecountpy=0.1.0=py39hd16970a_3 - primesieve=11.0=hd600fc2_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39he257ee7_0 - - pthread-stubs=0.4=hb9de7d4_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py39h060674a_0 + - pthread-stubs=0.4=h86ecc28_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39hd16970a_0 - - pybind11-global=2.12.0=py39hd16970a_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py39h7cc1d5f_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 + - pyside6=6.8.0.2=py39h51c6ee1_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.9.19=h4ac3b42_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39h387a81e_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39hc2250db_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39h4420490_4 - - pyyaml=6.0.1=py39h898b7ef_1 - - pyzmq=26.0.3=py39h866fef3_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.9.20=h4a649e4_1_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py39h7dbf29c_7 + - python_abi=3.9=5_cp39 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py39he601760_3 - qd=2.3.22=h05efe27_1004 - - qhull=2020.2=hd62202e_2 - - r-base=4.3.3=h7f20121_3 - - r-lattice=0.22_6=r43h25e906a_0 + - qhull=2020.2=h70be974_5 + - qt6-main=6.8.0=h666f7c6_0 - readline=8.2=h8fc344f_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h31becfc_0 - - rpds-py=0.18.1=py39hb8f4057_0 - - rpy2=3.5.11=py39r43h1ae4408_3 - rw=0.9=h31becfc_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.3=py39h91c28bb_1 - - sed=4.8=ha0d5d3d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hbe76a8a_1 + - scipy=1.13.1=py39hb921187_0 + - setuptools=75.6.0=pyhff2d567_1 + - singular=4.4.0=h9a92511_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=7.4.7=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=hdc7ab3c_0 + - sqlite=3.47.0=h578a6b9_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=h3944111_1 - symmetrica=3.0.1=hd600fc2_0 - sympow=2.023.6=h157afb5_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-aarch64=2.17=h5b4a56d_14 + - sympy=1.13.3=pyh2585a3b_104 + - sysroot_linux-aarch64=2.17=h5b4a56d_18 - tachyon=0.99b6=ha0bfc61_1002 - - tar=1.34=h048efde_0 - - tbb=2021.12.0=h70be974_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h17f021e_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - tk=8.6.13=h194ca79_0 - - tktable=2.10=h52f7bd3_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39ha3e8b56_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py39h3e3acee_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39h4420490_0 - - unicodedata2=15.1.0=py39h898b7ef_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py39h060674a_1 + - urllib3=2.2.3=pyhd8ed1ab_0 + - wayland=1.23.1=h698ed42_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-fixesproto=5.0=h3557bc0_1002 - - xorg-inputproto=2.3.2=h3557bc0_1002 - - xorg-kbproto=1.0.7=h3557bc0_1002 - - xorg-libice=1.1.1=h7935292_0 - - xorg-libsm=1.2.4=h5a01bc2_0 - - xorg-libx11=1.8.9=h08be655_1 - - xorg-libxau=1.0.11=h31becfc_0 - - xorg-libxdmcp=1.1.3=h3557bc0_0 - - xorg-libxext=1.3.4=h2a766a3_2 - - xorg-libxfixes=5.0.3=h3557bc0_1004 - - xorg-libxi=1.7.10=h3557bc0_0 - - xorg-libxrender=0.9.11=h7935292_0 - - xorg-libxt=1.3.0=h7935292_1 - - xorg-libxtst=1.2.3=hf897c2e_1002 - - xorg-recordproto=1.14.2=hf897c2e_1002 - - xorg-renderproto=0.11.1=h3557bc0_1002 - - xorg-xextproto=7.3.0=h2a766a3_1003 - - xorg-xproto=7.0.31=h3557bc0_1007 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xcb-util=0.4.1=h5c728e9_2 + - xcb-util-cursor=0.1.5=h86ecc28_0 + - xcb-util-image=0.4.0=h5c728e9_2 + - xcb-util-keysyms=0.4.1=h5c728e9_0 + - xcb-util-renderutil=0.3.10=h5c728e9_0 + - xcb-util-wm=0.4.2=h5c728e9_0 + - xkeyboard-config=2.43=h86ecc28_0 + - xorg-libice=1.1.1=h57736b2_1 + - xorg-libsm=1.2.4=hbac51e1_1 + - xorg-libx11=1.8.9=he755bbd_2 + - xorg-libxau=1.0.11=h86ecc28_1 + - xorg-libxcomposite=0.4.6=h86ecc28_2 + - xorg-libxcursor=1.2.3=h86ecc28_0 + - xorg-libxdamage=1.1.6=h86ecc28_0 + - xorg-libxdmcp=1.1.5=h57736b2_0 + - xorg-libxext=1.3.6=h57736b2_0 + - xorg-libxfixes=6.0.1=h57736b2_0 + - xorg-libxi=1.8.2=h57736b2_0 + - xorg-libxrandr=1.5.4=h86ecc28_0 + - xorg-libxrender=0.9.11=h57736b2_1 + - xorg-libxtst=1.2.5=h57736b2_3 + - xorg-libxxf86vm=1.1.5=h57736b2_4 + - xorg-xorgproto=2024.1=h86ecc28_1 - xz=5.2.6=h9cdd2b7_0 - - yaml=0.2.5=hf897c2e_2 - - zeromq=4.3.5=h28faeed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h68df207_1 + - zeromq=4.3.5=h5efb499_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=h86ecc28_2 + - zstandard=0.23.0=py39h5934b9c_1 - zstd=1.5.6=h02f22dd_0 diff --git a/environment-3.9-linux.yml b/environment-3.9-linux.yml index 7099a1eb01d..0a8d9500a8d 100644 --- a/environment-3.9-linux.yml +++ b/environment-3.9-linux.yml @@ -1,484 +1,338 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: linux-64 -# input_hash: e864996ba609c3a06f1c78376812e9f6180653730f5c2e60df67268b3e2fb7d6 +# input_hash: a52c15354bebd8c86b0f8a14c4514746d357f79f673cfa7998f53d9bcc42b5c1 channels: - conda-forge dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.12=h4ab18f5_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39hd1e30aa_4 + - alsa-lib=1.2.13=hb9d3cd8_0 - arpack=3.9.1=nompi_h77f6705_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h166bdaf_1 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321h2b4cb7a_1 - - automake=1.16.5=pl5321ha770c72_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h7f98852_0 + - automake=1.17=pl5321ha770c72_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=h4bd325d_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=h4852527_7 - - binutils_impl_linux-64=2.40=ha1999f0_7 - - binutils_linux-64=2.40=hb3c18ed_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linux64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h44aadfe_2 + - binutils=2.43=h4852527_2 + - binutils_impl_linux-64=2.43=h4bf12b8_2 + - binutils_linux-64=2.43=h4852527_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_linux64_openblas + - boost-cpp=1.85.0=h3c6214e_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hd590300_1 - - brotli-bin=1.1.0=hd590300_1 - - brotli-python=1.1.0=py39h3d6467e_1 - - bwidget=1.9.14=ha770c72_1 - - bzip2=1.0.8=hd590300_5 - - c-ares=1.28.1=hd590300_0 - - c-compiler=1.7.0=hd590300_1 - - ca-certificates=2024.6.2=hbcca054_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=hbb29018_2 + - brotli=1.1.0=hb9d3cd8_2 + - brotli-bin=1.1.0=hb9d3cd8_2 + - brotli-python=1.1.0=py39hf88036b_2 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.3=hb9d3cd8_1 + - c-compiler=1.8.0=h2b85faf_1 + - ca-certificates=2024.8.30=hbcca054_0 + - cairo=1.18.0=hebfffa5_3 - cddlib=1!0.94m=h9202a9a_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39h7a31438_0 - - chardet=5.2.0=py39hf3d152e_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py39h15c3d72_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 - cliquer=1.22=hd590300_1 - - cmake=3.29.6=hcafd917_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39hf3d152e_0 - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=ha770c72_1 - - contourpy=1.2.1=py39h7633fee_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=he654da7_0 - - cvxopt=1.3.2=py39h640215f_2 - - cxx-compiler=1.7.0=h00ab1b0_1 + - contourpy=1.3.0=py39h74842e3_2 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py39h9399b63_0 + - cpython=3.9.20=py39hd8ed1ab_1 + - cxx-compiler=1.8.0=h1a2810e_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py39h1698a45_0 + - cyrus-sasl=2.1.27=h54b06d7_7 - cysignals=1.11.2=py39h1ce0973_3 - - cython=3.0.10=py39h3d6467e_0 + - cython=3.0.11=py39hde8bd2b_3 - dbus=1.13.6=h5008d03_3 - - debugpy=1.8.1=py39h3d6467e_0 + - debugpy=1.8.9=py39hf88036b_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hd9d9efa_1203 - - ecl=23.9.9=hed6455c_0 + - double-conversion=3.3.0=h59595ed_0 + - ecl=24.5.10=h0f3afd4_0 - eclib=20231212=h96f522a_0 - ecm=7.0.5=h9458935_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h59595ed_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h5888daf_0 - fflas-ffpack=2.5.0=h4f9960b_0 - - fftw=3.3.10=nompi_hf1063bd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h14ed4e7_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h7e30c49_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39hd3abc70_0 - - fortran-compiler=1.7.0=heb67821_1 + - fonttools=4.55.0=py39h9399b63_0 + - fortran-compiler=1.8.0=h36df796_1 - fplll=5.4.5=h384768b_0 - fpylll=0.6.1=py39h2525e16_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=h267a509_2 - - fribidi=1.0.10=h36c2ea0_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he9a28a4_3 - - gap-defaults=4.12.2=ha770c72_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=h915e2ae_13 - - gcc_impl_linux-64=12.3.0=h58ffeeb_13 - - gcc_linux-64=12.3.0=h9528a6a_9 - - gengetopt=2.23=h9c3ff4c_0 - - gettext=0.22.5=h59595ed_2 - - gettext-tools=0.22.5=h59595ed_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h94f18e1_0 + - gap-defaults=4.13.1=ha770c72_0 + - gcc=13.3.0=h9576a4e_1 + - gcc_impl_linux-64=13.3.0=hfea6d02_1 + - gcc_linux-64=13.3.0=hc28eda2_7 - gf2x=1.3.0=ha476b99_2 - gfan=0.6.2=hb86e20a_1003 - - gfortran=12.3.0=h915e2ae_13 - - gfortran_impl_linux-64=12.3.0=h8f2110c_13 - - gfortran_linux-64=12.3.0=h5877db1_9 + - gfortran=13.3.0=h9576a4e_1 + - gfortran_impl_linux-64=13.3.0=h10434e7_1 + - gfortran_linux-64=13.3.0=hb919d3a_7 - giac=1.9.0.21=h673759e_1 - - giflib=5.2.2=hd590300_0 - givaro=4.2.0=hb789bce_0 - - glib=2.80.2=h8a4344b_1 - - glib-tools=2.80.2=h73ef956_1 - glpk=5.0=h445213a_0 - gmp=6.3.0=hac33072_2 - - gmpy2=2.1.5=py39h048c657_1 + - gmpy2=2.1.5=py39h7196dd7_2 - graphite2=1.3.13=h59595ed_1003 - gsl=2.7=he838d99_0 - - gst-plugins-base=1.24.5=hbaaba92_0 - - gstreamer=1.24.5=haf2f30d_0 - - gxx=12.3.0=h915e2ae_13 - - gxx_impl_linux-64=12.3.0=h2a574ab_13 - - gxx_linux-64=12.3.0=ha28b414_9 - - h11=0.14.0=pyhd8ed1ab_0 + - gxx=13.3.0=h9576a4e_1 + - gxx_impl_linux-64=13.3.0=hdbfa832_1 + - gxx_linux-64=13.3.0=h6834431_7 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=hfac3d4d_0 - - hatchling=1.25.0=pyhd8ed1ab_0 + - harfbuzz=9.0.0=hda332d3_1 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h59595ed_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hef0740d_1 + - icu=75.1=he02047a_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=he44f51b_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h623f65a_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - importlib-resources=6.4.5=pyhd8ed1ab_0 + - importlib_resources=6.4.5=pyhd8ed1ab_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh3099207_0 - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=ha770c72_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39hf3d152e_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py39hf3d152e_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-64=2.6.32=he073ed8_17 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kernel-headers_linux-64=3.10.0=he073ed8_18 - keyutils=1.6.1=h166bdaf_0 - - kiwisolver=1.4.5=py39h7633fee_1 - - krb5=1.21.2=h659d440_0 - - lame=3.100=h166bdaf_1003 + - kiwisolver=1.4.7=py39h74842e3_0 + - krb5=1.21.3=h659f571_0 - lcalc=2.0.5=h5aac1b6_2 - lcms2=2.16=hb7c19ff_0 - - ld_impl_linux-64=2.40=hf3520f5_7 + - ld_impl_linux-64=2.43=h712a8e2_2 - lerc=4.0.0=h27087fc_0 - - libasprintf=0.22.5=h661eb56_2 - - libasprintf-devel=0.22.5=h661eb56_2 - - libatomic_ops=7.6.14=h166bdaf_0 - - libblas=3.9.0=20_linux64_openblas - - libboost=1.85.0=hba137d9_2 - - libboost-devel=1.85.0=h00ab1b0_2 - - libboost-headers=1.85.0=ha770c72_2 - - libbraiding=1.2=hcb278e6_0 + - libblas=3.9.0=25_linux64_openblas + - libboost=1.85.0=h0ccab89_4 + - libboost-devel=1.85.0=h00ab1b0_4 + - libboost-headers=1.85.0=ha770c72_4 + - libbraiding=1.3=h5888daf_0 - libbrial=1.2.12=h76af697_3 - - libbrotlicommon=1.1.0=hd590300_1 - - libbrotlidec=1.1.0=hd590300_1 - - libbrotlienc=1.1.0=hd590300_1 - - libcap=2.69=h0f662aa_0 - - libcblas=3.9.0=20_linux64_openblas - - libclang-cpp15=15.0.7=default_h127d8a8_5 - - libclang13=18.1.8=default_h6ae225f_0 + - libbrotlicommon=1.1.0=hb9d3cd8_2 + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=25_linux64_openblas + - libclang-cpp19.1=19.1.4=default_hb5137d0_0 + - libclang13=19.1.4=default_h9c6a7e4_0 - libcups=2.3.3=h4637d8d_4 - - libcurl=8.8.0=hca28451_0 - - libdeflate=1.20=hd590300_0 + - libcurl=8.10.1=hbbe4b11_0 + - libdeflate=1.22=hb9d3cd8_0 + - libdrm=2.4.123=hb9d3cd8_0 - libedit=3.1.20191231=he28a2e2_2 + - libegl=1.7.0=ha4b6fd6_2 - libev=4.33=hd590300_2 - - libevent=2.1.12=hf998b51_1 - - libexpat=2.6.2=h59595ed_0 + - libexpat=2.6.4=h5888daf_0 - libffi=3.4.2=h7f98852_5 - - libflac=1.4.3=h59595ed_0 - - libflint=3.0.1=h5f2e117_ntl_100 - - libgcc-devel_linux-64=12.3.0=h6b66f73_113 - - libgcc-ng=13.2.0=h77fa898_13 - - libgcrypt=1.10.3=hd590300_0 - - libgd=2.3.3=h119a65a_9 - - libgettextpo=0.22.5=h59595ed_2 - - libgettextpo-devel=0.22.5=h59595ed_2 - - libgfortran-ng=13.2.0=h69a702a_13 - - libgfortran5=13.2.0=h3d2ce59_13 - - libglib=2.80.2=h8a4344b_1 - - libgomp=13.2.0=h77fa898_13 - - libgpg-error=1.49=h4f305b6_0 + - libflint=3.0.1=h6fb9888_103 + - libgcc=14.2.0=h77fa898_1 + - libgcc-devel_linux-64=13.3.0=h84ea5a7_101 + - libgcc-ng=14.2.0=h69a702a_1 + - libgd=2.3.3=hd3e95f3_10 + - libgfortran=14.2.0=h69a702a_1 + - libgfortran-ng=14.2.0=h69a702a_1 + - libgfortran5=14.2.0=hd5240d6_1 + - libgl=1.7.0=ha4b6fd6_2 + - libglib=2.82.2=h2ff4ddf_0 + - libglvnd=1.7.0=ha4b6fd6_2 + - libglx=1.7.0=ha4b6fd6_2 + - libgomp=14.2.0=h77fa898_1 - libhomfly=1.02r6=hd590300_1 - - libhwloc=2.10.0=default_h5622ce7_1001 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_openblas - - liblapacke=3.9.0=20_linux64_openblas - - libllvm15=15.0.7=hb3ce162_4 - - libllvm18=18.1.8=hc9dba70_0 - - libnghttp2=1.58.0=h47da74e_1 + - liblapack=3.9.0=25_linux64_openblas + - liblapacke=3.9.0=25_linux64_openblas + - libllvm19=19.1.4=ha7bfdaf_1 + - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - - libogg=1.3.5=h4ab18f5_0 - - libopenblas=0.3.25=pthreads_h413a1c8_0 - - libopus=1.3.1=h7f98852_1 - - libpng=1.6.43=h2797004_0 - - libpq=16.3=ha72fbe1_0 - - libsanitizer=12.3.0=hb8811af_13 - - libsndfile=1.2.2=hc60ed4a_1 - - libsodium=1.0.18=h36c2ea0_1 - - libsqlite=3.46.0=hde9e2c9_0 - - libssh2=1.11.0=h0841786_0 - - libstdcxx-devel_linux-64=12.3.0=h6b66f73_113 - - libstdcxx-ng=13.2.0=hc0a3c3a_13 - - libsystemd0=255=h3516f8a_1 - - libtiff=4.6.0=h1dd3fc0_3 - - libtool=2.4.7=h27087fc_0 + - libntlm=1.4=h7f98852_1002 + - libopenblas=0.3.28=pthreads_h94d23a6_1 + - libopengl=1.7.0=ha4b6fd6_2 + - libpciaccess=0.18=hd590300_0 + - libpng=1.6.44=hadc24fc_0 + - libpq=17.2=h04577a9_0 + - libsanitizer=13.3.0=heb74ff8_1 + - libsodium=1.0.20=h4ab18f5_0 + - libsqlite=3.47.0=hadc24fc_1 + - libssh2=1.11.1=hf672d98_0 + - libstdcxx=14.2.0=hc0a3c3a_1 + - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101 + - libstdcxx-ng=14.2.0=h4852527_1 + - libtiff=4.7.0=he137b08_1 - libuuid=2.38.1=h0b41bf4_0 - - libuv=1.48.0=hd590300_0 - - libvorbis=1.3.7=h9c3ff4c_0 - - libwebp=1.4.0=h2c329e2_0 - libwebp-base=1.4.0=hd590300_0 - - libxcb=1.16=hd590300_0 + - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - libxkbcommon=1.7.0=h2c5496b_1 - - libxml2=2.12.7=hc051c1a_1 - - libzlib=1.3.1=h4ab18f5_1 + - libxml2=2.13.5=hb346dea_0 + - libxslt=1.1.39=h76b75d6_0 + - libzlib=1.3.1=hb9d3cd8_2 - linbox=1.7.0=ha329b40_0 - - llvm-openmp=18.1.8=hf5423f3_0 - - lrcalc=2.1=h59595ed_6 - - lz4-c=1.9.4=hcb278e6_0 + - llvm-openmp=19.1.4=h024ca30_0 + - lrcalc=2.1=h5888daf_7 - m4=1.4.18=h516909a_1001 - m4ri=20140914=hae5d5c5_1006 - m4rie=20150908=h267a509_1002 - - make=4.3=hd18ef5c_1 - - markupsafe=2.1.5=py39hd1e30aa_0 - - mathjax=3.2.2=ha770c72_0 - - matplotlib=3.8.4=py39hf3d152e_2 - - matplotlib-base=3.8.4=py39h10d1fc8_2 + - markupsafe=3.0.2=py39h9399b63_0 + - matplotlib=3.9.2=py39hf3d152e_2 + - matplotlib-base=3.9.2=py39h16632d1_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=hed6455c_2 - - memory-allocator=0.1.3=py39hd1e30aa_0 - - metis=5.1.0=h59595ed_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=hfe3b2da_0 + - maxima=5.47.0=h75482ee_3 + - memory-allocator=0.1.3=py39h8cd3c5a_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h24ddda3_1 - mpfi=1.5.4=h9f54685_1001 - - mpfr=4.2.1=h9458935_1 - - mpg123=1.32.6=h59595ed_0 + - mpfr=4.2.1=h90cbb55_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - - mysql-common=8.3.0=hf1915f5_4 - - mysql-libs=8.3.0=hca2cd23_4 + - mysql-common=9.0.1=h266115a_2 + - mysql-libs=9.0.1=he0572af_2 - nauty=2.8.8=hd590300_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h59595ed_0 + - ncurses=6.5=he02047a_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - networkx=3.2.1=pyhd8ed1ab_0 - ninja=1.12.1=h297d8ca_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - nspr=4.35=h27087fc_0 - - nss=3.101=h593d115_0 - ntl=11.4.3=hef3c4d3_1 - numpy=1.26.4=py39h474f0d3_0 - - openblas=0.3.25=pthreads_h7a3da1a_0 - - openjdk=21.0.2=haa376d0_0 + - openblas=0.3.28=pthreads_h6ec200e_1 - openjpeg=2.5.2=h488ebb8_0 - - openssl=3.3.1=h4ab18f5_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openldap=2.6.9=he970967_0 + - openssl=3.4.0=hb9d3cd8_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=h36c2ea0_0 - - pandoc=3.2.1=ha770c72_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h84a9a3c_0 - pari=2.15.5=h4d4ae9b_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=h7f98852_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h0f59acf_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=hba22ea6_2 - perl=5.32.1=7_hd590300_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39h16a7006_1 - - pip=24.0=pyhd8ed1ab_0 + - pillow=11.0.0=py39h538c539_0 + - pip=24.3.1=pyh8b19718_0 - pixman=0.43.2=h59595ed_0 - - pkg-config=0.29.2=h36c2ea0_1008 + - pkg-config=0.29.2=h4bc722e_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=hd590300_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h6ec01c2_1006 - pplpy=0.8.9=py39h9e9cb73_1 - primecount=7.9=hcb278e6_0 - primecountpy=0.1.0=py39h7633fee_4 - primesieve=11.1=h59595ed_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39hd3abc70_0 - - pthread-stubs=0.4=h36c2ea0_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py39h8cd3c5a_0 + - pthread-stubs=0.4=hb9d3cd8_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pulseaudio-client=17.0=hb77b528_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39h7633fee_0 - - pybind11-global=2.12.0=py39h7633fee_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyqt=5.15.9=py39h52134e7_5 - - pyqt5-sip=12.12.2=py39h3d6467e_5 - - pyrsistent=0.20.0=py39hd1e30aa_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 + - pyside6=6.8.0.2=py39h0383914_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.9.19=h0755675_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39h3d6467e_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39hda80f44_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39hf3d152e_4 - - pyyaml=6.0.1=py39hd1e30aa_1 - - pyzmq=26.0.3=py39ha1047a2_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.9.20=h13acc7a_1_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py39hf88036b_7 + - python_abi=3.9=5_cp39 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py39h4e4fb57_3 - qd=2.3.22=h2cc385e_1004 - - qhull=2020.2=h4bd325d_2 - - qt-main=5.15.8=ha2b5568_22 - - r-base=4.3.3=he2d9a6e_3 - - r-lattice=0.22_6=r43h57805ef_0 + - qhull=2020.2=h434a139_5 + - qt6-main=6.8.0=h6e8976b_0 - readline=8.2=h8228510_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hd590300_0 - - rpds-py=0.18.1=py39ha68c5e3_0 - - rpy2=3.5.11=py39r43h44dd56e_3 - rw=0.9=hd590300_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py39h474f0d3_0 - - sed=4.8=he412f7d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h33f5c3f_1 - - sip=6.7.12=py39h3d6467e_0 + - scipy=1.13.1=py39haf93ffa_0 + - setuptools=75.6.0=pyhff2d567_1 + - singular=4.4.0=h8a38e62_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=7.4.7=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h6d4b2fc_0 + - sqlite=3.47.0=h9eae976_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf4753ba_1 - symmetrica=3.0.1=hcb278e6_0 - sympow=2.023.6=hc6ab17c_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-64=2.12=he073ed8_17 + - sympy=1.13.3=pyh2585a3b_104 + - sysroot_linux-64=2.17=h4a8ded7_18 - tachyon=0.99b6=hba7d16a_1002 - - tar=1.34=hb2e2bae_1 - - tbb=2021.12.0=h297d8ca_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h0f457ee_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - tk=8.6.13=noxft_h4845f30_101 - - tktable=2.10=h8bc8fbc_6 - - toml=0.10.2=pyhd8ed1ab_0 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39hd3abc70_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py39h8cd3c5a_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39hf3d152e_0 - - unicodedata2=15.1.0=py39hd1e30aa_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py39h8cd3c5a_1 + - urllib3=2.2.3=pyhd8ed1ab_0 + - wayland=1.23.1=h3e06ad9_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 - xcb-util=0.4.1=hb711507_2 + - xcb-util-cursor=0.1.5=hb9d3cd8_0 - xcb-util-image=0.4.0=hb711507_2 - xcb-util-keysyms=0.4.1=hb711507_0 - xcb-util-renderutil=0.3.10=hb711507_0 - xcb-util-wm=0.4.2=hb711507_0 - - xkeyboard-config=2.42=h4ab18f5_0 - - xorg-fixesproto=5.0=h7f98852_1002 - - xorg-inputproto=2.3.2=h7f98852_1002 - - xorg-kbproto=1.0.7=h7f98852_1002 - - xorg-libice=1.1.1=hd590300_0 - - xorg-libsm=1.2.4=h7391055_0 - - xorg-libx11=1.8.9=hb711507_1 - - xorg-libxau=1.0.11=hd590300_0 - - xorg-libxdmcp=1.1.3=h7f98852_0 - - xorg-libxext=1.3.4=h0b41bf4_2 - - xorg-libxfixes=5.0.3=h7f98852_1004 - - xorg-libxi=1.7.10=h7f98852_0 - - xorg-libxrender=0.9.11=hd590300_0 - - xorg-libxt=1.3.0=hd590300_1 - - xorg-libxtst=1.2.3=h7f98852_1002 - - xorg-recordproto=1.14.2=h7f98852_1002 - - xorg-renderproto=0.11.1=h7f98852_1002 - - xorg-xextproto=7.3.0=h0b41bf4_1003 - - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - - xorg-xproto=7.0.31=h7f98852_1007 + - xkeyboard-config=2.43=hb9d3cd8_0 + - xorg-libice=1.1.1=hb9d3cd8_1 + - xorg-libsm=1.2.4=he73a12e_1 + - xorg-libx11=1.8.10=h4f16b4b_0 + - xorg-libxau=1.0.11=hb9d3cd8_1 + - xorg-libxcomposite=0.4.6=hb9d3cd8_2 + - xorg-libxcursor=1.2.3=hb9d3cd8_0 + - xorg-libxdamage=1.1.6=hb9d3cd8_0 + - xorg-libxdmcp=1.1.5=hb9d3cd8_0 + - xorg-libxext=1.3.6=hb9d3cd8_0 + - xorg-libxfixes=6.0.1=hb9d3cd8_0 + - xorg-libxi=1.8.2=hb9d3cd8_0 + - xorg-libxrandr=1.5.4=hb9d3cd8_0 + - xorg-libxrender=0.9.11=hb9d3cd8_1 + - xorg-libxtst=1.2.5=hb9d3cd8_3 + - xorg-libxxf86vm=1.1.5=hb9d3cd8_4 + - xorg-xorgproto=2024.1=hb9d3cd8_1 - xz=5.2.6=h166bdaf_0 - - yaml=0.2.5=h7f98852_2 - - zeromq=4.3.5=h75354e8_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h4ab18f5_1 + - zeromq=4.3.5=h3b0a872_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=hb9d3cd8_2 + - zstandard=0.23.0=py39h08a7858_1 - zstd=1.5.6=ha6fb4c9_0 diff --git a/environment-3.9-macos-x86_64.yml b/environment-3.9-macos-x86_64.yml index de8df57d291..c755abe0e4a 100644 --- a/environment-3.9-macos-x86_64.yml +++ b/environment-3.9-macos-x86_64.yml @@ -1,424 +1,290 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: osx-64 -# input_hash: 7b973134e4e44170c953a71c99253450b079227c08993b2a49ae3ddd14d93fdb +# input_hash: cdad1bd56606756079e5b1e9a07e3c7deb49c120a33b156a2567eaf2121dfae0 channels: - conda-forge dependencies: - - _r-mutex=1.0.1=anacondar_1 - alabaster=0.7.16=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39hdc70f33_4 - arpack=3.9.1=nompi_hf81eadf_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321hed12c24_1 - - automake=1.16.5=pl5321h694c41f_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h0d85af4_0 + - automake=1.17=pl5321h694c41f_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=h940c156_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osx64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h07eb623_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_osx64_openblas + - boost-cpp=1.85.0=hfcd56d9_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h0dc2134_1 - - brotli-bin=1.1.0=h0dc2134_1 - - brotli-python=1.1.0=py39h840bb9f_1 - - bwidget=1.9.14=h694c41f_1 - - bzip2=1.0.8=h10d778d_5 - - c-ares=1.28.1=h10d778d_0 - - c-compiler=1.7.0=h282daa2_1 - - ca-certificates=2024.6.2=h8857fd0_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=h9f650ed_2 - - cctools=986=h40f6528_0 - - cctools_osx-64=986=ha1c5b94_0 + - brotli=1.1.0=h00291cd_2 + - brotli-bin=1.1.0=h00291cd_2 + - brotli-python=1.1.0=py39h7c0e7c0_2 + - bzip2=1.0.8=hfdf4475_7 + - c-ares=1.34.3=hf13058a_1 + - c-compiler=1.8.0=hfc4bf79_1 + - ca-certificates=2024.8.30=h8857fd0_0 + - cctools=1010.6=h5b2de21_2 + - cctools_osx-64=1010.6=hea4301f_2 - cddlib=1!0.94m=h0f52abe_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39h18ef598_0 - - chardet=5.2.0=py39h6e9494a_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_ha3b9224_8 - - clang-16=16.0.6=default_h4c8afb6_8 - - clang_impl_osx-64=16.0.6=h8787910_16 - - clang_osx-64=16.0.6=hb91bd55_16 - - clangxx=16.0.6=default_ha3b9224_8 - - clangxx_impl_osx-64=16.0.6=h6d92fbe_16 - - clangxx_osx-64=16.0.6=hb91bd55_16 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py39h8ddeee6_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 + - clang=17.0.6=default_he371ed4_7 + - clang-17=17.0.6=default_hb173f14_7 + - clang_impl_osx-64=17.0.6=h1af8efd_23 + - clang_osx-64=17.0.6=h7e5c614_23 + - clangxx=17.0.6=default_he371ed4_7 + - clangxx_impl_osx-64=17.0.6=hc3430b7_23 + - clangxx_osx-64=17.0.6=h7e5c614_23 - cliquer=1.22=h10d778d_1 - - cmake=3.29.6=h749d262_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39h6e9494a_0 - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=ha38d28d_2 - - compiler-rt_osx-64=16.0.6=ha38d28d_2 - - compilers=1.7.0=h694c41f_1 - - contourpy=1.2.1=py39h0ca7971_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=hea67d85_0 - - cvxopt=1.3.2=py39hd66cc7a_2 - - cxx-compiler=1.7.0=h7728843_1 + - compiler-rt=17.0.6=h1020d70_2 + - compiler-rt_osx-64=17.0.6=hf2b8a54_2 + - contourpy=1.3.0=py39h0d3c867_2 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py39hd18e689_0 + - cpython=3.9.20=py39hd8ed1ab_1 + - cxx-compiler=1.8.0=h385f146_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py39hc0d7317_0 - cysignals=1.11.2=py39hf6ae30e_3 - - cython=3.0.10=py39hd253f6c_0 - - debugpy=1.8.1=py39hd253f6c_0 + - cython=3.0.11=py39h84f6f9c_3 + - debugpy=1.8.9=py39hdf37715_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h6e329d1_1203 - - ecl=23.9.9=h2b27fa8_0 + - ecl=24.5.10=h56bac16_0 - eclib=20231212=h02435c3_0 - ecm=7.0.5=h4f6b447_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h73e2aa4_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h240833e_0 - fflas-ffpack=2.5.0=h5898d61_0 - - fftw=3.3.10=nompi_h292e606_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h5bb23bf_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h37eeddb_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39hded5825_0 - - fortran-compiler=1.7.0=h6c2ab21_1 + - fonttools=4.55.0=py39hd18e689_0 + - fortran-compiler=1.8.0=h33d1f46_1 - fplll=5.4.5=hb7981ad_0 - fpylll=0.6.1=py39h3b3ffec_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=h60636b9_2 - - fribidi=1.0.10=hbcb3906_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=hc16eb5f_3 - - gap-defaults=4.12.2=h694c41f_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=he49afe7_0 - - gettext=0.22.5=h5ff76d1_2 - - gettext-tools=0.22.5=h5ff76d1_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h2299be9_0 + - gap-defaults=4.13.1=h694c41f_0 + - gettext=0.22.5=hdfe23c8_3 + - gettext-tools=0.22.5=hdfe23c8_3 - gf2x=1.3.0=hb2a7efb_2 - gfan=0.6.2=hd793b56_1003 - - gfortran=12.3.0=h2c809b3_1 - - gfortran_impl_osx-64=12.3.0=hc328e78_3 - - gfortran_osx-64=12.3.0=h18f7dce_1 + - gfortran=13.2.0=h2c809b3_1 + - gfortran_impl_osx-64=13.2.0=h2bc304d_3 + - gfortran_osx-64=13.2.0=h18f7dce_1 - giac=1.9.0.21=h92f3f65_1 - - giflib=5.2.2=h10d778d_0 - givaro=4.2.0=h1b3d6f7_0 - glpk=5.0=h3cb5acd_0 - gmp=6.3.0=hf036a51_2 - - gmpy2=2.1.5=py39h87b48b1_1 - - graphite2=1.3.13=h73e2aa4_1003 + - gmpy2=2.1.5=py39h8ddd0cc_2 - gsl=2.7=h93259b0_0 - - h11=0.14.0=pyhd8ed1ab_0 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h053f038_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hf5e326d_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hde4452d_1 + - icu=75.1=h120a0e1_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h5479cbe_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=h61918c1_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - importlib-resources=6.4.5=pyhd8ed1ab_0 + - importlib_resources=6.4.5=pyhd8ed1ab_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh57ce528_0 - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 - isl=0.26=imath32_h2e86a7b_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.9=h694c41f_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39h6e9494a_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.1=py39h6e9494a_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kiwisolver=1.4.5=py39h8ee36c8_1 - - krb5=1.21.2=hb884880_0 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kiwisolver=1.4.7=py39h0d8d0ca_0 + - krb5=1.21.3=h37d8d59_0 - lcalc=2.0.5=h547a6ed_2 - lcms2=2.16=ha2f27b4_0 - - ld64=711=ha02d983_0 - - ld64_osx-64=711=ha20a434_0 + - ld64=951.9=h0a3eb4e_2 + - ld64_osx-64=951.9=h5ffbe8e_2 - lerc=4.0.0=hb486fe8_0 - - libasprintf=0.22.5=h5ff76d1_2 - - libasprintf-devel=0.22.5=h5ff76d1_2 - - libatomic_ops=7.6.14=hb7f2c08_0 - - libblas=3.9.0=20_osx64_openblas - - libboost=1.85.0=h739af76_2 - - libboost-devel=1.85.0=h2b186f8_2 - - libboost-headers=1.85.0=h694c41f_2 - - libbraiding=1.2=hf0c8a7f_0 + - libasprintf=0.22.5=hdfe23c8_3 + - libasprintf-devel=0.22.5=hdfe23c8_3 + - libblas=3.9.0=25_osx64_openblas + - libboost=1.85.0=hcca3243_4 + - libboost-devel=1.85.0=h2b186f8_4 + - libboost-headers=1.85.0=h694c41f_4 + - libbraiding=1.3=h240833e_0 - libbrial=1.2.12=h81e9653_3 - - libbrotlicommon=1.1.0=h0dc2134_1 - - libbrotlidec=1.1.0=h0dc2134_1 - - libbrotlienc=1.1.0=h0dc2134_1 - - libcblas=3.9.0=20_osx64_openblas - - libclang-cpp16=16.0.6=default_h4c8afb6_8 - - libcurl=8.8.0=hf9fcc65_0 - - libcxx=17.0.6=h88467a6_0 - - libdeflate=1.20=h49d49c5_0 + - libbrotlicommon=1.1.0=h00291cd_2 + - libbrotlidec=1.1.0=h00291cd_2 + - libbrotlienc=1.1.0=h00291cd_2 + - libcblas=3.9.0=25_osx64_openblas + - libclang-cpp17=17.0.6=default_hb173f14_7 + - libcurl=8.10.1=h58e7537_0 + - libcxx=19.1.4=hf95d169_0 + - libcxx-devel=17.0.6=h8f8a49f_6 + - libdeflate=1.22=h00291cd_0 - libedit=3.1.20191231=h0678c8f_2 - libev=4.33=h10d778d_2 - - libexpat=2.6.2=h73e2aa4_0 + - libexpat=2.6.4=h240833e_0 - libffi=3.4.2=h0d85af4_5 - - libflint=3.0.1=h5d15de0_ntl_100 - - libgd=2.3.3=h0dceb68_9 - - libgettextpo=0.22.5=h5ff76d1_2 - - libgettextpo-devel=0.22.5=h5ff76d1_2 + - libflint=3.0.1=h1d27844_103 + - libgd=2.3.3=h2e77e4f_10 + - libgettextpo=0.22.5=hdfe23c8_3 + - libgettextpo-devel=0.22.5=hdfe23c8_3 - libgfortran=5.0.0=13_2_0_h97931a8_3 - - libgfortran-devel_osx-64=12.3.0=h0b6f5ec_3 + - libgfortran-devel_osx-64=13.2.0=h80d4556_3 - libgfortran5=13.2.0=h2873a65_3 - - libglib=2.80.2=h736d271_1 - libhomfly=1.02r6=h10d778d_1 - - libhwloc=2.10.0=default_h456cccd_1001 - libiconv=1.17=hd75f5a5_2 - - libintl=0.22.5=h5ff76d1_2 - - libintl-devel=0.22.5=h5ff76d1_2 + - libintl=0.22.5=hdfe23c8_3 + - libintl-devel=0.22.5=hdfe23c8_3 - libjpeg-turbo=3.0.0=h0dc2134_1 - - liblapack=3.9.0=20_osx64_openblas - - liblapacke=3.9.0=20_osx64_openblas - - libllvm16=16.0.6=hbedff68_3 - - libnghttp2=1.58.0=h64cf6d3_1 - - libopenblas=0.3.25=openmp_hfef2a42_0 - - libpng=1.6.43=h92b6c6a_0 - - libsodium=1.0.18=hbcb3906_1 - - libsqlite=3.46.0=h1b8f9f3_0 - - libssh2=1.11.0=hd019ec5_0 - - libtiff=4.6.0=h129831d_3 - - libtool=2.4.7=hf0c8a7f_0 - - libuv=1.48.0=h67532ce_0 - - libwebp=1.4.0=hc207709_0 + - liblapack=3.9.0=25_osx64_openblas + - liblapacke=3.9.0=25_osx64_openblas + - libllvm17=17.0.6=hbedff68_1 + - libnghttp2=1.64.0=hc7306c3_0 + - libopenblas=0.3.28=openmp_hbf64a52_1 + - libpng=1.6.44=h4b8f8c9_0 + - libsodium=1.0.20=hfdf4475_0 + - libsqlite=3.47.0=h2f8c449_1 + - libssh2=1.11.1=h3dc7d44_0 + - libtiff=4.7.0=h583c2ba_1 - libwebp-base=1.4.0=h10d778d_0 - - libxcb=1.16=h0dc2134_0 - - libxml2=2.12.7=h3e169fe_1 - - libzlib=1.3.1=h87427d6_1 + - libxcb=1.17.0=hf1f96e2_0 + - libxml2=2.13.5=h495214b_0 + - libzlib=1.3.1=hd23fc13_2 - linbox=1.7.0=h7061c92_0 - - llvm-openmp=18.1.8=h15ab845_0 - - llvm-tools=16.0.6=hbedff68_3 - - lrcalc=2.1=h73e2aa4_6 + - llvm-openmp=19.1.4=ha54dae1_0 + - llvm-tools=17.0.6=hbedff68_1 + - lrcalc=2.1=hac325c4_7 - m4=1.4.18=haf1e3a3_1001 - m4ri=20140914=hd82a5f3_1006 - m4rie=20150908=hc616cfc_1002 - - make=4.3=h22f3db7_1 - - markupsafe=2.1.5=py39ha09f3b3_0 - - mathjax=3.2.2=h694c41f_0 - - matplotlib=3.8.4=py39h6e9494a_2 - - matplotlib-base=3.8.4=py39hfca4cae_2 + - markupsafe=3.0.2=py39h20cc651_0 + - matplotlib=3.9.2=py39h6e9494a_2 + - matplotlib-base=3.9.2=py39ha1b726c_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2b27fa8_2 - - memory-allocator=0.1.3=py39hdc70f33_0 - - metis=5.1.0=he965462_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=h81bd1dd_0 + - maxima=5.47.0=h3080a4d_3 + - memory-allocator=0.1.3=py39h06d86d0_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h9d8efa1_1 - mpfi=1.5.4=h52b28e3_1001 - - mpfr=4.2.1=h4f6b447_1 + - mpfr=4.2.1=haed47dc_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - nauty=2.8.8=h10d778d_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h5846eda_0 + - ncurses=6.5=hf036a51_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - networkx=3.2.1=pyhd8ed1ab_0 - ninja=1.12.1=h3c5361c_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=h0ab3c2f_1 - numpy=1.26.4=py39h28c39a1_0 - - openblas=0.3.25=openmp_h6794695_0 - - openjdk=22.0.1=h2d185b6_0 + - openblas=0.3.28=openmp_h30af337_1 - openjpeg=2.5.2=h7310d3a_0 - - openssl=3.3.1=h87427d6_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openssl=3.4.0=hd471939_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=hbcb3906_0 - - pandoc=3.2.1=h694c41f_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h880b76c_0 - pari=2.15.5=h7ba67ff_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=hbcf498f_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h7634a1b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - perl=5.32.1=7_h10d778d_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39hc3a33ae_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h73e2aa4_0 - - pkg-config=0.29.2=ha3d46e9_1008 + - pillow=11.0.0=py39h6cf2171_0 + - pip=24.3.1=pyh8b19718_0 + - pkg-config=0.29.2=hf7e621a_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h10d778d_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=ha60d53e_1006 - pplpy=0.8.9=py39hc385998_1 - primecount=7.6=ha894c9a_0 - primecountpy=0.1.0=py39h8ee36c8_4 - primesieve=11.0=hf0c8a7f_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39hded5825_0 - - pthread-stubs=0.4=hc929b4f_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py39h296a897_0 + - pthread-stubs=0.4=h00291cd_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39h0ca7971_0 - - pybind11-global=2.12.0=py39h0ca7971_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py39hf8f43b1_0 - - pyobjc-framework-cocoa=10.3.1=py39hf8f43b1_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py39ha09f3b3_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.9.19=h7a9c478_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39hd253f6c_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39h5d0c61a_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39h6e9494a_4 - - pyyaml=6.0.1=py39hdc70f33_1 - - pyzmq=26.0.3=py39h304b177_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.9.20=hf24efe3_1_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py39h7c0e7c0_7 + - python_abi=3.9=5_cp39 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py39h7644d4c_3 - qd=2.3.22=h2beb688_1004 - - qhull=2020.2=h940c156_2 - - r-base=4.3.3=h4648a1f_3 - - r-lattice=0.22_6=r43hb2c329c_0 + - qhull=2020.2=h3c5361c_5 - readline=8.2=h9e318b2_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h0dc2134_0 - - rpds-py=0.18.1=py39hf59063a_0 - - rpy2=3.5.11=py39r43hd01001f_3 - rw=0.9=h10d778d_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py39ha321857_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 + - scipy=1.13.1=py39h038d4f4_0 + - setuptools=75.6.0=pyhff2d567_1 - sigtool=0.1.3=h88f4db0_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h0d51a9f_1 + - singular=4.4.0=h0c52cc7_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=7.4.7=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h28673e1_0 + - sqlite=3.47.0=h6285a30_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hd2b2131_1 - symmetrica=3.0.1=hf0c8a7f_0 - sympow=2.023.6=h115ba6a_3 - - sympy=1.12.1=pypyh2585a3b_103 + - sympy=1.13.3=pyh2585a3b_104 - tachyon=0.99b6=h3a1d103_1002 - - tapi=1100.0.11=h9ce4665_0 - - tar=1.34=hcb2f6ea_1 - - tbb=2021.12.0=h3c5361c_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321hc47821c_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 + - tapi=1300.6.5=h390ca13_0 - tk=8.6.13=h1abcd95_1 - - tktable=2.10=hba9d6f1_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39hded5825_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py39h80efdc8_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39h6e9494a_0 - - unicodedata2=15.1.0=py39hdc70f33_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py39h296a897_1 + - urllib3=2.2.3=pyhd8ed1ab_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=h0dc2134_0 - - xorg-libxdmcp=1.1.3=h35c211d_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xorg-libxau=1.0.11=h00291cd_1 + - xorg-libxdmcp=1.1.5=h00291cd_0 - xz=5.2.6=h775f41a_0 - - yaml=0.2.5=h0d85af4_2 - - zeromq=4.3.5=hde137ed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h87427d6_1 + - zeromq=4.3.5=h7130eaa_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=hd23fc13_2 + - zstandard=0.23.0=py39hc23f734_1 - zstd=1.5.6=h915ae27_0 diff --git a/environment-3.9-macos.yml b/environment-3.9-macos.yml index 612b41003c9..ac783c7e02f 100644 --- a/environment-3.9-macos.yml +++ b/environment-3.9-macos.yml @@ -1,424 +1,292 @@ -name: sage +name: sage-dev # Generated by conda-lock. # platform: osx-arm64 -# input_hash: c72df9df3a2c7c120e9ff1ca936ae3527692a0de782793536087f2041f57d700 +# input_hash: 001c7b49d78852907ca5b2bef0b258fde0a46a8187c66ff7edbc8b3c0e988b51 channels: - conda-forge dependencies: - - _r-mutex=1.0.1=anacondar_1 - alabaster=0.7.16=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39h0f82c59_4 - arpack=3.9.1=nompi_h593882a_101 - - arrow=1.3.0=pyhd8ed1ab_0 - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - autoconf=2.71=pl5321hcd07c0c_1 - - automake=1.16.5=pl5321hce30654_0 - - babel=2.14.0=pyhd8ed1ab_0 - - bc=1.07.1=h3422bc3_0 + - automake=1.17=pl5321hce30654_0 + - babel=2.16.0=pyhd8ed1ab_0 - bdw-gc=8.0.6=hc021e02_0 - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osxarm64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=hca5e981_2 + - blas=2.125=openblas + - blas-devel=3.9.0=25_osxarm64_openblas + - boost-cpp=1.85.0=h103c1d6_4 - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hb547adb_1 - - brotli-bin=1.1.0=hb547adb_1 - - brotli-python=1.1.0=py39hb198ff7_1 - - bwidget=1.9.14=hce30654_1 - - bzip2=1.0.8=h93a5062_5 - - c-ares=1.28.1=h93a5062_0 - - c-compiler=1.7.0=h6aa9301_1 - - ca-certificates=2024.6.2=hf0a4a13_0 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cairo=1.18.0=hc6c324b_2 - - cctools=986=h4faf515_0 - - cctools_osx-arm64=986=h62378fb_0 + - brotli=1.1.0=hd74edd7_2 + - brotli-bin=1.1.0=hd74edd7_2 + - brotli-python=1.1.0=py39hfa9831e_2 + - bzip2=1.0.8=h99b78c6_7 + - c-ares=1.34.3=h5505292_1 + - c-compiler=1.8.0=hf48404e_1 + - ca-certificates=2024.8.30=hf0a4a13_0 + - cctools=1010.6=hf67d63f_2 + - cctools_osx-arm64=1010.6=h623e0ac_2 - cddlib=1!0.94m=h6d7a090_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39he153c15_0 - - chardet=5.2.0=py39h2804cbe_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_h095aff0_8 - - clang-16=16.0.6=default_hb63da90_8 - - clang_impl_osx-arm64=16.0.6=hc421ffc_16 - - clang_osx-arm64=16.0.6=h54d7cd3_16 - - clangxx=16.0.6=default_h095aff0_8 - - clangxx_impl_osx-arm64=16.0.6=hcd7bac0_16 - - clangxx_osx-arm64=16.0.6=h54d7cd3_16 + - certifi=2024.8.30=pyhd8ed1ab_0 + - cffi=1.17.1=py39h7f933ea_0 + - charset-normalizer=3.4.0=pyhd8ed1ab_0 + - clang=17.0.6=default_h360f5da_7 + - clang-17=17.0.6=default_h146c034_7 + - clang_impl_osx-arm64=17.0.6=he47c785_23 + - clang_osx-arm64=17.0.6=h07b0088_23 + - clangxx=17.0.6=default_h360f5da_7 + - clangxx_impl_osx-arm64=17.0.6=h50f59cd_23 + - clangxx_osx-arm64=17.0.6=h07b0088_23 - cliquer=1.22=h93a5062_1 - - cmake=3.29.6=had79d8f_0 - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39h2804cbe_0 - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=h3808999_2 - - compiler-rt_osx-arm64=16.0.6=h3808999_2 - - compilers=1.7.0=hce30654_1 - - contourpy=1.2.1=py39h48c5dd5_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - curl=8.8.0=h653d890_0 - - cvxopt=1.3.2=py39hf9e8641_2 - - cxx-compiler=1.7.0=h2ffa867_1 + - compiler-rt=17.0.6=h856b3c1_2 + - compiler-rt_osx-arm64=17.0.6=h832e737_2 + - contourpy=1.3.0=py39h85b62ae_2 + - conway-polynomials=0.10=pyhd8ed1ab_0 + - coverage=7.6.8=py39hefdd603_0 + - cpython=3.9.20=py39hd8ed1ab_1 + - cxx-compiler=1.8.0=h18dbf2f_1 - cycler=0.12.1=pyhd8ed1ab_0 - cypari2=2.1.5=py39h070b2a8_0 - cysignals=1.11.2=py39h65fc70a_3 - - cython=3.0.10=py39hf3050f2_0 - - debugpy=1.8.1=py39hf3050f2_0 + - cython=3.0.11=py39h20637d4_3 + - debugpy=1.8.9=py39h941272d_0 - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h9397a75_1203 - ecl=23.9.9=h1d9728a_0 - eclib=20231212=h7f07de4_0 - ecm=7.0.5=h41d338b_0 - - editables=0.5=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=hebf3989_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - execnet=2.1.1=pyhd8ed1ab_0 + - executing=2.1.0=pyhd8ed1ab_0 + - expat=2.6.4=h286801f_0 - fflas-ffpack=2.5.0=h4bc3318_0 - - fftw=3.3.10=nompi_h6637ab6_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h82840c6_0 + - font-ttf-ubuntu=0.83=h77eed37_3 + - fontconfig=2.15.0=h1383a14_1 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39hfea33bf_0 - - fortran-compiler=1.7.0=hafb19e3_1 + - fonttools=4.55.0=py39hefdd603_0 + - fortran-compiler=1.8.0=hc3477c4_1 - fplll=5.4.5=hb7d509d_0 - fpylll=0.6.1=py39h2eadeda_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - freetype=2.12.1=hadb7bae_2 - - fribidi=1.0.10=h27ca646_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he8f4e70_3 - - gap-defaults=4.12.2=hce30654_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=hbdafb3b_0 - - gettext=0.22.5=h8fbad5d_2 - - gettext-tools=0.22.5=h8fbad5d_2 + - furo=2024.8.6=pyhd8ed1ab_1 + - gap-core=4.13.1=h4cbeff9_0 + - gap-defaults=4.13.1=hce30654_0 + - gettext=0.22.5=h8414b35_3 + - gettext-tools=0.22.5=h8414b35_3 - gf2x=1.3.0=hdaa854c_2 - gfan=0.6.2=hec08f5c_1003 - - gfortran=12.3.0=h1ca8e4b_1 - - gfortran_impl_osx-arm64=12.3.0=h53ed385_3 - - gfortran_osx-arm64=12.3.0=h57527a5_1 + - gfortran=13.2.0=h1ca8e4b_1 + - gfortran_impl_osx-arm64=13.2.0=h252ada1_3 + - gfortran_osx-arm64=13.2.0=h57527a5_1 - giac=1.9.0.21=h1c96721_1 - - giflib=5.2.2=h93a5062_0 - givaro=4.2.0=h018886a_0 - glpk=5.0=h6d7a090_0 - gmp=6.3.0=h7bae524_2 - - gmpy2=2.1.5=py39h9bb7c0c_1 - - graphite2=1.3.13=hebf3989_1003 + - gmpy2=2.1.5=py39h0bbb021_2 - gsl=2.7=h6e638da_0 - - h11=0.14.0=pyhd8ed1ab_0 - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h1836168_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - hpack=4.0.0=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hc8870d7_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h762ac30_1 + - icu=75.1=hfee45f7_0 + - idna=3.10=pyhd8ed1ab_0 + - igraph=0.10.15=h3fe6531_0 - imagesize=1.4.1=pyhd8ed1ab_0 - iml=1.0.5=hd73f12c_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 + - importlib-metadata=8.5.0=pyha770c72_0 + - importlib-resources=6.4.5=pyhd8ed1ab_0 + - importlib_resources=6.4.5=pyhd8ed1ab_0 + - iniconfig=2.0.0=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh57ce528_0 - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 + - ipywidgets=8.1.5=pyhd8ed1ab_0 - isl=0.26=imath32_h347afa1_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 + - jedi=0.19.2=pyhff2d567_0 - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=hce30654_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39h2804cbe_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py39h2804cbe_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kiwisolver=1.4.5=py39hbd775c9_1 - - krb5=1.21.2=h92f50d5_0 + - jupyter_client=8.6.3=pyhd8ed1ab_0 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_0 + - kiwisolver=1.4.7=py39h157d57c_0 + - krb5=1.21.3=h237132a_0 - lcalc=2.0.5=h4a402bc_2 - lcms2=2.16=ha0e7c42_0 - - ld64=711=h634c8be_0 - - ld64_osx-arm64=711=ha4bd21c_0 + - ld64=951.9=h39a299f_2 + - ld64_osx-arm64=951.9=h3f9b568_2 - lerc=4.0.0=h9a09cb3_0 - - libasprintf=0.22.5=h8fbad5d_2 - - libasprintf-devel=0.22.5=h8fbad5d_2 - - libatomic_ops=7.6.14=h1a8c8d9_0 - - libblas=3.9.0=20_osxarm64_openblas - - libboost=1.85.0=h17eb2be_2 - - libboost-devel=1.85.0=hf450f58_2 - - libboost-headers=1.85.0=hce30654_2 - - libbraiding=1.2=hb7217d7_0 + - libasprintf=0.22.5=h8414b35_3 + - libasprintf-devel=0.22.5=h8414b35_3 + - libblas=3.9.0=25_osxarm64_openblas + - libboost=1.85.0=hf763ba5_4 + - libboost-devel=1.85.0=hf450f58_4 + - libboost-headers=1.85.0=hce30654_4 + - libbraiding=1.3=h286801f_0 - libbrial=1.2.12=h56a29cd_3 - - libbrotlicommon=1.1.0=hb547adb_1 - - libbrotlidec=1.1.0=hb547adb_1 - - libbrotlienc=1.1.0=hb547adb_1 - - libcblas=3.9.0=20_osxarm64_openblas - - libclang-cpp16=16.0.6=default_hb63da90_8 - - libcurl=8.8.0=h7b6f9a7_0 - - libcxx=17.0.6=h5f092b4_0 - - libdeflate=1.20=h93a5062_0 + - libbrotlicommon=1.1.0=hd74edd7_2 + - libbrotlidec=1.1.0=hd74edd7_2 + - libbrotlienc=1.1.0=hd74edd7_2 + - libcblas=3.9.0=25_osxarm64_openblas + - libclang-cpp17=17.0.6=default_h146c034_7 + - libcurl=8.10.1=h13a7ad3_0 + - libcxx=19.1.4=ha82da77_0 + - libcxx-devel=17.0.6=h86353a2_6 + - libdeflate=1.22=hd74edd7_0 - libedit=3.1.20191231=hc8eb9b7_2 - libev=4.33=h93a5062_2 - - libexpat=2.6.2=hebf3989_0 + - libexpat=2.6.4=h286801f_0 - libffi=3.4.2=h3422bc3_5 - - libflint=3.0.1=h28749a5_ntl_100 - - libgd=2.3.3=hfdf3952_9 - - libgettextpo=0.22.5=h8fbad5d_2 - - libgettextpo-devel=0.22.5=h8fbad5d_2 + - libflint=3.0.1=he28cf6d_103 + - libgd=2.3.3=hac1b3a8_10 + - libgettextpo=0.22.5=h8414b35_3 + - libgettextpo-devel=0.22.5=h8414b35_3 - libgfortran=5.0.0=13_2_0_hd922786_3 - - libgfortran-devel_osx-arm64=12.3.0=hc62be1c_3 + - libgfortran-devel_osx-arm64=13.2.0=h5d7a38c_3 - libgfortran5=13.2.0=hf226fd6_3 - - libglib=2.80.2=h59d46d9_1 + - libglib=2.82.2=h07bd6cf_0 - libhomfly=1.02r6=h93a5062_1 - - libhwloc=2.10.0=default_h7685b71_1001 - libiconv=1.17=h0d3ecfb_2 - - libintl=0.22.5=h8fbad5d_2 - - libintl-devel=0.22.5=h8fbad5d_2 + - libintl=0.22.5=h8414b35_3 + - libintl-devel=0.22.5=h8414b35_3 - libjpeg-turbo=3.0.0=hb547adb_1 - - liblapack=3.9.0=20_osxarm64_openblas - - liblapacke=3.9.0=20_osxarm64_openblas - - libllvm16=16.0.6=haab561b_3 - - libnghttp2=1.58.0=ha4dd798_1 - - libopenblas=0.3.25=openmp_h6c19121_0 - - libpng=1.6.43=h091b4b1_0 - - libsodium=1.0.18=h27ca646_1 - - libsqlite=3.46.0=hfb93653_0 - - libssh2=1.11.0=h7a5bd25_0 - - libtiff=4.6.0=h07db509_3 - - libtool=2.4.7=hb7217d7_0 - - libuv=1.48.0=h93a5062_0 - - libwebp=1.4.0=h54798ee_0 + - liblapack=3.9.0=25_osxarm64_openblas + - liblapacke=3.9.0=25_osxarm64_openblas + - libllvm17=17.0.6=h5090b49_2 + - libnghttp2=1.64.0=h6d7220d_0 + - libopenblas=0.3.28=openmp_hf332438_1 + - libpng=1.6.44=hc14010f_0 + - libsodium=1.0.20=h99b78c6_0 + - libsqlite=3.47.0=hbaaea75_1 + - libssh2=1.11.1=h9cc3647_0 + - libtiff=4.7.0=hfce79cd_1 - libwebp-base=1.4.0=h93a5062_0 - - libxcb=1.16=hf2054a2_0 - - libxml2=2.12.7=ha661575_1 - - libzlib=1.3.1=hfb2fe0b_1 + - libxcb=1.17.0=hdb1d25a_0 + - libxml2=2.13.5=hbbdcc80_0 + - libzlib=1.3.1=h8359307_2 - linbox=1.7.0=h3afee3a_0 - - llvm-openmp=18.1.8=hde57baf_0 - - llvm-tools=16.0.6=haab561b_3 - - lrcalc=2.1=hebf3989_6 + - llvm-openmp=19.1.4=hdb05f8b_0 + - llvm-tools=17.0.6=h5090b49_2 + - lrcalc=2.1=hf9b8971_7 - m4=1.4.18=h642e427_1001 - m4ri=20140914=hc97c1ff_1006 - m4rie=20150908=h22b9e9d_1002 - - make=4.3=he57ea6c_1 - - markupsafe=2.1.5=py39h17cfd9d_0 - - mathjax=3.2.2=hce30654_0 - - matplotlib=3.8.4=py39hdf13c20_2 - - matplotlib-base=3.8.4=py39h15359f4_2 + - markupsafe=3.0.2=py39h66d85bf_0 + - matplotlib=3.9.2=py39hdf13c20_2 + - matplotlib-base=3.9.2=py39hc57f556_2 - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - maxima=5.47.0=h2bbcd85_2 - - memory-allocator=0.1.3=py39h0f82c59_0 - - metis=5.1.0=h13dd4ca_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - mpc=1.3.1=h91ba8db_0 + - memory-allocator=0.1.3=py39h06df861_1 + - meson=1.6.0=pyhd8ed1ab_0 + - meson-python=0.17.1=pyh70fd9c4_0 + - mpc=1.3.1=h8f1351a_1 - mpfi=1.5.4=hbde5f5b_1001 - - mpfr=4.2.1=h41d338b_1 + - mpfr=4.2.1=hb693164_3 - mpmath=1.3.0=pyhd8ed1ab_0 - munkres=1.1.4=pyh9f0ad1d_0 - nauty=2.8.8=h93a5062_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=hb89a1cb_0 + - ncurses=6.5=h7bae524_1 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - networkx=3.2.1=pyhd8ed1ab_0 - ninja=1.12.1=h420ef59_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - ntl=11.4.3=hbb3f309_1 - numpy=1.26.4=py39h7aa2656_0 - - openblas=0.3.25=openmp_h55c453e_0 - - openjdk=22.0.1=hbeb2e11_0 + - openblas=0.3.28=openmp_hea878ba_1 - openjpeg=2.5.2=h9f1df11_0 - - openssl=3.3.1=hfb2fe0b_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 + - openssl=3.4.0=h39f12f2_0 + - packaging=24.2=pyhff2d567_1 - palp=2.20=h27ca646_0 - - pandoc=3.2.1=hce30654_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h5cb9fbc_0 - pari=2.15.5=h4f2304c_2_pthread - pari-elldata=0.0.20161017=0 - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - pari-seadata=0.0.20090618=0 - pari-seadata-small=0.0.20090618=0 - parso=0.8.4=pyhd8ed1ab_0 - - patch=2.7.6=h27ca646_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h297a79d_0 - - pep517=0.13.0=pyhd8ed1ab_0 + - pcre2=10.44=h297a79d_2 - perl=5.32.1=7_h4614cfb_perl5 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39h3baf582_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=hebf3989_0 - - pkg-config=0.29.2=hab62308_1008 + - pillow=11.0.0=py39h4ac03e3_0 + - pip=24.3.1=pyh8b19718_0 + - pkg-config=0.29.2=hde07d2e_1009 - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - planarity=3.0.2.0=h93a5062_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 + - platformdirs=4.3.6=pyhd8ed1ab_0 - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - ppl=1.2=h8b147cf_1006 - pplpy=0.8.9=py39ha497ee3_1 - primecount=7.6=hb6e4faa_0 - primecountpy=0.1.0=py39hbd775c9_4 - primesieve=11.0=hb7217d7_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39hfea33bf_0 - - pthread-stubs=0.4=h27ca646_1001 + - prompt-toolkit=3.0.48=pyha770c72_0 + - psutil=6.1.0=py39h57695bc_0 + - pthread-stubs=0.4=hd74edd7_1002 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39h48c5dd5_0 - - pybind11-global=2.12.0=py39h48c5dd5_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 - pycparser=2.22=pyhd8ed1ab_0 - pygments=2.18.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py39h336d860_0 - - pyobjc-framework-cocoa=10.3.1=py39h336d860_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py39h17cfd9d_0 + - pyparsing=3.2.0=pyhd8ed1ab_1 + - pyproject-metadata=0.9.0=pyh2cfa8aa_0 - pysocks=1.7.1=pyha2e5f31_6 - - python=3.9.19=hd7ebdb9_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39hf3050f2_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39h1261dcd_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39h2804cbe_4 - - pyyaml=6.0.1=py39h0f82c59_1 - - pyzmq=26.0.3=py39he7f0319_0 + - pytest=8.3.3=pyhd8ed1ab_0 + - pytest-xdist=3.6.1=pyhd8ed1ab_0 + - python=3.9.20=h9e33284_1_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_0 + - python-lrcalc=2.1=py39hfa9831e_7 + - python_abi=3.9=5_cp39 + - pytz=2024.2=pyhd8ed1ab_0 + - pyzmq=26.2.0=py39h6e893d0_3 - qd=2.3.22=hbec66e7_1004 - - qhull=2020.2=hc021e02_2 - - r-base=4.3.3=h8112bfe_3 - - r-lattice=0.22_6=r43hd2d937b_0 + - qhull=2020.2=h420ef59_5 - readline=8.2=h92ec313_1 - - referencing=0.35.1=pyhd8ed1ab_0 - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hb547adb_0 - - rpds-py=0.18.1=py39h0019b8a_0 - - rpy2=3.5.11=py39r43hf4a74a7_3 - rw=0.9=h93a5062_2 - - sagemath-db-combinatorial-designs=20140630=1 - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - sagemath-db-graphs=20210214=hd8ed1ab_0 - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py39h36c428d_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 + - scipy=1.13.1=py39h3d5391c_0 + - setuptools=75.6.0=pyhff2d567_1 - sigtool=0.1.3=h44b9a77_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hb460b52_1 + - singular=4.4.0=h8aafc33_0 - six=1.16.0=pyh6c4a22f_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 + - sphinx=7.4.7=pyhd8ed1ab_0 + - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 + - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h5838104_0 + - sqlite=3.47.0=hcd14bea_1 - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf6fcff2_1 - symmetrica=3.0.1=hb7217d7_0 - sympow=2.023.6=hb0babe8_3 - - sympy=1.12.1=pypyh2585a3b_103 + - sympy=1.13.3=pyh2585a3b_104 - tachyon=0.99b6=hb8a568e_1002 - - tapi=1100.0.11=he4954df_0 - - tar=1.34=h7cb298e_1 - - tbb=2021.12.0=h420ef59_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321h9ea1dce_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 + - tapi=1300.6.5=h03f4b80_0 - tk=8.6.13=h5083fa2_1 - - tktable=2.10=h1e387b8_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39hfea33bf_0 - - tox=4.15.1=pyhd8ed1ab_0 + - tomli=2.1.0=pyhff2d567_0 + - tornado=6.4.2=py39hf3bc14e_0 - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39h2804cbe_0 - - unicodedata2=15.1.0=py39h0f82c59_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=2.2.2=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 + - tzdata=2024b=hc8b5060_0 + - unicodedata2=15.1.0=py39h57695bc_1 + - urllib3=2.2.3=pyhd8ed1ab_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=hb547adb_0 - - xorg-libxdmcp=1.1.3=h27ca646_0 + - wheel=0.45.1=pyhd8ed1ab_0 + - widgetsnbextension=4.0.13=pyhd8ed1ab_0 + - xorg-libxau=1.0.11=hd74edd7_1 + - xorg-libxdmcp=1.1.5=hd74edd7_0 - xz=5.2.6=h57fd34a_0 - - yaml=0.2.5=h3422bc3_2 - - zeromq=4.3.5=hcc0f68c_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=hfb2fe0b_1 + - zeromq=4.3.5=hc1bb282_7 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.3.1=h8359307_2 + - zstandard=0.23.0=py39hcf1bb16_1 - zstd=1.5.6=hb46c0d2_0 diff --git a/environment-dev-3.10-linux-aarch64.yml b/environment-dev-3.10-linux-aarch64.yml deleted file mode 100644 index 111950c3a42..00000000000 --- a/environment-dev-3.10-linux-aarch64.yml +++ /dev/null @@ -1,489 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: linux-aarch64 -# input_hash: d36865ba776427275c808ea91ee0d71d1f653f57bf83e81fbb92003fd5db575e - -channels: - - conda-forge -dependencies: - - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - _sysroot_linux-aarch64_curr_repodata_hack=4=h57d6b7b_14 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.11=h31becfc_1 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310hb299538_4 - - arpack=3.9.1=nompi_hd363cd0_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h4e544f5_1 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321h2148fe1_1 - - automake=1.16.5=pl5321h8af1aa0_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=hf897c2e_0 - - bdw-gc=8.0.6=hd62202e_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=hf1166c9_7 - - binutils_impl_linux-aarch64=2.40=hf54a868_7 - - binutils_linux-aarch64=2.40=h1f91aba_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linuxaarch64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=ha990451_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h31becfc_1 - - brotli-bin=1.1.0=h31becfc_1 - - brotli-python=1.1.0=py310hbb3657e_1 - - bwidget=1.9.14=h8af1aa0_1 - - bzip2=1.0.8=h31becfc_5 - - c-ares=1.28.1=h31becfc_0 - - c-compiler=1.7.0=h31becfc_1 - - ca-certificates=2024.6.2=hcefe29a_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=h5c54ea9_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cddlib=1!0.94m=h719063d_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310hce94938_0 - - chardet=5.2.0=py310hbbe02a8_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h31becfc_1 - - cmake=3.29.6=h7042e5d_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310h4c7bcd0_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=h8af1aa0_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py310h586407a_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - cryptography=42.0.8=py310hf601767_0 - - curl=8.8.0=h7daf2e0_0 - - cvxopt=1.3.2=py310he29a27f_2 - - cxx-compiler=1.7.0=h2a328a1_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py310h4cbba44_0 - - cysignals=1.11.2=py310h485802a_3 - - cython=3.0.10=py310hbb3657e_0 - - dbus=1.13.6=h12b9eeb_3 - - debugpy=1.8.1=py310hbb3657e_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hb12102e_1203 - - ecl=23.9.9=h6475f26_0 - - eclib=20231212=he26bab5_0 - - ecm=7.0.5=ha2d0fc4_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h2f0025b_0 - - fflas-ffpack=2.5.0=h503e619_0 - - fftw=3.3.10=nompi_h020dacd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=ha9a116f_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310hb52b2da_0 - - fortran-compiler=1.7.0=h7048d53_1 - - fplll=5.4.5=hb3a790e_0 - - fpylll=0.6.1=py310hfdbf2a6_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=hf0a5ef3_2 - - fribidi=1.0.10=hb9de7d4_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=h597289e_3 - - gap-defaults=4.12.2=h8af1aa0_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=hdb0cc85_13 - - gcc_impl_linux-aarch64=12.3.0=h3d98823_13 - - gcc_linux-aarch64=12.3.0=ha52a6ea_9 - - gengetopt=2.23=h01db608_0 - - gf2x=1.3.0=h1b3b3a3_2 - - gfan=0.6.2=h5f589ec_1003 - - gfortran=12.3.0=hdb0cc85_13 - - gfortran_impl_linux-aarch64=12.3.0=h97ebfd2_13 - - gfortran_linux-aarch64=12.3.0=ha7b8e4b_9 - - gh=2.46.0=h652cbe9_0 - - giac=1.9.0.21=h04922a4_1 - - giflib=5.2.2=h31becfc_0 - - git=2.45.2=pl5321h011b5c6_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h364d21b_0 - - glpk=5.0=h66325d0_0 - - gmp=6.3.0=h0a1ffab_2 - - gmpy2=2.1.5=py310h05bcf56_1 - - graphite2=1.3.13=h2f0025b_1003 - - gsl=2.7=h294027d_0 - - gxx=12.3.0=hdb0cc85_13 - - gxx_impl_linux-aarch64=12.3.0=hba91e99_13 - - gxx_linux-aarch64=12.3.0=h9d1f256_9 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h9812418_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h787c7f5_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h197073e_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h15043fe_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jeepney=0.8.0=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=h8af1aa0_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310h4c7bcd0_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310h4c7bcd0_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-aarch64=4.18.0=h5b4a56d_14 - - keyring=25.2.1=pyha804496_0 - - keyutils=1.6.1=h4e544f5_0 - - kiwisolver=1.4.5=py310he290b8a_1 - - krb5=1.21.2=hc419048_0 - - lcalc=2.0.5=he588f68_2 - - lcms2=2.16=h922389a_0 - - ld_impl_linux-aarch64=2.40=h9fc2d93_7 - - lerc=4.0.0=h4de3ea5_0 - - libatomic_ops=7.6.14=h4e544f5_0 - - libblas=3.9.0=20_linuxaarch64_openblas - - libboost=1.85.0=hb41fec8_2 - - libboost-devel=1.85.0=h37bb5a9_2 - - libboost-headers=1.85.0=h8af1aa0_2 - - libbraiding=1.2=hd600fc2_0 - - libbrial=1.2.12=h9429f74_3 - - libbrotlicommon=1.1.0=h31becfc_1 - - libbrotlidec=1.1.0=h31becfc_1 - - libbrotlienc=1.1.0=h31becfc_1 - - libcap=2.69=h883460d_0 - - libcblas=3.9.0=20_linuxaarch64_openblas - - libcbor=0.9.0=h01db608_0 - - libcups=2.3.3=h405e4a8_4 - - libcurl=8.8.0=h4e8248e_0 - - libdeflate=1.20=h31becfc_0 - - libedit=3.1.20191231=he28a2e2_2 - - libev=4.33=h31becfc_2 - - libexpat=2.6.2=h2f0025b_0 - - libffi=3.4.2=h3557bc0_5 - - libfido2=1.15.0=hab05c5e_0 - - libflint=3.0.1=hc392af7_ntl_100 - - libgcc-devel_linux-aarch64=12.3.0=h6144e03_113 - - libgcc-ng=13.2.0=he277a41_13 - - libgd=2.3.3=hcd22fd5_9 - - libgfortran-ng=13.2.0=he9431aa_13 - - libgfortran5=13.2.0=h2af0866_13 - - libglib=2.80.2=haee52c6_1 - - libgomp=13.2.0=he277a41_13 - - libhomfly=1.02r6=h31becfc_1 - - libhwloc=2.10.0=default_h3030c0e_1001 - - libiconv=1.17=h31becfc_2 - - libjpeg-turbo=3.0.0=h31becfc_1 - - liblapack=3.9.0=20_linuxaarch64_openblas - - liblapacke=3.9.0=20_linuxaarch64_openblas - - libnghttp2=1.58.0=hb0e430d_1 - - libnsl=2.0.1=h31becfc_0 - - libopenblas=0.3.25=pthreads_h5a5ec62_0 - - libpng=1.6.43=h194ca79_0 - - libsanitizer=12.3.0=h57e2e72_13 - - libsodium=1.0.18=hb9de7d4_1 - - libsqlite=3.46.0=hf51ef55_0 - - libssh2=1.11.0=h492db2e_0 - - libstdcxx-devel_linux-aarch64=12.3.0=h6144e03_113 - - libstdcxx-ng=13.2.0=h3f4de04_13 - - libtiff=4.6.0=hf980d43_3 - - libtool=2.4.7=h4de3ea5_0 - - libudev1=255=h31becfc_1 - - libuuid=2.38.1=hb4cce97_0 - - libuv=1.48.0=h31becfc_0 - - libwebp=1.4.0=h8b4e01b_0 - - libwebp-base=1.4.0=h31becfc_0 - - libxcb=1.16=h7935292_0 - - libxcrypt=4.4.36=h31becfc_1 - - libxml2=2.12.7=h49dc7a2_1 - - libzlib=1.3.1=h68df207_1 - - linbox=1.7.0=h681a5ee_0 - - llvm-openmp=18.1.8=hb063fc5_0 - - lrcalc=2.1=h2f0025b_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=h516909a_1001 - - m4ri=20140914=hedfd65a_1006 - - m4rie=20150908=hf0a5ef3_1002 - - make=4.3=h309ac5b_1 - - markupsafe=2.1.5=py310h7c1f4a2_0 - - mathjax=3.2.2=h8af1aa0_0 - - matplotlib=3.8.4=py310hbbe02a8_2 - - matplotlib-base=3.8.4=py310h84f21c1_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h6475f26_2 - - memory-allocator=0.1.3=py310hb299538_0 - - metis=5.1.0=h2f0025b_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=hf4c8f4c_0 - - mpfi=1.5.4=h846f343_1001 - - mpfr=4.2.1=ha2d0fc4_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py310h6cd5c4a_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h31becfc_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h0425590_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h70be974_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=h0d7519b_1 - - numpy=1.26.4=py310hcbab775_0 - - openblas=0.3.25=pthreads_h339cbfa_0 - - openjdk=22.0.1=h3d4cd67_0 - - openjpeg=2.5.2=h0d9d63b_0 - - openssh=9.6p1=h04b8c23_0 - - openssl=3.3.1=h68df207_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=hb9de7d4_0 - - pandoc=3.2.1=h8af1aa0_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h399c48b_0 - - pari=2.15.5=h169c2a7_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=hf897c2e_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h070dd5b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h31becfc_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310h611336f_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h2f0025b_0 - - pkg-config=0.29.2=hb9de7d4_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h31becfc_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h984aac9_1006 - - pplpy=0.8.9=py310h6665419_1 - - primecount=7.9=hd600fc2_0 - - primecountpy=0.1.0=py310h586407a_4 - - primesieve=11.1=h2f0025b_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310hb52b2da_0 - - pthread-stubs=0.4=hb9de7d4_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310h586407a_0 - - pybind11-global=2.12.0=py310h586407a_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py310h4719f56_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py310h7c1f4a2_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.10.14=hbbe8eec_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310hbb3657e_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310h5e48e15_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310h4c7bcd0_4 - - pyyaml=6.0.1=py310hb299538_1 - - pyzmq=26.0.3=py310he875deb_0 - - qd=2.3.22=h05efe27_1004 - - qhull=2020.2=hd62202e_2 - - r-base=4.3.3=h7f20121_3 - - r-lattice=0.22_6=r43h25e906a_0 - - readline=8.2=h8fc344f_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h31becfc_0 - - rpds-py=0.18.1=py310h59d1b7a_0 - - rpy2=3.5.11=py310r43h8b6b5fc_3 - - ruamel.yaml=0.18.6=py310hb299538_0 - - ruamel.yaml.clib=0.2.8=py310hb299538_0 - - rw=0.9=h31becfc_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.3=py310hcbab775_1 - - secretstorage=3.3.3=py310hbbe02a8_2 - - sed=4.8=ha0d5d3d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hbe76a8a_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=hdc7ab3c_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=h3944111_1 - - symmetrica=3.0.1=hd600fc2_0 - - sympow=2.023.6=h157afb5_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-aarch64=2.17=h5b4a56d_14 - - tachyon=0.99b6=ha0bfc61_1002 - - tar=1.34=h048efde_0 - - tbb=2021.12.0=h70be974_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h17f021e_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h194ca79_0 - - tktable=2.10=h52f7bd3_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310h03727f4_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310h4c7bcd0_0 - - unicodedata2=15.1.0=py310hb299538_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-fixesproto=5.0=h3557bc0_1002 - - xorg-inputproto=2.3.2=h3557bc0_1002 - - xorg-kbproto=1.0.7=h3557bc0_1002 - - xorg-libice=1.1.1=h7935292_0 - - xorg-libsm=1.2.4=h5a01bc2_0 - - xorg-libx11=1.8.9=h08be655_1 - - xorg-libxau=1.0.11=h31becfc_0 - - xorg-libxdmcp=1.1.3=h3557bc0_0 - - xorg-libxext=1.3.4=h2a766a3_2 - - xorg-libxfixes=5.0.3=h3557bc0_1004 - - xorg-libxi=1.7.10=h3557bc0_0 - - xorg-libxrender=0.9.11=h7935292_0 - - xorg-libxt=1.3.0=h7935292_1 - - xorg-libxtst=1.2.3=hf897c2e_1002 - - xorg-recordproto=1.14.2=hf897c2e_1002 - - xorg-renderproto=0.11.1=h3557bc0_1002 - - xorg-xextproto=7.3.0=h2a766a3_1003 - - xorg-xproto=7.0.31=h3557bc0_1007 - - xz=5.2.6=h9cdd2b7_0 - - yaml=0.2.5=hf897c2e_2 - - zeromq=4.3.5=h28faeed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h68df207_1 - - zstd=1.5.6=h02f22dd_0 diff --git a/environment-dev-3.10-linux.yml b/environment-dev-3.10-linux.yml deleted file mode 100644 index 4e35ec5d152..00000000000 --- a/environment-dev-3.10-linux.yml +++ /dev/null @@ -1,536 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: linux-64 -# input_hash: f5ac6bc66f134451e0ec73f0a00b8da508df8c7c642f57231ab559a7c63f8ee0 - -channels: - - conda-forge -dependencies: - - _libgcc_mutex=0.1=conda_forge - - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.12=h4ab18f5_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310h2372a71_4 - - arpack=3.9.1=nompi_h77f6705_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h166bdaf_1 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321h2b4cb7a_1 - - automake=1.16.5=pl5321ha770c72_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h7f98852_0 - - bdw-gc=8.0.6=h4bd325d_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=h4852527_7 - - binutils_impl_linux-64=2.40=ha1999f0_7 - - binutils_linux-64=2.40=hb3c18ed_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linux64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h44aadfe_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hd590300_1 - - brotli-bin=1.1.0=hd590300_1 - - brotli-python=1.1.0=py310hc6cd4ac_1 - - bwidget=1.9.14=ha770c72_1 - - bzip2=1.0.8=hd590300_5 - - c-ares=1.28.1=hd590300_0 - - c-compiler=1.7.0=hd590300_1 - - ca-certificates=2024.6.2=hbcca054_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=hbb29018_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cddlib=1!0.94m=h9202a9a_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310h2fee648_0 - - chardet=5.2.0=py310hff52083_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=hd590300_1 - - cmake=3.29.6=hcafd917_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310hff52083_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=ha770c72_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py310hd41b1e2_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - cryptography=42.0.8=py310hb1bd9d3_0 - - curl=8.8.0=he654da7_0 - - cvxopt=1.3.2=py310h7b0674a_2 - - cxx-compiler=1.7.0=h00ab1b0_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py310h14ed79e_0 - - cysignals=1.11.2=py310h945e7c7_3 - - cython=3.0.10=py310hc6cd4ac_0 - - dbus=1.13.6=h5008d03_3 - - debugpy=1.8.1=py310hc6cd4ac_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hd9d9efa_1203 - - ecl=23.9.9=hed6455c_0 - - eclib=20231212=h96f522a_0 - - ecm=7.0.5=h9458935_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h59595ed_0 - - fflas-ffpack=2.5.0=h4f9960b_0 - - fftw=3.3.10=nompi_hf1063bd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h14ed4e7_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310hc51659f_0 - - fortran-compiler=1.7.0=heb67821_1 - - fplll=5.4.5=h384768b_0 - - fpylll=0.6.1=py310h7e26f94_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=h267a509_2 - - fribidi=1.0.10=h36c2ea0_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he9a28a4_3 - - gap-defaults=4.12.2=ha770c72_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=h915e2ae_13 - - gcc_impl_linux-64=12.3.0=h58ffeeb_13 - - gcc_linux-64=12.3.0=h9528a6a_9 - - gengetopt=2.23=h9c3ff4c_0 - - gettext=0.22.5=h59595ed_2 - - gettext-tools=0.22.5=h59595ed_2 - - gf2x=1.3.0=ha476b99_2 - - gfan=0.6.2=hb86e20a_1003 - - gfortran=12.3.0=h915e2ae_13 - - gfortran_impl_linux-64=12.3.0=h8f2110c_13 - - gfortran_linux-64=12.3.0=h5877db1_9 - - gh=2.52.0=he0e2781_0 - - giac=1.9.0.21=h673759e_1 - - giflib=5.2.2=hd590300_0 - - git=2.45.2=pl5321ha099dd3_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=hb789bce_0 - - glib=2.80.2=h8a4344b_1 - - glib-tools=2.80.2=h73ef956_1 - - glpk=5.0=h445213a_0 - - gmp=6.3.0=hac33072_2 - - gmpy2=2.1.5=py310hc7909c9_1 - - graphite2=1.3.13=h59595ed_1003 - - gsl=2.7=he838d99_0 - - gst-plugins-base=1.24.5=hbaaba92_0 - - gstreamer=1.24.5=haf2f30d_0 - - gxx=12.3.0=h915e2ae_13 - - gxx_impl_linux-64=12.3.0=h2a574ab_13 - - gxx_linux-64=12.3.0=ha28b414_9 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=hfac3d4d_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h59595ed_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hef0740d_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h623f65a_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jeepney=0.8.0=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=ha770c72_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310hff52083_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310hff52083_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-64=2.6.32=he073ed8_17 - - keyring=25.2.1=pyha804496_0 - - keyutils=1.6.1=h166bdaf_0 - - kiwisolver=1.4.5=py310hd41b1e2_1 - - krb5=1.21.2=h659d440_0 - - lame=3.100=h166bdaf_1003 - - lcalc=2.0.5=h5aac1b6_2 - - lcms2=2.16=hb7c19ff_0 - - ld_impl_linux-64=2.40=hf3520f5_7 - - lerc=4.0.0=h27087fc_0 - - libasprintf=0.22.5=h661eb56_2 - - libasprintf-devel=0.22.5=h661eb56_2 - - libatomic_ops=7.6.14=h166bdaf_0 - - libblas=3.9.0=20_linux64_openblas - - libboost=1.85.0=hba137d9_2 - - libboost-devel=1.85.0=h00ab1b0_2 - - libboost-headers=1.85.0=ha770c72_2 - - libbraiding=1.2=hcb278e6_0 - - libbrial=1.2.12=h76af697_3 - - libbrotlicommon=1.1.0=hd590300_1 - - libbrotlidec=1.1.0=hd590300_1 - - libbrotlienc=1.1.0=hd590300_1 - - libcap=2.69=h0f662aa_0 - - libcblas=3.9.0=20_linux64_openblas - - libcbor=0.10.2=hcb278e6_0 - - libclang-cpp15=15.0.7=default_h127d8a8_5 - - libclang13=18.1.8=default_h6ae225f_0 - - libcups=2.3.3=h4637d8d_4 - - libcurl=8.8.0=hca28451_0 - - libdeflate=1.20=hd590300_0 - - libedit=3.1.20191231=he28a2e2_2 - - libev=4.33=hd590300_2 - - libevent=2.1.12=hf998b51_1 - - libexpat=2.6.2=h59595ed_0 - - libffi=3.4.2=h7f98852_5 - - libfido2=1.15.0=hdd1f21f_0 - - libflac=1.4.3=h59595ed_0 - - libflint=3.0.1=h5f2e117_ntl_100 - - libgcc-devel_linux-64=12.3.0=h6b66f73_113 - - libgcc-ng=13.2.0=h77fa898_13 - - libgcrypt=1.10.3=hd590300_0 - - libgd=2.3.3=h119a65a_9 - - libgettextpo=0.22.5=h59595ed_2 - - libgettextpo-devel=0.22.5=h59595ed_2 - - libgfortran-ng=13.2.0=h69a702a_13 - - libgfortran5=13.2.0=h3d2ce59_13 - - libglib=2.80.2=h8a4344b_1 - - libgomp=13.2.0=h77fa898_13 - - libgpg-error=1.49=h4f305b6_0 - - libhomfly=1.02r6=hd590300_1 - - libhwloc=2.10.0=default_h5622ce7_1001 - - libiconv=1.17=hd590300_2 - - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_openblas - - liblapacke=3.9.0=20_linux64_openblas - - libllvm15=15.0.7=hb3ce162_4 - - libllvm18=18.1.8=hc9dba70_0 - - libnghttp2=1.58.0=h47da74e_1 - - libnsl=2.0.1=hd590300_0 - - libogg=1.3.5=h4ab18f5_0 - - libopenblas=0.3.25=pthreads_h413a1c8_0 - - libopus=1.3.1=h7f98852_1 - - libpng=1.6.43=h2797004_0 - - libpq=16.3=ha72fbe1_0 - - libsanitizer=12.3.0=hb8811af_13 - - libsndfile=1.2.2=hc60ed4a_1 - - libsodium=1.0.18=h36c2ea0_1 - - libsqlite=3.46.0=hde9e2c9_0 - - libssh2=1.11.0=h0841786_0 - - libstdcxx-devel_linux-64=12.3.0=h6b66f73_113 - - libstdcxx-ng=13.2.0=hc0a3c3a_13 - - libsystemd0=255=h3516f8a_1 - - libtiff=4.6.0=h1dd3fc0_3 - - libtool=2.4.7=h27087fc_0 - - libudev1=255=h3f72095_1 - - libuuid=2.38.1=h0b41bf4_0 - - libuv=1.48.0=hd590300_0 - - libvorbis=1.3.7=h9c3ff4c_0 - - libwebp=1.4.0=h2c329e2_0 - - libwebp-base=1.4.0=hd590300_0 - - libxcb=1.16=hd590300_0 - - libxcrypt=4.4.36=hd590300_1 - - libxkbcommon=1.7.0=h2c5496b_1 - - libxml2=2.12.7=hc051c1a_1 - - libzlib=1.3.1=h4ab18f5_1 - - linbox=1.7.0=ha329b40_0 - - llvm-openmp=18.1.8=hf5423f3_0 - - lrcalc=2.1=h59595ed_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - lz4-c=1.9.4=hcb278e6_0 - - m4=1.4.18=h516909a_1001 - - m4ri=20140914=hae5d5c5_1006 - - m4rie=20150908=h267a509_1002 - - make=4.3=hd18ef5c_1 - - markupsafe=2.1.5=py310h2372a71_0 - - mathjax=3.2.2=ha770c72_0 - - matplotlib=3.8.4=py310hff52083_2 - - matplotlib-base=3.8.4=py310hef631a5_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=hed6455c_2 - - memory-allocator=0.1.3=py310h2372a71_0 - - meson=1.5.2=pyhd8ed1ab_0 - - meson-python=0.15.0=pyh0c530f3_0 - - metis=5.1.0=h59595ed_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=hfe3b2da_0 - - mpfi=1.5.4=h9f54685_1001 - - mpfr=4.2.1=h9458935_1 - - mpg123=1.32.6=h59595ed_0 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py310h25c7140_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - mysql-common=8.3.0=hf1915f5_4 - - mysql-libs=8.3.0=hca2cd23_4 - - nauty=2.8.8=hd590300_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h59595ed_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h297d8ca_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - nspr=4.35=h27087fc_0 - - nss=3.101=h593d115_0 - - ntl=11.4.3=hef3c4d3_1 - - numpy=1.26.4=py310hb13e2d6_0 - - openblas=0.3.25=pthreads_h7a3da1a_0 - - openjdk=21.0.2=haa376d0_0 - - openjpeg=2.5.2=h488ebb8_0 - - openssh=9.6p1=h2d3b35a_0 - - openssl=3.3.1=h4ab18f5_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=h36c2ea0_0 - - pandoc=3.2.1=ha770c72_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h84a9a3c_0 - - pari=2.15.5=h4d4ae9b_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=h7f98852_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h0f59acf_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_hd590300_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310hebfe307_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.2=h59595ed_0 - - pkg-config=0.29.2=h36c2ea0_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=hd590300_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h6ec01c2_1006 - - pplpy=0.8.9=py310h18554fa_1 - - primecount=7.9=hcb278e6_0 - - primecountpy=0.1.0=py310hd41b1e2_4 - - primesieve=11.1=h59595ed_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310hc51659f_0 - - pthread-stubs=0.4=h36c2ea0_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pulseaudio-client=17.0=hb77b528_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310hd41b1e2_0 - - pybind11-global=2.12.0=py310hd41b1e2_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py310he421c4c_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyqt=5.15.9=py310h04931ad_5 - - pyqt5-sip=12.12.2=py310hc6cd4ac_5 - - pyrsistent=0.20.0=py310h2372a71_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.10.14=hd12c33a_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310hc6cd4ac_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310hcb52e73_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310hff52083_4 - - pyyaml=6.0.1=py310h2372a71_1 - - pyzmq=26.0.3=py310h6883aea_0 - - qd=2.3.22=h2cc385e_1004 - - qhull=2020.2=h4bd325d_2 - - qt-main=5.15.8=ha2b5568_22 - - r-base=4.3.3=he2d9a6e_3 - - r-lattice=0.22_6=r43h57805ef_0 - - readline=8.2=h8228510_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hd590300_0 - - rpds-py=0.18.1=py310he421c4c_0 - - rpy2=3.5.11=py310r43h1f7b6fc_3 - - ruamel.yaml=0.18.6=py310h2372a71_0 - - ruamel.yaml.clib=0.2.8=py310h2372a71_0 - - rw=0.9=hd590300_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py310hb13e2d6_0 - - secretstorage=3.3.3=py310hff52083_2 - - sed=4.8=he412f7d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h33f5c3f_1 - - sip=6.7.12=py310hc6cd4ac_0 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h6d4b2fc_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf4753ba_1 - - symmetrica=3.0.1=hcb278e6_0 - - sympow=2.023.6=hc6ab17c_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-64=2.12=he073ed8_17 - - tachyon=0.99b6=hba7d16a_1002 - - tar=1.34=hb2e2bae_1 - - tbb=2021.12.0=h297d8ca_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h0f457ee_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=noxft_h4845f30_101 - - tktable=2.10=h8bc8fbc_6 - - toml=0.10.2=pyhd8ed1ab_0 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310hc51659f_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310hff52083_0 - - unicodedata2=15.1.0=py310h2372a71_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xcb-util=0.4.1=hb711507_2 - - xcb-util-image=0.4.0=hb711507_2 - - xcb-util-keysyms=0.4.1=hb711507_0 - - xcb-util-renderutil=0.3.10=hb711507_0 - - xcb-util-wm=0.4.2=hb711507_0 - - xkeyboard-config=2.42=h4ab18f5_0 - - xorg-fixesproto=5.0=h7f98852_1002 - - xorg-inputproto=2.3.2=h7f98852_1002 - - xorg-kbproto=1.0.7=h7f98852_1002 - - xorg-libice=1.1.1=hd590300_0 - - xorg-libsm=1.2.4=h7391055_0 - - xorg-libx11=1.8.9=hb711507_1 - - xorg-libxau=1.0.11=hd590300_0 - - xorg-libxdmcp=1.1.3=h7f98852_0 - - xorg-libxext=1.3.4=h0b41bf4_2 - - xorg-libxfixes=5.0.3=h7f98852_1004 - - xorg-libxi=1.7.10=h7f98852_0 - - xorg-libxrender=0.9.11=hd590300_0 - - xorg-libxt=1.3.0=hd590300_1 - - xorg-libxtst=1.2.3=h7f98852_1002 - - xorg-recordproto=1.14.2=h7f98852_1002 - - xorg-renderproto=0.11.1=h7f98852_1002 - - xorg-xextproto=7.3.0=h0b41bf4_1003 - - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - - xorg-xproto=7.0.31=h7f98852_1007 - - xz=5.2.6=h166bdaf_0 - - yaml=0.2.5=h7f98852_2 - - zeromq=4.3.5=h75354e8_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h4ab18f5_1 - - zstd=1.5.6=ha6fb4c9_0 diff --git a/environment-dev-3.10-macos-x86_64.yml b/environment-dev-3.10-macos-x86_64.yml deleted file mode 100644 index c3f4696d491..00000000000 --- a/environment-dev-3.10-macos-x86_64.yml +++ /dev/null @@ -1,470 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: osx-64 -# input_hash: 6f780a484a3cb4f5357ae4fc25f621ccf74f1cb625cb47cbd49f37ed9e7d3f46 - -channels: - - conda-forge -dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310h6729b98_4 - - arpack=3.9.1=nompi_hf81eadf_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321hed12c24_1 - - automake=1.16.5=pl5321h694c41f_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h0d85af4_0 - - bdw-gc=8.0.6=h940c156_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osx64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h07eb623_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h0dc2134_1 - - brotli-bin=1.1.0=h0dc2134_1 - - brotli-python=1.1.0=py310h9e9d8ca_1 - - bwidget=1.9.14=h694c41f_1 - - bzip2=1.0.8=h10d778d_5 - - c-ares=1.28.1=h10d778d_0 - - c-compiler=1.7.0=h282daa2_1 - - ca-certificates=2024.6.2=h8857fd0_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=h9f650ed_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cctools=986=h40f6528_0 - - cctools_osx-64=986=ha1c5b94_0 - - cddlib=1!0.94m=h0f52abe_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310hdca579f_0 - - chardet=5.2.0=py310h2ec42d9_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_ha3b9224_8 - - clang-16=16.0.6=default_h4c8afb6_8 - - clang_impl_osx-64=16.0.6=h8787910_16 - - clang_osx-64=16.0.6=hb91bd55_16 - - clangxx=16.0.6=default_ha3b9224_8 - - clangxx_impl_osx-64=16.0.6=h6d92fbe_16 - - clangxx_osx-64=16.0.6=hb91bd55_16 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h10d778d_1 - - cmake=3.29.6=h749d262_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310h2ec42d9_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=ha38d28d_2 - - compiler-rt_osx-64=16.0.6=ha38d28d_2 - - compilers=1.7.0=h694c41f_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py310hb3b189b_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - curl=8.8.0=hea67d85_0 - - cvxopt=1.3.2=py310h1fac3e1_2 - - cxx-compiler=1.7.0=h7728843_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py310hc7df965_0 - - cysignals=1.11.2=py310h8c82e65_3 - - cython=3.0.10=py310h5daac23_0 - - debugpy=1.8.1=py310h5daac23_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h6e329d1_1203 - - ecl=23.9.9=h2b27fa8_0 - - eclib=20231212=h02435c3_0 - - ecm=7.0.5=h4f6b447_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h73e2aa4_0 - - fflas-ffpack=2.5.0=h5898d61_0 - - fftw=3.3.10=nompi_h292e606_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h5bb23bf_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310h936d840_0 - - fortran-compiler=1.7.0=h6c2ab21_1 - - fplll=5.4.5=hb7981ad_0 - - fpylll=0.6.1=py310h65a3d7e_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=h60636b9_2 - - fribidi=1.0.10=hbcb3906_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=hc16eb5f_3 - - gap-defaults=4.12.2=h694c41f_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=he49afe7_0 - - gettext=0.22.5=h5ff76d1_2 - - gettext-tools=0.22.5=h5ff76d1_2 - - gf2x=1.3.0=hb2a7efb_2 - - gfan=0.6.2=hd793b56_1003 - - gfortran=12.3.0=h2c809b3_1 - - gfortran_impl_osx-64=12.3.0=hc328e78_3 - - gfortran_osx-64=12.3.0=h18f7dce_1 - - gh=2.52.0=he13f2d6_0 - - giac=1.9.0.21=h92f3f65_1 - - giflib=5.2.2=h10d778d_0 - - git=2.45.2=pl5321hb0c6a96_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h1b3d6f7_0 - - glpk=5.0=h3cb5acd_0 - - gmp=6.3.0=hf036a51_2 - - gmpy2=2.1.5=py310h0310db1_1 - - graphite2=1.3.13=h73e2aa4_1003 - - gsl=2.7=h93259b0_0 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h053f038_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hf5e326d_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hde4452d_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h61918c1_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isl=0.26=imath32_h2e86a7b_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.9=h694c41f_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310h2ec42d9_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310h2ec42d9_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - keyring=25.2.1=pyh534df25_0 - - kiwisolver=1.4.5=py310h88cfcbd_1 - - krb5=1.21.2=hb884880_0 - - lcalc=2.0.5=h547a6ed_2 - - lcms2=2.16=ha2f27b4_0 - - ld64=711=ha02d983_0 - - ld64_osx-64=711=ha20a434_0 - - lerc=4.0.0=hb486fe8_0 - - libasprintf=0.22.5=h5ff76d1_2 - - libasprintf-devel=0.22.5=h5ff76d1_2 - - libatomic_ops=7.6.14=hb7f2c08_0 - - libblas=3.9.0=20_osx64_openblas - - libboost=1.85.0=h739af76_2 - - libboost-devel=1.85.0=h2b186f8_2 - - libboost-headers=1.85.0=h694c41f_2 - - libbraiding=1.2=hf0c8a7f_0 - - libbrial=1.2.12=h81e9653_3 - - libbrotlicommon=1.1.0=h0dc2134_1 - - libbrotlidec=1.1.0=h0dc2134_1 - - libbrotlienc=1.1.0=h0dc2134_1 - - libcblas=3.9.0=20_osx64_openblas - - libcbor=0.10.2=hf0c8a7f_0 - - libclang-cpp16=16.0.6=default_h4c8afb6_8 - - libcurl=8.8.0=hf9fcc65_0 - - libcxx=17.0.6=h88467a6_0 - - libdeflate=1.20=h49d49c5_0 - - libedit=3.1.20191231=h0678c8f_2 - - libev=4.33=h10d778d_2 - - libexpat=2.6.2=h73e2aa4_0 - - libffi=3.4.2=h0d85af4_5 - - libfido2=1.15.0=h41b28d8_0 - - libflint=3.0.1=h5d15de0_ntl_100 - - libgd=2.3.3=h0dceb68_9 - - libgettextpo=0.22.5=h5ff76d1_2 - - libgettextpo-devel=0.22.5=h5ff76d1_2 - - libgfortran=5.0.0=13_2_0_h97931a8_3 - - libgfortran-devel_osx-64=12.3.0=h0b6f5ec_3 - - libgfortran5=13.2.0=h2873a65_3 - - libglib=2.80.2=h736d271_1 - - libhomfly=1.02r6=h10d778d_1 - - libhwloc=2.10.0=default_h456cccd_1001 - - libiconv=1.17=hd75f5a5_2 - - libintl=0.22.5=h5ff76d1_2 - - libintl-devel=0.22.5=h5ff76d1_2 - - libjpeg-turbo=3.0.0=h0dc2134_1 - - liblapack=3.9.0=20_osx64_openblas - - liblapacke=3.9.0=20_osx64_openblas - - libllvm16=16.0.6=hbedff68_3 - - libnghttp2=1.58.0=h64cf6d3_1 - - libopenblas=0.3.25=openmp_hfef2a42_0 - - libpng=1.6.43=h92b6c6a_0 - - libsodium=1.0.18=hbcb3906_1 - - libsqlite=3.46.0=h1b8f9f3_0 - - libssh2=1.11.0=hd019ec5_0 - - libtiff=4.6.0=h129831d_3 - - libtool=2.4.7=hf0c8a7f_0 - - libuv=1.48.0=h67532ce_0 - - libwebp=1.4.0=hc207709_0 - - libwebp-base=1.4.0=h10d778d_0 - - libxcb=1.16=h0dc2134_0 - - libxml2=2.12.7=h3e169fe_1 - - libzlib=1.3.1=h87427d6_1 - - linbox=1.7.0=h7061c92_0 - - llvm-openmp=18.1.8=h15ab845_0 - - llvm-tools=16.0.6=hbedff68_3 - - lrcalc=2.1=h73e2aa4_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=haf1e3a3_1001 - - m4ri=20140914=hd82a5f3_1006 - - m4rie=20150908=hc616cfc_1002 - - make=4.3=h22f3db7_1 - - markupsafe=2.1.5=py310hb372a2b_0 - - mathjax=3.2.2=h694c41f_0 - - matplotlib=3.8.4=py310h2ec42d9_2 - - matplotlib-base=3.8.4=py310h7ea1ff3_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2b27fa8_2 - - memory-allocator=0.1.3=py310h6729b98_0 - - metis=5.1.0=he965462_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=h81bd1dd_0 - - mpfi=1.5.4=h52b28e3_1001 - - mpfr=4.2.1=h4f6b447_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py310h5334dd0_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h10d778d_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h5846eda_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h3c5361c_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=h0ab3c2f_1 - - numpy=1.26.4=py310h4bfa8fc_0 - - openblas=0.3.25=openmp_h6794695_0 - - openjdk=22.0.1=h2d185b6_0 - - openjpeg=2.5.2=h7310d3a_0 - - openssh=9.6p1=h6dd4ff7_0 - - openssl=3.3.1=h87427d6_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=hbcb3906_0 - - pandoc=3.2.1=h694c41f_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h880b76c_0 - - pari=2.15.5=h7ba67ff_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=hbcf498f_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h7634a1b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h10d778d_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310h2fdc51f_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h73e2aa4_0 - - pkg-config=0.29.2=ha3d46e9_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h10d778d_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=ha60d53e_1006 - - pplpy=0.8.9=py310hbe8aec3_1 - - primecount=7.6=ha894c9a_0 - - primecountpy=0.1.0=py310h88cfcbd_4 - - primesieve=11.0=hf0c8a7f_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310h936d840_0 - - pthread-stubs=0.4=hc929b4f_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310hb3b189b_0 - - pybind11-global=2.12.0=py310hb3b189b_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py310h12a1ced_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py310h445dc1f_0 - - pyobjc-framework-cocoa=10.3.1=py310h445dc1f_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py310hb372a2b_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.10.14=h00d2728_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310h5daac23_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310h076e4b7_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310h2ec42d9_4 - - pyyaml=6.0.1=py310h6729b98_1 - - pyzmq=26.0.3=py310he0bbd50_0 - - qd=2.3.22=h2beb688_1004 - - qhull=2020.2=h940c156_2 - - r-base=4.3.3=h4648a1f_3 - - r-lattice=0.22_6=r43hb2c329c_0 - - readline=8.2=h9e318b2_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h0dc2134_0 - - rpds-py=0.18.1=py310h12a1ced_0 - - rpy2=3.5.11=py310r43hf0b6da5_3 - - ruamel.yaml=0.18.6=py310hb372a2b_0 - - ruamel.yaml.clib=0.2.8=py310hb372a2b_0 - - rw=0.9=h10d778d_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py310h3f1db6d_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - sigtool=0.1.3=h88f4db0_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h0d51a9f_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h28673e1_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hd2b2131_1 - - symmetrica=3.0.1=hf0c8a7f_0 - - sympow=2.023.6=h115ba6a_3 - - sympy=1.12.1=pypyh2585a3b_103 - - tachyon=0.99b6=h3a1d103_1002 - - tapi=1100.0.11=h9ce4665_0 - - tar=1.34=hcb2f6ea_1 - - tbb=2021.12.0=h3c5361c_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321hc47821c_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h1abcd95_1 - - tktable=2.10=hba9d6f1_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310h936d840_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310h2ec42d9_0 - - unicodedata2=15.1.0=py310h6729b98_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=h0dc2134_0 - - xorg-libxdmcp=1.1.3=h35c211d_0 - - xz=5.2.6=h775f41a_0 - - yaml=0.2.5=h0d85af4_2 - - zeromq=4.3.5=hde137ed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h87427d6_1 - - zstd=1.5.6=h915ae27_0 diff --git a/environment-dev-3.10-macos.yml b/environment-dev-3.10-macos.yml deleted file mode 100644 index 097508c3f6f..00000000000 --- a/environment-dev-3.10-macos.yml +++ /dev/null @@ -1,472 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: osx-arm64 -# input_hash: c03964bb63187e8dea2adbfa9332f08fbdb1b89d359248a94c39f3af0db26d90 - -channels: - - conda-forge -dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310h2aa6e3c_4 - - arpack=3.9.1=nompi_h593882a_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321hcd07c0c_1 - - automake=1.16.5=pl5321hce30654_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h3422bc3_0 - - bdw-gc=8.0.6=hc021e02_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osxarm64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=hca5e981_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hb547adb_1 - - brotli-bin=1.1.0=hb547adb_1 - - brotli-python=1.1.0=py310h1253130_1 - - bwidget=1.9.14=hce30654_1 - - bzip2=1.0.8=h93a5062_5 - - c-ares=1.28.1=h93a5062_0 - - c-compiler=1.7.0=h6aa9301_1 - - ca-certificates=2024.6.2=hf0a4a13_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=hc6c324b_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cctools=986=h4faf515_0 - - cctools_osx-arm64=986=h62378fb_0 - - cddlib=1!0.94m=h6d7a090_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py310hdcd7c05_0 - - chardet=5.2.0=py310hbe9552e_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_h095aff0_8 - - clang-16=16.0.6=default_hb63da90_8 - - clang_impl_osx-arm64=16.0.6=hc421ffc_16 - - clang_osx-arm64=16.0.6=h54d7cd3_16 - - clangxx=16.0.6=default_h095aff0_8 - - clangxx_impl_osx-arm64=16.0.6=hcd7bac0_16 - - clangxx_osx-arm64=16.0.6=h54d7cd3_16 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h93a5062_1 - - cmake=3.29.6=had79d8f_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py310hbe9552e_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=h3808999_2 - - compiler-rt_osx-arm64=16.0.6=h3808999_2 - - compilers=1.7.0=hce30654_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py310h21239e6_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - curl=8.8.0=h653d890_0 - - cvxopt=1.3.2=py310h7e4e7d1_2 - - cxx-compiler=1.7.0=h2ffa867_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py310h5e3d6bc_0 - - cysignals=1.11.2=py310hfd3b3fe_3 - - cython=3.0.10=py310h692a8b6_0 - - debugpy=1.8.1=py310h692a8b6_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h9397a75_1203 - - ecl=23.9.9=h1d9728a_0 - - eclib=20231212=h7f07de4_0 - - ecm=7.0.5=h41d338b_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=hebf3989_0 - - fflas-ffpack=2.5.0=h4bc3318_0 - - fftw=3.3.10=nompi_h6637ab6_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h82840c6_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py310ha6dd24b_0 - - fortran-compiler=1.7.0=hafb19e3_1 - - fplll=5.4.5=hb7d509d_0 - - fpylll=0.6.1=py310hd9be144_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=hadb7bae_2 - - fribidi=1.0.10=h27ca646_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he8f4e70_3 - - gap-defaults=4.12.2=hce30654_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=hbdafb3b_0 - - gettext=0.22.5=h8fbad5d_2 - - gettext-tools=0.22.5=h8fbad5d_2 - - gf2x=1.3.0=hdaa854c_2 - - gfan=0.6.2=hec08f5c_1003 - - gfortran=12.3.0=h1ca8e4b_1 - - gfortran_impl_osx-arm64=12.3.0=h53ed385_3 - - gfortran_osx-arm64=12.3.0=h57527a5_1 - - gh=2.52.0=h163aea0_0 - - giac=1.9.0.21=h1c96721_1 - - giflib=5.2.2=h93a5062_0 - - git=2.45.2=pl5321h41514c7_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h018886a_0 - - glpk=5.0=h6d7a090_0 - - gmp=6.3.0=h7bae524_2 - - gmpy2=2.1.5=py310h3bc658a_1 - - graphite2=1.3.13=hebf3989_1003 - - gsl=2.7=h6e638da_0 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h1836168_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hc8870d7_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h762ac30_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=hd73f12c_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isl=0.26=imath32_h347afa1_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=hce30654_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py310hbe9552e_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py310hbe9552e_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - keyring=25.2.1=pyh534df25_0 - - kiwisolver=1.4.5=py310h38f39d4_1 - - krb5=1.21.2=h92f50d5_0 - - lcalc=2.0.5=h4a402bc_2 - - lcms2=2.16=ha0e7c42_0 - - ld64=711=h634c8be_0 - - ld64_osx-arm64=711=ha4bd21c_0 - - lerc=4.0.0=h9a09cb3_0 - - libasprintf=0.22.5=h8fbad5d_2 - - libasprintf-devel=0.22.5=h8fbad5d_2 - - libatomic_ops=7.6.14=h1a8c8d9_0 - - libblas=3.9.0=20_osxarm64_openblas - - libboost=1.85.0=h17eb2be_2 - - libboost-devel=1.85.0=hf450f58_2 - - libboost-headers=1.85.0=hce30654_2 - - libbraiding=1.2=hb7217d7_0 - - libbrial=1.2.12=h56a29cd_3 - - libbrotlicommon=1.1.0=hb547adb_1 - - libbrotlidec=1.1.0=hb547adb_1 - - libbrotlienc=1.1.0=hb547adb_1 - - libcblas=3.9.0=20_osxarm64_openblas - - libcbor=0.10.2=hb7217d7_0 - - libclang-cpp16=16.0.6=default_hb63da90_8 - - libcurl=8.8.0=h7b6f9a7_0 - - libcxx=17.0.6=h5f092b4_0 - - libdeflate=1.20=h93a5062_0 - - libedit=3.1.20191231=hc8eb9b7_2 - - libev=4.33=h93a5062_2 - - libexpat=2.6.2=hebf3989_0 - - libffi=3.4.2=h3422bc3_5 - - libfido2=1.15.0=h9d74d49_0 - - libflint=3.0.1=h28749a5_ntl_100 - - libgd=2.3.3=hfdf3952_9 - - libgettextpo=0.22.5=h8fbad5d_2 - - libgettextpo-devel=0.22.5=h8fbad5d_2 - - libgfortran=5.0.0=13_2_0_hd922786_3 - - libgfortran-devel_osx-arm64=12.3.0=hc62be1c_3 - - libgfortran5=13.2.0=hf226fd6_3 - - libglib=2.80.2=h59d46d9_1 - - libhomfly=1.02r6=h93a5062_1 - - libhwloc=2.10.0=default_h7685b71_1001 - - libiconv=1.17=h0d3ecfb_2 - - libintl=0.22.5=h8fbad5d_2 - - libintl-devel=0.22.5=h8fbad5d_2 - - libjpeg-turbo=3.0.0=hb547adb_1 - - liblapack=3.9.0=20_osxarm64_openblas - - liblapacke=3.9.0=20_osxarm64_openblas - - libllvm16=16.0.6=haab561b_3 - - libnghttp2=1.58.0=ha4dd798_1 - - libopenblas=0.3.25=openmp_h6c19121_0 - - libpng=1.6.43=h091b4b1_0 - - libsodium=1.0.18=h27ca646_1 - - libsqlite=3.46.0=hfb93653_0 - - libssh2=1.11.0=h7a5bd25_0 - - libtiff=4.6.0=h07db509_3 - - libtool=2.4.7=hb7217d7_0 - - libuv=1.48.0=h93a5062_0 - - libwebp=1.4.0=h54798ee_0 - - libwebp-base=1.4.0=h93a5062_0 - - libxcb=1.16=hf2054a2_0 - - libxml2=2.12.7=ha661575_1 - - libzlib=1.3.1=hfb2fe0b_1 - - linbox=1.7.0=h3afee3a_0 - - llvm-openmp=18.1.8=hde57baf_0 - - llvm-tools=16.0.6=haab561b_3 - - lrcalc=2.1=hebf3989_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=h642e427_1001 - - m4ri=20140914=hc97c1ff_1006 - - m4rie=20150908=h22b9e9d_1002 - - make=4.3=he57ea6c_1 - - markupsafe=2.1.5=py310hd125d64_0 - - mathjax=3.2.2=hce30654_0 - - matplotlib=3.8.4=py310hb6292c7_2 - - matplotlib-base=3.8.4=py310hedb7998_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2bbcd85_2 - - memory-allocator=0.1.3=py310h2aa6e3c_0 - - meson=1.5.2=pyhd8ed1ab_0 - - meson-python=0.15.0=pyh0c530f3_0 - - metis=5.1.0=h13dd4ca_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=h91ba8db_0 - - mpfi=1.5.4=hbde5f5b_1001 - - mpfr=4.2.1=h41d338b_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py310he1a186f_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h93a5062_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=hb89a1cb_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h420ef59_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=hbb3f309_1 - - numpy=1.26.4=py310hd45542a_0 - - openblas=0.3.25=openmp_h55c453e_0 - - openjdk=22.0.1=hbeb2e11_0 - - openjpeg=2.5.2=h9f1df11_0 - - openssh=9.6p1=hd435d45_0 - - openssl=3.3.1=hfb2fe0b_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=h27ca646_0 - - pandoc=3.2.1=hce30654_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h5cb9fbc_0 - - pari=2.15.5=h4f2304c_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=h27ca646_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h297a79d_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h4614cfb_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py310h01af8b1_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=hebf3989_0 - - pkg-config=0.29.2=hab62308_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h93a5062_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h8b147cf_1006 - - pplpy=0.8.9=py310hc3af9bb_1 - - primecount=7.6=hb6e4faa_0 - - primecountpy=0.1.0=py310h38f39d4_4 - - primesieve=11.0=hb7217d7_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py310ha6dd24b_0 - - pthread-stubs=0.4=h27ca646_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py310h21239e6_0 - - pybind11-global=2.12.0=py310h21239e6_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py310h947b723_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py310h4b7648a_0 - - pyobjc-framework-cocoa=10.3.1=py310h4b7648a_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py310hd125d64_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.10.14=h2469fbe_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py310h692a8b6_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.10=4_cp310 - - pythran=0.15.0=py310h1359cc7_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py310hbe9552e_4 - - pyyaml=6.0.1=py310h2aa6e3c_1 - - pyzmq=26.0.3=py310h16e08c9_0 - - qd=2.3.22=hbec66e7_1004 - - qhull=2020.2=hc021e02_2 - - r-base=4.3.3=h8112bfe_3 - - r-lattice=0.22_6=r43hd2d937b_0 - - readline=8.2=h92ec313_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hb547adb_0 - - rpds-py=0.18.1=py310h947b723_0 - - rpy2=3.5.11=py310r43h280b8fa_3 - - ruamel.yaml=0.18.6=py310hd125d64_0 - - ruamel.yaml.clib=0.2.8=py310hd125d64_0 - - rw=0.9=h93a5062_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py310h2b794db_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - sigtool=0.1.3=h44b9a77_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hb460b52_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h5838104_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf6fcff2_1 - - symmetrica=3.0.1=hb7217d7_0 - - sympow=2.023.6=hb0babe8_3 - - sympy=1.12.1=pypyh2585a3b_103 - - tachyon=0.99b6=hb8a568e_1002 - - tapi=1100.0.11=he4954df_0 - - tar=1.34=h7cb298e_1 - - tbb=2021.12.0=h420ef59_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321h9ea1dce_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h5083fa2_1 - - tktable=2.10=h1e387b8_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py310ha6dd24b_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py310hbe9552e_0 - - unicodedata2=15.1.0=py310h2aa6e3c_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=hb547adb_0 - - xorg-libxdmcp=1.1.3=h27ca646_0 - - xz=5.2.6=h57fd34a_0 - - yaml=0.2.5=h3422bc3_2 - - zeromq=4.3.5=hcc0f68c_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=hfb2fe0b_1 - - zstd=1.5.6=hb46c0d2_0 diff --git a/environment-dev-3.11-linux-aarch64.yml b/environment-dev-3.11-linux-aarch64.yml deleted file mode 100644 index d02836fc39b..00000000000 --- a/environment-dev-3.11-linux-aarch64.yml +++ /dev/null @@ -1,488 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: linux-aarch64 -# input_hash: 66aaaed1c1f4084624510fb4e264813007a23f0c2a3526f277199a0ebc059af4 - -channels: - - conda-forge -dependencies: - - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - _sysroot_linux-aarch64_curr_repodata_hack=4=h57d6b7b_14 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.11=h31becfc_1 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311hcd402e7_4 - - arpack=3.9.1=nompi_hd363cd0_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h4e544f5_1 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321h2148fe1_1 - - automake=1.16.5=pl5321h8af1aa0_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=hf897c2e_0 - - bdw-gc=8.0.6=hd62202e_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=hf1166c9_7 - - binutils_impl_linux-aarch64=2.40=hf54a868_7 - - binutils_linux-aarch64=2.40=h1f91aba_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linuxaarch64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=ha990451_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h31becfc_1 - - brotli-bin=1.1.0=h31becfc_1 - - brotli-python=1.1.0=py311h8715677_1 - - bwidget=1.9.14=h8af1aa0_1 - - bzip2=1.0.8=h31becfc_5 - - c-ares=1.28.1=h31becfc_0 - - c-compiler=1.7.0=h31becfc_1 - - ca-certificates=2024.6.2=hcefe29a_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=h5c54ea9_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cddlib=1!0.94m=h719063d_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311h7963103_0 - - chardet=5.2.0=py311hfecb2dc_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h31becfc_1 - - cmake=3.29.6=h7042e5d_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311hec3470c_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=h8af1aa0_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py311h098ece5_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - cryptography=42.0.8=py311h0290c5f_0 - - curl=8.8.0=h7daf2e0_0 - - cvxopt=1.3.2=py311ha095bbf_2 - - cxx-compiler=1.7.0=h2a328a1_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py311h5ab95f0_0 - - cysignals=1.11.2=py311h644d908_3 - - cython=3.0.10=py311h8715677_0 - - dbus=1.13.6=h12b9eeb_3 - - debugpy=1.8.1=py311h8715677_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hb12102e_1203 - - ecl=23.9.9=h6475f26_0 - - eclib=20231212=he26bab5_0 - - ecm=7.0.5=ha2d0fc4_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h2f0025b_0 - - fflas-ffpack=2.5.0=h503e619_0 - - fftw=3.3.10=nompi_h020dacd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=ha9a116f_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311hf4892ed_0 - - fortran-compiler=1.7.0=h7048d53_1 - - fplll=5.4.5=hb3a790e_0 - - fpylll=0.6.1=py311h5d3d69a_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=hf0a5ef3_2 - - fribidi=1.0.10=hb9de7d4_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=h597289e_3 - - gap-defaults=4.12.2=h8af1aa0_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=hdb0cc85_13 - - gcc_impl_linux-aarch64=12.3.0=h3d98823_13 - - gcc_linux-aarch64=12.3.0=ha52a6ea_9 - - gengetopt=2.23=h01db608_0 - - gf2x=1.3.0=h1b3b3a3_2 - - gfan=0.6.2=h5f589ec_1003 - - gfortran=12.3.0=hdb0cc85_13 - - gfortran_impl_linux-aarch64=12.3.0=h97ebfd2_13 - - gfortran_linux-aarch64=12.3.0=ha7b8e4b_9 - - gh=2.46.0=h652cbe9_0 - - giac=1.9.0.21=h04922a4_1 - - giflib=5.2.2=h31becfc_0 - - git=2.45.2=pl5321h011b5c6_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h364d21b_0 - - glpk=5.0=h66325d0_0 - - gmp=6.3.0=h0a1ffab_2 - - gmpy2=2.1.5=py311h3c136a7_1 - - graphite2=1.3.13=h2f0025b_1003 - - gsl=2.7=h294027d_0 - - gxx=12.3.0=hdb0cc85_13 - - gxx_impl_linux-aarch64=12.3.0=hba91e99_13 - - gxx_linux-aarch64=12.3.0=h9d1f256_9 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h9812418_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h787c7f5_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h197073e_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h15043fe_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jeepney=0.8.0=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=h8af1aa0_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311hec3470c_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311hec3470c_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-aarch64=4.18.0=h5b4a56d_14 - - keyring=25.2.1=pyha804496_0 - - keyutils=1.6.1=h4e544f5_0 - - kiwisolver=1.4.5=py311h0d5d7b0_1 - - krb5=1.21.2=hc419048_0 - - lcalc=2.0.5=he588f68_2 - - lcms2=2.16=h922389a_0 - - ld_impl_linux-aarch64=2.40=h9fc2d93_7 - - lerc=4.0.0=h4de3ea5_0 - - libatomic_ops=7.6.14=h4e544f5_0 - - libblas=3.9.0=20_linuxaarch64_openblas - - libboost=1.85.0=hb41fec8_2 - - libboost-devel=1.85.0=h37bb5a9_2 - - libboost-headers=1.85.0=h8af1aa0_2 - - libbraiding=1.2=hd600fc2_0 - - libbrial=1.2.12=h9429f74_3 - - libbrotlicommon=1.1.0=h31becfc_1 - - libbrotlidec=1.1.0=h31becfc_1 - - libbrotlienc=1.1.0=h31becfc_1 - - libcap=2.69=h883460d_0 - - libcblas=3.9.0=20_linuxaarch64_openblas - - libcbor=0.9.0=h01db608_0 - - libcups=2.3.3=h405e4a8_4 - - libcurl=8.8.0=h4e8248e_0 - - libdeflate=1.20=h31becfc_0 - - libedit=3.1.20191231=he28a2e2_2 - - libev=4.33=h31becfc_2 - - libexpat=2.6.2=h2f0025b_0 - - libffi=3.4.2=h3557bc0_5 - - libfido2=1.15.0=hab05c5e_0 - - libflint=3.0.1=hc392af7_ntl_100 - - libgcc-devel_linux-aarch64=12.3.0=h6144e03_113 - - libgcc-ng=13.2.0=he277a41_13 - - libgd=2.3.3=hcd22fd5_9 - - libgfortran-ng=13.2.0=he9431aa_13 - - libgfortran5=13.2.0=h2af0866_13 - - libglib=2.80.2=haee52c6_1 - - libgomp=13.2.0=he277a41_13 - - libhomfly=1.02r6=h31becfc_1 - - libhwloc=2.10.0=default_h3030c0e_1001 - - libiconv=1.17=h31becfc_2 - - libjpeg-turbo=3.0.0=h31becfc_1 - - liblapack=3.9.0=20_linuxaarch64_openblas - - liblapacke=3.9.0=20_linuxaarch64_openblas - - libnghttp2=1.58.0=hb0e430d_1 - - libnsl=2.0.1=h31becfc_0 - - libopenblas=0.3.25=pthreads_h5a5ec62_0 - - libpng=1.6.43=h194ca79_0 - - libsanitizer=12.3.0=h57e2e72_13 - - libsodium=1.0.18=hb9de7d4_1 - - libsqlite=3.46.0=hf51ef55_0 - - libssh2=1.11.0=h492db2e_0 - - libstdcxx-devel_linux-aarch64=12.3.0=h6144e03_113 - - libstdcxx-ng=13.2.0=h3f4de04_13 - - libtiff=4.6.0=hf980d43_3 - - libtool=2.4.7=h4de3ea5_0 - - libudev1=255=h31becfc_1 - - libuuid=2.38.1=hb4cce97_0 - - libuv=1.48.0=h31becfc_0 - - libwebp=1.4.0=h8b4e01b_0 - - libwebp-base=1.4.0=h31becfc_0 - - libxcb=1.16=h7935292_0 - - libxcrypt=4.4.36=h31becfc_1 - - libxml2=2.12.7=h49dc7a2_1 - - libzlib=1.3.1=h68df207_1 - - linbox=1.7.0=h681a5ee_0 - - llvm-openmp=18.1.8=hb063fc5_0 - - lrcalc=2.1=h2f0025b_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=h516909a_1001 - - m4ri=20140914=hedfd65a_1006 - - m4rie=20150908=hf0a5ef3_1002 - - make=4.3=h309ac5b_1 - - markupsafe=2.1.5=py311hc8f2f60_0 - - mathjax=3.2.2=h8af1aa0_0 - - matplotlib=3.8.4=py311hfecb2dc_2 - - matplotlib-base=3.8.4=py311h55059f0_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h6475f26_2 - - memory-allocator=0.1.3=py311hcd402e7_0 - - metis=5.1.0=h2f0025b_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=hf4c8f4c_0 - - mpfi=1.5.4=h846f343_1001 - - mpfr=4.2.1=ha2d0fc4_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py311hdc7ef93_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h31becfc_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h0425590_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h70be974_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=h0d7519b_1 - - numpy=1.26.4=py311h69ead2a_0 - - openblas=0.3.25=pthreads_h339cbfa_0 - - openjdk=22.0.1=h3d4cd67_0 - - openjpeg=2.5.2=h0d9d63b_0 - - openssh=9.6p1=h04b8c23_0 - - openssl=3.3.1=h68df207_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=hb9de7d4_0 - - pandoc=3.2.1=h8af1aa0_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h399c48b_0 - - pari=2.15.5=h169c2a7_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=hf897c2e_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h070dd5b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h31becfc_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311h54289d1_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h2f0025b_0 - - pkg-config=0.29.2=hb9de7d4_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h31becfc_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h984aac9_1006 - - pplpy=0.8.9=py311ha3770eb_1 - - primecount=7.9=hd600fc2_0 - - primecountpy=0.1.0=py311h098ece5_4 - - primesieve=11.1=h2f0025b_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311hf4892ed_0 - - pthread-stubs=0.4=hb9de7d4_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311h098ece5_0 - - pybind11-global=2.12.0=py311h098ece5_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py311h4713408_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py311hc8f2f60_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.11.9=hddfb980_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311h8715677_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311hec5c23b_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311hec3470c_4 - - pyyaml=6.0.1=py311hcd402e7_1 - - pyzmq=26.0.3=py311hb8d4657_0 - - qd=2.3.22=h05efe27_1004 - - qhull=2020.2=hd62202e_2 - - r-base=4.3.3=h7f20121_3 - - r-lattice=0.22_6=r43h25e906a_0 - - readline=8.2=h8fc344f_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h31becfc_0 - - rpds-py=0.18.1=py311h949f54a_0 - - rpy2=3.5.11=py311r43hf13da56_3 - - ruamel.yaml=0.18.6=py311hcd402e7_0 - - ruamel.yaml.clib=0.2.8=py311hcd402e7_0 - - rw=0.9=h31becfc_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.3=py311h69ead2a_1 - - secretstorage=3.3.3=py311hfecb2dc_2 - - sed=4.8=ha0d5d3d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hbe76a8a_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=hdc7ab3c_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=h3944111_1 - - symmetrica=3.0.1=hd600fc2_0 - - sympow=2.023.6=h157afb5_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-aarch64=2.17=h5b4a56d_14 - - tachyon=0.99b6=ha0bfc61_1002 - - tar=1.34=h048efde_0 - - tbb=2021.12.0=h70be974_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h17f021e_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h194ca79_0 - - tktable=2.10=h52f7bd3_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311h323e239_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311hec3470c_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-fixesproto=5.0=h3557bc0_1002 - - xorg-inputproto=2.3.2=h3557bc0_1002 - - xorg-kbproto=1.0.7=h3557bc0_1002 - - xorg-libice=1.1.1=h7935292_0 - - xorg-libsm=1.2.4=h5a01bc2_0 - - xorg-libx11=1.8.9=h08be655_1 - - xorg-libxau=1.0.11=h31becfc_0 - - xorg-libxdmcp=1.1.3=h3557bc0_0 - - xorg-libxext=1.3.4=h2a766a3_2 - - xorg-libxfixes=5.0.3=h3557bc0_1004 - - xorg-libxi=1.7.10=h3557bc0_0 - - xorg-libxrender=0.9.11=h7935292_0 - - xorg-libxt=1.3.0=h7935292_1 - - xorg-libxtst=1.2.3=hf897c2e_1002 - - xorg-recordproto=1.14.2=hf897c2e_1002 - - xorg-renderproto=0.11.1=h3557bc0_1002 - - xorg-xextproto=7.3.0=h2a766a3_1003 - - xorg-xproto=7.0.31=h3557bc0_1007 - - xz=5.2.6=h9cdd2b7_0 - - yaml=0.2.5=hf897c2e_2 - - zeromq=4.3.5=h28faeed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h68df207_1 - - zstd=1.5.6=h02f22dd_0 diff --git a/environment-dev-3.11-linux.yml b/environment-dev-3.11-linux.yml deleted file mode 100644 index 786c2190d71..00000000000 --- a/environment-dev-3.11-linux.yml +++ /dev/null @@ -1,535 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: linux-64 -# input_hash: f63cac647504bbd824a745f50b79ed9af0d2c491bf359361fdaa0624827c7f36 - -channels: - - conda-forge -dependencies: - - _libgcc_mutex=0.1=conda_forge - - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.12=h4ab18f5_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311h459d7ec_4 - - arpack=3.9.1=nompi_h77f6705_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h166bdaf_1 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321h2b4cb7a_1 - - automake=1.16.5=pl5321ha770c72_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h7f98852_0 - - bdw-gc=8.0.6=h4bd325d_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=h4852527_7 - - binutils_impl_linux-64=2.40=ha1999f0_7 - - binutils_linux-64=2.40=hb3c18ed_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linux64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h44aadfe_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hd590300_1 - - brotli-bin=1.1.0=hd590300_1 - - brotli-python=1.1.0=py311hb755f60_1 - - bwidget=1.9.14=ha770c72_1 - - bzip2=1.0.8=hd590300_5 - - c-ares=1.28.1=hd590300_0 - - c-compiler=1.7.0=hd590300_1 - - ca-certificates=2024.6.2=hbcca054_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=hbb29018_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cddlib=1!0.94m=h9202a9a_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311hb3a22ac_0 - - chardet=5.2.0=py311h38be061_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=hd590300_1 - - cmake=3.29.6=hcafd917_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311h38be061_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=ha770c72_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py311h9547e67_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - cryptography=42.0.8=py311h4a61cc7_0 - - curl=8.8.0=he654da7_0 - - cvxopt=1.3.2=py311hec6cc1f_2 - - cxx-compiler=1.7.0=h00ab1b0_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py311hd2352ae_0 - - cysignals=1.11.2=py311h82528dc_3 - - cython=3.0.10=py311hb755f60_0 - - dbus=1.13.6=h5008d03_3 - - debugpy=1.8.1=py311hb755f60_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hd9d9efa_1203 - - ecl=23.9.9=hed6455c_0 - - eclib=20231212=h96f522a_0 - - ecm=7.0.5=h9458935_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h59595ed_0 - - fflas-ffpack=2.5.0=h4f9960b_0 - - fftw=3.3.10=nompi_hf1063bd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h14ed4e7_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311h331c9d8_0 - - fortran-compiler=1.7.0=heb67821_1 - - fplll=5.4.5=h384768b_0 - - fpylll=0.6.1=py311hcfae7cf_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=h267a509_2 - - fribidi=1.0.10=h36c2ea0_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he9a28a4_3 - - gap-defaults=4.12.2=ha770c72_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=h915e2ae_13 - - gcc_impl_linux-64=12.3.0=h58ffeeb_13 - - gcc_linux-64=12.3.0=h9528a6a_9 - - gengetopt=2.23=h9c3ff4c_0 - - gettext=0.22.5=h59595ed_2 - - gettext-tools=0.22.5=h59595ed_2 - - gf2x=1.3.0=ha476b99_2 - - gfan=0.6.2=hb86e20a_1003 - - gfortran=12.3.0=h915e2ae_13 - - gfortran_impl_linux-64=12.3.0=h8f2110c_13 - - gfortran_linux-64=12.3.0=h5877db1_9 - - gh=2.52.0=he0e2781_0 - - giac=1.9.0.21=h673759e_1 - - giflib=5.2.2=hd590300_0 - - git=2.45.2=pl5321ha099dd3_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=hb789bce_0 - - glib=2.80.2=h8a4344b_1 - - glib-tools=2.80.2=h73ef956_1 - - glpk=5.0=h445213a_0 - - gmp=6.3.0=hac33072_2 - - gmpy2=2.1.5=py311hc4f1f91_1 - - graphite2=1.3.13=h59595ed_1003 - - gsl=2.7=he838d99_0 - - gst-plugins-base=1.24.5=hbaaba92_0 - - gstreamer=1.24.5=haf2f30d_0 - - gxx=12.3.0=h915e2ae_13 - - gxx_impl_linux-64=12.3.0=h2a574ab_13 - - gxx_linux-64=12.3.0=ha28b414_9 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=hfac3d4d_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h59595ed_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hef0740d_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h623f65a_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jeepney=0.8.0=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=ha770c72_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311h38be061_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311h38be061_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-64=2.6.32=he073ed8_17 - - keyring=25.2.1=pyha804496_0 - - keyutils=1.6.1=h166bdaf_0 - - kiwisolver=1.4.5=py311h9547e67_1 - - krb5=1.21.2=h659d440_0 - - lame=3.100=h166bdaf_1003 - - lcalc=2.0.5=h5aac1b6_2 - - lcms2=2.16=hb7c19ff_0 - - ld_impl_linux-64=2.40=hf3520f5_7 - - lerc=4.0.0=h27087fc_0 - - libasprintf=0.22.5=h661eb56_2 - - libasprintf-devel=0.22.5=h661eb56_2 - - libatomic_ops=7.6.14=h166bdaf_0 - - libblas=3.9.0=20_linux64_openblas - - libboost=1.85.0=hba137d9_2 - - libboost-devel=1.85.0=h00ab1b0_2 - - libboost-headers=1.85.0=ha770c72_2 - - libbraiding=1.2=hcb278e6_0 - - libbrial=1.2.12=h76af697_3 - - libbrotlicommon=1.1.0=hd590300_1 - - libbrotlidec=1.1.0=hd590300_1 - - libbrotlienc=1.1.0=hd590300_1 - - libcap=2.69=h0f662aa_0 - - libcblas=3.9.0=20_linux64_openblas - - libcbor=0.10.2=hcb278e6_0 - - libclang-cpp15=15.0.7=default_h127d8a8_5 - - libclang13=18.1.8=default_h6ae225f_0 - - libcups=2.3.3=h4637d8d_4 - - libcurl=8.8.0=hca28451_0 - - libdeflate=1.20=hd590300_0 - - libedit=3.1.20191231=he28a2e2_2 - - libev=4.33=hd590300_2 - - libevent=2.1.12=hf998b51_1 - - libexpat=2.6.2=h59595ed_0 - - libffi=3.4.2=h7f98852_5 - - libfido2=1.15.0=hdd1f21f_0 - - libflac=1.4.3=h59595ed_0 - - libflint=3.0.1=h5f2e117_ntl_100 - - libgcc-devel_linux-64=12.3.0=h6b66f73_113 - - libgcc-ng=13.2.0=h77fa898_13 - - libgcrypt=1.10.3=hd590300_0 - - libgd=2.3.3=h119a65a_9 - - libgettextpo=0.22.5=h59595ed_2 - - libgettextpo-devel=0.22.5=h59595ed_2 - - libgfortran-ng=13.2.0=h69a702a_13 - - libgfortran5=13.2.0=h3d2ce59_13 - - libglib=2.80.2=h8a4344b_1 - - libgomp=13.2.0=h77fa898_13 - - libgpg-error=1.49=h4f305b6_0 - - libhomfly=1.02r6=hd590300_1 - - libhwloc=2.10.0=default_h5622ce7_1001 - - libiconv=1.17=hd590300_2 - - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_openblas - - liblapacke=3.9.0=20_linux64_openblas - - libllvm15=15.0.7=hb3ce162_4 - - libllvm18=18.1.8=hc9dba70_0 - - libnghttp2=1.58.0=h47da74e_1 - - libnsl=2.0.1=hd590300_0 - - libogg=1.3.5=h4ab18f5_0 - - libopenblas=0.3.25=pthreads_h413a1c8_0 - - libopus=1.3.1=h7f98852_1 - - libpng=1.6.43=h2797004_0 - - libpq=16.3=ha72fbe1_0 - - libsanitizer=12.3.0=hb8811af_13 - - libsndfile=1.2.2=hc60ed4a_1 - - libsodium=1.0.18=h36c2ea0_1 - - libsqlite=3.46.0=hde9e2c9_0 - - libssh2=1.11.0=h0841786_0 - - libstdcxx-devel_linux-64=12.3.0=h6b66f73_113 - - libstdcxx-ng=13.2.0=hc0a3c3a_13 - - libsystemd0=255=h3516f8a_1 - - libtiff=4.6.0=h1dd3fc0_3 - - libtool=2.4.7=h27087fc_0 - - libudev1=255=h3f72095_1 - - libuuid=2.38.1=h0b41bf4_0 - - libuv=1.48.0=hd590300_0 - - libvorbis=1.3.7=h9c3ff4c_0 - - libwebp=1.4.0=h2c329e2_0 - - libwebp-base=1.4.0=hd590300_0 - - libxcb=1.16=hd590300_0 - - libxcrypt=4.4.36=hd590300_1 - - libxkbcommon=1.7.0=h2c5496b_1 - - libxml2=2.12.7=hc051c1a_1 - - libzlib=1.3.1=h4ab18f5_1 - - linbox=1.7.0=ha329b40_0 - - llvm-openmp=18.1.8=hf5423f3_0 - - lrcalc=2.1=h59595ed_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - lz4-c=1.9.4=hcb278e6_0 - - m4=1.4.18=h516909a_1001 - - m4ri=20140914=hae5d5c5_1006 - - m4rie=20150908=h267a509_1002 - - make=4.3=hd18ef5c_1 - - markupsafe=2.1.5=py311h459d7ec_0 - - mathjax=3.2.2=ha770c72_0 - - matplotlib=3.8.4=py311h38be061_2 - - matplotlib-base=3.8.4=py311ha4ca890_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=hed6455c_2 - - memory-allocator=0.1.3=py311h459d7ec_0 - - meson=1.5.2=pyhd8ed1ab_0 - - meson-python=0.15.0=pyh0c530f3_0 - - metis=5.1.0=h59595ed_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=hfe3b2da_0 - - mpfi=1.5.4=h9f54685_1001 - - mpfr=4.2.1=h9458935_1 - - mpg123=1.32.6=h59595ed_0 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py311h52f7536_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - mysql-common=8.3.0=hf1915f5_4 - - mysql-libs=8.3.0=hca2cd23_4 - - nauty=2.8.8=hd590300_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h59595ed_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h297d8ca_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - nspr=4.35=h27087fc_0 - - nss=3.101=h593d115_0 - - ntl=11.4.3=hef3c4d3_1 - - numpy=1.26.4=py311h64a7726_0 - - openblas=0.3.25=pthreads_h7a3da1a_0 - - openjdk=21.0.2=haa376d0_0 - - openjpeg=2.5.2=h488ebb8_0 - - openssh=9.6p1=h2d3b35a_0 - - openssl=3.3.1=h4ab18f5_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=h36c2ea0_0 - - pandoc=3.2.1=ha770c72_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h84a9a3c_0 - - pari=2.15.5=h4d4ae9b_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=h7f98852_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h0f59acf_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_hd590300_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311h82a398c_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.2=h59595ed_0 - - pkg-config=0.29.2=h36c2ea0_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=hd590300_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h6ec01c2_1006 - - pplpy=0.8.9=py311ha9f9f00_1 - - primecount=7.9=hcb278e6_0 - - primecountpy=0.1.0=py311h9547e67_4 - - primesieve=11.1=h59595ed_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311h331c9d8_0 - - pthread-stubs=0.4=h36c2ea0_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pulseaudio-client=17.0=hb77b528_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311h9547e67_0 - - pybind11-global=2.12.0=py311h9547e67_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py311h5ecf98a_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyqt=5.15.9=py311hf0fb5b6_5 - - pyqt5-sip=12.12.2=py311hb755f60_5 - - pyrsistent=0.20.0=py311h459d7ec_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.11.9=hb806964_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311hb755f60_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311h92ebd52_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311h38be061_4 - - pyyaml=6.0.1=py311h459d7ec_1 - - pyzmq=26.0.3=py311h08a0b41_0 - - qd=2.3.22=h2cc385e_1004 - - qhull=2020.2=h4bd325d_2 - - qt-main=5.15.8=ha2b5568_22 - - r-base=4.3.3=he2d9a6e_3 - - r-lattice=0.22_6=r43h57805ef_0 - - readline=8.2=h8228510_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hd590300_0 - - rpds-py=0.18.1=py311h5ecf98a_0 - - rpy2=3.5.11=py311r43h1f0f07a_3 - - ruamel.yaml=0.18.6=py311h459d7ec_0 - - ruamel.yaml.clib=0.2.8=py311h459d7ec_0 - - rw=0.9=hd590300_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py311h64a7726_0 - - secretstorage=3.3.3=py311h38be061_2 - - sed=4.8=he412f7d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h33f5c3f_1 - - sip=6.7.12=py311hb755f60_0 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h6d4b2fc_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf4753ba_1 - - symmetrica=3.0.1=hcb278e6_0 - - sympow=2.023.6=hc6ab17c_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-64=2.12=he073ed8_17 - - tachyon=0.99b6=hba7d16a_1002 - - tar=1.34=hb2e2bae_1 - - tbb=2021.12.0=h297d8ca_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h0f457ee_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=noxft_h4845f30_101 - - tktable=2.10=h8bc8fbc_6 - - toml=0.10.2=pyhd8ed1ab_0 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311h331c9d8_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311h38be061_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xcb-util=0.4.1=hb711507_2 - - xcb-util-image=0.4.0=hb711507_2 - - xcb-util-keysyms=0.4.1=hb711507_0 - - xcb-util-renderutil=0.3.10=hb711507_0 - - xcb-util-wm=0.4.2=hb711507_0 - - xkeyboard-config=2.42=h4ab18f5_0 - - xorg-fixesproto=5.0=h7f98852_1002 - - xorg-inputproto=2.3.2=h7f98852_1002 - - xorg-kbproto=1.0.7=h7f98852_1002 - - xorg-libice=1.1.1=hd590300_0 - - xorg-libsm=1.2.4=h7391055_0 - - xorg-libx11=1.8.9=hb711507_1 - - xorg-libxau=1.0.11=hd590300_0 - - xorg-libxdmcp=1.1.3=h7f98852_0 - - xorg-libxext=1.3.4=h0b41bf4_2 - - xorg-libxfixes=5.0.3=h7f98852_1004 - - xorg-libxi=1.7.10=h7f98852_0 - - xorg-libxrender=0.9.11=hd590300_0 - - xorg-libxt=1.3.0=hd590300_1 - - xorg-libxtst=1.2.3=h7f98852_1002 - - xorg-recordproto=1.14.2=h7f98852_1002 - - xorg-renderproto=0.11.1=h7f98852_1002 - - xorg-xextproto=7.3.0=h0b41bf4_1003 - - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - - xorg-xproto=7.0.31=h7f98852_1007 - - xz=5.2.6=h166bdaf_0 - - yaml=0.2.5=h7f98852_2 - - zeromq=4.3.5=h75354e8_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h4ab18f5_1 - - zstd=1.5.6=ha6fb4c9_0 diff --git a/environment-dev-3.11-macos-x86_64.yml b/environment-dev-3.11-macos-x86_64.yml deleted file mode 100644 index d49d10ccdd9..00000000000 --- a/environment-dev-3.11-macos-x86_64.yml +++ /dev/null @@ -1,469 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: osx-64 -# input_hash: 76cbd25511c5f90d515f03ecbad120b0c890d6418428d7ee7d5cc0e82468e02a - -channels: - - conda-forge -dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311h2725bcf_4 - - arpack=3.9.1=nompi_hf81eadf_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321hed12c24_1 - - automake=1.16.5=pl5321h694c41f_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h0d85af4_0 - - bdw-gc=8.0.6=h940c156_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osx64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h07eb623_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h0dc2134_1 - - brotli-bin=1.1.0=h0dc2134_1 - - brotli-python=1.1.0=py311hdf8f085_1 - - bwidget=1.9.14=h694c41f_1 - - bzip2=1.0.8=h10d778d_5 - - c-ares=1.28.1=h10d778d_0 - - c-compiler=1.7.0=h282daa2_1 - - ca-certificates=2024.6.2=h8857fd0_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=h9f650ed_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cctools=986=h40f6528_0 - - cctools_osx-64=986=ha1c5b94_0 - - cddlib=1!0.94m=h0f52abe_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311hc0b63fd_0 - - chardet=5.2.0=py311h6eed73b_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_ha3b9224_8 - - clang-16=16.0.6=default_h4c8afb6_8 - - clang_impl_osx-64=16.0.6=h8787910_16 - - clang_osx-64=16.0.6=hb91bd55_16 - - clangxx=16.0.6=default_ha3b9224_8 - - clangxx_impl_osx-64=16.0.6=h6d92fbe_16 - - clangxx_osx-64=16.0.6=hb91bd55_16 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h10d778d_1 - - cmake=3.29.6=h749d262_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311h6eed73b_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=ha38d28d_2 - - compiler-rt_osx-64=16.0.6=ha38d28d_2 - - compilers=1.7.0=h694c41f_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py311h1d816ee_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - curl=8.8.0=hea67d85_0 - - cvxopt=1.3.2=py311he94735a_2 - - cxx-compiler=1.7.0=h7728843_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py311h4fde0ae_0 - - cysignals=1.11.2=py311h8a58447_3 - - cython=3.0.10=py311hdd0406b_0 - - debugpy=1.8.1=py311hdd0406b_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h6e329d1_1203 - - ecl=23.9.9=h2b27fa8_0 - - eclib=20231212=h02435c3_0 - - ecm=7.0.5=h4f6b447_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h73e2aa4_0 - - fflas-ffpack=2.5.0=h5898d61_0 - - fftw=3.3.10=nompi_h292e606_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h5bb23bf_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311h72ae277_0 - - fortran-compiler=1.7.0=h6c2ab21_1 - - fplll=5.4.5=hb7981ad_0 - - fpylll=0.6.1=py311h85fbf69_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=h60636b9_2 - - fribidi=1.0.10=hbcb3906_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=hc16eb5f_3 - - gap-defaults=4.12.2=h694c41f_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=he49afe7_0 - - gettext=0.22.5=h5ff76d1_2 - - gettext-tools=0.22.5=h5ff76d1_2 - - gf2x=1.3.0=hb2a7efb_2 - - gfan=0.6.2=hd793b56_1003 - - gfortran=12.3.0=h2c809b3_1 - - gfortran_impl_osx-64=12.3.0=hc328e78_3 - - gfortran_osx-64=12.3.0=h18f7dce_1 - - gh=2.52.0=he13f2d6_0 - - giac=1.9.0.21=h92f3f65_1 - - giflib=5.2.2=h10d778d_0 - - git=2.45.2=pl5321hb0c6a96_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h1b3d6f7_0 - - glpk=5.0=h3cb5acd_0 - - gmp=6.3.0=hf036a51_2 - - gmpy2=2.1.5=py311hab17429_1 - - graphite2=1.3.13=h73e2aa4_1003 - - gsl=2.7=h93259b0_0 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h053f038_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hf5e326d_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hde4452d_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h61918c1_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isl=0.26=imath32_h2e86a7b_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.9=h694c41f_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311h6eed73b_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311h6eed73b_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - keyring=25.2.1=pyh534df25_0 - - kiwisolver=1.4.5=py311h5fe6e05_1 - - krb5=1.21.2=hb884880_0 - - lcalc=2.0.5=h547a6ed_2 - - lcms2=2.16=ha2f27b4_0 - - ld64=711=ha02d983_0 - - ld64_osx-64=711=ha20a434_0 - - lerc=4.0.0=hb486fe8_0 - - libasprintf=0.22.5=h5ff76d1_2 - - libasprintf-devel=0.22.5=h5ff76d1_2 - - libatomic_ops=7.6.14=hb7f2c08_0 - - libblas=3.9.0=20_osx64_openblas - - libboost=1.85.0=h739af76_2 - - libboost-devel=1.85.0=h2b186f8_2 - - libboost-headers=1.85.0=h694c41f_2 - - libbraiding=1.2=hf0c8a7f_0 - - libbrial=1.2.12=h81e9653_3 - - libbrotlicommon=1.1.0=h0dc2134_1 - - libbrotlidec=1.1.0=h0dc2134_1 - - libbrotlienc=1.1.0=h0dc2134_1 - - libcblas=3.9.0=20_osx64_openblas - - libcbor=0.10.2=hf0c8a7f_0 - - libclang-cpp16=16.0.6=default_h4c8afb6_8 - - libcurl=8.8.0=hf9fcc65_0 - - libcxx=17.0.6=h88467a6_0 - - libdeflate=1.20=h49d49c5_0 - - libedit=3.1.20191231=h0678c8f_2 - - libev=4.33=h10d778d_2 - - libexpat=2.6.2=h73e2aa4_0 - - libffi=3.4.2=h0d85af4_5 - - libfido2=1.15.0=h41b28d8_0 - - libflint=3.0.1=h5d15de0_ntl_100 - - libgd=2.3.3=h0dceb68_9 - - libgettextpo=0.22.5=h5ff76d1_2 - - libgettextpo-devel=0.22.5=h5ff76d1_2 - - libgfortran=5.0.0=13_2_0_h97931a8_3 - - libgfortran-devel_osx-64=12.3.0=h0b6f5ec_3 - - libgfortran5=13.2.0=h2873a65_3 - - libglib=2.80.2=h736d271_1 - - libhomfly=1.02r6=h10d778d_1 - - libhwloc=2.10.0=default_h456cccd_1001 - - libiconv=1.17=hd75f5a5_2 - - libintl=0.22.5=h5ff76d1_2 - - libintl-devel=0.22.5=h5ff76d1_2 - - libjpeg-turbo=3.0.0=h0dc2134_1 - - liblapack=3.9.0=20_osx64_openblas - - liblapacke=3.9.0=20_osx64_openblas - - libllvm16=16.0.6=hbedff68_3 - - libnghttp2=1.58.0=h64cf6d3_1 - - libopenblas=0.3.25=openmp_hfef2a42_0 - - libpng=1.6.43=h92b6c6a_0 - - libsodium=1.0.18=hbcb3906_1 - - libsqlite=3.46.0=h1b8f9f3_0 - - libssh2=1.11.0=hd019ec5_0 - - libtiff=4.6.0=h129831d_3 - - libtool=2.4.7=hf0c8a7f_0 - - libuv=1.48.0=h67532ce_0 - - libwebp=1.4.0=hc207709_0 - - libwebp-base=1.4.0=h10d778d_0 - - libxcb=1.16=h0dc2134_0 - - libxml2=2.12.7=h3e169fe_1 - - libzlib=1.3.1=h87427d6_1 - - linbox=1.7.0=h7061c92_0 - - llvm-openmp=18.1.8=h15ab845_0 - - llvm-tools=16.0.6=hbedff68_3 - - lrcalc=2.1=h73e2aa4_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=haf1e3a3_1001 - - m4ri=20140914=hd82a5f3_1006 - - m4rie=20150908=hc616cfc_1002 - - make=4.3=h22f3db7_1 - - markupsafe=2.1.5=py311he705e18_0 - - mathjax=3.2.2=h694c41f_0 - - matplotlib=3.8.4=py311h6eed73b_2 - - matplotlib-base=3.8.4=py311hff79762_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2b27fa8_2 - - memory-allocator=0.1.3=py311h2725bcf_0 - - metis=5.1.0=he965462_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=h81bd1dd_0 - - mpfi=1.5.4=h52b28e3_1001 - - mpfr=4.2.1=h4f6b447_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py311h46c8309_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h10d778d_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h5846eda_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h3c5361c_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=h0ab3c2f_1 - - numpy=1.26.4=py311hc43a94b_0 - - openblas=0.3.25=openmp_h6794695_0 - - openjdk=22.0.1=h2d185b6_0 - - openjpeg=2.5.2=h7310d3a_0 - - openssh=9.6p1=h6dd4ff7_0 - - openssl=3.3.1=h87427d6_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=hbcb3906_0 - - pandoc=3.2.1=h694c41f_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h880b76c_0 - - pari=2.15.5=h7ba67ff_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=hbcf498f_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h7634a1b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h10d778d_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311h2755ac0_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h73e2aa4_0 - - pkg-config=0.29.2=ha3d46e9_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h10d778d_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=ha60d53e_1006 - - pplpy=0.8.9=py311h922ec50_1 - - primecount=7.6=ha894c9a_0 - - primecountpy=0.1.0=py311h5fe6e05_4 - - primesieve=11.0=hf0c8a7f_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311h72ae277_0 - - pthread-stubs=0.4=hc929b4f_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311h1d816ee_0 - - pybind11-global=2.12.0=py311h1d816ee_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py311h295b1db_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py311h9d23797_0 - - pyobjc-framework-cocoa=10.3.1=py311h9d23797_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py311he705e18_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.11.9=h657bba9_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311hdd0406b_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311ha853786_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311h6eed73b_4 - - pyyaml=6.0.1=py311h2725bcf_1 - - pyzmq=26.0.3=py311h89e2aaa_0 - - qd=2.3.22=h2beb688_1004 - - qhull=2020.2=h940c156_2 - - r-base=4.3.3=h4648a1f_3 - - r-lattice=0.22_6=r43hb2c329c_0 - - readline=8.2=h9e318b2_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h0dc2134_0 - - rpds-py=0.18.1=py311h295b1db_0 - - rpy2=3.5.11=py311r43h4a70a88_3 - - ruamel.yaml=0.18.6=py311he705e18_0 - - ruamel.yaml.clib=0.2.8=py311he705e18_0 - - rw=0.9=h10d778d_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py311he0bea55_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - sigtool=0.1.3=h88f4db0_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h0d51a9f_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h28673e1_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hd2b2131_1 - - symmetrica=3.0.1=hf0c8a7f_0 - - sympow=2.023.6=h115ba6a_3 - - sympy=1.12.1=pypyh2585a3b_103 - - tachyon=0.99b6=h3a1d103_1002 - - tapi=1100.0.11=h9ce4665_0 - - tar=1.34=hcb2f6ea_1 - - tbb=2021.12.0=h3c5361c_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321hc47821c_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h1abcd95_1 - - tktable=2.10=hba9d6f1_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311h72ae277_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311h6eed73b_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=h0dc2134_0 - - xorg-libxdmcp=1.1.3=h35c211d_0 - - xz=5.2.6=h775f41a_0 - - yaml=0.2.5=h0d85af4_2 - - zeromq=4.3.5=hde137ed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h87427d6_1 - - zstd=1.5.6=h915ae27_0 diff --git a/environment-dev-3.11-macos.yml b/environment-dev-3.11-macos.yml deleted file mode 100644 index 497abbec59f..00000000000 --- a/environment-dev-3.11-macos.yml +++ /dev/null @@ -1,471 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: osx-arm64 -# input_hash: 2a680a2d8d0e54717c485a773c614ef8a6102b81d2c396cd75bfe731f43e3b5f - -channels: - - conda-forge -dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py311heffc1b2_4 - - arpack=3.9.1=nompi_h593882a_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321hcd07c0c_1 - - automake=1.16.5=pl5321hce30654_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h3422bc3_0 - - bdw-gc=8.0.6=hc021e02_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osxarm64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=hca5e981_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hb547adb_1 - - brotli-bin=1.1.0=hb547adb_1 - - brotli-python=1.1.0=py311ha891d26_1 - - bwidget=1.9.14=hce30654_1 - - bzip2=1.0.8=h93a5062_5 - - c-ares=1.28.1=h93a5062_0 - - c-compiler=1.7.0=h6aa9301_1 - - ca-certificates=2024.6.2=hf0a4a13_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=hc6c324b_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cctools=986=h4faf515_0 - - cctools_osx-arm64=986=h62378fb_0 - - cddlib=1!0.94m=h6d7a090_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py311h4a08483_0 - - chardet=5.2.0=py311h267d04e_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_h095aff0_8 - - clang-16=16.0.6=default_hb63da90_8 - - clang_impl_osx-arm64=16.0.6=hc421ffc_16 - - clang_osx-arm64=16.0.6=h54d7cd3_16 - - clangxx=16.0.6=default_h095aff0_8 - - clangxx_impl_osx-arm64=16.0.6=hcd7bac0_16 - - clangxx_osx-arm64=16.0.6=h54d7cd3_16 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h93a5062_1 - - cmake=3.29.6=had79d8f_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py311h267d04e_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=h3808999_2 - - compiler-rt_osx-arm64=16.0.6=h3808999_2 - - compilers=1.7.0=hce30654_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py311hcc98501_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - curl=8.8.0=h653d890_0 - - cvxopt=1.3.2=py311h77cf4c7_2 - - cxx-compiler=1.7.0=h2ffa867_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py311h2c49a9d_0 - - cysignals=1.11.2=py311he42fc87_3 - - cython=3.0.10=py311h92babd0_0 - - debugpy=1.8.1=py311h92babd0_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h9397a75_1203 - - ecl=23.9.9=h1d9728a_0 - - eclib=20231212=h7f07de4_0 - - ecm=7.0.5=h41d338b_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=hebf3989_0 - - fflas-ffpack=2.5.0=h4bc3318_0 - - fftw=3.3.10=nompi_h6637ab6_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h82840c6_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py311hd3f4193_0 - - fortran-compiler=1.7.0=hafb19e3_1 - - fplll=5.4.5=hb7d509d_0 - - fpylll=0.6.1=py311h341b96b_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=hadb7bae_2 - - fribidi=1.0.10=h27ca646_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he8f4e70_3 - - gap-defaults=4.12.2=hce30654_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=hbdafb3b_0 - - gettext=0.22.5=h8fbad5d_2 - - gettext-tools=0.22.5=h8fbad5d_2 - - gf2x=1.3.0=hdaa854c_2 - - gfan=0.6.2=hec08f5c_1003 - - gfortran=12.3.0=h1ca8e4b_1 - - gfortran_impl_osx-arm64=12.3.0=h53ed385_3 - - gfortran_osx-arm64=12.3.0=h57527a5_1 - - gh=2.52.0=h163aea0_0 - - giac=1.9.0.21=h1c96721_1 - - giflib=5.2.2=h93a5062_0 - - git=2.45.2=pl5321h41514c7_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h018886a_0 - - glpk=5.0=h6d7a090_0 - - gmp=6.3.0=h7bae524_2 - - gmpy2=2.1.5=py311h1e33d93_1 - - graphite2=1.3.13=hebf3989_1003 - - gsl=2.7=h6e638da_0 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h1836168_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hc8870d7_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h762ac30_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=hd73f12c_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.25.0=pyh707e725_0 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isl=0.26=imath32_h347afa1_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=hce30654_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py311h267d04e_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py311h267d04e_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - keyring=25.2.1=pyh534df25_0 - - kiwisolver=1.4.5=py311he4fd1f5_1 - - krb5=1.21.2=h92f50d5_0 - - lcalc=2.0.5=h4a402bc_2 - - lcms2=2.16=ha0e7c42_0 - - ld64=711=h634c8be_0 - - ld64_osx-arm64=711=ha4bd21c_0 - - lerc=4.0.0=h9a09cb3_0 - - libasprintf=0.22.5=h8fbad5d_2 - - libasprintf-devel=0.22.5=h8fbad5d_2 - - libatomic_ops=7.6.14=h1a8c8d9_0 - - libblas=3.9.0=20_osxarm64_openblas - - libboost=1.85.0=h17eb2be_2 - - libboost-devel=1.85.0=hf450f58_2 - - libboost-headers=1.85.0=hce30654_2 - - libbraiding=1.2=hb7217d7_0 - - libbrial=1.2.12=h56a29cd_3 - - libbrotlicommon=1.1.0=hb547adb_1 - - libbrotlidec=1.1.0=hb547adb_1 - - libbrotlienc=1.1.0=hb547adb_1 - - libcblas=3.9.0=20_osxarm64_openblas - - libcbor=0.10.2=hb7217d7_0 - - libclang-cpp16=16.0.6=default_hb63da90_8 - - libcurl=8.8.0=h7b6f9a7_0 - - libcxx=17.0.6=h5f092b4_0 - - libdeflate=1.20=h93a5062_0 - - libedit=3.1.20191231=hc8eb9b7_2 - - libev=4.33=h93a5062_2 - - libexpat=2.6.2=hebf3989_0 - - libffi=3.4.2=h3422bc3_5 - - libfido2=1.15.0=h9d74d49_0 - - libflint=3.0.1=h28749a5_ntl_100 - - libgd=2.3.3=hfdf3952_9 - - libgettextpo=0.22.5=h8fbad5d_2 - - libgettextpo-devel=0.22.5=h8fbad5d_2 - - libgfortran=5.0.0=13_2_0_hd922786_3 - - libgfortran-devel_osx-arm64=12.3.0=hc62be1c_3 - - libgfortran5=13.2.0=hf226fd6_3 - - libglib=2.80.2=h59d46d9_1 - - libhomfly=1.02r6=h93a5062_1 - - libhwloc=2.10.0=default_h7685b71_1001 - - libiconv=1.17=h0d3ecfb_2 - - libintl=0.22.5=h8fbad5d_2 - - libintl-devel=0.22.5=h8fbad5d_2 - - libjpeg-turbo=3.0.0=hb547adb_1 - - liblapack=3.9.0=20_osxarm64_openblas - - liblapacke=3.9.0=20_osxarm64_openblas - - libllvm16=16.0.6=haab561b_3 - - libnghttp2=1.58.0=ha4dd798_1 - - libopenblas=0.3.25=openmp_h6c19121_0 - - libpng=1.6.43=h091b4b1_0 - - libsodium=1.0.18=h27ca646_1 - - libsqlite=3.46.0=hfb93653_0 - - libssh2=1.11.0=h7a5bd25_0 - - libtiff=4.6.0=h07db509_3 - - libtool=2.4.7=hb7217d7_0 - - libuv=1.48.0=h93a5062_0 - - libwebp=1.4.0=h54798ee_0 - - libwebp-base=1.4.0=h93a5062_0 - - libxcb=1.16=hf2054a2_0 - - libxml2=2.12.7=ha661575_1 - - libzlib=1.3.1=hfb2fe0b_1 - - linbox=1.7.0=h3afee3a_0 - - llvm-openmp=18.1.8=hde57baf_0 - - llvm-tools=16.0.6=haab561b_3 - - lrcalc=2.1=hebf3989_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=h642e427_1001 - - m4ri=20140914=hc97c1ff_1006 - - m4rie=20150908=h22b9e9d_1002 - - make=4.3=he57ea6c_1 - - markupsafe=2.1.5=py311h05b510d_0 - - mathjax=3.2.2=hce30654_0 - - matplotlib=3.8.4=py311ha1ab1f8_2 - - matplotlib-base=3.8.4=py311h000fb6e_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2bbcd85_2 - - memory-allocator=0.1.3=py311heffc1b2_0 - - meson=1.5.2=pyhd8ed1ab_0 - - meson-python=0.15.0=pyh0c530f3_0 - - metis=5.1.0=h13dd4ca_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=h91ba8db_0 - - mpfi=1.5.4=hbde5f5b_1001 - - mpfr=4.2.1=h41d338b_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py311h6bde47b_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h93a5062_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=hb89a1cb_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h420ef59_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=hbb3f309_1 - - numpy=1.26.4=py311h7125741_0 - - openblas=0.3.25=openmp_h55c453e_0 - - openjdk=22.0.1=hbeb2e11_0 - - openjpeg=2.5.2=h9f1df11_0 - - openssh=9.6p1=hd435d45_0 - - openssl=3.3.1=hfb2fe0b_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=h27ca646_0 - - pandoc=3.2.1=hce30654_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h5cb9fbc_0 - - pari=2.15.5=h4f2304c_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=h27ca646_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h297a79d_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h4614cfb_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py311hd7951ec_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=hebf3989_0 - - pkg-config=0.29.2=hab62308_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h93a5062_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h8b147cf_1006 - - pplpy=0.8.9=py311h3d77d83_1 - - primecount=7.6=hb6e4faa_0 - - primecountpy=0.1.0=py311he4fd1f5_4 - - primesieve=11.0=hb7217d7_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py311hd3f4193_0 - - pthread-stubs=0.4=h27ca646_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py311hcc98501_0 - - pybind11-global=2.12.0=py311hcc98501_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py311h98c6a39_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py311h5f135c3_0 - - pyobjc-framework-cocoa=10.3.1=py311h5f135c3_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py311h05b510d_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.11.9=h932a869_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py311h92babd0_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.11=4_cp311 - - pythran=0.15.0=py311hceb3b21_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py311h267d04e_4 - - pyyaml=6.0.1=py311heffc1b2_1 - - pyzmq=26.0.3=py311h9bed540_0 - - qd=2.3.22=hbec66e7_1004 - - qhull=2020.2=hc021e02_2 - - r-base=4.3.3=h8112bfe_3 - - r-lattice=0.22_6=r43hd2d937b_0 - - readline=8.2=h92ec313_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hb547adb_0 - - rpds-py=0.18.1=py311h98c6a39_0 - - rpy2=3.5.11=py311r43hb49d859_3 - - ruamel.yaml=0.18.6=py311h05b510d_0 - - ruamel.yaml.clib=0.2.8=py311h05b510d_0 - - rw=0.9=h93a5062_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py311h2b215a9_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - sigtool=0.1.3=h44b9a77_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hb460b52_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h5838104_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf6fcff2_1 - - symmetrica=3.0.1=hb7217d7_0 - - sympow=2.023.6=hb0babe8_3 - - sympy=1.12.1=pypyh2585a3b_103 - - tachyon=0.99b6=hb8a568e_1002 - - tapi=1100.0.11=he4954df_0 - - tar=1.34=h7cb298e_1 - - tbb=2021.12.0=h420ef59_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321h9ea1dce_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h5083fa2_1 - - tktable=2.10=h1e387b8_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py311hd3f4193_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py311h267d04e_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=hb547adb_0 - - xorg-libxdmcp=1.1.3=h27ca646_0 - - xz=5.2.6=h57fd34a_0 - - yaml=0.2.5=h3422bc3_2 - - zeromq=4.3.5=hcc0f68c_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=hfb2fe0b_1 - - zstd=1.5.6=hb46c0d2_0 diff --git a/environment-dev-3.9-linux-aarch64.yml b/environment-dev-3.9-linux-aarch64.yml deleted file mode 100644 index eaeb2644dcd..00000000000 --- a/environment-dev-3.9-linux-aarch64.yml +++ /dev/null @@ -1,489 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: linux-aarch64 -# input_hash: ce794cc8451c14571ca9bfc8ecdd74ad09cf8a281a340df449678e0fed967078 - -channels: - - conda-forge -dependencies: - - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - _sysroot_linux-aarch64_curr_repodata_hack=4=h57d6b7b_14 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.11=h31becfc_1 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39h898b7ef_4 - - arpack=3.9.1=nompi_hd363cd0_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h4e544f5_1 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321h2148fe1_1 - - automake=1.16.5=pl5321h8af1aa0_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=hf897c2e_0 - - bdw-gc=8.0.6=hd62202e_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=hf1166c9_7 - - binutils_impl_linux-aarch64=2.40=hf54a868_7 - - binutils_linux-aarch64=2.40=h1f91aba_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linuxaarch64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=ha990451_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h31becfc_1 - - brotli-bin=1.1.0=h31becfc_1 - - brotli-python=1.1.0=py39h387a81e_1 - - bwidget=1.9.14=h8af1aa0_1 - - bzip2=1.0.8=h31becfc_5 - - c-ares=1.28.1=h31becfc_0 - - c-compiler=1.7.0=h31becfc_1 - - ca-certificates=2024.6.2=hcefe29a_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=h5c54ea9_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cddlib=1!0.94m=h719063d_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39hdf53b9e_0 - - chardet=5.2.0=py39ha65689a_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h31becfc_1 - - cmake=3.29.6=h7042e5d_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39h4420490_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=h8af1aa0_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py39hd16970a_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - cryptography=42.0.8=py39h33ea94c_0 - - curl=8.8.0=h7daf2e0_0 - - cvxopt=1.3.2=py39h093dae0_2 - - cxx-compiler=1.7.0=h2a328a1_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py39h532d932_0 - - cysignals=1.11.2=py39hfa81392_3 - - cython=3.0.10=py39h387a81e_0 - - dbus=1.13.6=h12b9eeb_3 - - debugpy=1.8.1=py39h387a81e_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hb12102e_1203 - - ecl=23.9.9=h6475f26_0 - - eclib=20231212=he26bab5_0 - - ecm=7.0.5=ha2d0fc4_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h2f0025b_0 - - fflas-ffpack=2.5.0=h503e619_0 - - fftw=3.3.10=nompi_h020dacd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=ha9a116f_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39he257ee7_0 - - fortran-compiler=1.7.0=h7048d53_1 - - fplll=5.4.5=hb3a790e_0 - - fpylll=0.6.1=py39h97065f7_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=hf0a5ef3_2 - - fribidi=1.0.10=hb9de7d4_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=h597289e_3 - - gap-defaults=4.12.2=h8af1aa0_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=hdb0cc85_13 - - gcc_impl_linux-aarch64=12.3.0=h3d98823_13 - - gcc_linux-aarch64=12.3.0=ha52a6ea_9 - - gengetopt=2.23=h01db608_0 - - gf2x=1.3.0=h1b3b3a3_2 - - gfan=0.6.2=h5f589ec_1003 - - gfortran=12.3.0=hdb0cc85_13 - - gfortran_impl_linux-aarch64=12.3.0=h97ebfd2_13 - - gfortran_linux-aarch64=12.3.0=ha7b8e4b_9 - - gh=2.46.0=h652cbe9_0 - - giac=1.9.0.21=h04922a4_1 - - giflib=5.2.2=h31becfc_0 - - git=2.45.2=pl5321h011b5c6_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h364d21b_0 - - glpk=5.0=h66325d0_0 - - gmp=6.3.0=h0a1ffab_2 - - gmpy2=2.1.5=py39hcc1b389_1 - - graphite2=1.3.13=h2f0025b_1003 - - gsl=2.7=h294027d_0 - - gxx=12.3.0=hdb0cc85_13 - - gxx_impl_linux-aarch64=12.3.0=hba91e99_13 - - gxx_linux-aarch64=12.3.0=h9d1f256_9 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h9812418_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h787c7f5_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h197073e_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h15043fe_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jeepney=0.8.0=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=h8af1aa0_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39h4420490_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py39h4420490_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-aarch64=4.18.0=h5b4a56d_14 - - keyring=25.2.1=pyha804496_0 - - keyutils=1.6.1=h4e544f5_0 - - kiwisolver=1.4.5=py39had2cf8c_1 - - krb5=1.21.2=hc419048_0 - - lcalc=2.0.5=he588f68_2 - - lcms2=2.16=h922389a_0 - - ld_impl_linux-aarch64=2.40=h9fc2d93_7 - - lerc=4.0.0=h4de3ea5_0 - - libatomic_ops=7.6.14=h4e544f5_0 - - libblas=3.9.0=20_linuxaarch64_openblas - - libboost=1.85.0=hb41fec8_2 - - libboost-devel=1.85.0=h37bb5a9_2 - - libboost-headers=1.85.0=h8af1aa0_2 - - libbraiding=1.2=hd600fc2_0 - - libbrial=1.2.12=h9429f74_3 - - libbrotlicommon=1.1.0=h31becfc_1 - - libbrotlidec=1.1.0=h31becfc_1 - - libbrotlienc=1.1.0=h31becfc_1 - - libcap=2.69=h883460d_0 - - libcblas=3.9.0=20_linuxaarch64_openblas - - libcbor=0.9.0=h01db608_0 - - libcups=2.3.3=h405e4a8_4 - - libcurl=8.8.0=h4e8248e_0 - - libdeflate=1.20=h31becfc_0 - - libedit=3.1.20191231=he28a2e2_2 - - libev=4.33=h31becfc_2 - - libexpat=2.6.2=h2f0025b_0 - - libffi=3.4.2=h3557bc0_5 - - libfido2=1.15.0=hab05c5e_0 - - libflint=3.0.1=hc392af7_ntl_100 - - libgcc-devel_linux-aarch64=12.3.0=h6144e03_113 - - libgcc-ng=13.2.0=he277a41_13 - - libgd=2.3.3=hcd22fd5_9 - - libgfortran-ng=13.2.0=he9431aa_13 - - libgfortran5=13.2.0=h2af0866_13 - - libglib=2.80.2=haee52c6_1 - - libgomp=13.2.0=he277a41_13 - - libhomfly=1.02r6=h31becfc_1 - - libhwloc=2.10.0=default_h3030c0e_1001 - - libiconv=1.17=h31becfc_2 - - libjpeg-turbo=3.0.0=h31becfc_1 - - liblapack=3.9.0=20_linuxaarch64_openblas - - liblapacke=3.9.0=20_linuxaarch64_openblas - - libnghttp2=1.58.0=hb0e430d_1 - - libnsl=2.0.1=h31becfc_0 - - libopenblas=0.3.25=pthreads_h5a5ec62_0 - - libpng=1.6.43=h194ca79_0 - - libsanitizer=12.3.0=h57e2e72_13 - - libsodium=1.0.18=hb9de7d4_1 - - libsqlite=3.46.0=hf51ef55_0 - - libssh2=1.11.0=h492db2e_0 - - libstdcxx-devel_linux-aarch64=12.3.0=h6144e03_113 - - libstdcxx-ng=13.2.0=h3f4de04_13 - - libtiff=4.6.0=hf980d43_3 - - libtool=2.4.7=h4de3ea5_0 - - libudev1=255=h31becfc_1 - - libuuid=2.38.1=hb4cce97_0 - - libuv=1.48.0=h31becfc_0 - - libwebp=1.4.0=h8b4e01b_0 - - libwebp-base=1.4.0=h31becfc_0 - - libxcb=1.16=h7935292_0 - - libxcrypt=4.4.36=h31becfc_1 - - libxml2=2.12.7=h49dc7a2_1 - - libzlib=1.3.1=h68df207_1 - - linbox=1.7.0=h681a5ee_0 - - llvm-openmp=18.1.8=hb063fc5_0 - - lrcalc=2.1=h2f0025b_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=h516909a_1001 - - m4ri=20140914=hedfd65a_1006 - - m4rie=20150908=hf0a5ef3_1002 - - make=4.3=h309ac5b_1 - - markupsafe=2.1.5=py39h7cc1d5f_0 - - mathjax=3.2.2=h8af1aa0_0 - - matplotlib=3.8.4=py39ha65689a_2 - - matplotlib-base=3.8.4=py39hf44f4b6_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h6475f26_2 - - memory-allocator=0.1.3=py39h898b7ef_0 - - metis=5.1.0=h2f0025b_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=hf4c8f4c_0 - - mpfi=1.5.4=h846f343_1001 - - mpfr=4.2.1=ha2d0fc4_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py39h7e9cfeb_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h31becfc_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h0425590_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h70be974_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=h0d7519b_1 - - numpy=1.26.4=py39h91c28bb_0 - - openblas=0.3.25=pthreads_h339cbfa_0 - - openjdk=22.0.1=h3d4cd67_0 - - openjpeg=2.5.2=h0d9d63b_0 - - openssh=9.6p1=h04b8c23_0 - - openssl=3.3.1=h68df207_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=hb9de7d4_0 - - pandoc=3.2.1=h8af1aa0_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h399c48b_0 - - pari=2.15.5=h169c2a7_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=hf897c2e_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h070dd5b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h31becfc_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39h4a8821f_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h2f0025b_0 - - pkg-config=0.29.2=hb9de7d4_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h31becfc_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h984aac9_1006 - - pplpy=0.8.9=py39hf652505_1 - - primecount=7.6=hd600fc2_0 - - primecountpy=0.1.0=py39hd16970a_3 - - primesieve=11.0=hd600fc2_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39he257ee7_0 - - pthread-stubs=0.4=hb9de7d4_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39hd16970a_0 - - pybind11-global=2.12.0=py39hd16970a_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py39hb170bb1_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py39h7cc1d5f_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.9.19=h4ac3b42_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39h387a81e_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39hc2250db_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39h4420490_4 - - pyyaml=6.0.1=py39h898b7ef_1 - - pyzmq=26.0.3=py39h866fef3_0 - - qd=2.3.22=h05efe27_1004 - - qhull=2020.2=hd62202e_2 - - r-base=4.3.3=h7f20121_3 - - r-lattice=0.22_6=r43h25e906a_0 - - readline=8.2=h8fc344f_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h31becfc_0 - - rpds-py=0.18.1=py39hb8f4057_0 - - rpy2=3.5.11=py39r43h1ae4408_3 - - ruamel.yaml=0.18.6=py39h898b7ef_0 - - ruamel.yaml.clib=0.2.8=py39h898b7ef_0 - - rw=0.9=h31becfc_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.3=py39h91c28bb_1 - - secretstorage=3.3.3=py39ha65689a_2 - - sed=4.8=ha0d5d3d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hbe76a8a_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=hdc7ab3c_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=h3944111_1 - - symmetrica=3.0.1=hd600fc2_0 - - sympow=2.023.6=h157afb5_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-aarch64=2.17=h5b4a56d_14 - - tachyon=0.99b6=ha0bfc61_1002 - - tar=1.34=h048efde_0 - - tbb=2021.12.0=h70be974_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h17f021e_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h194ca79_0 - - tktable=2.10=h52f7bd3_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39ha3e8b56_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39h4420490_0 - - unicodedata2=15.1.0=py39h898b7ef_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-fixesproto=5.0=h3557bc0_1002 - - xorg-inputproto=2.3.2=h3557bc0_1002 - - xorg-kbproto=1.0.7=h3557bc0_1002 - - xorg-libice=1.1.1=h7935292_0 - - xorg-libsm=1.2.4=h5a01bc2_0 - - xorg-libx11=1.8.9=h08be655_1 - - xorg-libxau=1.0.11=h31becfc_0 - - xorg-libxdmcp=1.1.3=h3557bc0_0 - - xorg-libxext=1.3.4=h2a766a3_2 - - xorg-libxfixes=5.0.3=h3557bc0_1004 - - xorg-libxi=1.7.10=h3557bc0_0 - - xorg-libxrender=0.9.11=h7935292_0 - - xorg-libxt=1.3.0=h7935292_1 - - xorg-libxtst=1.2.3=hf897c2e_1002 - - xorg-recordproto=1.14.2=hf897c2e_1002 - - xorg-renderproto=0.11.1=h3557bc0_1002 - - xorg-xextproto=7.3.0=h2a766a3_1003 - - xorg-xproto=7.0.31=h3557bc0_1007 - - xz=5.2.6=h9cdd2b7_0 - - yaml=0.2.5=hf897c2e_2 - - zeromq=4.3.5=h28faeed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h68df207_1 - - zstd=1.5.6=h02f22dd_0 diff --git a/environment-dev-3.9-linux.yml b/environment-dev-3.9-linux.yml deleted file mode 100644 index ab8991dfcd6..00000000000 --- a/environment-dev-3.9-linux.yml +++ /dev/null @@ -1,536 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: linux-64 -# input_hash: 9434f8e084f9cad908d6fa3d6e7b5e95bb0546055588979176fb8fe260ae6d0f - -channels: - - conda-forge -dependencies: - - _libgcc_mutex=0.1=conda_forge - - _openmp_mutex=4.5=2_kmp_llvm - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - alsa-lib=1.2.12=h4ab18f5_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39hd1e30aa_4 - - arpack=3.9.1=nompi_h77f6705_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attr=2.5.1=h166bdaf_1 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321h2b4cb7a_1 - - automake=1.16.5=pl5321ha770c72_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h7f98852_0 - - bdw-gc=8.0.6=h4bd325d_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - binutils=2.40=h4852527_7 - - binutils_impl_linux-64=2.40=ha1999f0_7 - - binutils_linux-64=2.40=hb3c18ed_9 - - blas=2.120=openblas - - blas-devel=3.9.0=20_linux64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h44aadfe_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hd590300_1 - - brotli-bin=1.1.0=hd590300_1 - - brotli-python=1.1.0=py39h3d6467e_1 - - bwidget=1.9.14=ha770c72_1 - - bzip2=1.0.8=hd590300_5 - - c-ares=1.28.1=hd590300_0 - - c-compiler=1.7.0=hd590300_1 - - ca-certificates=2024.6.2=hbcca054_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=hbb29018_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cddlib=1!0.94m=h9202a9a_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39h7a31438_0 - - chardet=5.2.0=py39hf3d152e_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=hd590300_1 - - cmake=3.29.6=hcafd917_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39hf3d152e_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compilers=1.7.0=ha770c72_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py39h7633fee_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - cryptography=42.0.8=py39h8169da8_0 - - curl=8.8.0=he654da7_0 - - cvxopt=1.3.2=py39h640215f_2 - - cxx-compiler=1.7.0=h00ab1b0_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py39h1698a45_0 - - cysignals=1.11.2=py39h1ce0973_3 - - cython=3.0.10=py39h3d6467e_0 - - dbus=1.13.6=h5008d03_3 - - debugpy=1.8.1=py39h3d6467e_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=hd9d9efa_1203 - - ecl=23.9.9=hed6455c_0 - - eclib=20231212=h96f522a_0 - - ecm=7.0.5=h9458935_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h59595ed_0 - - fflas-ffpack=2.5.0=h4f9960b_0 - - fftw=3.3.10=nompi_hf1063bd_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h14ed4e7_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39hd3abc70_0 - - fortran-compiler=1.7.0=heb67821_1 - - fplll=5.4.5=h384768b_0 - - fpylll=0.6.1=py39h2525e16_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=h267a509_2 - - fribidi=1.0.10=h36c2ea0_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he9a28a4_3 - - gap-defaults=4.12.2=ha770c72_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gcc=12.3.0=h915e2ae_13 - - gcc_impl_linux-64=12.3.0=h58ffeeb_13 - - gcc_linux-64=12.3.0=h9528a6a_9 - - gengetopt=2.23=h9c3ff4c_0 - - gettext=0.22.5=h59595ed_2 - - gettext-tools=0.22.5=h59595ed_2 - - gf2x=1.3.0=ha476b99_2 - - gfan=0.6.2=hb86e20a_1003 - - gfortran=12.3.0=h915e2ae_13 - - gfortran_impl_linux-64=12.3.0=h8f2110c_13 - - gfortran_linux-64=12.3.0=h5877db1_9 - - gh=2.52.0=he0e2781_0 - - giac=1.9.0.21=h673759e_1 - - giflib=5.2.2=hd590300_0 - - git=2.45.2=pl5321ha099dd3_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=hb789bce_0 - - glib=2.80.2=h8a4344b_1 - - glib-tools=2.80.2=h73ef956_1 - - glpk=5.0=h445213a_0 - - gmp=6.3.0=hac33072_2 - - gmpy2=2.1.5=py39h048c657_1 - - graphite2=1.3.13=h59595ed_1003 - - gsl=2.7=he838d99_0 - - gst-plugins-base=1.24.5=hbaaba92_0 - - gstreamer=1.24.5=haf2f30d_0 - - gxx=12.3.0=h915e2ae_13 - - gxx_impl_linux-64=12.3.0=h2a574ab_13 - - gxx_linux-64=12.3.0=ha28b414_9 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=hfac3d4d_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=h59595ed_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hef0740d_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h623f65a_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh3099207_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jeepney=0.8.0=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=ha770c72_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39hf3d152e_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py39hf3d152e_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - kernel-headers_linux-64=2.6.32=he073ed8_17 - - keyring=25.2.1=pyha804496_0 - - keyutils=1.6.1=h166bdaf_0 - - kiwisolver=1.4.5=py39h7633fee_1 - - krb5=1.21.2=h659d440_0 - - lame=3.100=h166bdaf_1003 - - lcalc=2.0.5=h5aac1b6_2 - - lcms2=2.16=hb7c19ff_0 - - ld_impl_linux-64=2.40=hf3520f5_7 - - lerc=4.0.0=h27087fc_0 - - libasprintf=0.22.5=h661eb56_2 - - libasprintf-devel=0.22.5=h661eb56_2 - - libatomic_ops=7.6.14=h166bdaf_0 - - libblas=3.9.0=20_linux64_openblas - - libboost=1.85.0=hba137d9_2 - - libboost-devel=1.85.0=h00ab1b0_2 - - libboost-headers=1.85.0=ha770c72_2 - - libbraiding=1.2=hcb278e6_0 - - libbrial=1.2.12=h76af697_3 - - libbrotlicommon=1.1.0=hd590300_1 - - libbrotlidec=1.1.0=hd590300_1 - - libbrotlienc=1.1.0=hd590300_1 - - libcap=2.69=h0f662aa_0 - - libcblas=3.9.0=20_linux64_openblas - - libcbor=0.10.2=hcb278e6_0 - - libclang-cpp15=15.0.7=default_h127d8a8_5 - - libclang13=18.1.8=default_h6ae225f_0 - - libcups=2.3.3=h4637d8d_4 - - libcurl=8.8.0=hca28451_0 - - libdeflate=1.20=hd590300_0 - - libedit=3.1.20191231=he28a2e2_2 - - libev=4.33=hd590300_2 - - libevent=2.1.12=hf998b51_1 - - libexpat=2.6.2=h59595ed_0 - - libffi=3.4.2=h7f98852_5 - - libfido2=1.15.0=hdd1f21f_0 - - libflac=1.4.3=h59595ed_0 - - libflint=3.0.1=h5f2e117_ntl_100 - - libgcc-devel_linux-64=12.3.0=h6b66f73_113 - - libgcc-ng=13.2.0=h77fa898_13 - - libgcrypt=1.10.3=hd590300_0 - - libgd=2.3.3=h119a65a_9 - - libgettextpo=0.22.5=h59595ed_2 - - libgettextpo-devel=0.22.5=h59595ed_2 - - libgfortran-ng=13.2.0=h69a702a_13 - - libgfortran5=13.2.0=h3d2ce59_13 - - libglib=2.80.2=h8a4344b_1 - - libgomp=13.2.0=h77fa898_13 - - libgpg-error=1.49=h4f305b6_0 - - libhomfly=1.02r6=hd590300_1 - - libhwloc=2.10.0=default_h5622ce7_1001 - - libiconv=1.17=hd590300_2 - - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_openblas - - liblapacke=3.9.0=20_linux64_openblas - - libllvm15=15.0.7=hb3ce162_4 - - libllvm18=18.1.8=hc9dba70_0 - - libnghttp2=1.58.0=h47da74e_1 - - libnsl=2.0.1=hd590300_0 - - libogg=1.3.5=h4ab18f5_0 - - libopenblas=0.3.25=pthreads_h413a1c8_0 - - libopus=1.3.1=h7f98852_1 - - libpng=1.6.43=h2797004_0 - - libpq=16.3=ha72fbe1_0 - - libsanitizer=12.3.0=hb8811af_13 - - libsndfile=1.2.2=hc60ed4a_1 - - libsodium=1.0.18=h36c2ea0_1 - - libsqlite=3.46.0=hde9e2c9_0 - - libssh2=1.11.0=h0841786_0 - - libstdcxx-devel_linux-64=12.3.0=h6b66f73_113 - - libstdcxx-ng=13.2.0=hc0a3c3a_13 - - libsystemd0=255=h3516f8a_1 - - libtiff=4.6.0=h1dd3fc0_3 - - libtool=2.4.7=h27087fc_0 - - libudev1=255=h3f72095_1 - - libuuid=2.38.1=h0b41bf4_0 - - libuv=1.48.0=hd590300_0 - - libvorbis=1.3.7=h9c3ff4c_0 - - libwebp=1.4.0=h2c329e2_0 - - libwebp-base=1.4.0=hd590300_0 - - libxcb=1.16=hd590300_0 - - libxcrypt=4.4.36=hd590300_1 - - libxkbcommon=1.7.0=h2c5496b_1 - - libxml2=2.12.7=hc051c1a_1 - - libzlib=1.3.1=h4ab18f5_1 - - linbox=1.7.0=ha329b40_0 - - llvm-openmp=18.1.8=hf5423f3_0 - - lrcalc=2.1=h59595ed_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - lz4-c=1.9.4=hcb278e6_0 - - m4=1.4.18=h516909a_1001 - - m4ri=20140914=hae5d5c5_1006 - - m4rie=20150908=h267a509_1002 - - make=4.3=hd18ef5c_1 - - markupsafe=2.1.5=py39hd1e30aa_0 - - mathjax=3.2.2=ha770c72_0 - - matplotlib=3.8.4=py39hf3d152e_2 - - matplotlib-base=3.8.4=py39h10d1fc8_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=hed6455c_2 - - memory-allocator=0.1.3=py39hd1e30aa_0 - - meson=1.5.2=pyhd8ed1ab_0 - - meson-python=0.15.0=pyh0c530f3_0 - - metis=5.1.0=h59595ed_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=hfe3b2da_0 - - mpfi=1.5.4=h9f54685_1001 - - mpfr=4.2.1=h9458935_1 - - mpg123=1.32.6=h59595ed_0 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py39h95fdab5_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - mysql-common=8.3.0=hf1915f5_4 - - mysql-libs=8.3.0=hca2cd23_4 - - nauty=2.8.8=hd590300_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h59595ed_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h297d8ca_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - nspr=4.35=h27087fc_0 - - nss=3.101=h593d115_0 - - ntl=11.4.3=hef3c4d3_1 - - numpy=1.26.4=py39h474f0d3_0 - - openblas=0.3.25=pthreads_h7a3da1a_0 - - openjdk=21.0.2=haa376d0_0 - - openjpeg=2.5.2=h488ebb8_0 - - openssh=9.6p1=h2d3b35a_0 - - openssl=3.3.1=h4ab18f5_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=h36c2ea0_0 - - pandoc=3.2.1=ha770c72_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h84a9a3c_0 - - pari=2.15.5=h4d4ae9b_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=h7f98852_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h0f59acf_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_hd590300_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39h16a7006_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.2=h59595ed_0 - - pkg-config=0.29.2=h36c2ea0_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=hd590300_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h6ec01c2_1006 - - pplpy=0.8.9=py39h9e9cb73_1 - - primecount=7.9=hcb278e6_0 - - primecountpy=0.1.0=py39h7633fee_4 - - primesieve=11.1=h59595ed_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39hd3abc70_0 - - pthread-stubs=0.4=h36c2ea0_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pulseaudio-client=17.0=hb77b528_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39h7633fee_0 - - pybind11-global=2.12.0=py39h7633fee_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py39ha68c5e3_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyqt=5.15.9=py39h52134e7_5 - - pyqt5-sip=12.12.2=py39h3d6467e_5 - - pyrsistent=0.20.0=py39hd1e30aa_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.9.19=h0755675_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39h3d6467e_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39hda80f44_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39hf3d152e_4 - - pyyaml=6.0.1=py39hd1e30aa_1 - - pyzmq=26.0.3=py39ha1047a2_0 - - qd=2.3.22=h2cc385e_1004 - - qhull=2020.2=h4bd325d_2 - - qt-main=5.15.8=ha2b5568_22 - - r-base=4.3.3=he2d9a6e_3 - - r-lattice=0.22_6=r43h57805ef_0 - - readline=8.2=h8228510_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hd590300_0 - - rpds-py=0.18.1=py39ha68c5e3_0 - - rpy2=3.5.11=py39r43h44dd56e_3 - - ruamel.yaml=0.18.6=py39hd1e30aa_0 - - ruamel.yaml.clib=0.2.8=py39hd1e30aa_0 - - rw=0.9=hd590300_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py39h474f0d3_0 - - secretstorage=3.3.3=py39hf3d152e_2 - - sed=4.8=he412f7d_0 - - send2trash=1.8.3=pyh0d859eb_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h33f5c3f_1 - - sip=6.7.12=py39h3d6467e_0 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h6d4b2fc_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf4753ba_1 - - symmetrica=3.0.1=hcb278e6_0 - - sympow=2.023.6=hc6ab17c_3 - - sympy=1.12.1=pypyh2585a3b_103 - - sysroot_linux-64=2.12=he073ed8_17 - - tachyon=0.99b6=hba7d16a_1002 - - tar=1.34=hb2e2bae_1 - - tbb=2021.12.0=h297d8ca_1 - - terminado=0.18.1=pyh0d859eb_0 - - texinfo=7.0=pl5321h0f457ee_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=noxft_h4845f30_101 - - tktable=2.10=h8bc8fbc_6 - - toml=0.10.2=pyhd8ed1ab_0 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39hd3abc70_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39hf3d152e_0 - - unicodedata2=15.1.0=py39hd1e30aa_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xcb-util=0.4.1=hb711507_2 - - xcb-util-image=0.4.0=hb711507_2 - - xcb-util-keysyms=0.4.1=hb711507_0 - - xcb-util-renderutil=0.3.10=hb711507_0 - - xcb-util-wm=0.4.2=hb711507_0 - - xkeyboard-config=2.42=h4ab18f5_0 - - xorg-fixesproto=5.0=h7f98852_1002 - - xorg-inputproto=2.3.2=h7f98852_1002 - - xorg-kbproto=1.0.7=h7f98852_1002 - - xorg-libice=1.1.1=hd590300_0 - - xorg-libsm=1.2.4=h7391055_0 - - xorg-libx11=1.8.9=hb711507_1 - - xorg-libxau=1.0.11=hd590300_0 - - xorg-libxdmcp=1.1.3=h7f98852_0 - - xorg-libxext=1.3.4=h0b41bf4_2 - - xorg-libxfixes=5.0.3=h7f98852_1004 - - xorg-libxi=1.7.10=h7f98852_0 - - xorg-libxrender=0.9.11=hd590300_0 - - xorg-libxt=1.3.0=hd590300_1 - - xorg-libxtst=1.2.3=h7f98852_1002 - - xorg-recordproto=1.14.2=h7f98852_1002 - - xorg-renderproto=0.11.1=h7f98852_1002 - - xorg-xextproto=7.3.0=h0b41bf4_1003 - - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - - xorg-xproto=7.0.31=h7f98852_1007 - - xz=5.2.6=h166bdaf_0 - - yaml=0.2.5=h7f98852_2 - - zeromq=4.3.5=h75354e8_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h4ab18f5_1 - - zstd=1.5.6=ha6fb4c9_0 diff --git a/environment-dev-3.9-macos-x86_64.yml b/environment-dev-3.9-macos-x86_64.yml deleted file mode 100644 index a09f7e4f3b1..00000000000 --- a/environment-dev-3.9-macos-x86_64.yml +++ /dev/null @@ -1,470 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: osx-64 -# input_hash: 87145dff13f485d3cacd44987c6622d73ff7e5ebfdff843fe604d9835dead5f9 - -channels: - - conda-forge -dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39hdc70f33_4 - - arpack=3.9.1=nompi_hf81eadf_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321hed12c24_1 - - automake=1.16.5=pl5321h694c41f_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h0d85af4_0 - - bdw-gc=8.0.6=h940c156_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osx64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=h07eb623_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=h0dc2134_1 - - brotli-bin=1.1.0=h0dc2134_1 - - brotli-python=1.1.0=py39h840bb9f_1 - - bwidget=1.9.14=h694c41f_1 - - bzip2=1.0.8=h10d778d_5 - - c-ares=1.28.1=h10d778d_0 - - c-compiler=1.7.0=h282daa2_1 - - ca-certificates=2024.6.2=h8857fd0_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=h9f650ed_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cctools=986=h40f6528_0 - - cctools_osx-64=986=ha1c5b94_0 - - cddlib=1!0.94m=h0f52abe_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39h18ef598_0 - - chardet=5.2.0=py39h6e9494a_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_ha3b9224_8 - - clang-16=16.0.6=default_h4c8afb6_8 - - clang_impl_osx-64=16.0.6=h8787910_16 - - clang_osx-64=16.0.6=hb91bd55_16 - - clangxx=16.0.6=default_ha3b9224_8 - - clangxx_impl_osx-64=16.0.6=h6d92fbe_16 - - clangxx_osx-64=16.0.6=hb91bd55_16 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h10d778d_1 - - cmake=3.29.6=h749d262_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39h6e9494a_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=ha38d28d_2 - - compiler-rt_osx-64=16.0.6=ha38d28d_2 - - compilers=1.7.0=h694c41f_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py39h0ca7971_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - curl=8.8.0=hea67d85_0 - - cvxopt=1.3.2=py39hd66cc7a_2 - - cxx-compiler=1.7.0=h7728843_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py39hc0d7317_0 - - cysignals=1.11.2=py39hf6ae30e_3 - - cython=3.0.10=py39hd253f6c_0 - - debugpy=1.8.1=py39hd253f6c_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h6e329d1_1203 - - ecl=23.9.9=h2b27fa8_0 - - eclib=20231212=h02435c3_0 - - ecm=7.0.5=h4f6b447_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=h73e2aa4_0 - - fflas-ffpack=2.5.0=h5898d61_0 - - fftw=3.3.10=nompi_h292e606_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h5bb23bf_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39hded5825_0 - - fortran-compiler=1.7.0=h6c2ab21_1 - - fplll=5.4.5=hb7981ad_0 - - fpylll=0.6.1=py39h3b3ffec_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=h60636b9_2 - - fribidi=1.0.10=hbcb3906_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=hc16eb5f_3 - - gap-defaults=4.12.2=h694c41f_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=he49afe7_0 - - gettext=0.22.5=h5ff76d1_2 - - gettext-tools=0.22.5=h5ff76d1_2 - - gf2x=1.3.0=hb2a7efb_2 - - gfan=0.6.2=hd793b56_1003 - - gfortran=12.3.0=h2c809b3_1 - - gfortran_impl_osx-64=12.3.0=hc328e78_3 - - gfortran_osx-64=12.3.0=h18f7dce_1 - - gh=2.52.0=he13f2d6_0 - - giac=1.9.0.21=h92f3f65_1 - - giflib=5.2.2=h10d778d_0 - - git=2.45.2=pl5321hb0c6a96_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h1b3d6f7_0 - - glpk=5.0=h3cb5acd_0 - - gmp=6.3.0=hf036a51_2 - - gmpy2=2.1.5=py39h87b48b1_1 - - graphite2=1.3.13=h73e2aa4_1003 - - gsl=2.7=h93259b0_0 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h053f038_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hf5e326d_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=hde4452d_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=h61918c1_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isl=0.26=imath32_h2e86a7b_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.9=h694c41f_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39h6e9494a_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.1=py39h6e9494a_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - keyring=25.2.1=pyh534df25_0 - - kiwisolver=1.4.5=py39h8ee36c8_1 - - krb5=1.21.2=hb884880_0 - - lcalc=2.0.5=h547a6ed_2 - - lcms2=2.16=ha2f27b4_0 - - ld64=711=ha02d983_0 - - ld64_osx-64=711=ha20a434_0 - - lerc=4.0.0=hb486fe8_0 - - libasprintf=0.22.5=h5ff76d1_2 - - libasprintf-devel=0.22.5=h5ff76d1_2 - - libatomic_ops=7.6.14=hb7f2c08_0 - - libblas=3.9.0=20_osx64_openblas - - libboost=1.85.0=h739af76_2 - - libboost-devel=1.85.0=h2b186f8_2 - - libboost-headers=1.85.0=h694c41f_2 - - libbraiding=1.2=hf0c8a7f_0 - - libbrial=1.2.12=h81e9653_3 - - libbrotlicommon=1.1.0=h0dc2134_1 - - libbrotlidec=1.1.0=h0dc2134_1 - - libbrotlienc=1.1.0=h0dc2134_1 - - libcblas=3.9.0=20_osx64_openblas - - libcbor=0.10.2=hf0c8a7f_0 - - libclang-cpp16=16.0.6=default_h4c8afb6_8 - - libcurl=8.8.0=hf9fcc65_0 - - libcxx=17.0.6=h88467a6_0 - - libdeflate=1.20=h49d49c5_0 - - libedit=3.1.20191231=h0678c8f_2 - - libev=4.33=h10d778d_2 - - libexpat=2.6.2=h73e2aa4_0 - - libffi=3.4.2=h0d85af4_5 - - libfido2=1.15.0=h41b28d8_0 - - libflint=3.0.1=h5d15de0_ntl_100 - - libgd=2.3.3=h0dceb68_9 - - libgettextpo=0.22.5=h5ff76d1_2 - - libgettextpo-devel=0.22.5=h5ff76d1_2 - - libgfortran=5.0.0=13_2_0_h97931a8_3 - - libgfortran-devel_osx-64=12.3.0=h0b6f5ec_3 - - libgfortran5=13.2.0=h2873a65_3 - - libglib=2.80.2=h736d271_1 - - libhomfly=1.02r6=h10d778d_1 - - libhwloc=2.10.0=default_h456cccd_1001 - - libiconv=1.17=hd75f5a5_2 - - libintl=0.22.5=h5ff76d1_2 - - libintl-devel=0.22.5=h5ff76d1_2 - - libjpeg-turbo=3.0.0=h0dc2134_1 - - liblapack=3.9.0=20_osx64_openblas - - liblapacke=3.9.0=20_osx64_openblas - - libllvm16=16.0.6=hbedff68_3 - - libnghttp2=1.58.0=h64cf6d3_1 - - libopenblas=0.3.25=openmp_hfef2a42_0 - - libpng=1.6.43=h92b6c6a_0 - - libsodium=1.0.18=hbcb3906_1 - - libsqlite=3.46.0=h1b8f9f3_0 - - libssh2=1.11.0=hd019ec5_0 - - libtiff=4.6.0=h129831d_3 - - libtool=2.4.7=hf0c8a7f_0 - - libuv=1.48.0=h67532ce_0 - - libwebp=1.4.0=hc207709_0 - - libwebp-base=1.4.0=h10d778d_0 - - libxcb=1.16=h0dc2134_0 - - libxml2=2.12.7=h3e169fe_1 - - libzlib=1.3.1=h87427d6_1 - - linbox=1.7.0=h7061c92_0 - - llvm-openmp=18.1.8=h15ab845_0 - - llvm-tools=16.0.6=hbedff68_3 - - lrcalc=2.1=h73e2aa4_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=haf1e3a3_1001 - - m4ri=20140914=hd82a5f3_1006 - - m4rie=20150908=hc616cfc_1002 - - make=4.3=h22f3db7_1 - - markupsafe=2.1.5=py39ha09f3b3_0 - - mathjax=3.2.2=h694c41f_0 - - matplotlib=3.8.4=py39h6e9494a_2 - - matplotlib-base=3.8.4=py39hfca4cae_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2b27fa8_2 - - memory-allocator=0.1.3=py39hdc70f33_0 - - metis=5.1.0=he965462_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=h81bd1dd_0 - - mpfi=1.5.4=h52b28e3_1001 - - mpfr=4.2.1=h4f6b447_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py39hdf1af86_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h10d778d_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=h5846eda_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h3c5361c_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=h0ab3c2f_1 - - numpy=1.26.4=py39h28c39a1_0 - - openblas=0.3.25=openmp_h6794695_0 - - openjdk=22.0.1=h2d185b6_0 - - openjpeg=2.5.2=h7310d3a_0 - - openssh=9.6p1=h6dd4ff7_0 - - openssl=3.3.1=h87427d6_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=hbcb3906_0 - - pandoc=3.2.1=h694c41f_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h880b76c_0 - - pari=2.15.5=h7ba67ff_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=hbcf498f_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h7634a1b_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h10d778d_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39hc3a33ae_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=h73e2aa4_0 - - pkg-config=0.29.2=ha3d46e9_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h10d778d_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=ha60d53e_1006 - - pplpy=0.8.9=py39hc385998_1 - - primecount=7.6=ha894c9a_0 - - primecountpy=0.1.0=py39h8ee36c8_4 - - primesieve=11.0=hf0c8a7f_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39hded5825_0 - - pthread-stubs=0.4=hc929b4f_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39h0ca7971_0 - - pybind11-global=2.12.0=py39h0ca7971_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py39hf59063a_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py39hf8f43b1_0 - - pyobjc-framework-cocoa=10.3.1=py39hf8f43b1_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py39ha09f3b3_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.9.19=h7a9c478_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39hd253f6c_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39h5d0c61a_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39h6e9494a_4 - - pyyaml=6.0.1=py39hdc70f33_1 - - pyzmq=26.0.3=py39h304b177_0 - - qd=2.3.22=h2beb688_1004 - - qhull=2020.2=h940c156_2 - - r-base=4.3.3=h4648a1f_3 - - r-lattice=0.22_6=r43hb2c329c_0 - - readline=8.2=h9e318b2_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=h0dc2134_0 - - rpds-py=0.18.1=py39hf59063a_0 - - rpy2=3.5.11=py39r43hd01001f_3 - - ruamel.yaml=0.18.6=py39ha09f3b3_0 - - ruamel.yaml.clib=0.2.8=py39ha09f3b3_0 - - rw=0.9=h10d778d_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py39ha321857_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - sigtool=0.1.3=h88f4db0_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=h0d51a9f_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h28673e1_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hd2b2131_1 - - symmetrica=3.0.1=hf0c8a7f_0 - - sympow=2.023.6=h115ba6a_3 - - sympy=1.12.1=pypyh2585a3b_103 - - tachyon=0.99b6=h3a1d103_1002 - - tapi=1100.0.11=h9ce4665_0 - - tar=1.34=hcb2f6ea_1 - - tbb=2021.12.0=h3c5361c_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321hc47821c_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h1abcd95_1 - - tktable=2.10=hba9d6f1_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39hded5825_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39h6e9494a_0 - - unicodedata2=15.1.0=py39hdc70f33_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=h0dc2134_0 - - xorg-libxdmcp=1.1.3=h35c211d_0 - - xz=5.2.6=h775f41a_0 - - yaml=0.2.5=h0d85af4_2 - - zeromq=4.3.5=hde137ed_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=h87427d6_1 - - zstd=1.5.6=h915ae27_0 diff --git a/environment-dev-3.9-macos.yml b/environment-dev-3.9-macos.yml deleted file mode 100644 index dd2bccb3380..00000000000 --- a/environment-dev-3.9-macos.yml +++ /dev/null @@ -1,472 +0,0 @@ -name: sage-dev -# Generated by conda-lock. -# platform: osx-arm64 -# input_hash: 3e552281740b1a37b111ca4468f2f30142d4a3d4c041f3d342f28b36394c84de - -channels: - - conda-forge -dependencies: - - _r-mutex=1.0.1=anacondar_1 - - alabaster=0.7.16=pyhd8ed1ab_0 - - annotated-types=0.7.0=pyhd8ed1ab_0 - - anyio=4.4.0=pyhd8ed1ab_0 - - appdirs=1.4.4=pyh9f0ad1d_0 - - appnope=0.1.4=pyhd8ed1ab_0 - - argon2-cffi=23.1.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py39h0f82c59_4 - - arpack=3.9.1=nompi_h593882a_101 - - arrow=1.3.0=pyhd8ed1ab_0 - - asttokens=2.4.1=pyhd8ed1ab_0 - - async-lru=2.0.4=pyhd8ed1ab_0 - - attrs=23.2.0=pyh71513ae_0 - - autoconf=2.71=pl5321hcd07c0c_1 - - automake=1.16.5=pl5321hce30654_0 - - babel=2.14.0=pyhd8ed1ab_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.tarfile=1.0.0=pyhd8ed1ab_1 - - bc=1.07.1=h3422bc3_0 - - bdw-gc=8.0.6=hc021e02_0 - - beautifulsoup4=4.12.3=pyha770c72_0 - - beniget=0.4.1=pyhd8ed1ab_0 - - blas=2.120=openblas - - blas-devel=3.9.0=20_osxarm64_openblas - - bleach=6.1.0=pyhd8ed1ab_0 - - boost-cpp=1.85.0=hca5e981_2 - - brial=1.2.12=pyh694c41f_3 - - brotli=1.1.0=hb547adb_1 - - brotli-bin=1.1.0=hb547adb_1 - - brotli-python=1.1.0=py39hb198ff7_1 - - bwidget=1.9.14=hce30654_1 - - bzip2=1.0.8=h93a5062_5 - - c-ares=1.28.1=h93a5062_0 - - c-compiler=1.7.0=h6aa9301_1 - - ca-certificates=2024.6.2=hf0a4a13_0 - - cachecontrol=0.14.0=pyhd8ed1ab_1 - - cachecontrol-with-filecache=0.14.0=pyhd8ed1ab_1 - - cached-property=1.5.2=hd8ed1ab_1 - - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.3=pyhd8ed1ab_0 - - cachy=0.3.0=pyhd8ed1ab_1 - - cairo=1.18.0=hc6c324b_2 - - cattrs=23.2.3=pyhd8ed1ab_0 - - cctools=986=h4faf515_0 - - cctools_osx-arm64=986=h62378fb_0 - - cddlib=1!0.94m=h6d7a090_0 - - certifi=2024.6.2=pyhd8ed1ab_0 - - cffi=1.16.0=py39he153c15_0 - - chardet=5.2.0=py39h2804cbe_1 - - charset-normalizer=3.3.2=pyhd8ed1ab_0 - - clang=16.0.6=default_h095aff0_8 - - clang-16=16.0.6=default_hb63da90_8 - - clang_impl_osx-arm64=16.0.6=hc421ffc_16 - - clang_osx-arm64=16.0.6=h54d7cd3_16 - - clangxx=16.0.6=default_h095aff0_8 - - clangxx_impl_osx-arm64=16.0.6=hcd7bac0_16 - - clangxx_osx-arm64=16.0.6=h54d7cd3_16 - - click=8.1.7=unix_pyh707e725_0 - - click-default-group=1.2.4=pyhd8ed1ab_0 - - clikit=0.6.2=pyhd8ed1ab_2 - - cliquer=1.22=h93a5062_1 - - cmake=3.29.6=had79d8f_0 - - colorama=0.4.6=pyhd8ed1ab_0 - - colorlog=6.8.2=py39h2804cbe_0 - - comm=0.2.2=pyhd8ed1ab_0 - - compiler-rt=16.0.6=h3808999_2 - - compiler-rt_osx-arm64=16.0.6=h3808999_2 - - compilers=1.7.0=hce30654_1 - - conda-lock=2.5.7=pyhd8ed1ab_0 - - contourpy=1.2.1=py39h48c5dd5_0 - - conway-polynomials=0.9=pyhd8ed1ab_0 - - cppy=1.2.1=pyhd8ed1ab_0 - - crashtest=0.4.1=pyhd8ed1ab_0 - - curl=8.8.0=h653d890_0 - - cvxopt=1.3.2=py39hf9e8641_2 - - cxx-compiler=1.7.0=h2ffa867_1 - - cycler=0.12.1=pyhd8ed1ab_0 - - cypari2=2.1.5=py39h070b2a8_0 - - cysignals=1.11.2=py39h65fc70a_3 - - cython=3.0.10=py39hf3050f2_0 - - debugpy=1.8.1=py39hf3050f2_0 - - decorator=5.1.1=pyhd8ed1ab_0 - - defusedxml=0.7.1=pyhd8ed1ab_0 - - distlib=0.3.8=pyhd8ed1ab_0 - - docutils=0.21.2=pyhd8ed1ab_0 - - dsdp=5.8=h9397a75_1203 - - ecl=23.9.9=h1d9728a_0 - - eclib=20231212=h7f07de4_0 - - ecm=7.0.5=h41d338b_0 - - editables=0.5=pyhd8ed1ab_0 - - ensureconda=1.4.4=pyhd8ed1ab_0 - - entrypoints=0.4=pyhd8ed1ab_0 - - esbonio=0.16.4=pyhd8ed1ab_0 - - exceptiongroup=1.2.0=pyhd8ed1ab_2 - - execnet=2.1.1=pyhd8ed1ab_0 - - executing=2.0.1=pyhd8ed1ab_0 - - expat=2.6.2=hebf3989_0 - - fflas-ffpack=2.5.0=h4bc3318_0 - - fftw=3.3.10=nompi_h6637ab6_110 - - filelock=3.15.4=pyhd8ed1ab_0 - - flit-core=3.9.0=pyhd8ed1ab_1 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - font-ttf-inconsolata=3.000=h77eed37_0 - - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=h77eed37_2 - - fontconfig=2.14.2=h82840c6_0 - - fonts-conda-ecosystem=1=0 - - fonts-conda-forge=1=0 - - fonttools=4.53.0=py39hfea33bf_0 - - fortran-compiler=1.7.0=hafb19e3_1 - - fplll=5.4.5=hb7d509d_0 - - fpylll=0.6.1=py39h2eadeda_0 - - fqdn=1.5.1=pyhd8ed1ab_0 - - freetype=2.12.1=hadb7bae_2 - - fribidi=1.0.10=h27ca646_0 - - furo=2024.5.6=pyhd8ed1ab_0 - - gap-core=4.12.2=he8f4e70_3 - - gap-defaults=4.12.2=hce30654_3 - - gast=0.5.4=pyhd8ed1ab_0 - - gengetopt=2.23=hbdafb3b_0 - - gettext=0.22.5=h8fbad5d_2 - - gettext-tools=0.22.5=h8fbad5d_2 - - gf2x=1.3.0=hdaa854c_2 - - gfan=0.6.2=hec08f5c_1003 - - gfortran=12.3.0=h1ca8e4b_1 - - gfortran_impl_osx-arm64=12.3.0=h53ed385_3 - - gfortran_osx-arm64=12.3.0=h57527a5_1 - - gh=2.52.0=h163aea0_0 - - giac=1.9.0.21=h1c96721_1 - - giflib=5.2.2=h93a5062_0 - - git=2.45.2=pl5321h41514c7_1 - - gitdb=4.0.11=pyhd8ed1ab_0 - - gitpython=3.1.43=pyhd8ed1ab_0 - - givaro=4.2.0=h018886a_0 - - glpk=5.0=h6d7a090_0 - - gmp=6.3.0=h7bae524_2 - - gmpy2=2.1.5=py39h9bb7c0c_1 - - graphite2=1.3.13=hebf3989_1003 - - gsl=2.7=h6e638da_0 - - h11=0.14.0=pyhd8ed1ab_0 - - h2=4.1.0=pyhd8ed1ab_0 - - harfbuzz=8.5.0=h1836168_0 - - hatchling=1.25.0=pyhd8ed1ab_0 - - hpack=4.0.0=pyh9f0ad1d_0 - - html5lib=1.1=pyh9f0ad1d_0 - - httpcore=1.0.5=pyhd8ed1ab_0 - - httpx=0.27.0=pyhd8ed1ab_0 - - hyperframe=6.0.1=pyhd8ed1ab_0 - - icu=73.2=hc8870d7_0 - - idna=3.7=pyhd8ed1ab_0 - - igraph=0.10.12=h762ac30_1 - - imagesize=1.4.1=pyhd8ed1ab_0 - - iml=1.0.5=hd73f12c_1004 - - importlib-metadata=8.0.0=pyha770c72_0 - - importlib-resources=6.4.0=pyhd8ed1ab_0 - - importlib_metadata=8.0.0=hd8ed1ab_0 - - importlib_resources=6.4.0=pyhd8ed1ab_0 - - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.29.4=pyh57ce528_0 - - ipympl=0.9.4=pyhd8ed1ab_0 - - ipython=8.18.1=pyh707e725_3 - - ipython_genutils=0.2.0=pyhd8ed1ab_1 - - ipywidgets=8.1.3=pyhd8ed1ab_0 - - isl=0.26=imath32_h347afa1_101 - - isoduration=20.11.0=pyhd8ed1ab_0 - - jaraco.classes=3.4.0=pyhd8ed1ab_1 - - jaraco.context=5.3.0=pyhd8ed1ab_1 - - jaraco.functools=4.0.0=pyhd8ed1ab_0 - - jedi=0.19.1=pyhd8ed1ab_0 - - jinja2=3.1.4=pyhd8ed1ab_0 - - jmol=14.32.10=hce30654_0 - - json5=0.9.25=pyhd8ed1ab_0 - - jsonpointer=3.0.0=py39h2804cbe_0 - - jsonschema=4.22.0=pyhd8ed1ab_0 - - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - - jsonschema-with-format-nongpl=4.22.0=pyhd8ed1ab_0 - - jupyter-jsmol=2022.1.0=pyhd8ed1ab_0 - - jupyter-lsp=2.2.5=pyhd8ed1ab_0 - - jupyter-sphinx=0.5.3=pyha770c72_4 - - jupyter_client=8.6.2=pyhd8ed1ab_0 - - jupyter_core=5.7.2=py39h2804cbe_0 - - jupyter_events=0.10.0=pyhd8ed1ab_0 - - jupyter_server=2.14.1=pyhd8ed1ab_0 - - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 - - jupyter_sphinx=0.5.3=hd8ed1ab_4 - - jupyterlab=4.2.2=pyhd8ed1ab_0 - - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - - jupyterlab_server=2.27.2=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 - - keyring=25.2.1=pyh534df25_0 - - kiwisolver=1.4.5=py39hbd775c9_1 - - krb5=1.21.2=h92f50d5_0 - - lcalc=2.0.5=h4a402bc_2 - - lcms2=2.16=ha0e7c42_0 - - ld64=711=h634c8be_0 - - ld64_osx-arm64=711=ha4bd21c_0 - - lerc=4.0.0=h9a09cb3_0 - - libasprintf=0.22.5=h8fbad5d_2 - - libasprintf-devel=0.22.5=h8fbad5d_2 - - libatomic_ops=7.6.14=h1a8c8d9_0 - - libblas=3.9.0=20_osxarm64_openblas - - libboost=1.85.0=h17eb2be_2 - - libboost-devel=1.85.0=hf450f58_2 - - libboost-headers=1.85.0=hce30654_2 - - libbraiding=1.2=hb7217d7_0 - - libbrial=1.2.12=h56a29cd_3 - - libbrotlicommon=1.1.0=hb547adb_1 - - libbrotlidec=1.1.0=hb547adb_1 - - libbrotlienc=1.1.0=hb547adb_1 - - libcblas=3.9.0=20_osxarm64_openblas - - libcbor=0.10.2=hb7217d7_0 - - libclang-cpp16=16.0.6=default_hb63da90_8 - - libcurl=8.8.0=h7b6f9a7_0 - - libcxx=17.0.6=h5f092b4_0 - - libdeflate=1.20=h93a5062_0 - - libedit=3.1.20191231=hc8eb9b7_2 - - libev=4.33=h93a5062_2 - - libexpat=2.6.2=hebf3989_0 - - libffi=3.4.2=h3422bc3_5 - - libfido2=1.15.0=h9d74d49_0 - - libflint=3.0.1=h28749a5_ntl_100 - - libgd=2.3.3=hfdf3952_9 - - libgettextpo=0.22.5=h8fbad5d_2 - - libgettextpo-devel=0.22.5=h8fbad5d_2 - - libgfortran=5.0.0=13_2_0_hd922786_3 - - libgfortran-devel_osx-arm64=12.3.0=hc62be1c_3 - - libgfortran5=13.2.0=hf226fd6_3 - - libglib=2.80.2=h59d46d9_1 - - libhomfly=1.02r6=h93a5062_1 - - libhwloc=2.10.0=default_h7685b71_1001 - - libiconv=1.17=h0d3ecfb_2 - - libintl=0.22.5=h8fbad5d_2 - - libintl-devel=0.22.5=h8fbad5d_2 - - libjpeg-turbo=3.0.0=hb547adb_1 - - liblapack=3.9.0=20_osxarm64_openblas - - liblapacke=3.9.0=20_osxarm64_openblas - - libllvm16=16.0.6=haab561b_3 - - libnghttp2=1.58.0=ha4dd798_1 - - libopenblas=0.3.25=openmp_h6c19121_0 - - libpng=1.6.43=h091b4b1_0 - - libsodium=1.0.18=h27ca646_1 - - libsqlite=3.46.0=hfb93653_0 - - libssh2=1.11.0=h7a5bd25_0 - - libtiff=4.6.0=h07db509_3 - - libtool=2.4.7=hb7217d7_0 - - libuv=1.48.0=h93a5062_0 - - libwebp=1.4.0=h54798ee_0 - - libwebp-base=1.4.0=h93a5062_0 - - libxcb=1.16=hf2054a2_0 - - libxml2=2.12.7=ha661575_1 - - libzlib=1.3.1=hfb2fe0b_1 - - linbox=1.7.0=h3afee3a_0 - - llvm-openmp=18.1.8=hde57baf_0 - - llvm-tools=16.0.6=haab561b_3 - - lrcalc=2.1=hebf3989_6 - - lsprotocol=2023.0.1=pyhd8ed1ab_0 - - m4=1.4.18=h642e427_1001 - - m4ri=20140914=hc97c1ff_1006 - - m4rie=20150908=h22b9e9d_1002 - - make=4.3=he57ea6c_1 - - markupsafe=2.1.5=py39h17cfd9d_0 - - mathjax=3.2.2=hce30654_0 - - matplotlib=3.8.4=py39hdf13c20_2 - - matplotlib-base=3.8.4=py39h15359f4_2 - - matplotlib-inline=0.1.7=pyhd8ed1ab_0 - - maxima=5.47.0=h2bbcd85_2 - - memory-allocator=0.1.3=py39h0f82c59_0 - - meson=1.5.2=pyhd8ed1ab_0 - - meson-python=0.15.0=pyh0c530f3_0 - - metis=5.1.0=h13dd4ca_1007 - - mistune=3.0.2=pyhd8ed1ab_0 - - more-itertools=10.3.0=pyhd8ed1ab_0 - - mpc=1.3.1=h91ba8db_0 - - mpfi=1.5.4=hbde5f5b_1001 - - mpfr=4.2.1=h41d338b_1 - - mpmath=1.3.0=pyhd8ed1ab_0 - - msgpack-python=1.0.8=py39ha1e04a5_0 - - munkres=1.1.4=pyh9f0ad1d_0 - - nauty=2.8.8=h93a5062_1 - - nbclient=0.10.0=pyhd8ed1ab_0 - - nbconvert=7.16.4=hd8ed1ab_1 - - nbconvert-core=7.16.4=pyhd8ed1ab_1 - - nbconvert-pandoc=7.16.4=hd8ed1ab_1 - - nbformat=5.10.4=pyhd8ed1ab_0 - - ncurses=6.5=hb89a1cb_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_0 - - networkx=3.2.1=pyhd8ed1ab_0 - - ninja=1.12.1=h420ef59_0 - - notebook=7.2.1=pyhd8ed1ab_0 - - notebook-shim=0.2.4=pyhd8ed1ab_0 - - ntl=11.4.3=hbb3f309_1 - - numpy=1.26.4=py39h7aa2656_0 - - openblas=0.3.25=openmp_h55c453e_0 - - openjdk=22.0.1=hbeb2e11_0 - - openjpeg=2.5.2=h9f1df11_0 - - openssh=9.6p1=hd435d45_0 - - openssl=3.3.1=hfb2fe0b_0 - - overrides=7.7.0=pyhd8ed1ab_0 - - packaging=24.1=pyhd8ed1ab_0 - - palp=2.20=h27ca646_0 - - pandoc=3.2.1=hce30654_0 - - pandocfilters=1.5.0=pyhd8ed1ab_0 - - pango=1.54.0=h5cb9fbc_0 - - pari=2.15.5=h4f2304c_2_pthread - - pari-elldata=0.0.20161017=0 - - pari-galdata=0.0.20180411=0 - - pari-galpol=0.0.20180625=0 - - pari-seadata=0.0.20090618=0 - - pari-seadata-small=0.0.20090618=0 - - parso=0.8.4=pyhd8ed1ab_0 - - pastel=0.2.1=pyhd8ed1ab_0 - - patch=2.7.6=h27ca646_1002 - - pathspec=0.12.1=pyhd8ed1ab_0 - - pcre2=10.44=h297a79d_0 - - pep517=0.13.0=pyhd8ed1ab_0 - - perl=5.32.1=7_h4614cfb_perl5 - - pexpect=4.9.0=pyhd8ed1ab_0 - - pickleshare=0.7.5=py_1003 - - pillow=10.3.0=py39h3baf582_1 - - pip=24.0=pyhd8ed1ab_0 - - pixman=0.43.4=hebf3989_0 - - pkg-config=0.29.2=hab62308_1008 - - pkgconfig=1.5.5=pyhd8ed1ab_4 - - pkginfo=1.11.1=pyhd8ed1ab_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - - planarity=3.0.2.0=h93a5062_0 - - platformdirs=4.2.2=pyhd8ed1ab_0 - - pluggy=1.5.0=pyhd8ed1ab_0 - - ply=3.11=pyhd8ed1ab_2 - - ppl=1.2=h8b147cf_1006 - - pplpy=0.8.9=py39ha497ee3_1 - - primecount=7.6=hb6e4faa_0 - - primecountpy=0.1.0=py39hbd775c9_4 - - primesieve=11.0=hb7217d7_0 - - prometheus_client=0.20.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.47=pyha770c72_0 - - prompt_toolkit=3.0.47=hd8ed1ab_0 - - psutil=6.0.0=py39hfea33bf_0 - - pthread-stubs=0.4=h27ca646_1001 - - ptyprocess=0.7.0=pyhd3deb0d_0 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - py=1.11.0=pyh6c4a22f_0 - - pybind11=2.12.0=py39h48c5dd5_0 - - pybind11-global=2.12.0=py39h48c5dd5_0 - - pycodestyle=2.12.0=pyhd8ed1ab_0 - - pycparser=2.22=pyhd8ed1ab_0 - - pydantic=2.7.4=pyhd8ed1ab_0 - - pydantic-core=2.18.4=py39h0019b8a_0 - - pygls=1.3.1=pyhd8ed1ab_0 - - pygments=2.18.0=pyhd8ed1ab_0 - - pylev=1.4.0=pyhd8ed1ab_0 - - pyobjc-core=10.3.1=py39h336d860_0 - - pyobjc-framework-cocoa=10.3.1=py39h336d860_0 - - pyparsing=3.1.2=pyhd8ed1ab_0 - - pyproject-api=1.7.1=pyhd8ed1ab_0 - - pyrsistent=0.20.0=py39h17cfd9d_0 - - pysocks=1.7.1=pyha2e5f31_6 - - pyspellchecker=0.8.0=pyhd8ed1ab_0 - - pytest=8.2.2=pyhd8ed1ab_0 - - pytest-xdist=3.6.1=pyhd8ed1ab_0 - - python=3.9.19=hd7ebdb9_0_cpython - - python-build=1.2.1=pyhd8ed1ab_0 - - python-dateutil=2.9.0=pyhd8ed1ab_0 - - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-lrcalc=2.1=py39hf3050f2_6 - - python-tzdata=2024.1=pyhd8ed1ab_0 - - python_abi=3.9=4_cp39 - - pythran=0.15.0=py39h1261dcd_1 - - pytz=2024.1=pyhd8ed1ab_0 - - pytz-deprecation-shim=0.1.0.post0=py39h2804cbe_4 - - pyyaml=6.0.1=py39h0f82c59_1 - - pyzmq=26.0.3=py39he7f0319_0 - - qd=2.3.22=hbec66e7_1004 - - qhull=2020.2=hc021e02_2 - - r-base=4.3.3=h8112bfe_3 - - r-lattice=0.22_6=r43hd2d937b_0 - - readline=8.2=h92ec313_1 - - referencing=0.35.1=pyhd8ed1ab_0 - - requests=2.32.3=pyhd8ed1ab_0 - - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rhash=1.4.4=hb547adb_0 - - rpds-py=0.18.1=py39h0019b8a_0 - - rpy2=3.5.11=py39r43hf4a74a7_3 - - ruamel.yaml=0.18.6=py39h17cfd9d_0 - - ruamel.yaml.clib=0.2.8=py39h17cfd9d_0 - - rw=0.9=h93a5062_2 - - sagemath-db-combinatorial-designs=20140630=1 - - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 - - sagemath-db-graphs=20210214=hd8ed1ab_0 - - sagemath-db-polytopes=20170220=1 - - sagetex=3.6.1=pyhd8ed1ab_0 - - scipy=1.11.4=py39h36c428d_0 - - send2trash=1.8.3=pyh31c8845_0 - - setuptools=70.1.1=pyhd8ed1ab_0 - - setuptools-scm=8.1.0=pyhd8ed1ab_0 - - setuptools_scm=8.1.0=hd8ed1ab_0 - - sigtool=0.1.3=h44b9a77_0 - - simplegeneric=0.8.1=py_1 - - singular=4.3.2.p8=hb460b52_1 - - six=1.16.0=pyh6c4a22f_0 - - smmap=5.0.0=pyhd8ed1ab_0 - - sniffio=1.3.1=pyhd8ed1ab_0 - - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - soupsieve=2.5=pyhd8ed1ab_1 - - sphinx=7.3.7=pyhd8ed1ab_0 - - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_1 - - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.8=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.6=pyhd8ed1ab_0 - - sphinxcontrib-htmlhelp=2.0.5=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 - - sphinxcontrib-qthelp=1.0.7=pyhd8ed1ab_0 - - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 - - sphinxcontrib-websupport=1.2.7=pyhd8ed1ab_0 - - sqlite=3.46.0=h5838104_0 - - stack_data=0.6.2=pyhd8ed1ab_0 - - suitesparse=7.7.0=hf6fcff2_1 - - symmetrica=3.0.1=hb7217d7_0 - - sympow=2.023.6=hb0babe8_3 - - sympy=1.12.1=pypyh2585a3b_103 - - tachyon=0.99b6=hb8a568e_1002 - - tapi=1100.0.11=he4954df_0 - - tar=1.34=h7cb298e_1 - - tbb=2021.12.0=h420ef59_1 - - terminado=0.18.1=pyh31c8845_0 - - texinfo=7.0=pl5321h9ea1dce_0 - - three.js=122=hd8ed1ab_2 - - threejs-sage=122=hd8ed1ab_2 - - tinycss2=1.3.0=pyhd8ed1ab_0 - - tk=8.6.13=h5083fa2_1 - - tktable=2.10=h1e387b8_6 - - tomli=2.0.1=pyhd8ed1ab_0 - - tomlkit=0.12.5=pyha770c72_0 - - toolz=0.12.1=pyhd8ed1ab_0 - - tornado=6.4.1=py39hfea33bf_0 - - tox=4.15.1=pyhd8ed1ab_0 - - traitlets=5.14.3=pyhd8ed1ab_0 - - trove-classifiers=2024.5.22=pyhd8ed1ab_0 - - types-python-dateutil=2.9.0.20240316=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_0 - - typing_extensions=4.12.2=pyha770c72_0 - - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzdata=2024a=h0c530f3_0 - - tzlocal=5.2=py39h2804cbe_0 - - unicodedata2=15.1.0=py39h0f82c59_0 - - uri-template=1.3.0=pyhd8ed1ab_0 - - urllib3=1.26.19=pyhd8ed1ab_0 - - virtualenv=20.26.3=pyhd8ed1ab_0 - - wcwidth=0.2.13=pyhd8ed1ab_0 - - webcolors=24.6.0=pyhd8ed1ab_0 - - webencodings=0.5.1=pyhd8ed1ab_2 - - websocket-client=1.8.0=pyhd8ed1ab_0 - - wheel=0.43.0=pyhd8ed1ab_1 - - widgetsnbextension=4.0.11=pyhd8ed1ab_0 - - xorg-libxau=1.0.11=hb547adb_0 - - xorg-libxdmcp=1.1.3=h27ca646_0 - - xz=5.2.6=h57fd34a_0 - - yaml=0.2.5=h3422bc3_2 - - zeromq=4.3.5=hcc0f68c_4 - - zipp=3.19.2=pyhd8ed1ab_0 - - zlib=1.3.1=hfb2fe0b_1 - - zstd=1.5.6=hb46c0d2_0 diff --git a/pkgs/sage-conf/VERSION.txt b/pkgs/sage-conf/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sage-conf/VERSION.txt +++ b/pkgs/sage-conf/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sage-conf_conda/MANIFEST.in b/pkgs/sage-conf_conda/MANIFEST.in index ea5f85f8c99..98897c3d4a7 100644 --- a/pkgs/sage-conf_conda/MANIFEST.in +++ b/pkgs/sage-conf_conda/MANIFEST.in @@ -8,7 +8,6 @@ include sage_root/Makefile include sage_root/README.md include sage_root/VERSION.txt include sage_root/bootstrap -include sage_root/bootstrap-conda graft sage_root/build prune sage_root/build/.tox exclude sage_root/build/bin/sage-build-env-config # generated by configure diff --git a/pkgs/sage-conf_conda/VERSION.txt b/pkgs/sage-conf_conda/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sage-conf_conda/VERSION.txt +++ b/pkgs/sage-conf_conda/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sage-conf_pypi/VERSION.txt b/pkgs/sage-conf_pypi/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sage-conf_pypi/VERSION.txt +++ b/pkgs/sage-conf_pypi/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sage-docbuild/VERSION.txt b/pkgs/sage-docbuild/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sage-docbuild/VERSION.txt +++ b/pkgs/sage-docbuild/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sage-setup/VERSION.txt b/pkgs/sage-setup/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sage-setup/VERSION.txt +++ b/pkgs/sage-setup/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sage-sws2rst/VERSION.txt b/pkgs/sage-sws2rst/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sage-sws2rst/VERSION.txt +++ b/pkgs/sage-sws2rst/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-bliss/VERSION.txt b/pkgs/sagemath-bliss/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-bliss/VERSION.txt +++ b/pkgs/sagemath-bliss/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-categories/VERSION.txt b/pkgs/sagemath-categories/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-categories/VERSION.txt +++ b/pkgs/sagemath-categories/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-coxeter3/VERSION.txt b/pkgs/sagemath-coxeter3/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-coxeter3/VERSION.txt +++ b/pkgs/sagemath-coxeter3/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-environment/VERSION.txt b/pkgs/sagemath-environment/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-environment/VERSION.txt +++ b/pkgs/sagemath-environment/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-mcqd/VERSION.txt b/pkgs/sagemath-mcqd/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-mcqd/VERSION.txt +++ b/pkgs/sagemath-mcqd/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-meataxe/VERSION.txt b/pkgs/sagemath-meataxe/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-meataxe/VERSION.txt +++ b/pkgs/sagemath-meataxe/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-objects/VERSION.txt b/pkgs/sagemath-objects/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-objects/VERSION.txt +++ b/pkgs/sagemath-objects/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-repl/VERSION.txt b/pkgs/sagemath-repl/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-repl/VERSION.txt +++ b/pkgs/sagemath-repl/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-sirocco/VERSION.txt b/pkgs/sagemath-sirocco/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-sirocco/VERSION.txt +++ b/pkgs/sagemath-sirocco/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pkgs/sagemath-tdlib/VERSION.txt b/pkgs/sagemath-tdlib/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/pkgs/sagemath-tdlib/VERSION.txt +++ b/pkgs/sagemath-tdlib/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/pyproject.toml b/pyproject.toml index 9840e43b7a5..da06db03649 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,9 @@ build-backend = 'mesonpy' requires = [ 'meson-python', 'cypari2 >=2.1.1', - 'cysignals >=1.11.4', + # cysignals 1.11.2 is the newest version that is available on conda: + # https://github.com/conda-forge/cysignals-feedstock/pull/49 + 'cysignals >=1.11.2', # Exclude 3.0.3 because of https://github.com/cython/cython/issues/5748 'cython >=3.0, != 3.0.3', 'gmpy2 ~=2.1.b999', @@ -54,6 +56,8 @@ dependencies = [ 'ipywidgets >=7.5.1', 'fpylll >=0.5.9', 'ptyprocess > 0.5', + # TODO: Remove this once the migration to meson is complete + 'pkgconfig' ] dynamic = ["version"] license = {text = "GNU General Public License (GPL) v2 or later"} @@ -100,6 +104,7 @@ build-requires = [ host-requires = [ "virtual:interface/blas", + "virtual:compiler/fortran", "pkg:generic/boost", "pkg:generic/brial", "pkg:generic/cddlib", diff --git a/src/VERSION.txt b/src/VERSION.txt index bf89b51e25f..61117e46f91 100644 --- a/src/VERSION.txt +++ b/src/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta2 diff --git a/src/bin/sage-version.sh b/src/bin/sage-version.sh index 8f940ae430b..c21005c7881 100644 --- a/src/bin/sage-version.sh +++ b/src/bin/sage-version.sh @@ -4,6 +4,6 @@ # which stops "setup.py develop" from rewriting it as a Python file. : # This file is auto-generated by the sage-update-version script, do not edit! -SAGE_VERSION='10.6.beta0' -SAGE_RELEASE_DATE='2024-12-08' -SAGE_VERSION_BANNER='SageMath version 10.6.beta0, Release Date: 2024-12-08' +SAGE_VERSION='10.6.beta2' +SAGE_RELEASE_DATE='2024-12-22' +SAGE_VERSION_BANNER='SageMath version 10.6.beta2, Release Date: 2024-12-22' diff --git a/src/doc/en/developer/coding_basics.rst b/src/doc/en/developer/coding_basics.rst index 9b56de46ad0..02936d3e423 100644 --- a/src/doc/en/developer/coding_basics.rst +++ b/src/doc/en/developer/coding_basics.rst @@ -82,6 +82,19 @@ In particular, def SomeIdentityValue(x): return SomeValue(1) +.. _section-python-version: + +Python Version +================= + +In order to reduce the technical debt of maintaining the project, Sage follows +the time window-based support policy +`SPEC 0 — Minimum Supported Dependencies `_ +for Python versions. Accordingly, support for Python versions will be dropped +3 years after their initial release. +For the drop schedule of Python versions, see the +`SPEC 0 `_ +document. .. _chapter-directory-structure: diff --git a/src/doc/en/developer/coding_in_cython.rst b/src/doc/en/developer/coding_in_cython.rst index d0c7b0d521f..a912a75c544 100644 --- a/src/doc/en/developer/coding_in_cython.rst +++ b/src/doc/en/developer/coding_in_cython.rst @@ -32,13 +32,13 @@ up-to-date information or check out the to get started immediately. -Writing cython code in Sage +Writing Cython code in Sage =========================== There are several ways to create and build Cython code in Sage. -#. In the Sage Notebook, begin any cell with ``%cython``. When you - evaluate that cell, +#. In the Sage notebook or the Sage command line, begin any cell with + a line containing ``%%cython``. When you evaluate that cell, #. It is saved to a file. @@ -53,22 +53,21 @@ There are several ways to create and build Cython code in Sage. program that was compiled to create the ``.so`` file. #. A ``cpdef`` or ``def`` function, say ``testfunction``, defined in - a ``%cython`` cell in a worksheet can be imported and made available - in a different ``%cython`` cell within the same worksheet by + a ``%%cython`` cell in a worksheet can be imported and made available + in a different ``%%cython`` cell within the same worksheet by importing it as shown below:: - %cython + %%cython from __main__ import testfunction -#. Create an ``.spyx`` file and attach or load it from the command - line. This is similar to creating a ``%cython`` cell in the - notebook but works completely from the command line (and not from - the notebook). + Refer to :meth:`sage.repl.ipython_extension.SageMagics.cython`. + +#. Create an ``.spyx`` file and attach or load it + from the command line. #. Create a ``.pyx`` file and add it to the Sage library. Then run ``sage -b`` to rebuild Sage. - Attaching or loading .spyx files ================================ diff --git a/src/doc/en/developer/packaging.rst b/src/doc/en/developer/packaging.rst index 2b6903ca466..cfa6fec89d3 100644 --- a/src/doc/en/developer/packaging.rst +++ b/src/doc/en/developer/packaging.rst @@ -497,10 +497,9 @@ should not need to add it yourself. The following are also available, but rarely used. -- ``sdh_cmake [...]``: Runs ``cmake`` in the current directory with - the given arguments, as well as additional arguments passed to - cmake (assuming packages are using the GNUInstallDirs module) so - that ``CMAKE_INSTALL_PREFIX`` and ``CMAKE_INSTALL_LIBDIR`` are set +- ``sdh_cmake [...]``: Runs ``cmake`` with the given arguments, as well as + additional arguments (assuming packages are using the GNUInstallDirs module) + so that ``CMAKE_INSTALL_PREFIX`` and ``CMAKE_INSTALL_LIBDIR`` are set correctly. - ``sdh_preload_lib EXECUTABLE SONAME``: (Linux only -- no-op on other diff --git a/src/doc/en/installation/conda.rst b/src/doc/en/installation/conda.rst index e3cbf6b342c..ae560bb5a38 100644 --- a/src/doc/en/installation/conda.rst +++ b/src/doc/en/installation/conda.rst @@ -86,14 +86,14 @@ Here we assume that you are using a git checkout. .. code-block:: shell - $ mamba env create --file environment-dev-3.11-linux.yml --name sage-dev + $ mamba env create --file environment-3.11-linux.yml --name sage-dev $ conda activate sage-dev .. tab:: conda .. code-block:: shell - $ conda env create --file environment-dev-3.11-linux.yml --name sage-dev + $ conda env create --file environment-3.11-linux.yml --name sage-dev $ conda activate sage-dev Alternatively, you can use ``environment-3.11-linux.yml`` or @@ -137,7 +137,7 @@ After editing any Cython files, rebuild the Sage library using:: In order to update the conda environment later, you can run:: - $ mamba env update --file environment-dev-3.11-linux.yml --name sage-dev + $ mamba env update --file environment-3.11-linux.yml --name sage-dev To build the documentation, use:: @@ -156,5 +156,5 @@ To build the documentation, use:: You can update the conda lock files by running ``.github/workflows/conda-lock-update.py`` or by running - ``conda-lock --platform linux-64 --filename environment-dev-3.11-linux.yml --lockfile environment-dev-3.11-linux.lock`` + ``conda-lock --platform linux-64 --filename environment-3.11-linux.yml --lockfile environment-3.11-linux.lock`` manually. diff --git a/src/doc/en/installation/meson.rst b/src/doc/en/installation/meson.rst index b8e44bc12fc..196ecc02597 100644 --- a/src/doc/en/installation/meson.rst +++ b/src/doc/en/installation/meson.rst @@ -13,8 +13,7 @@ Assume we're starting from a clean repo and a fully set up conda environment: .. CODE-BLOCK:: shell-session - $ ./bootstrap-conda - $ mamba env create --file src/environment-dev-3.11.yml --name sage-dev + $ mamba env create --file src/environment-3.11.yml --name sage-dev $ conda activate sage-dev Alternatively, install all build requirements as described in section @@ -56,8 +55,9 @@ or run the tests with ``./sage -t``. By using ``pip install --editable`` in the above steps, the Sage library is installed in editable mode. This means that when you only edit source files, there is no need to rebuild the library; it suffices to restart Sage. - Note that this even works when you edit Cython files, so you no longer need - to manually compile after editing Cython files. + Note that this even works when you edit Cython files (they will be recompiled + automatically), so you no longer need to manually compile after editing Cython + files. .. NOTE:: @@ -65,6 +65,15 @@ or run the tests with ``./sage -t``. This means that any Sage-the-distribution commands such as ``sage -i`` will not work. +.. NOTE:: + + By default, Meson will automatically determine the number of jobs to + run in parallel based on the number of CPU available. This can be adjusted + by passing ``--config-settings=compile-args=-jN`` to ``pip install``. + + ``--verbose`` can be passed to ``pip install``, then the meson commands + internally used by pip will be printed out. + Background information ====================== @@ -79,6 +88,12 @@ To configure the project, we need to run the following command: This will create a build directory ``builddir`` that will hold the build artifacts. The ``--prefix`` option specifies the directory where the Sage will be installed. + +If pip is used as above, ``builddir`` is set to be +``build/cp[Python major version][Python minor version]``, such as ``build/cp311``. +``--prefix=`` can be left unspecified, when conda is used then meson will +install to the conda environment e.g. ``$HOME/miniforge3/envs/sage-dev/``. + To compile the project, run the following command: .. CODE-BLOCK:: shell-session @@ -99,6 +114,8 @@ Usually, this directory is not on your Python path, so you have to use: $ PYTHONPATH=build-install/lib/python3.11/site-packages ./sage +When editable install is used, it is not necessary to reinstall after each compilation. + Alternatively, we can still use pip to install: .. CODE-BLOCK:: shell-session @@ -120,3 +137,17 @@ Alternatively, we can still use pip to install: See `Meson's quick guide `_ and `Meson's install guide `_ for more information. + +Miscellaneous tips +================== + +The environment variable ``MESONPY_EDITABLE_VERBOSE=1`` can be set while running ``./sage``, +so that when Cython files are recompiled a message is printed out. + +If a new ``.pyx`` file is added, it need to be added to ``meson.build`` file in the +containing directory. + +Unlike the ``make``-based build system which relies on header comments ``# distutils: language = c++`` +to determine whether C++ should be used, Meson-based build system requires specifying +``override_options: ['cython_language=cpp']`` in the ``meson.build`` file. +Similarly, dependencies need to be specified by ``dependencies: [...]``. diff --git a/src/doc/en/reference/data_structures/index.rst b/src/doc/en/reference/data_structures/index.rst index 08c03313ad3..1832d01eb75 100644 --- a/src/doc/en/reference/data_structures/index.rst +++ b/src/doc/en/reference/data_structures/index.rst @@ -9,5 +9,6 @@ Data Structures sage/data_structures/bounded_integer_sequences sage/data_structures/stream sage/data_structures/mutable_poset + sage/data_structures/pairing_heap .. include:: ../footer.txt diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index 7af6ae3bf7d..ca81cda3f75 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -44,8 +44,8 @@ REFERENCES: 1995 .. [Ab2022] Willie Aboumrad, - *Quantum compution with anyons: an F-matrix and braid calculator* - (2022). https://arxiv.org/abs/2212.00831 + *Quantum computing with anyons: an F-matrix and braid calculator* + (2022). :arxiv:`2212.00831` .. [Alekseyev2006] \M. Alekseyev: (Forum post on counting irreducible multivariate polynomials), @@ -76,7 +76,7 @@ REFERENCES: "Lilliput-AE: a New Lightweight Tweakable BlockCipher for Authenticated Encryption with AssociatedData" https://csrc.nist.gov/CSRC/media/Projects/Lightweight-Cryptography/documents/round-1/spec-doc/LILLIPUT-AE-spec.pdf -.. [ABCMT2019] \V. Arul, A. J. Best, E. Costa, R. Magner, and N. Triantafillou, *Computing zeta functions of cyclic covers in large characteristic,* The Open Book Series, vol. 2, no. 1, pp. 37–53, Jan. 2019. +.. [ABCMT2019] \V. Arul, A. J. Best, E. Costa, R. Magner, and N. Triantafillou, *Computing zeta functions of cyclic covers in large characteristic*, The Open Book Series, vol. 2, no. 1, pp. 37–53, Jan. 2019. .. [ABZ2007] \R. Aharoni and E. Berger and R. Ziv. *Independent systems of representatives in weighted graphs*. @@ -242,8 +242,8 @@ REFERENCES: .. [AM1990] \R. Abraham and J. E. Marsden, "Foundations of Mechanics", Addison-Wesley, 1980. -.. [AM1974] \J. F. Adams and H. R. Margolis, "Sub-Hopf-algebras of the - Steenrod algebra," Proc. Cambridge Philos. Soc. 76 (1974), +.. [AM1974] \J. F. Adams and H. R. Margolis, *Sub-Hopf-algebras of the + Steenrod algebra*, Proc. Cambridge Philos. Soc. 76 (1974), 45-52. .. [AM2000] \S. Ariki and A. Mathas. @@ -277,6 +277,10 @@ REFERENCES: .. [Ap1997] \T. Apostol, Modular functions and Dirichlet series in number theory, Springer, 1997 (2nd ed), section 3.7--3.9. +.. [AP2024] William Atherton, Dmitrii V. Pasechnik, *Decline and Fall of the + ICALP 2008 Modular Decomposition algorithm*, 2024. + :arxiv:`2404.14049`. + .. [APR2001] George E. Andrews, Peter Paule, Axel Riese, *MacMahon's partition analysis: the Omega package*, European J. Combin. 22 (2001), no. 7, 887--904. @@ -440,16 +444,16 @@ REFERENCES: Proc. Calgary Internat. Conference 1969, New York, 1970, Gordon and Breach. -.. [Bar2006] \G. Bard. 'Accelerating Cryptanalysis with the Method of - Four Russians'. Cryptography E-Print Archive +.. [Bar2006] \G. Bard. *Accelerating Cryptanalysis with the Method of + Four Russians*. Cryptography E-Print Archive (http://eprint.iacr.org/2006/251.pdf), 2006. .. [Bat1991] \V. V. Batyrev, *On the classification of smooth projective toric varieties*, Tohoku Math. J. **43** (1991), 569-585 .. [Bat1994] Victor V. Batyrev, - "Dual polyhedra and mirror symmetry for Calabi-Yau - hypersurfaces in toric varieties", + *Dual polyhedra and mirror symmetry for Calabi-Yau + hypersurfaces in toric varieties*, J. Algebraic Geom. 3 (1994), no. 3, 493-535. :arxiv:`alg-geom/9310003v1` @@ -496,6 +500,9 @@ REFERENCES: .. [BeBo2009] Olivier Bernardi and Nicolas Bonichon, *Intervals in Catalan lattices and realizers of triangulations*, JCTA 116 (2009) +.. [Best2021] Alex J. Best: Tools and Techniques for Rational Points on Curves. + PhD Thesis, Boston University, 2021. + .. [BBGL2008] \A. Blondin Massé, S. Brlek, A. Garon, and S. Labbé, Combinatorial properties of f -palindromes in the Thue-Morse sequence. Pure Math. Appl., @@ -533,14 +540,14 @@ REFERENCES: .. [Bodin2007] \A. Bodin: Number of irreducible polynomials in several variables over finite fields, The American Mathematical Monthly 115(7), pp. 653-660, 2008. - https://arxiv.org/abs/0706.0157 + :arxiv:`0706.0157` .. [BH2012] \A. Brouwer and W. Haemers, Spectra of graphs, Springer, 2012, http://homepages.cwi.nl/~aeb/math/ipm/ipm.pdf -.. [BMFPR2011] \M. Bousquet-Melou, É. Fusy, L.-F. Préville-Ratelle, +.. [BMFPR2011] \M. Bousquet-Mélou, É. Fusy, L.-F. Préville-Ratelle, *The number of intervals in the m-Tamari lattices*. Electronic Journal of Combinatorics 18(2), 2011. :doi:`10.37236/2027` @@ -706,8 +713,8 @@ REFERENCES: Journal of Algebraic Combinatorics (1992), vol.1, n.4, pp329-346, :doi:`10.1023/A%3A1022438616684`. -.. [Bec1992] Bernhard Beckermann. "A reliable method for computing M-Padé - approximants on arbitrary staircases". J. Comput. Appl. Math., +.. [Bec1992] Bernhard Beckermann. *A reliable method for computing M-Padé + approximants on arbitrary staircases*. J. Comput. Appl. Math., 40(1):19-42, 1992. :doi:`10.1016/0377-0427(92)90039-Z`. .. [BeCoMe] Frits Beukers, Henri Cohen, Anton Mellit, @@ -793,15 +800,16 @@ REFERENCES: .. [BF2005] \R.L. Burden and J.D. Faires. *Numerical Analysis*. 8th edition, Thomson Brooks/Cole, 2005. -.. [BFS2004] Magali Bardet, Jean-Charles Faugère, and Bruno Salvy, On +.. [BFS2004] Magali Bardet, Jean-Charles Faugère, and Bruno Salvy, *On the complexity of Groebner basis computation of - semi-regular overdetermined algebraic equations. + semi-regular overdetermined algebraic equations.* Proc. International Conference on Polynomial System Solving (ICPSS), pp. 71-75, 2004. .. [BFSS2006] \A. Bostan, P. Flajolet, B. Salvy and E. Schost, *Fast Computation of special resultants*, Journal of Symbolic Computation 41 (2006), 1-29 + :doi:`10.1016/j.jsc.2005.07.001` .. [BFZ2005] \A. Berenstein, \S. Fomin, and \A. Zelevinsky, *Cluster algebras. III. Upper bounds and double Bruhat cells*, @@ -970,6 +978,10 @@ REFERENCES: Anal. Appl. 15 (1994) 804-823. :doi:`10.1137/S0895479892230031` +.. [BL1995] W. Bosma, H.W. Lenstra: Complete Systems of Two Addition Laws for + Elliptic Curves. Journal of Number Theory, volume 53, issue 2, + pages 229-240. 1995. + .. [BHMPW20a] Tom Braden, June Huh, Jacob P. Matherne, Nicholas Proudfoot, and Botong Wang, *A semi-small decomposition of the Chow ring of a matroid*, :arxiv:`2002.03341` (2020). @@ -1104,18 +1116,18 @@ REFERENCES: lacunas of the Thue-Morse word*, Proc. GASCOM 2008 (June 16-20 2008, Bibbiena, Arezzo-Italia), 53--67. -.. [BMFPR] \M. Bousquet-Melou, E. Fusy, L.-F. Preville Ratelle. +.. [BMFPR] \M. Bousquet-Mélou, E. Fusy, L.-F. Preville Ratelle. *The number of intervals in the m-Tamari lattices*. :arxiv:`1106.1498` -.. [BMS2006] Bugeaud, Mignotte, and Siksek. "Classical and modular +.. [BMS2006] Bugeaud, Mignotte, and Siksek. *Classical and modular approaches to exponential Diophantine - equations: I. Fibonacci and Lucas perfect powers." Annals + equations: I. Fibonacci and Lucas perfect powers.* Annals of Math, 2006. .. [BMSS2006] Alin Bostan, Bruno Salvy, François Morain, Éric Schost. - Fast algorithms for computing isogenies between elliptic - curves. [Research Report] 2006, pp.28. - https://arxiv.org/pdf/cs/0609020.pdf + *Fast algorithms for computing isogenies between elliptic + curves*. [Research Report] 2006, pp.28. + :arxiv:`cs/0609020` .. [BN2010] \D. Bump and M. Nakasuji. Integration on `p`-adic groups and crystal bases. @@ -1584,12 +1596,13 @@ REFERENCES: IV. The quotient groups of the lower central series, Ann. of Math. 68 (1958) 81--95. -.. [CFZ2000] \J. Cassaigne, S. Ferenczi, L.Q. Zamboni, Imbalances in - Arnoux-Rauzy sequences, Ann. Inst. Fourier (Grenoble) +.. [CFZ2000] \J. Cassaigne, S. Ferenczi, L.Q. Zamboni, *Imbalances in + Arnoux-Rauzy sequences*, Ann. Inst. Fourier (Grenoble) 50 (2000) 1265--1276. -.. [CFZ2002] Chapoton, Fomin, Zelevinsky - Polytopal realizations of - generalized associahedra, :arxiv:`math/0202004`. +.. [CFZ2002] \F. Chapoton, S. Fomin, A. Zelevinsky - *Polytopal realizations of + generalized associahedra*, :arxiv:`math/0202004`, + :doi:`10.4153/CMB-2002-054-1` .. [CGHLM2013] \P. Crescenzi, R. Grossi, M. Habib, L. Lanzi, A. Marino. *On computing the diameter of real-world undirected graphs*. @@ -1637,9 +1650,9 @@ REFERENCES: .. [Cha18] Frédéric Chapoton, *Some properties of a new partial order on Dyck paths*, 2018, :arxiv:`1809.10981` -.. [Cha22005] \B. Cha. Vanishing of some cohomology groups and bounds +.. [Cha22005] \B. Cha. *Vanishing of some cohomology groups and bounds for the Shafarevich-Tate groups of elliptic - curves. J. Number Theory, 111:154-178, 2005. + curves*. J. Number Theory, 111:154-178, 2005. .. [Cha2008] Frédéric Chapoton. *Sur le nombre d'intervalles dans les treillis de Tamari*. @@ -1779,13 +1792,13 @@ REFERENCES: :doi:`10.1007/978-3-319-07959-2_5`, https://hal.inria.fr/hal-00943549/document -.. [CMO2011] \C. Chun, D. Mayhew, J. Oxley, A chain theorem for - internally 4-connected binary matroids. J. Combin. Theory +.. [CMO2011] \C. Chun, D. Mayhew, J. Oxley, *A chain theorem for + internally 4-connected binary matroids*. J. Combin. Theory Ser. B 101 (2011), 141-189. -.. [CMO2012] \C. Chun, D. Mayhew, J. Oxley, Towards a splitter +.. [CMO2012] \C. Chun, D. Mayhew, J. Oxley, *Towards a splitter theorem for internally 4-connected binary - matroids. J. Combin. Theory Ser. B 102 (2012), 688-700. + matroids*. J. Combin. Theory Ser. B 102 (2012), 688-700. .. [CMR2005] C\. Cid, S\. Murphy, M\. Robshaw, *Small Scale Variants of the AES*; in Proceedings of Fast Software Encryption @@ -2762,6 +2775,11 @@ REFERENCES: Cambridge University Press, Cambridge, 2009. See also the `Errata list `_. +.. [FSST1986] Michael L. Fredman, Robert Sedgewick, Daniel D. Sleator, + and Robert E. Tarjan. *The pairing heap: A new form of + self-adjusting heap*, Algorithmica, 1:111-129, 1986. + :doi:`10.1007/BF01840439` + .. [FST2012] \A. Felikson, \M. Shapiro, and \P. Tumarkin, *Cluster Algebras of Finite Mutation Type Via Unfoldings*, Int Math Res Notices (2012) 2012 (8): 1768-1804. diff --git a/src/doc/en/reference/repl/index.rst b/src/doc/en/reference/repl/index.rst index d12d8866dda..cf17bba8fb3 100644 --- a/src/doc/en/reference/repl/index.rst +++ b/src/doc/en/reference/repl/index.rst @@ -1,3 +1,5 @@ +.. _section-command-line: + The Sage Command Line ===================== @@ -5,8 +7,8 @@ The Sage Read-Eval-Print-Loop (REPL) is based on IPython. In this document, you'll find how the IPython integration works. You should also be familiar with the documentation for IPython. -For more details about using the Sage command line, see the Sage -tutorial. +For more details about using the Sage command line, see `the Sage +tutorial <../../tutorial/index.html>`_. Running Sage ------------ diff --git a/src/doc/en/thematic_tutorials/coercion_and_categories.rst b/src/doc/en/thematic_tutorials/coercion_and_categories.rst index 5eeddc3a7f6..2339cc57f26 100644 --- a/src/doc/en/thematic_tutorials/coercion_and_categories.rst +++ b/src/doc/en/thematic_tutorials/coercion_and_categories.rst @@ -133,7 +133,6 @@ This base class provides a lot more methods than a general parent:: 'is_commutative', 'is_field', 'krull_dimension', - 'localization', 'ngens', 'one', 'order', diff --git a/src/doc/en/tutorial/index.rst b/src/doc/en/tutorial/index.rst index 9098e68c78e..7b1591cf621 100644 --- a/src/doc/en/tutorial/index.rst +++ b/src/doc/en/tutorial/index.rst @@ -2,8 +2,6 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -.. _tutorial: - ======================== Welcome to Sage Tutorial ======================== diff --git a/src/sage/algebras/finite_dimensional_algebras/meson.build b/src/sage/algebras/finite_dimensional_algebras/meson.build index 075f0b8cebd..85f04b2afcb 100644 --- a/src/sage/algebras/finite_dimensional_algebras/meson.build +++ b/src/sage/algebras/finite_dimensional_algebras/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'finite_dimensional_algebra.py', 'finite_dimensional_algebra_element.pxd', diff --git a/src/sage/algebras/fusion_rings/meson.build b/src/sage/algebras/fusion_rings/meson.build index 281460a066a..221cce6146e 100644 --- a/src/sage/algebras/fusion_rings/meson.build +++ b/src/sage/algebras/fusion_rings/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'f_matrix.py', 'fast_parallel_fmats_methods.pxd', diff --git a/src/sage/algebras/letterplace/meson.build b/src/sage/algebras/letterplace/meson.build index 1ada90927a7..3e429eb420a 100644 --- a/src/sage/algebras/letterplace/meson.build +++ b/src/sage/algebras/letterplace/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'free_algebra_element_letterplace.pxd', 'free_algebra_letterplace.pxd', diff --git a/src/sage/algebras/lie_algebras/meson.build b/src/sage/algebras/lie_algebras/meson.build index f50959cb44b..754d8729fbb 100644 --- a/src/sage/algebras/lie_algebras/meson.build +++ b/src/sage/algebras/lie_algebras/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'abelian.py', 'affine_lie_algebra.py', 'all.py', diff --git a/src/sage/algebras/meson.build b/src/sage/algebras/meson.build index a7e74474c6b..d3483851743 100644 --- a/src/sage/algebras/meson.build +++ b/src/sage/algebras/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'affine_nil_temperley_lieb.py', 'algebra.py', 'all.py', diff --git a/src/sage/algebras/quatalg/meson.build b/src/sage/algebras/quatalg/meson.build index 2ec5cd31f22..25c4adfc46c 100644 --- a/src/sage/algebras/quatalg/meson.build +++ b/src/sage/algebras/quatalg/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'quaternion_algebra.py', 'quaternion_algebra_element.pxd', diff --git a/src/sage/algebras/weyl_algebra.py b/src/sage/algebras/weyl_algebra.py index 8eae4797c7d..dc7cbef3058 100644 --- a/src/sage/algebras/weyl_algebra.py +++ b/src/sage/algebras/weyl_algebra.py @@ -29,7 +29,7 @@ from sage.categories.algebras_with_basis import AlgebrasWithBasis from sage.sets.family import Family import sage.data_structures.blas_dict as blas -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.structure.global_options import GlobalOptions @@ -677,7 +677,7 @@ def __classcall__(cls, R, names=None): sage: W1 is W2 True """ - if isinstance(R, (PolynomialRing_general, MPolynomialRing_base)): + if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base)): if names is None: names = R.variable_names() R = R.base_ring() diff --git a/src/sage/arith/meson.build b/src/sage/arith/meson.build index 3c3656c5738..500b49edf85 100644 --- a/src/sage/arith/meson.build +++ b/src/sage/arith/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_objects.py', 'constants.pxd', diff --git a/src/sage/calculus/integration.pyx b/src/sage/calculus/integration.pyx index 643442ac714..f71695926aa 100644 --- a/src/sage/calculus/integration.pyx +++ b/src/sage/calculus/integration.pyx @@ -59,7 +59,13 @@ cdef double c_f(double t, void *params) noexcept: else: value = wrapper.the_function(t) except Exception as msg: - print(msg) + try: + if str(msg).strip(): + print(msg) + else: + print(f"Unable to evaluate function at {t}") + except Exception: + pass return 0 return value @@ -144,17 +150,19 @@ def numerical_integral(func, a, b=None, For a Python function with parameters:: sage: f(x,a) = 1/(a+x^2) - sage: [numerical_integral(f, 1, 2, max_points=100, params=[n]) for n in range(10)] # random output (architecture and os dependent) - [(0.49999999999998657, 5.5511151231256336e-15), - (0.32175055439664557, 3.5721487367706477e-15), - (0.24030098317249229, 2.6678768435816325e-15), - (0.19253082576711697, 2.1375215571674764e-15), - (0.16087527719832367, 1.7860743683853337e-15), - (0.13827545676349412, 1.5351659583939151e-15), - (0.12129975935702741, 1.3466978571966261e-15), - (0.10806674191683065, 1.1997818507228991e-15), - (0.09745444625548845, 1.0819617008493815e-15), - (0.088750683050217577, 9.8533051773561173e-16)] + sage: [numerical_integral(f, 1, 2, max_points=100, params=[n])[0] # abs tol 1.0e-6 + ....: for n in range(10)] + [0.5000000000000000, + 0.3217505543966422, + 0.24030098317248832, + 0.19253082576711372, + 0.1608752771983211, + 0.138275456763492, + 0.1212997593570257, + 0.10806674191683492, + 0.09745444625553161, + 0.08875068305030848] + sage: y = var('y') sage: numerical_integral(x*y, 0, 1) Traceback (most recent call last): @@ -323,6 +331,9 @@ def numerical_integral(func, a, b=None, if ell.is_numeric() and not ell.is_zero(): raise ValueError('integral does not converge at infinity') func = fast_callable(func, vars=[v], domain=float) + # `func` is now a function of one variable, + # so it no longer needs any parameters + params = [] if not isinstance(func, compiled_integrand): wrapper = PyFunctionWrapper() diff --git a/src/sage/calculus/meson.build b/src/sage/calculus/meson.build index 541d7d86d75..3bedeb2220a 100644 --- a/src/sage/calculus/meson.build +++ b/src/sage/calculus/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'calculus.py', 'desolvers.py', diff --git a/src/sage/calculus/transforms/meson.build b/src/sage/calculus/transforms/meson.build index 05d3fb59637..11ffa9f8ec1 100644 --- a/src/sage/calculus/transforms/meson.build +++ b/src/sage/calculus/transforms/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'dft.py', 'dwt.pxd', diff --git a/src/sage/categories/category_with_axiom.py b/src/sage/categories/category_with_axiom.py index 014ac68d369..5e5b7ec8aff 100644 --- a/src/sage/categories/category_with_axiom.py +++ b/src/sage/categories/category_with_axiom.py @@ -2525,7 +2525,7 @@ def __init__(self, base_category): Category_over_base_ring.__init__(self, base_category.base_ring()) -class CategoryWithAxiom_singleton(Category_singleton, CategoryWithAxiom):#, Category_singleton, FastHashable_class): +class CategoryWithAxiom_singleton(Category_singleton, CategoryWithAxiom): # Category_singleton, FastHashable_class): pass diff --git a/src/sage/categories/drinfeld_modules.py b/src/sage/categories/drinfeld_modules.py index aca5675497a..1e9bd910c70 100644 --- a/src/sage/categories/drinfeld_modules.py +++ b/src/sage/categories/drinfeld_modules.py @@ -29,7 +29,7 @@ from sage.rings.integer import Integer lazy_import('sage.rings.polynomial.ore_polynomial_ring', 'OrePolynomialRing') -lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_general') +lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_generic') lazy_import('sage.rings.ring_extension', 'RingExtension_generic') @@ -251,7 +251,7 @@ def __init__(self, base_field, name='t'): self._function_ring = base_morphism.domain() # Check domain of base morphism is Fq[T] function_ring = self._function_ring - if not isinstance(function_ring, PolynomialRing_general): + if not isinstance(function_ring, PolynomialRing_generic): raise NotImplementedError('function ring must be a polynomial ' 'ring') function_ring_base = function_ring.base_ring() diff --git a/src/sage/categories/examples/meson.build b/src/sage/categories/examples/meson.build index ecb63c913ba..bf5926b1d84 100644 --- a/src/sage/categories/examples/meson.build +++ b/src/sage/categories/examples/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'algebras_with_basis.py', 'all.py', 'commutative_additive_monoids.py', diff --git a/src/sage/categories/groupoid.py b/src/sage/categories/groupoid.py index b197c092be5..4833b4e6f57 100644 --- a/src/sage/categories/groupoid.py +++ b/src/sage/categories/groupoid.py @@ -40,7 +40,7 @@ def __init__(self, G=None): sage: C = Groupoid(S8) sage: TestSuite(C).run() """ - CategoryWithParameters.__init__(self) #, "Groupoid") + CategoryWithParameters.__init__(self) # "Groupoid") if G is None: from sage.groups.perm_gps.permgroup_named import SymmetricGroup G = SymmetricGroup(8) @@ -56,8 +56,8 @@ def _repr_(self): """ return "Groupoid with underlying set %s" % self.__G - #def construction(self): - # return (self.__class__, self.__G) + # def construction(self): + # return (self.__class__, self.__G) def _make_named_class_key(self, name): """ diff --git a/src/sage/categories/integral_domains.py b/src/sage/categories/integral_domains.py index 4dd66a9277b..c66b609a5e3 100644 --- a/src/sage/categories/integral_domains.py +++ b/src/sage/categories/integral_domains.py @@ -143,6 +143,37 @@ def is_integral_domain(self, proof=True): """ return True + def is_field(self, proof=True): + r""" + Return ``True`` if this ring is a field. + + EXAMPLES:: + + sage: ZZ['x'].is_field() + False + """ + if self.is_finite(): + return True + if proof: + raise NotImplementedError(f"unable to determine whether or not {self} is a field.") + return False + + def localization(self, additional_units, names=None, normalize=True, category=None): + """ + Return the localization of ``self`` at the given additional units. + + EXAMPLES:: + + sage: R. = GF(3)[] + sage: R.localization((x*y, x**2 + y**2)) # needs sage.rings.finite_rings + Multivariate Polynomial Ring in x, y over Finite Field of size 3 + localized at (y, x, x^2 + y^2) + sage: ~y in _ # needs sage.rings.finite_rings + True + """ + from sage.rings.localization import Localization + return Localization(self, additional_units, names=names, normalize=normalize, category=category) + def _test_fraction_field(self, **options): r""" Test that the fraction field, if it is implemented, works diff --git a/src/sage/categories/meson.build b/src/sage/categories/meson.build index 132037fe7fd..affc2034df2 100644 --- a/src/sage/categories/meson.build +++ b/src/sage/categories/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'action.pxd', 'additive_groups.py', 'additive_magmas.py', diff --git a/src/sage/categories/rings.py b/src/sage/categories/rings.py index adfc75c00ec..e0769336c6f 100644 --- a/src/sage/categories/rings.py +++ b/src/sage/categories/rings.py @@ -554,6 +554,22 @@ def is_subring(self, other): except (TypeError, AttributeError): return False + def localization(self, *args, **kwds): + """ + Return the localization of ``self``. + + This only works for integral domains. + + EXAMPLES:: + + sage: R = Zmod(6) + sage: R.localization((4)) + Traceback (most recent call last): + ... + TypeError: self must be an integral domain + """ + raise TypeError("self must be an integral domain") + def bracket(self, x, y): """ Return the Lie bracket `[x, y] = x y - y x` of `x` and `y`. diff --git a/src/sage/categories/unital_algebras.py b/src/sage/categories/unital_algebras.py index b5c0dd73e86..33c10cf2c4a 100644 --- a/src/sage/categories/unital_algebras.py +++ b/src/sage/categories/unital_algebras.py @@ -319,7 +319,7 @@ def one_from_one_basis(self): sage: Aone().parent() is A # needs sage.combinat sage.modules True """ - return self.monomial(self.one_basis()) #. + return self.monomial(self.one_basis()) @lazy_attribute def one(self): diff --git a/src/sage/coding/codecan/meson.build b/src/sage/coding/codecan/meson.build index 8749207de4b..1ccaca09b2a 100644 --- a/src/sage/coding/codecan/meson.build +++ b/src/sage/coding/codecan/meson.build @@ -1,4 +1,9 @@ -py.install_sources('all.py', 'codecan.pxd', subdir: 'sage/coding/codecan') +py.install_sources( + '__init__.py', + 'all.py', + 'codecan.pxd', + subdir: 'sage/coding/codecan', +) extension_data = { 'autgroup_can_label' : files('autgroup_can_label.pyx'), diff --git a/src/sage/coding/delsarte_bounds.py b/src/sage/coding/delsarte_bounds.py index a7cc35e058d..f3dedb7a720 100644 --- a/src/sage/coding/delsarte_bounds.py +++ b/src/sage/coding/delsarte_bounds.py @@ -201,9 +201,8 @@ def _delsarte_LP_building(n, d, d_star, q, isinteger, solver, maxc=0): constraint_1: 0 <= x_1 <= 0 constraint_2: 0 <= x_2 <= 0 constraint_3: -7 x_0 - 5 x_1 - 3 x_2 - x_3 + x_4 + 3 x_5 + 5 x_6 + 7 x_7 <= 0 - constraint_4: -7 x_0 - 5 x_1 - 3 x_2 - x_3 + x_4 + 3 x_5 + 5 x_6 + 7 x_7 <= 0 ... - constraint_16: - x_0 + x_1 - x_2 + x_3 - x_4 + x_5 - x_6 + x_7 <= 0 + constraint_9: - x_0 + x_1 - x_2 + x_3 - x_4 + x_5 - x_6 + x_7 <= 0 Variables: x_0 is a continuous variable (min=0, max=+oo) ... @@ -213,21 +212,20 @@ def _delsarte_LP_building(n, d, d_star, q, isinteger, solver, maxc=0): p = MixedIntegerLinearProgram(maximization=True, solver=solver) A = p.new_variable(integer=isinteger, nonnegative=True) - p.set_objective(sum([A[r] for r in range(n + 1)])) + p.set_objective(p.sum([A[r] for r in range(n + 1)])) p.add_constraint(A[0] == 1) for i in range(1, d): p.add_constraint(A[i] == 0) for j in range(1, n + 1): - rhs = sum([krawtchouk(n, q, j, r, check=False) * A[r] + rhs = p.sum([krawtchouk(n, q, j, r, check=False) * A[r] for r in range(n + 1)]) - p.add_constraint(0 <= rhs) if j >= d_star: p.add_constraint(0 <= rhs) else: # rhs is proportional to j-th weight of the dual code p.add_constraint(0 == rhs) if maxc > 0: - p.add_constraint(sum([A[r] for r in range(n + 1)]), max=maxc) + p.add_constraint(p.sum([A[r] for r in range(n + 1)]), max=maxc) return A, p @@ -275,7 +273,7 @@ def _delsarte_cwc_LP_building(n, d, w, solver, isinteger): p = MixedIntegerLinearProgram(maximization=True, solver=solver) A = p.new_variable(integer=isinteger, nonnegative=True) - p.set_objective(sum([A[2*r] for r in range(d//2, w+1)]) + 1) + p.set_objective(p.sum([A[2*r] for r in range(d//2, w+1)]) + 1) def _q(k, i): mu_i = 1 @@ -283,7 +281,7 @@ def _q(k, i): return mu_i*eberlein(n, w, i, k)/v_i for k in range(1, w+1): - p.add_constraint(sum([A[2*i]*_q(k, i) for i in range(d//2, w+1)]), + p.add_constraint(p.sum([A[2*i]*_q(k, i) for i in range(d//2, w+1)]), min=-1) return A, p @@ -622,7 +620,7 @@ def _delsarte_Q_LP_building(q, d, solver, isinteger): p = MixedIntegerLinearProgram(maximization=True, solver=solver) A = p.new_variable(integer=isinteger, nonnegative=True) - p.set_objective(sum([A[i] for i in range(n)])) + p.set_objective(p.sum([A[i] for i in range(n)])) p.add_constraint(A[0] == 1) @@ -634,7 +632,7 @@ def _delsarte_Q_LP_building(q, d, solver, isinteger): p.add_constraint(A[i] == 0) for k in range(1, n): - p.add_constraint(sum([q[k][i] * A[i] for i in range(n)]), min=0) + p.add_constraint(p.sum([q[k][i] * A[i] for i in range(n)]), min=0) return A, p diff --git a/src/sage/coding/grs_code.py b/src/sage/coding/grs_code.py index 2fada75c4a9..a37a5b15a7b 100644 --- a/src/sage/coding/grs_code.py +++ b/src/sage/coding/grs_code.py @@ -1915,6 +1915,12 @@ def decode_to_message(self, word_and_erasure_vector): sage: y = Chan(c) sage: D.connected_encoder().unencode(c) == D.decode_to_message(y) True + sage: n_era = C.minimum_distance() - 1 + sage: Chan = channels.ErrorErasureChannel(C.ambient_space(), + ....: D.decoding_radius(n_era), n_era) + sage: y = Chan(c) + sage: D.connected_encoder().unencode(c) == D.decode_to_message(y) + True TESTS: @@ -1958,14 +1964,14 @@ def decode_to_message(self, word_and_erasure_vector): [word[i] for i in range(len(word)) if not erasure_vector[i]]) C1_length = len(punctured_word) - if C1_length == k: - return self.connected_encoder().unencode_nocheck(word) C1_evaluation_points = [self.code().evaluation_points()[i] for i in range(n) if erasure_vector[i] != 1] C1_column_multipliers = [self.code().column_multipliers()[i] for i in range(n) if erasure_vector[i] != 1] C1 = GeneralizedReedSolomonCode(C1_evaluation_points, k, C1_column_multipliers) + if C1_length == k: + return C1.unencode(punctured_word, nocheck=True) return C1.decode_to_message(punctured_word) def decoding_radius(self, number_erasures): @@ -1997,7 +2003,7 @@ def decoding_radius(self, number_erasures): ValueError: The number of erasures exceed decoding capability """ diff = self.code().minimum_distance() - 1 - number_erasures - if diff <= 0: + if diff < 0: raise ValueError("The number of erasures exceed decoding capability") else: return diff // 2 diff --git a/src/sage/coding/guruswami_sudan/interpolation.py b/src/sage/coding/guruswami_sudan/interpolation.py index b1334307e79..3adc0ef1130 100644 --- a/src/sage/coding/guruswami_sudan/interpolation.py +++ b/src/sage/coding/guruswami_sudan/interpolation.py @@ -24,7 +24,7 @@ from sage.matrix.constructor import matrix from sage.misc.misc_c import prod -####################### Linear algebra system solving ############################### +# ###################### Linear algebra system solving ############################### def _flatten_once(lstlst): @@ -50,9 +50,9 @@ def _flatten_once(lstlst): for lst in lstlst: yield from lst -#************************************************************* +# ************************************************************* # Linear algebraic Interpolation algorithm, helper functions -#************************************************************* +# ************************************************************* def _monomial_list(maxdeg, l, wy): @@ -137,9 +137,9 @@ def eqs_affine(x0, y0): jhat = monomial[1] if ihat >= i and jhat >= j: icoeff = binomial(ihat, i) * x0**(ihat-i) \ - if ihat > i else 1 + if ihat > i else 1 jcoeff = binomial(jhat, j) * y0**(jhat-j) \ - if jhat > j else 1 + if jhat > j else 1 eq[monomial] = jcoeff * icoeff eqs.append([eq.get(monomial, 0) for monomial in monomials]) return eqs @@ -284,12 +284,12 @@ def gs_interpolation_linalg(points, tau, parameters, wy): # Pick a nonzero element from the right kernel sol = Ker.basis()[0] # Construct the Q polynomial - PF = M.base_ring()['x', 'y'] #make that ring a ring in + PF = M.base_ring()['x', 'y'] # make that ring a ring in x, y = PF.gens() - Q = sum([x**monomials[i][0] * y**monomials[i][1] * sol[i] for i in range(0, len(monomials))]) - return Q + return sum([x**m[0] * y**m[1] * sol[i] + for i, m in enumerate(monomials)]) -####################### Lee-O'Sullivan's method ############################### +# ###################### Lee-O'Sullivan's method ############################### def lee_osullivan_module(points, parameters, wy): @@ -397,12 +397,11 @@ def gs_interpolation_lee_osullivan(points, tau, parameters, wy): from .utils import _degree_of_vector s, l = parameters[0], parameters[1] F = points[0][0].parent() - M = lee_osullivan_module(points, (s,l), wy) - shifts = [i * wy for i in range(0,l+1)] + M = lee_osullivan_module(points, (s, l), wy) + shifts = [i * wy for i in range(l + 1)] Mnew = M.reduced_form(shifts=shifts) # Construct Q as the element of the row with the lowest weighted degree Qlist = min(Mnew.rows(), key=lambda r: _degree_of_vector(r, shifts)) PFxy = F['x,y'] xx, yy = PFxy.gens() - Q = sum(yy**i * PFxy(Qlist[i]) for i in range(0,l+1)) - return Q + return sum(yy**i * PFxy(Qlist[i]) for i in range(l + 1)) diff --git a/src/sage/coding/linear_code_no_metric.py b/src/sage/coding/linear_code_no_metric.py index 49c30a415c8..b9ad941ed09 100644 --- a/src/sage/coding/linear_code_no_metric.py +++ b/src/sage/coding/linear_code_no_metric.py @@ -191,7 +191,7 @@ def __init__(self, base_field, length, default_encoder_name, default_decoder_nam super().__init__(length, default_encoder_name, default_decoder_name, metric) cat = Modules(base_field).FiniteDimensional().WithBasis().Finite() facade_for = VectorSpace(base_field, self._length) - self.Element = type(facade_for.an_element()) # for when we made this a non-facade parent + self.Element = facade_for.Element Parent.__init__(self, base=base_field, facade=facade_for, category=cat) def base_field(self): diff --git a/src/sage/coding/meson.build b/src/sage/coding/meson.build index 65b2e0d8eb1..b311c8df5d5 100644 --- a/src/sage/coding/meson.build +++ b/src/sage/coding/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'abstract_code.py', 'ag_code.py', 'all.py', diff --git a/src/sage/coding/reed_muller_code.py b/src/sage/coding/reed_muller_code.py index e690534c5e3..4f7759440ab 100644 --- a/src/sage/coding/reed_muller_code.py +++ b/src/sage/coding/reed_muller_code.py @@ -396,11 +396,22 @@ class directly, as :meth:`ReedMullerCode` creates either a binary or a EXAMPLES: - A binary Reed-Muller code can be constructed by simply giving the order of the code and the number of variables:: + A binary Reed-Muller code can be constructed by simply giving the order of + the code and the number of variables:: sage: C = codes.BinaryReedMullerCode(2, 4) sage: C Binary Reed-Muller Code of order 2 and number of variables 4 + + Very large Reed-Muller codes can be constructed without building + the generator matrix or elements of the code (fixes :issue:`33229`, + see also :issue:`39110`):: + + sage: C = codes.BinaryReedMullerCode(16, 32) + sage: C + Binary Reed-Muller Code of order 16 and number of variables 32 + sage: C.dimension(), C.length() + (2448023843, 4294967296) """ _registered_encoders = {} diff --git a/src/sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py b/src/sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py index c9f06a4761f..76be4d8bf02 100644 --- a/src/sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py +++ b/src/sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py @@ -1985,7 +1985,7 @@ def __init__(self, *args): """ data = args if len(data) < 2 or not all(isinstance(comp, QuiverMutationType_Irreducible) for comp in data): - return _mutation_type_error(data) + _mutation_type_error(data) # _info is initialized self._info = {} diff --git a/src/sage/combinat/crystals/meson.build b/src/sage/combinat/crystals/meson.build index 96ff9f4e19e..5c6b864d04a 100644 --- a/src/sage/combinat/crystals/meson.build +++ b/src/sage/combinat/crystals/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'affine.py', 'affine_factorization.py', 'affinization.py', diff --git a/src/sage/combinat/designs/incidence_structures.py b/src/sage/combinat/designs/incidence_structures.py index e9964af900c..3c6170e1ea3 100644 --- a/src/sage/combinat/designs/incidence_structures.py +++ b/src/sage/combinat/designs/incidence_structures.py @@ -1592,6 +1592,13 @@ def is_t_design(self, t=None, v=None, k=None, l=None, return_parameters=False): sage: I = IncidenceStructure(2, [[0],[0,1]]) sage: I.is_t_design(return_parameters=True) (False, (0, 0, 0, 0)) + + Verify that :issue:`38454` is fixed:: + + sage: I = IncidenceStructure(points=[0,1,2,3,4,5], + ....: blocks=[[0,1], [1,2], [0,2]]) + sage: I.is_t_design(return_parameters=True) + (True, (0, 6, 2, 3)) """ from sage.arith.misc import binomial @@ -1653,7 +1660,7 @@ def is_t_design(self, t=None, v=None, k=None, l=None, return_parameters=False): for i in combinations(block, tt): s[i] = s.get(i, 0) + 1 - if len(set(s.values())) != 1: + if (len(s) != binomial(v, tt)) or (len(set(s.values())) != 1): tt -= 1 break diff --git a/src/sage/combinat/designs/meson.build b/src/sage/combinat/designs/meson.build index fd3a8896bb3..019b62be54e 100644 --- a/src/sage/combinat/designs/meson.build +++ b/src/sage/combinat/designs/meson.build @@ -1,5 +1,6 @@ py.install_sources( 'MOLS_handbook_data.py', + '__init__.py', 'all.py', 'bibd.py', 'block_design.py', diff --git a/src/sage/combinat/diagram_algebras.py b/src/sage/combinat/diagram_algebras.py index 6410a4a93ea..b929327a28e 100644 --- a/src/sage/combinat/diagram_algebras.py +++ b/src/sage/combinat/diagram_algebras.py @@ -129,14 +129,14 @@ def brauer_diagrams(k): {{-3, 3}, {-2, 2}, {-1, 1}}] """ if k in ZZ: - s = list(range(1,k+1)) + list(range(-k,0)) + s = list(range(1, k+1)) + list(range(-k,0)) for p in perfect_matchings_iterator(k): yield [(s[a],s[b]) for a,b in p] - elif k + ZZ(1) / ZZ(2) in ZZ: # Else k in 1/2 ZZ - k = ZZ(k + ZZ(1) / ZZ(2)) + elif k + ZZ.one() / 2 in ZZ: # Else k in 1/2 ZZ + k = ZZ(k + ZZ.one() / 2) s = list(range(1, k)) + list(range(-k+1,0)) for p in perfect_matchings_iterator(k-1): - yield [(s[a],s[b]) for a,b in p] + [[k, -k]] + yield [(s[a], s[b]) for a, b in p] + [[k, -k]] def temperley_lieb_diagrams(k): @@ -1203,7 +1203,7 @@ def __init__(self, order, category=None): self.order = ZZ(order) base_set = frozenset(list(range(1,order+1)) + list(range(-order,0))) else: - #order is a half-integer. + # order is a half-integer. self.order = QQ(order) base_set = frozenset(list(range(1,ZZ(ZZ(1)/ZZ(2) + order)+1)) + list(range(ZZ(-ZZ(1)/ZZ(2) - order),0))) @@ -4865,7 +4865,7 @@ def key_func(P): count_left += 1 for j in range(i): prop_intervals[j].append([bot]) - for j in range(i+1,total_prop): + for j in range(i+1, total_prop): prop_intervals[j].append([top]) if not left_moving: top, bot = bot, top @@ -4964,10 +4964,10 @@ def sgn(x): for i in list(diagram): l1.append(list(i)) l2.extend(list(i)) - output = "\\begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}] \n\\tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt] \n" #setup beginning of picture - for i in l2: #add nodes + output = "\\begin{tikzpicture}[scale = 0.5,thick, baseline={(0,-1ex/2)}] \n\\tikzstyle{vertex} = [shape = circle, minimum size = 7pt, inner sep = 1pt] \n" # setup beginning of picture + for i in l2: # add nodes output = output + "\\node[vertex] (G-{}) at ({}, {}) [shape = circle, draw{}] {{}}; \n".format(i, (abs(i)-1)*1.5, sgn(i), filled_str) - for i in l1: #add edges + for i in l1: # add edges if len(i) > 1: l4 = list(i) posList = [] @@ -4980,21 +4980,21 @@ def sgn(x): posList.sort() negList.sort() l4 = posList + negList - l5 = l4[:] #deep copy + l5 = l4[:] # deep copy for j in range(len(l5)): - l5[j-1] = l4[j] #create a permuted list + l5[j-1] = l4[j] # create a permuted list if len(l4) == 2: l4.pop() - l5.pop() #pops to prevent duplicating edges + l5.pop() # pops to prevent duplicating edges for j in zip(l4, l5): xdiff = abs(j[1])-abs(j[0]) y1 = sgn(j[0]) y2 = sgn(j[1]) - if y2-y1 == 0 and abs(xdiff) < 5: #if nodes are close to each other on same row - diffCo = (0.5+0.1*(abs(xdiff)-1)) #gets bigger as nodes are farther apart; max value of 1; min value of 0.5. + if y2-y1 == 0 and abs(xdiff) < 5: # if nodes are close to each other on same row + diffCo = (0.5+0.1*(abs(xdiff)-1)) # gets bigger as nodes are farther apart; max value of 1; min value of 0.5. outVec = (sgn(xdiff)*diffCo, -1*diffCo*y1) inVec = (-1*diffCo*sgn(xdiff), -1*diffCo*y2) - elif y2-y1 != 0 and abs(xdiff) == 1: #if nodes are close enough curviness looks bad. + elif y2-y1 != 0 and abs(xdiff) == 1: # if nodes are close enough curviness looks bad. outVec = (sgn(xdiff)*0.75, -1*y1) inVec = (-1*sgn(xdiff)*0.75, -1*y2) else: @@ -5002,7 +5002,7 @@ def sgn(x): inVec = (-1*sgn(xdiff), -1*y2) output = output + "\\draw[{}] (G-{}) .. controls +{} and +{} .. {}(G-{}); \n".format( edge_options(j), j[0], outVec, inVec, edge_additions(j), j[1]) - output = output + "\\end{tikzpicture}" #end picture + output = output + "\\end{tikzpicture}" # end picture return output diff --git a/src/sage/combinat/finite_state_machine.py b/src/sage/combinat/finite_state_machine.py index 2750ea15e9c..ee5feb4815d 100644 --- a/src/sage/combinat/finite_state_machine.py +++ b/src/sage/combinat/finite_state_machine.py @@ -14717,7 +14717,7 @@ def __init__(self, *args, **kwargs): self.TapeCache = _FSMTapeCacheDetectEpsilon_ self.visited_states = {} kwargs['check_epsilon_transitions'] = False - return super().__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def _push_branch_(self, state, tape_cache, outputs): """ @@ -14842,7 +14842,7 @@ def __init__(self, *args, **kwargs): self.TapeCache = _FSMTapeCacheDetectAll_ self.visited_states = {} kwargs['check_epsilon_transitions'] = False - return super().__init__(*args, **kwargs) + super().__init__(*args, **kwargs) # **************************************************************************** diff --git a/src/sage/combinat/growth.py b/src/sage/combinat/growth.py index 958b664e7cd..542d4dfb280 100644 --- a/src/sage/combinat/growth.py +++ b/src/sage/combinat/growth.py @@ -2592,11 +2592,11 @@ def forward_rule(self, y, e, t, f, x, content): z, h = x, e elif x == t != y: z, h = y, e - else: # x != t and y != t + else: # x != t and y != t qx = SkewPartition([x.to_partition(), t.to_partition()]) qy = SkewPartition([y.to_partition(), t.to_partition()]) if not all(c in qx.cells() for c in qy.cells()): - res = [(j-i) % self.k for i,j in qx.cells()] + res = [(j-i) % self.k for i, j in qx.cells()] assert len(set(res)) == 1 r = res[0] z = y.affine_symmetric_group_simple_action(r) diff --git a/src/sage/combinat/integer_lists/invlex.pyx b/src/sage/combinat/integer_lists/invlex.pyx index 6bef85031ce..bfb4c8dc3d7 100644 --- a/src/sage/combinat/integer_lists/invlex.pyx +++ b/src/sage/combinat/integer_lists/invlex.pyx @@ -860,14 +860,18 @@ If you know what you are doing, you can set check=False to skip this warning.""" OUTPUT: - ``None`` if this method finds a proof that there + ``True`` if this method finds a proof that there exists an upper bound on the length. Otherwise a :exc:`ValueError` is raised. + Note that :func:`cached_method` does not work with methods + returning ``None``, so ``True`` is returned instead. + EXAMPLES:: sage: L = IntegerListsLex(4, max_length=4) sage: L._check_finiteness() + True The following example is infinite:: @@ -1002,20 +1006,20 @@ If you know what you are doing, you can set check=False to skip this warning.""" """ # Trivial cases if self.max_length < Infinity: - return + return True if self.max_sum < self.min_sum: - return + return True if self.min_slope > self.max_slope: - return + return True if self.max_slope < 0: - return + return True if self.ceiling.limit() < self.floor.limit(): - return + return True if self.ceiling.limit() == 0: # This assumes no trailing zeroes - return + return True if self.min_slope > 0 and self.ceiling.limit() < Infinity: - return + return True # Compute a lower bound on the sum of floor(i) for i=1 to infinity if self.floor.limit() > 0 or self.min_slope > 0: @@ -1028,10 +1032,10 @@ If you know what you are doing, you can set check=False to skip this warning.""" floor_sum_lower_bound = Infinity if self.max_sum < floor_sum_lower_bound: - return + return True if self.max_sum == floor_sum_lower_bound and self.max_sum < Infinity: # This assumes no trailing zeroes - return + return True # Variant on ceiling.limit() ==0 where we actually discover that the ceiling limit is 0 if ( self.max_slope == 0 and @@ -1039,13 +1043,13 @@ If you know what you are doing, you can set check=False to skip this warning.""" (self.ceiling.limit_start() < Infinity and any(self.ceiling(i) == 0 for i in range(self.ceiling.limit_start()+1))) ) ): - return + return True limit_start = max(self.ceiling.limit_start(), self.floor.limit_start()) if limit_start < Infinity: for i in range(limit_start+1): if self.ceiling(i) < self.floor(i): - return + return True raise ValueError("could not prove that the specified constraints yield a finite set") diff --git a/src/sage/combinat/k_tableau.py b/src/sage/combinat/k_tableau.py index de6b783f15b..cb6d6fbc087 100644 --- a/src/sage/combinat/k_tableau.py +++ b/src/sage/combinat/k_tableau.py @@ -1625,12 +1625,12 @@ def from_core_tableau(cls, t, k): [[None, 2], [3]] """ t = SkewTableau(list(t)) - shapes = [ Core(p, k+1).to_bounded_partition() for p in intermediate_shapes(t) ]#.to_chain() ] + shapes = [ Core(p, k+1).to_bounded_partition() for p in intermediate_shapes(t) ] # .to_chain() ] if t.inner_shape() == Partition([]): l = [] else: l = [[None]*i for i in shapes[0]] - for i in range(1,len(shapes)): + for i in range(1, len(shapes)): p = shapes[i] if len(l) < len(p): l += [[]] @@ -2068,8 +2068,10 @@ def from_core_tableau(cls, t, k): [s0*s3, s2*s1] """ t = SkewTableau(list(t)) - shapes = [ Core(p, k+1).to_grassmannian() for p in intermediate_shapes(t) ] #t.to_chain() ] - perms = [ shapes[i]*(shapes[i-1].inverse()) for i in range(len(shapes)-1,0,-1)] + shapes = [Core(p, k + 1).to_grassmannian() + for p in intermediate_shapes(t)] # t.to_chain() ] + perms = [shapes[i] * (shapes[i - 1].inverse()) + for i in range(len(shapes) - 1, 0, -1)] return cls(perms, k, inner_shape=t.inner_shape()) def k_charge(self, algorithm='I'): @@ -4222,16 +4224,16 @@ def _left_action_list( cls, Tlist, tij, v, k ): """ innershape = Core([len(r) for r in Tlist], k + 1) outershape = innershape.affine_symmetric_group_action(tij, transposition=True) - if outershape.length() == innershape.length()+1: + if outershape.length() == innershape.length() + 1: for c in SkewPartition([outershape.to_partition(),innershape.to_partition()]).cells(): while c[0] >= len(Tlist): Tlist.append([]) - Tlist[c[0]].append( v ) + Tlist[c[0]].append(v) if len(Tlist[c[0]])-c[0] == tij[1]: - Tlist[c[0]][-1] = -Tlist[c[0]][-1] #mark the cell that is on the j-1 diagonal + Tlist[c[0]][-1] = -Tlist[c[0]][-1] # mark the cell that is on the j-1 diagonal return Tlist - else: - raise ValueError("%s is not a single step up in the strong lattice" % tij) + + raise ValueError("%s is not a single step up in the strong lattice" % tij) @classmethod def follows_tableau_unsigned_standard( cls, Tlist, k ): diff --git a/src/sage/combinat/matrices/meson.build b/src/sage/combinat/matrices/meson.build index 86021f8d376..d316252bca0 100644 --- a/src/sage/combinat/matrices/meson.build +++ b/src/sage/combinat/matrices/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'dlxcpp.py', 'hadamard_matrix.py', diff --git a/src/sage/combinat/meson.build b/src/sage/combinat/meson.build index 8c1aba5bd50..441caadca17 100644 --- a/src/sage/combinat/meson.build +++ b/src/sage/combinat/meson.build @@ -1,5 +1,6 @@ py.install_sources( 'SJT.py', + '__init__.py', 'abstract_tree.py', 'affine_permutation.py', 'algebraic_combinatorics.py', diff --git a/src/sage/combinat/multiset_partition_into_sets_ordered.py b/src/sage/combinat/multiset_partition_into_sets_ordered.py old mode 100755 new mode 100644 diff --git a/src/sage/combinat/partition_kleshchev.py b/src/sage/combinat/partition_kleshchev.py index cfa78933e37..444a46f2cf1 100644 --- a/src/sage/combinat/partition_kleshchev.py +++ b/src/sage/combinat/partition_kleshchev.py @@ -162,9 +162,9 @@ def conormal_cells(self, i=None): carry[res] += 1 else: res = KP._multicharge[0] + self[row] - row - 1 - if row == len(self)-1 or self[row] > self[row+1]: # removable cell + if row == len(self)-1 or self[row] > self[row+1]: # removable cell carry[res] -= 1 - if row == 0 or self[row-1] > self[row]: #addable cell + if row == 0 or self[row-1] > self[row]: # addable cell if carry[res+1] >= 0: conormals[res+1].append((row, self[row])) else: @@ -661,25 +661,25 @@ def normal_cells(self, i=None): part_lens = [len(part) for part in self] # so we don't repeatedly call these KP = self.parent() if KP._convention[0] == 'L': - rows = [(k,r) for k,ell in enumerate(part_lens) for r in range(ell+1)] + rows = [(k, r) for k, ell in enumerate(part_lens) for r in range(ell+1)] else: - rows = [(k,r) for k,ell in reversed(list(enumerate(part_lens))) for r in range(ell+1)] + rows = [(k, r) for k, ell in reversed(list(enumerate(part_lens))) for r in range(ell+1)] if KP._convention[1] == 'S': rows.reverse() for row in rows: - k,r = row - if r == part_lens[k]: # addable cell at bottom of a component + k, r = row + if r == part_lens[k]: # addable cell at bottom of a component carry[KP._multicharge[k]-r] += 1 else: part = self[k] res = KP._multicharge[k] + (part[r] - r - 1) - if r == part_lens[k]-1 or part[r] > part[r+1]: # removable cell + if r == part_lens[k]-1 or part[r] > part[r+1]: # removable cell if carry[res] == 0: normals[res].insert(0, (k, r, part[r]-1)) else: carry[res] -= 1 - if r == 0 or part[r-1] > part[r]: #addable cell + if r == 0 or part[r-1] > part[r]: # addable cell carry[res+1] += 1 # finally return the result diff --git a/src/sage/combinat/posets/meson.build b/src/sage/combinat/posets/meson.build index 07837832519..9832967b4ff 100644 --- a/src/sage/combinat/posets/meson.build +++ b/src/sage/combinat/posets/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'cartesian_product.py', 'd_complete.py', diff --git a/src/sage/combinat/rigged_configurations/meson.build b/src/sage/combinat/rigged_configurations/meson.build index 6b12159dfda..40d0f4e42c5 100644 --- a/src/sage/combinat/rigged_configurations/meson.build +++ b/src/sage/combinat/rigged_configurations/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'bij_abstract_class.py', 'bij_infinity.py', diff --git a/src/sage/combinat/root_system/cartan_type.py b/src/sage/combinat/root_system/cartan_type.py index ce5762719e2..19c500a412f 100644 --- a/src/sage/combinat/root_system/cartan_type.py +++ b/src/sage/combinat/root_system/cartan_type.py @@ -841,7 +841,9 @@ def _samples(self): [CartanType(t) for t in [["I", 5], ["H", 3], ["H", 4]]] + \ [t.affine() for t in finite_crystallographic if t.is_irreducible()] + \ [CartanType(t) for t in [["BC", 1, 2], ["BC", 5, 2]]] + \ - [CartanType(t).dual() for t in [["B", 5, 1], ["C", 4, 1], ["F", 4, 1], ["G", 2, 1],["BC", 1, 2], ["BC", 5, 2]]] #+ \ + [CartanType(t).dual() for t in [["B", 5, 1], ["C", 4, 1], + ["F", 4, 1], ["G", 2, 1], + ["BC", 1, 2], ["BC", 5, 2]]] # + \ # [ g ] _colors = {1: 'blue', -1: 'blue', diff --git a/src/sage/combinat/root_system/meson.build b/src/sage/combinat/root_system/meson.build index 35e7bfb1950..629c67bcdd6 100644 --- a/src/sage/combinat/root_system/meson.build +++ b/src/sage/combinat/root_system/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'ambient_space.py', 'associahedron.py', diff --git a/src/sage/combinat/sf/sfa.py b/src/sage/combinat/sf/sfa.py index d09c1321830..1354f2b3776 100644 --- a/src/sage/combinat/sf/sfa.py +++ b/src/sage/combinat/sf/sfa.py @@ -2287,28 +2287,28 @@ def _invert_morphism(self, n, base_ring, sage: c2 == d2 True """ - #Decide whether we know how to go from self to other or - #from other to self + # Decide whether we know how to go from self to other or + # from other to self if to_other_function is not None: - known_cache = self_to_other_cache #the known direction - unknown_cache = other_to_self_cache #the unknown direction + known_cache = self_to_other_cache # the known direction + unknown_cache = other_to_self_cache # the unknown direction known_function = to_other_function else: - unknown_cache = self_to_other_cache #the known direction - known_cache = other_to_self_cache #the unknown direction + unknown_cache = self_to_other_cache # the known direction + known_cache = other_to_self_cache # the unknown direction known_function = to_self_function - #Do nothing if we've already computed the inverse - #for degree n. + # Do nothing if we've already computed the inverse + # for degree n. if n in known_cache and n in unknown_cache: return - #Univariate polynomial arithmetic is faster - #over ZZ. Since that is all we need to compute - #the transition matrices between S and P, we - #should use that. - #Zt = ZZ['t'] - #t = Zt.gen() + # Univariate polynomial arithmetic is faster + # over ZZ. Since that is all we need to compute + # the transition matrices between S and P, we + # should use that. + # Zt = ZZ['t'] + # t = Zt.gen() one = base_ring.one() zero = base_ring.zero() diff --git a/src/sage/combinat/six_vertex_model.py b/src/sage/combinat/six_vertex_model.py index 879418f18d9..ca70c9661c6 100644 --- a/src/sage/combinat/six_vertex_model.py +++ b/src/sage/combinat/six_vertex_model.py @@ -777,7 +777,7 @@ def to_alternating_sign_matrix(self): [ 0 1 -1 1] [ 0 0 1 0] """ - from sage.combinat.alternating_sign_matrix import AlternatingSignMatrix #AlternatingSignMatrices - #ASM = AlternatingSignMatrices(self.parent()._nrows) - #return ASM(self.to_signed_matrix()) + from sage.combinat.alternating_sign_matrix import AlternatingSignMatrix # AlternatingSignMatrices + # ASM = AlternatingSignMatrices(self.parent()._nrows) + # return ASM(self.to_signed_matrix()) return AlternatingSignMatrix(self.to_signed_matrix()) diff --git a/src/sage/combinat/words/meson.build b/src/sage/combinat/words/meson.build index bb12f65d28f..2333d8dc0cd 100644 --- a/src/sage/combinat/words/meson.build +++ b/src/sage/combinat/words/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'abstract_word.py', 'all.py', 'alphabet.py', diff --git a/src/sage/crypto/lattice.py b/src/sage/crypto/lattice.py index 430ab98f3ae..32b4f1c8be2 100644 --- a/src/sage/crypto/lattice.py +++ b/src/sage/crypto/lattice.py @@ -22,7 +22,7 @@ # http://www.gnu.org/licenses/ #***************************************************************************** -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic def gen_lattice(type='modular', n=4, m=8, q=11, seed=None, @@ -253,7 +253,7 @@ def gen_lattice(type='modular', n=4, m=8, q=11, seed=None, P = quotient.parent() # P should be a univariate polynomial ring over ZZ_q - if not isinstance(P, PolynomialRing_general): + if not isinstance(P, PolynomialRing_generic): raise TypeError("quotient should be a univariate polynomial") assert P.base_ring() is ZZ_q diff --git a/src/sage/data_structures/meson.build b/src/sage/data_structures/meson.build index 8a94548917b..8c100328378 100644 --- a/src/sage/data_structures/meson.build +++ b/src/sage/data_structures/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'binary_matrix.pxd', 'binary_search.pxd', @@ -9,6 +10,8 @@ py.install_sources( 'bounded_integer_sequences.pxd', 'list_of_pairs.pxd', 'mutable_poset.py', + 'pairing_heap.h', + 'pairing_heap.pxd', 'sparse_bitset.pxd', 'stream.py', subdir: 'sage/data_structures', @@ -39,3 +42,18 @@ foreach name, pyx : extension_data ) endforeach +extension_data_cpp = { + 'pairing_heap' : files('pairing_heap.pyx'), +} + +foreach name, pyx : extension_data_cpp + py.extension_module( + name, + sources: pyx, + subdir: 'sage/data_structures/', + install: true, + override_options: ['cython_language=cpp'], + include_directories: [inc_cpython, inc_data_structures], + dependencies: [py_dep, cysignals, gmp], + ) +endforeach diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h new file mode 100644 index 00000000000..3c6cbbf4216 --- /dev/null +++ b/src/sage/data_structures/pairing_heap.h @@ -0,0 +1,344 @@ +/* + * Pairing heap + * + * Implements a pairing heap data structure as described in [1]. See also [2] + * for more details. + * + * This implementation is templated by the type TI of items and the type TV of + * the value associated with an item. The type TI must be either a standard type + * (int, size_t, etc.) or a type equipped with a has function as supported by + * std::unordered_map. The top of the heap is the item with smallest value, + * i.e., this is a min heap data structure. The number of items in the heap is + * not fixed. It supports the following operations: + * + * - empty(): return true if the heap is empty, and false otherwise. + * + * - push(item, value): push an item to the heap with specified value. + * + * - top(): access the pair (item, value) at the top of the heap, i.e., with + * smallest value in time O(1). + * This operation assumes that the heap is not empty. + * + * - top_item(): access the item at the top of the heap in time O(1). + * This operation assumes that the heap is not empty. + * + * - top_value(): access the value of the item at the top of the heap in O(1). + * This operation assumes that the heap is not empty. + * + * - pop(): remove top item from the heap in amortize time O(log(n)). + * + * - decrease(item, new_value): change the value associated with the item to the + * specified value ``new_value`` in time o(log(n)). The new value must be + * smaller than the previous one. Otherwise the structure of the heap is no + * longer guaranteed. + * If the item is not already in the heap, this method calls method ``push``. + * + * - contains(item): check whether specified item is in the heap in time O(1). + * + * - value(item): return the value associated with the item in the heap. + * This operation assumes that the item is already in the heap. + * + * References: + * + * [1] M. L. Fredman, R. Sedgewick, D. D. Sleator, and R. E. Tarjan. + * "The pairing heap: a new form of self-adjusting heap". + * Algorithmica. 1 (1): 111-129, 1986. doi:10.1007/BF01840439. + * + * [2] https://en.wikipedia.org/wiki/Pairing_heap + * + * Author: + * - David Coudert + * + */ + +#ifndef PAIRING_HEAP_H +#define PAIRING_HEAP_H + +#include +#include + +namespace pairing_heap { + + template< + typename TV, // type of values + typename T // type of the child class + > + struct PairingHeapNodeBase { + public: + + bool operator<=(PairingHeapNodeBase const& other) const { + return static_cast(this)->le_implem(static_cast(other)); + } + + // Pair list of heaps and return pointer to the top of resulting heap + static T *_pair(T *p) { + if (p == nullptr) { + return nullptr; + } + + /* + * Move toward the end of the list, counting elements along the way. + * This is done in order to: + * - know whether the list has odd or even number of nodes + * - speed up going-back through the list + */ + size_t children = 1; + T *it = p; + while (it->next != nullptr) { + it = it->next; + children++; + } + + T *result; + + if (children % 2 == 1) { + T *a = it; + it = it->prev; + a->prev = a->next = nullptr; + result = a; + } else { + T *a = it; + T *b = it->prev; + it = it->prev->prev; + a->prev = a->next = b->prev = b->next = nullptr; + result = _merge(a, b); + } + + for (size_t i = 0; i < (children - 1) / 2; i++) { + T *a = it; + T *b = it->prev; + it = it->prev->prev; + a->prev = a->next = b->prev = b->next = nullptr; + result = _merge(_merge(a, b), result); + } + + return result; + } // end _pair + + + // Merge 2 heaps and return pointer to the top of resulting heap + static T *_merge(T *a, T *b) { + if (*a <= *b) { // Use comparison method of PairingHeapNodeBase + _link(a, b); + return a; + } else { + _link(b, a); + return b; + } + } // end _merge + + + // Make b a child of a + static void _link(T *a, T *b) { + if (a->child != nullptr) { + b->next = a->child; + a->child->prev = b; + } + b->prev = a; + a->child = b; + } // end _link + + + // Remove p from its parent children list + static void _unlink(T *p) { + if (p->prev->child == p) { + p->prev->child = p->next; + } else { + p->prev->next = p->next; + } + if (p->next != nullptr) { + p->next->prev = p->prev; + } + p->prev = nullptr; + p->next = nullptr; + } // end _unlink + + + TV value; // value associated to the node + T * prev; // Previous sibling of the node or parent + T * next; // Next sibling of the node + T * child; // First child of the node + + protected: + // Only derived class can build a PairingHeapNodeBase + explicit PairingHeapNodeBase(const TV &some_value) + : value{some_value}, prev{nullptr}, next{nullptr}, child{nullptr} { + } + }; // end struct PairingHeapNodeBase + + + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + // Assumes TV is a comparable type + > + class PairingHeapNode + : public PairingHeapNodeBase> { + + public: + PairingHeapNode(TI const& some_item, TV const& some_value) + : Base_(some_value), item(some_item) { + } + + bool le_implem(PairingHeapNode const& other) const { + return this->value <= other.value; + } + + TI item; // item contained in the node + + private: + using Base_ = PairingHeapNodeBase>; + }; + + + class PairingHeapNodePy + : public PairingHeapNodeBase { + public: + PairingHeapNodePy(PyObject *some_value) + : Base_(some_value) { + } + + bool le_implem(PairingHeapNodePy const& other) const { + return PyObject_RichCompareBool(this->value, other.value, Py_LE); + } + + private: + using Base_ = PairingHeapNodeBase; + }; + + + + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + // Assume TV is a comparable type + > + class PairingHeap + { + public: + using HeapNodeType = PairingHeapNode; + + // Constructor + explicit PairingHeap() + : root(nullptr) { + } + + // Copy constructor + PairingHeap(PairingHeap const *other) + : root(nullptr) { + for (auto const& it: other->nodes) { + push(it.first, it.second->value); + } + } + + // Destructor + virtual ~PairingHeap() { + for (auto const& it: nodes) { + delete it.second; + } + } + + // Return true if the heap is empty, else false + bool empty() const { + return root == nullptr; + } + + // Return true if the heap is not empty, else false + explicit operator bool() const { + return root != nullptr; + } + + // Insert an item into the heap with specified value (priority) + void push(const TI &some_item, const TV &some_value) { + if (contains(some_item)) { + throw std::invalid_argument("item already in the heap"); + } + PairingHeapNode *p = new PairingHeapNode(some_item, some_value); + nodes[some_item] = p; + root = empty() ? p : HeapNodeType::_merge(root, p); + } + + // Return the top pair (item, value) of the heap + std::pair top() const { + if (empty()) { + throw std::domain_error("trying to access the top of an empty heap"); + } + return std::make_pair(root->item, root->value); + } + + // Return the top item of the heap + TI top_item() const { + if (empty()) { + throw std::domain_error("trying to access the top of an empty heap"); + } + return root->item; + } + + // Return the top value of the heap + TV top_value() const { + if (empty()) { + throw std::domain_error("trying to access the top of an empty heap"); + } + return root->value; + } + + // Remove the top element from the heap. Do nothing if empty + void pop() { + if (not empty()) { + PairingHeapNode *p = root->child; + nodes.erase(root->item); + delete root; + root = HeapNodeType::_pair(p); + } + } + + // Decrease the value of specified item + // If the item is not in the heap, push it + void decrease(const TI &some_item, const TV &new_value) { + if (contains(some_item)) { + PairingHeapNode *p = nodes[some_item]; + if (p->value <= new_value) { + throw std::invalid_argument("the new value must be less than the current value"); + } + p->value = new_value; + if (p->prev != nullptr) { + HeapNodeType::_unlink(p); + root = HeapNodeType::_merge(root, p); + } + } else { + push(some_item, new_value); + } + } + + // Check if specified item is in the heap + bool contains(TI const& some_item) const { + return nodes.find(some_item) != nodes.end(); + } + + // Return the value associated with the item + TV value(const TI &some_item) const { + auto it = nodes.find(some_item); + if (it == nodes.end()) { + throw std::invalid_argument("the specified item is not in the heap"); + } + return it->second->value; + } + + // Return the number of items in the heap + size_t size() const { + return nodes.size(); + } + + private: + + // Pointer to the top of the heap + PairingHeapNode *root; + + // Map used to access stored items + std::unordered_map *> nodes; + + }; // end class PairingHeap + +} // end namespace pairing_heap + +#endif diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd new file mode 100644 index 00000000000..d749cc7ec31 --- /dev/null +++ b/src/sage/data_structures/pairing_heap.pxd @@ -0,0 +1,86 @@ +# ****************************************************************************** +# Copyright (C) 2024 David Coudert +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# https://www.gnu.org/licenses/ +# ****************************************************************************** + +from cpython cimport PyObject +from libcpp.pair cimport pair +from sage.data_structures.bitset_base cimport bitset_t + + +# ============================================================================== +# Interface to pairing heap data structure from ./pairing_heap.h +# ============================================================================== + +cdef extern from "./pairing_heap.h" namespace "pairing_heap": + cdef cppclass PairingHeap[TypeOfItem, TypeOfValue]: + PairingHeap() except + + PairingHeap(PairingHeap[TypeOfItem, TypeOfValue]) except + + bint empty() + void push(TypeOfItem, TypeOfValue) except + + pair[TypeOfItem, TypeOfValue] top() except + + TypeOfItem top_item() except + + TypeOfValue top_value() except + + void pop() except + + void decrease(TypeOfItem, TypeOfValue) except + + bint contains(TypeOfItem) + TypeOfValue value(TypeOfItem) except + + + cdef cppclass PairingHeapNodePy: + PyObject * value # value associated with the item + PairingHeapNodePy * prev # Previous sibling of the node or parent + PairingHeapNodePy * next # Next sibling of the node + PairingHeapNodePy * child # First child of the node + + @staticmethod + PairingHeapNodePy * _merge(PairingHeapNodePy * a, PairingHeapNodePy * b) except + + + @staticmethod + PairingHeapNodePy * _pair(PairingHeapNodePy * p) except + + + @staticmethod + void _link(PairingHeapNodePy * a, PairingHeapNodePy * b) + + @staticmethod + void _unlink(PairingHeapNodePy * p) + + +# ============================================================================== +# Pairing heap data structure with fixed capacity n +# ============================================================================== + +cdef class PairingHeap_class: + cdef size_t n # maximum number of items + cdef PairingHeapNodePy * root # pointer to the top of the heap + cdef PairingHeapNodePy * nodes # array of size n to store items + cdef size_t number_of_items # number of active items + cpdef bint empty(self) noexcept + cpdef bint full(self) noexcept + cpdef size_t capacity(self) noexcept + cpdef size_t size(self) noexcept + cpdef tuple top(self) + cpdef object top_value(self) + cpdef void pop(self) noexcept + + +cdef class PairingHeap_of_n_integers(PairingHeap_class): + cdef bitset_t active # bitset to identify active items + cpdef void push(self, size_t item, object value) except * + cpdef size_t top_item(self) except * + cpdef void decrease(self, size_t item, object new_value) except * + cpdef object value(self, size_t item) + + +cdef class PairingHeap_of_n_hashables(PairingHeap_class): + cdef list _int_to_item # mapping from integers to items + cdef dict _item_to_int # mapping from items to integers + cdef list free_idx # list of free indexes + cpdef void push(self, object item, object value) except * + cpdef object top_item(self) + cpdef void decrease(self, object item, object new_value) except * + cpdef object value(self, object item) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx new file mode 100644 index 00000000000..ec08be43652 --- /dev/null +++ b/src/sage/data_structures/pairing_heap.pyx @@ -0,0 +1,1462 @@ +# distutils: language = c++ +r""" +Pairing Heap + +This module proposes several implementations of the pairing heap data structure +[FSST1986]_. See the :wikipedia:`Pairing_heap` for more information on this +min-heap data structure. + +- :class:`PairingHeap_of_n_integers`: a pairing heap data structure with fixed + capacity `n`. Its items are integers in the range `[0, n-1]`. Values can be of + any type equipped with a comparison method (``<=``). + +- :class:`PairingHeap_of_n_hashables`: a pairing heap data structure with fixed + capacity `n`. Its items can be of any hashable type. Values can be of any type + equipped with a comparison method (``<=``). + +- ``PairingHeap``: interface to a pairing heap data structure written in C++. + The advantages of this data structure are that: its capacity is unbounded; + items can be of any hashable type equipped with a hashing method that can be + supported by ``std::unordered_map``; values can be of any specified type + equipped with a comparison method (``<=``). This data structure is for + internal use and therefore cannot be accessed from a shell. + +EXAMPLES: + +Pairing heap of `n` integers in the range `[0, n-1]`:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(10); P + PairingHeap_of_n_integers: capacity 10, size 0 + sage: P.push(1, 3) + sage: P.push(2, 2) + sage: P + PairingHeap_of_n_integers: capacity 10, size 2 + sage: P.top() + (2, 2) + sage: P.decrease(1, 1) + sage: P.top() + (1, 1) + sage: P.pop() + sage: P.top() + (2, 2) + + sage: P = PairingHeap_of_n_integers(10) + sage: P.push(1, (2, 'a')) + sage: P.push(2, (2, 'b')) + sage: P.top() + (1, (2, 'a')) + +Pairing heap of `n` hashables:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(10); P + PairingHeap_of_n_hashables: capacity 10, size 0 + sage: P.push(1, 3) + sage: P.push('b', 2) + sage: P.push((1, 'abc'), 4) + sage: P.top() + ('b', 2) + sage: P.decrease((1, 'abc'), 1) + sage: P.top() + ((1, 'abc'), 1) + sage: P.pop() + sage: P.top() + ('b', 2) + + sage: # needs sage.graphs + sage: P = PairingHeap_of_n_hashables(10) + sage: P.push(('a', 1), (2, 'b')) + sage: P.push(2, (2, 'a')) + sage: g = Graph(2, immutable=True) + sage: P.push(g, (3, 'z')) + sage: P.top() + (2, (2, 'a')) + sage: P.decrease(g, (1, 'z')) + sage: P.top() + (Graph on 2 vertices, (1, 'z')) + sage: while P: + ....: print(P.top()) + ....: P.pop() + (Graph on 2 vertices, (1, 'z')) + (2, (2, 'a')) + (('a', 1), (2, 'b')) +""" +# ****************************************************************************** +# Copyright (C) 2024 David Coudert +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# https://www.gnu.org/licenses/ +# ****************************************************************************** + + +from libcpp.pair cimport pair +from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF +from cysignals.signals cimport sig_on, sig_off, sig_check +from cysignals.memory cimport check_allocarray, sig_free +from sage.data_structures.bitset_base cimport (bitset_init, bitset_free, + bitset_add, bitset_remove, + bitset_in) +from sage.misc.prandom import shuffle + + +# ============================================================================== +# Class PairingHeap_class +# ============================================================================== + +cdef class PairingHeap_class: + r""" + Common class and methods for :class:`PairingHeap_of_n_integers` and + :class:`PairingHeap_of_n_hashables`. + """ + + def __repr__(self): + r""" + Return a string representing ``self``. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5); P + PairingHeap_of_n_integers: capacity 5, size 0 + sage: P.push(1, 2) + sage: P + PairingHeap_of_n_integers: capacity 5, size 1 + """ + return f"{type(self).__name__}: capacity {self.n}, size {len(self)}" + + def __bool__(self): + r""" + Check whether ``self`` is not empty. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: 'not empty' if P else 'empty' + 'empty' + sage: P.push(1, 2) + sage: 'not empty' if P else 'empty' + 'not empty' + """ + return self.root != NULL + + cpdef bint empty(self) noexcept: + r""" + Check whether the heap is empty. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.empty() + True + sage: P.push(1, 2) + sage: P.empty() + False + """ + return self.root == NULL + + cpdef bint full(self) noexcept: + r""" + Check whether the heap is full. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(2) + sage: P.full() + False + sage: P.push(0, 2) + sage: P.push(1, 3) + sage: P.full() + True + """ + return self.n == self.number_of_items + + cpdef size_t capacity(self) noexcept: + r""" + Return the maximum capacity of the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.capacity() + 5 + sage: P.push(1, 2) + sage: P.capacity() + 5 + """ + return self.n + + cpdef size_t size(self) noexcept: + r""" + Return the number of items in the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.size() + 0 + sage: P.push(1, 2) + sage: P.size() + 1 + + One may also use Python's ``__len__``:: + + sage: len(P) + 1 + """ + return self.number_of_items + + def __len__(self): + r""" + Return the number of items in the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: len(P) + 0 + sage: P.push(1, 2) + sage: len(P) + 1 + """ + return self.number_of_items + + cpdef tuple top(self): + r""" + Return the top pair (item, value) of the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.push(3, 1) + sage: P.top() + (3, 1) + + sage: P = PairingHeap_of_n_integers(3) + sage: P.top() + Traceback (most recent call last): + ... + ValueError: trying to access the top of an empty heap + """ + raise NotImplementedError() + + cpdef object top_value(self): + r""" + Return the value of the top item of the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.top_value() + 2 + + sage: P = PairingHeap_of_n_integers(3) + sage: P.top_value() + Traceback (most recent call last): + ... + ValueError: trying to access the top of an empty heap + """ + if not self: + raise ValueError("trying to access the top of an empty heap") + return self.root.value + + cpdef void pop(self) noexcept: + r""" + Remove the top item from the heap. + + If the heap is already empty, we do nothing. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5); P + PairingHeap_of_n_integers: capacity 5, size 0 + sage: P.push(1, 2); P + PairingHeap_of_n_integers: capacity 5, size 1 + sage: P.pop(); P + PairingHeap_of_n_integers: capacity 5, size 0 + sage: P.pop(); P + PairingHeap_of_n_integers: capacity 5, size 0 + """ + raise NotImplementedError() + + +# ============================================================================== +# Class PairingHeap_of_n_integers +# ============================================================================== + +cdef class PairingHeap_of_n_integers(PairingHeap_class): + r""" + Pairing Heap for items in range `[0, n - 1]`. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5); P + PairingHeap_of_n_integers: capacity 5, size 0 + sage: P.push(1, 3) + sage: P.push(2, 2) + sage: P + PairingHeap_of_n_integers: capacity 5, size 2 + sage: P.top() + (2, 2) + sage: P.decrease(1, 1) + sage: P.top() + (1, 1) + sage: P.pop() + sage: P.top() + (2, 2) + + TESTS:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(0) + Traceback (most recent call last): + ... + ValueError: the capacity of the heap must be strictly positive + sage: P = PairingHeap_of_n_integers(1); P + PairingHeap_of_n_integers: capacity 1, size 0 + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(11, 3) + Traceback (most recent call last): + ... + ValueError: item must be in range [0, 4] + """ + + def __init__(self, size_t n): + r""" + Construct the ``PairingHeap_of_n_integers`` where items are integers + from `0` to `n-1`. + + INPUT: + + - ``n`` -- strictly positive integer; the maximum number of items in the heap + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5); P + PairingHeap_of_n_integers: capacity 5, size 0 + sage: P.push(1, 2); P + PairingHeap_of_n_integers: capacity 5, size 1 + sage: P.push(2, 3); P + PairingHeap_of_n_integers: capacity 5, size 2 + sage: P.pop(); P + PairingHeap_of_n_integers: capacity 5, size 1 + sage: P.push(10, 1) + Traceback (most recent call last): + ... + ValueError: item must be in range [0, 4] + sage: PairingHeap_of_n_integers(1) + PairingHeap_of_n_integers: capacity 1, size 0 + + TESTS:: + + sage: PairingHeap_of_n_integers(0) + Traceback (most recent call last): + ... + ValueError: the capacity of the heap must be strictly positive + sage: P = PairingHeap_of_n_integers(10) + sage: P.push(1, 1); P.push(7, 0); P.push(0, 4); P.pop(); P.push(5, 5) + sage: TestSuite(P).run(skip="_test_pickling") + """ + if not n: + raise ValueError("the capacity of the heap must be strictly positive") + self.n = n + self.root = NULL + self.nodes = check_allocarray(n, sizeof(PairingHeapNodePy)) + bitset_init(self.active, n) + self.number_of_items = 0 + + def __dealloc__(self): + """ + Deallocate ``self``. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: del P + """ + sig_free(self.nodes) + bitset_free(self.active) + + cpdef void push(self, size_t item, object value) except *: + r""" + Insert an item into the heap with specified value (priority). + + INPUT: + + - ``item`` -- nonnegative integer; the item to consider + + - ``value`` -- the value associated with ``item`` + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.push(3, 1) + sage: P.top() + (3, 1) + + TESTS:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(1, 2) + sage: P.push(1, 2) + Traceback (most recent call last): + ... + ValueError: 1 is already in the heap + sage: P.push(11, 2) + Traceback (most recent call last): + ... + ValueError: item must be in range [0, 4] + sage: P.push(-1, 0) + Traceback (most recent call last): + ... + OverflowError: can't convert negative value to size_t + """ + if item >= self.n: + raise ValueError(f"item must be in range [0, {self.n - 1}]") + if item in self: + raise ValueError(f"{item} is already in the heap") + + cdef PairingHeapNodePy * p = self.nodes + item + Py_INCREF(value) + p.value = value + p.prev = p.next = p.child = NULL + if self.root == NULL: + self.root = p + else: + self.root = PairingHeapNodePy._merge(self.root, p) + bitset_add(self.active, item) + self.number_of_items += 1 + + cpdef tuple top(self): + r""" + Return the top pair (item, value) of the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.push(3, 1) + sage: P.top() + (3, 1) + + sage: P = PairingHeap_of_n_integers(3) + sage: P.top() + Traceback (most recent call last): + ... + ValueError: trying to access the top of an empty heap + """ + if not self: + raise ValueError("trying to access the top of an empty heap") + return self.root - self.nodes, self.root.value + + cpdef size_t top_item(self) except *: + r""" + Return the top item of the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.top_item() + 1 + + sage: P = PairingHeap_of_n_integers(3) + sage: P.top_item() + Traceback (most recent call last): + ... + ValueError: trying to access the top of an empty heap + """ + if not self: + raise ValueError("trying to access the top of an empty heap") + return self.root - self.nodes + + cpdef void pop(self) noexcept: + r""" + Remove the top item from the heap. + + If the heap is already empty, we do nothing. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5); P + PairingHeap_of_n_integers: capacity 5, size 0 + sage: P.push(1, 2); P + PairingHeap_of_n_integers: capacity 5, size 1 + sage: P.push(2, 3); P + PairingHeap_of_n_integers: capacity 5, size 2 + sage: P.pop(); P + PairingHeap_of_n_integers: capacity 5, size 1 + sage: P.pop(); P + PairingHeap_of_n_integers: capacity 5, size 0 + sage: P.pop(); P + PairingHeap_of_n_integers: capacity 5, size 0 + """ + if not self: + return + cdef size_t item = self.top_item() + Py_XDECREF(self.nodes[item].value) + bitset_remove(self.active, item) + self.number_of_items -= 1 + self.root = PairingHeapNodePy._pair(self.root.child) + + cpdef void decrease(self, size_t item, object new_value) except *: + r""" + Decrease the value of specified item. + + This method is more permissive than it should as it can also be used to + push an item in the heap. + + INPUT: + + - ``item`` -- nonnegative integer; the item to consider + + - ``new_value`` -- the new value for ``item`` + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: 3 in P + False + sage: P.decrease(3, 33) + sage: 3 in P + True + sage: P.top() + (3, 33) + sage: P.push(1, 10) + sage: P.top() + (1, 10) + sage: P.decrease(3, 7) + sage: P.top() + (3, 7) + + TESTS:: + + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(1, 3) + sage: P.decrease(1, 2) + sage: P.decrease(1, 2) + Traceback (most recent call last): + ... + ValueError: the new value must be less than the current value + """ + if item >= self.n: + raise ValueError(f"item must be in range [0, {self.n - 1}]") + cdef PairingHeapNodePy * p + if bitset_in(self.active, item): + p = self.nodes + item + if p.value <= new_value: + raise ValueError("the new value must be less than the current value") + Py_XDECREF(p.value) + Py_INCREF(new_value) + p.value = new_value + if p.prev != NULL: + PairingHeapNodePy._unlink(p) + self.root = PairingHeapNodePy._merge(self.root, p) + else: + self.push(item, new_value) + + def __contains__(self, size_t item): + r""" + Check whether the specified item is in the heap. + + INPUT: + + - ``item`` -- nonnegative integer; the item to consider + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: 3 in P + False + sage: P.push(3, 33) + sage: 3 in P + True + sage: 100 in P + False + """ + if item >= self.n: + return False + return bitset_in(self.active, item) + + contains = __contains__ + + cpdef object value(self, size_t item): + r""" + Return the value associated with the item. + + INPUT: + + - ``item`` -- nonnegative integer; the item to consider + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: P.push(3, 33) + sage: P.push(1, 10) + sage: P.value(3) + 33 + sage: P.value(7) + Traceback (most recent call last): + ... + ValueError: 7 is not in the heap + """ + if item not in self: + raise ValueError(f"{item} is not in the heap") + return self.nodes[item].value + + +# ============================================================================== +# Class PairingHeap_of_n_hashables +# ============================================================================== + +cdef class PairingHeap_of_n_hashables(PairingHeap_class): + r""" + Pairing Heap for `n` hashable items. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5); P + PairingHeap_of_n_hashables: capacity 5, size 0 + sage: P.push(1, 3) + sage: P.push('abc', 2); P + PairingHeap_of_n_hashables: capacity 5, size 2 + sage: P.top() + ('abc', 2) + sage: P.decrease(1, 1) + sage: P.top() + (1, 1) + sage: P.pop() + sage: P.top() + ('abc', 2) + + sage: P = PairingHeap_of_n_hashables(5) + sage: P.push(1, (2, 3)) + sage: P.push('a', (2, 2)) + sage: P.push('b', (3, 3)) + sage: P.push('c', (2, 1)) + sage: P.top() + ('c', (2, 1)) + sage: P.push(Graph(2, immutable=True), (1, 7)) + sage: P.top() + (Graph on 2 vertices, (1, 7)) + sage: P.decrease('b', (1, 5)) + sage: P.top() + ('b', (1, 5)) + + TESTS:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(0) + Traceback (most recent call last): + ... + ValueError: the capacity of the heap must be strictly positive + sage: P = PairingHeap_of_n_hashables(1); P + PairingHeap_of_n_hashables: capacity 1, size 0 + sage: P.push(11, 3) + sage: P.push(12, 4) + Traceback (most recent call last): + ... + ValueError: the heap is full + + sage: P = PairingHeap_of_n_hashables(10) + sage: P.push(1, 'John') + sage: P.push(4, 42) + Traceback (most recent call last): + ... + TypeError: unsupported operand parent(s) for >=: 'Integer Ring' and '' + """ + + def __init__(self, size_t n): + r""" + Construct the ``PairingHeap_of_n_hashables``. + + This pairing heap has a maximum capacity of `n` items and each item is a + hashable object. + + INPUT: + + - ``n`` -- strictly positive integer; the maximum number of items in the heap + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(2); P + PairingHeap_of_n_hashables: capacity 2, size 0 + sage: P.push(1, 2) + sage: P + PairingHeap_of_n_hashables: capacity 2, size 1 + sage: P.push(2, 3) + sage: P + PairingHeap_of_n_hashables: capacity 2, size 2 + sage: P.full() + True + sage: P.push(10, 1) + Traceback (most recent call last): + ... + ValueError: the heap is full + sage: P.pop() + sage: P + PairingHeap_of_n_hashables: capacity 2, size 1 + sage: P.push(10, 1) + + TESTS:: + + sage: P = PairingHeap_of_n_hashables(0) + Traceback (most recent call last): + ... + ValueError: the capacity of the heap must be strictly positive + sage: P = PairingHeap_of_n_hashables(1); P + PairingHeap_of_n_hashables: capacity 1, size 0 + sage: P = PairingHeap_of_n_hashables(6) + sage: P.push(1, -0.5); P.push(frozenset(), 1); P.pop(); P.push('a', 3.5) + sage: TestSuite(P).run(skip="_test_pickling") + """ + if not n: + raise ValueError("the capacity of the heap must be strictly positive") + self.n = n + self.root = NULL + self.nodes = check_allocarray(n, sizeof(PairingHeapNodePy)) + self.number_of_items = 0 + self._int_to_item = [None] * n + self._item_to_int = dict() + self.free_idx = list(range(n)) + + def __dealloc__(self): + """ + Deallocate ``self``. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_integers + sage: P = PairingHeap_of_n_integers(5) + sage: del P + """ + sig_free(self.nodes) + + cpdef void push(self, object item, object value) except *: + r""" + Insert an item into the heap with specified value (priority). + + INPUT: + + - ``item`` -- a hashable object; the item to add + + - ``value`` -- the value associated with ``item`` + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.push(3, 1) + sage: P.top() + (3, 1) + + TESTS:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(2) + sage: P.push(1, 2) + sage: P.push(1, 2) + Traceback (most recent call last): + ... + ValueError: 1 is already in the heap + sage: P.push(11, 2) + sage: P.push(7, 5) + Traceback (most recent call last): + ... + ValueError: the heap is full + """ + if item in self: + raise ValueError(f"{item} is already in the heap") + if self.full(): + raise ValueError("the heap is full") + + cdef size_t idx = self.free_idx.pop() + self._int_to_item[idx] = item + self._item_to_int[item] = idx + cdef PairingHeapNodePy * p = self.nodes + idx + Py_INCREF(value) + p.value = value + p.prev = p.next = p.child = NULL + if self.root == NULL: + self.root = p + else: + self.root = PairingHeapNodePy._merge(self.root, p) + self.number_of_items += 1 + + cpdef tuple top(self): + r""" + Return the top pair (item, value) of the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.push(3, 1) + sage: P.top() + (3, 1) + + sage: P = PairingHeap_of_n_hashables(3) + sage: P.top() + Traceback (most recent call last): + ... + ValueError: trying to access the top of an empty heap + """ + if not self: + raise ValueError("trying to access the top of an empty heap") + cdef size_t idx = self.root - self.nodes + return self._int_to_item[idx], self.root.value + + cpdef object top_item(self): + r""" + Return the top item of the heap. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5) + sage: P.push(1, 2) + sage: P.top() + (1, 2) + sage: P.top_item() + 1 + + sage: P = PairingHeap_of_n_hashables(3) + sage: P.top_item() + Traceback (most recent call last): + ... + ValueError: trying to access the top of an empty heap + """ + if not self: + raise ValueError("trying to access the top of an empty heap") + cdef size_t idx = self.root - self.nodes + return self._int_to_item[idx] + + cpdef void pop(self) noexcept: + r""" + Remove the top item from the heap. + + If the heap is already empty, we do nothing. + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5); len(P) + 0 + sage: P.push(1, 2); len(P) + 1 + sage: P.push(2, 3); len(P) + 2 + sage: P.pop(); len(P) + 1 + sage: P.pop(); len(P) + 0 + sage: P.pop(); len(P) + 0 + """ + if not self: + return + cdef object item = self.top_item() + cdef size_t idx = self._item_to_int[item] + Py_XDECREF(self.nodes[idx].value) + self.free_idx.append(idx) + del self._item_to_int[item] + self.number_of_items -= 1 + self.root = PairingHeapNodePy._pair(self.root.child) + + cpdef void decrease(self, object item, object new_value) except *: + r""" + Decrease the value of specified item. + + This method is more permissive than it should as it can also be used to + push an item in the heap. + + INPUT: + + - ``item`` -- the item to consider + + - ``new_value`` -- the new value for ``item`` + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5) + sage: 3 in P + False + sage: P.decrease(3, 33) + sage: 3 in P + True + sage: P.top() + (3, 33) + sage: P.push(1, 10) + sage: P.top() + (1, 10) + sage: P.decrease(3, 7) + sage: P.top() + (3, 7) + + TESTS:: + + sage: P = PairingHeap_of_n_hashables(5) + sage: P.push(1, 3) + sage: P.decrease(1, 2) + sage: P.decrease(1, 2) + Traceback (most recent call last): + ... + ValueError: the new value must be less than the current value + """ + cdef PairingHeapNodePy * p + cdef size_t idx + if item in self: + idx = self._item_to_int[item] + p = self.nodes + idx + if p.value <= new_value: + raise ValueError("the new value must be less than the current value") + Py_XDECREF(p.value) + Py_INCREF(new_value) + p.value = new_value + if p.prev != NULL: + PairingHeapNodePy._unlink(p) + self.root = PairingHeapNodePy._merge(self.root, p) + else: + self.push(item, new_value) + + def __contains__(self, object item): + r""" + Check whether the specified item is in the heap. + + INPUT: + + - ``item`` -- the item to consider + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5) + sage: 3 in P + False + sage: P.push(3, 33) + sage: 3 in P + True + sage: 100 in P + False + """ + return item in self._item_to_int + + contains = __contains__ + + cpdef object value(self, object item): + r""" + Return the value associated with the item. + + INPUT: + + - ``item`` -- the item to consider + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import PairingHeap_of_n_hashables + sage: P = PairingHeap_of_n_hashables(5) + sage: P.push(3, 33) + sage: P.push(1, 10) + sage: P.value(3) + 33 + sage: P.value(7) + Traceback (most recent call last): + ... + ValueError: 7 is not in the heap + """ + if item not in self: + raise ValueError(f"{item} is not in the heap") + cdef size_t idx = self._item_to_int[item] + return self.nodes[idx].value + + +# ============================================================================== +# Methods to check the validity of the pairing heaps +# ============================================================================== + +def _test_PairingHeap_from_C(n=100): + r""" + Test :class:`~sage.data_structures.pairing_heap.PairingHeap`. + + INPUT: + + - ``n`` -- a strictly positive integer (default: 100); the maximum capacity + of the heap + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_from_C + sage: _test_PairingHeap_from_C(100) + """ + from sage.misc.prandom import randint, shuffle + sig_on() + cdef PairingHeap[size_t, size_t] PH = PairingHeap[size_t, size_t]() + sig_off() + + # Initialize a list of tuples (value, item) randomly ordered + items = list(range(n)) + values = list(range(n)) + shuffle(items) + shuffle(values) + cdef list Lref = list(zip(values, items)) + + for value, item in Lref: + PH.push(item, value) + sig_check() + + L = [] + while not PH.empty(): + item, value = PH.top() + L.append((value, item)) + PH.pop() + sig_check() + + if L != sorted(Lref): + raise ValueError('the order is not good') + + # Test decrease key operations. We first push items in the heap with an + # excess of k in the value. Then we decrease the keys in a random order by + # random values until returning to the original values. We finally check the + # validity of the resulting ordering. + k = 10 + dec = {item: k for item in items} + shuffle(Lref) + for value, item in Lref: + PH.push(item, value + k) + sig_check() + + L = list(items) + while L: + i = randint(0, len(L) - 1) + item = L[i] + d = randint(1, dec[item]) + dec[item] -= d + if not dec[item]: + L[i] = L[-1] + L.pop() + PH.decrease(item, PH.value(item) - d) + sig_check() + + L = [] + while not PH.empty(): + item, value = PH.top() + L.append((value, item)) + PH.pop() + sig_check() + + if L != sorted(Lref): + raise ValueError('the order is not good') + + # Different cost function + from sage.functions.trig import sin, cos + sig_on() + cdef PairingHeap[size_t, pair[size_t, size_t]] HH = PairingHeap[size_t, pair[size_t, size_t]]() + sig_off() + + for i in range(n): + HH.push(i, (sin(i), cos(i))) + sig_check() + + L = [] + while not HH.empty(): + L.append(HH.top()) + HH.pop() + sig_check() + + for (u, cu), (v, cv) in zip(L, L[1:]): + if cu > cv: + print(u, cu, v, cv) + + # We finally show that an error is raised when trying to access the top of + # an empty heap + try: + _ = HH.top() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + try: + _ = HH.top_item() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + try: + _ = HH.top_value() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + # Or to get the value associated to an item that is not in the heap + try: + _ = HH.value(123) + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + +def _test_PairingHeap_of_n_integers(n=100): + r""" + Test :class:`~sage.data_structures.pairing_heap.PairingHeap_of_n_integers`. + + INPUT: + + - ``n`` -- a strictly positive integer (default: 100); the maximum capacity + of the heap + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers + sage: _test_PairingHeap_of_n_integers(100) + """ + from sage.misc.prandom import randint, shuffle + + sig_on() + cdef PairingHeap_of_n_integers P = PairingHeap_of_n_integers(n) + sig_off() + + # Initialize a list of tuples (value, item) randomly ordered + cdef list items = list(range(n)) + cdef list values = list(range(n)) + shuffle(items) + shuffle(values) + cdef list Lref = list(zip(values, items)) + + cdef int value, item + for value, item in Lref: + P.push(item, value) + sig_check() + + cdef list L = [] + while P: + item, value = P.top() + L.append((value, item)) + P.pop() + sig_check() + + if L != sorted(Lref): + raise ValueError('the order is not good') + + # Test decrease key operations. We first push items in the heap with an + # excess of k in the value. Then we decrease the keys in a random order by + # random values until returning to the original values. We finally check the + # validity of the resulting ordering. + cdef int k = 10 + cdef list dec = [k] * n + shuffle(Lref) + for value, item in Lref: + P.push(item, value + k) + sig_check() + + L = list(items) + while L: + i = randint(0, len(L) - 1) + item = L[i] + d = randint(1, dec[item]) + dec[item] -= d + if not dec[item]: + L[i] = L[-1] + L.pop() + P.decrease(item, P.value(item) - d) + sig_check() + + L = [] + while P: + item, value = P.top() + L.append((value, item)) + P.pop() + sig_check() + + if L != sorted(Lref): + raise ValueError('the order is not good') + + # We finally show that an error is raised when trying to access the top of + # an empty heap + try: + _ = P.top() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + try: + _ = P.top_item() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + try: + _ = P.top_value() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + # Or to get the value associated to an item that is not in the heap + try: + _ = P.value(123) + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + +def _test_PairingHeap_of_n_hashables(n=100): + r""" + Test :class:`~sage.data_structures.pairing_heap.PairingHeap_of_n_hashables`. + + INPUT: + + - ``n`` -- a strictly positive integer (default: 100); the maximum capacity + of the heap + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_hashables + sage: _test_PairingHeap_of_n_hashables(100) + """ + from sage.misc.prandom import randint, shuffle + + sig_on() + cdef PairingHeap_of_n_hashables P = PairingHeap_of_n_hashables(n) + sig_off() + + # Initialize a list of tuples (value, item) randomly ordered + cdef list items = [(str(i), i) for i in range(n)] + cdef list values = list(range(n)) + shuffle(items) + shuffle(values) + cdef list Lref = list(zip(values, items)) + + for value, item in Lref: + P.push(item, value) + sig_check() + + cdef list L = [] + while P: + item, value = P.top() + L.append((value, item)) + P.pop() + sig_check() + + if L != sorted(Lref): + raise ValueError('the order is not good') + + # Test decrease key operations. We first push items in the heap with an + # excess of k in the value. Then we decrease the keys in a random order by + # random values until returning to the original values. We finally check the + # validity of the resulting ordering. + cdef int k = 10 + cdef dict dec = {item: k for item in items} + shuffle(Lref) + for value, item in Lref: + P.push(item, value + k) + sig_check() + + L = list(items) + while L: + i = randint(0, len(L) - 1) + item = L[i] + d = randint(1, dec[item]) + dec[item] -= d + if not dec[item]: + L[i] = L[-1] + L.pop() + P.decrease(item, P.value(item) - d) + sig_check() + + L = [] + while P: + item, value = P.top() + L.append((value, item)) + P.pop() + sig_check() + + if L != sorted(Lref): + raise ValueError('the order is not good') + + # We finally show that an error is raised when trying to access the top of + # an empty heap + try: + _ = P.top() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + try: + _ = P.top_item() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + try: + _ = P.top_value() + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + # Or to get the value associated to an item that is not in the heap + try: + _ = P.value(123) + print("something goes wrong, the error has not been raised") + except ValueError as msg: + # The error has been properly handled + pass + + +def _compare_heaps(n=100, verbose=False): + r""" + Check that the heaps behave the same. + + This method selects a list of instructions: push items in some order, + decrease the values of the items in some order, extract all items in order. + Then it applies the same instructions to a ``PairingHeap``, a + :class:`PairingHeap_of_n_integers` and a + :class:`PairingHeap_of_n_hashables`. It checks that all heaps report the + list of items in the same order and it measures the running time. + + INPUT: + + - ``n`` -- a strictly positive integer (default: 100); the maximum capacity + of the heap + + - ``verbose`` -- boolean (default: ``False``); whether to display + information about the running times + + EXAMPLES:: + + sage: from sage.data_structures.pairing_heap import _compare_heaps + sage: _compare_heaps(n=100) + sage: _compare_heaps(n=100, verbose=True) # random + PairingHeap_of_n_integers: 7.800000000024454e-05 + PairingHeap_of_n_hashables: 9.400000000026054e-05 + PairingHeap (C++): 6.899999999987472e-05 + sage: _compare_heaps(1000000, verbose=True) # not tested (long time), random + PairingHeap_of_n_integers: 1.5106779999999995 + PairingHeap_of_n_hashables: 4.998040000000001 + PairingHeap (C++): 1.7841750000000012 + """ + from sage.misc.prandom import shuffle + from sage.misc.timing import cputime + + items = list(range(n)) + values = list(range(n)) + shuffle(items) + shuffle(values) + Lref = list(zip(values, items)) + k = 10 + dec_order = list(items) + shuffle(dec_order) + + t = cputime() + sig_on() + cdef PairingHeap_of_n_integers P = PairingHeap_of_n_integers(n) + sig_off() + for value, item in Lref: + P.push(item, value + k) + sig_check() + for item in dec_order: + P.decrease(item, P.value(item) - k) + sig_check() + LP = [] + while P: + LP.append(P.top()) + P.pop() + sig_check() + t = cputime(t) + if verbose: + print(f"PairingHeap_of_n_integers: {t}") + + t = cputime() + sig_on() + cdef PairingHeap_of_n_hashables Q = PairingHeap_of_n_hashables(n) + sig_off() + for value, item in Lref: + Q.push(item, value + k) + sig_check() + for item in dec_order: + Q.decrease(item, Q.value(item) - k) + sig_check() + LQ = [] + while Q: + LQ.append(Q.top()) + Q.pop() + sig_check() + t = cputime(t) + if verbose: + print(f"PairingHeap_of_n_hashables: {t}") + + t = cputime() + sig_on() + cdef PairingHeap[size_t, size_t] PH = PairingHeap[size_t, size_t]() + sig_off() + for value, item in Lref: + PH.push(item, value + k) + sig_check() + for item in dec_order: + PH.decrease(item, PH.value(item) - k) + sig_check() + LPH = [] + while not PH.empty(): + LPH.append(PH.top()) + PH.pop() + sig_check() + t = cputime(t) + if verbose: + print(f"PairingHeap (C++): {t}") + + if LPH != LP or LP != LQ: + print('something goes wrong') diff --git a/src/sage/databases/db_class_polynomials.py b/src/sage/databases/db_class_polynomials.py index 57acde7c05a..4362df56837 100644 --- a/src/sage/databases/db_class_polynomials.py +++ b/src/sage/databases/db_class_polynomials.py @@ -30,8 +30,8 @@ from .db_modular_polynomials import _dbz_to_integers -disc_format = "%07d" # disc_length = 7 -level_format = "%03d" # level_length = 3 +disc_format = "%07d" # disc_length = 7 +level_format = "%03d" # level_length = 3 class ClassPolynomialDatabase: @@ -52,7 +52,7 @@ def _dbpath(self, disc, level=1): if level != 1: raise NotImplementedError("Level (= %s) > 1 not yet implemented" % level) n1 = 5000*((abs(disc)-1)//5000) - s1 = disc_format % (n1+1) #_pad_int(n1+1, disc_length) + s1 = disc_format % (n1+1) # _pad_int(n1+1, disc_length) s2 = disc_format % (n1+5000) subdir = "%s-%s" % (s1, s2) discstr = disc_format % abs(disc) diff --git a/src/sage/dynamics/arithmetic_dynamics/meson.build b/src/sage/dynamics/arithmetic_dynamics/meson.build index 9e26a72c874..7ba8b8b4068 100644 --- a/src/sage/dynamics/arithmetic_dynamics/meson.build +++ b/src/sage/dynamics/arithmetic_dynamics/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'affine_ds.py', 'all.py', 'berkovich_ds.py', diff --git a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py index f395214b516..591693e5af8 100644 --- a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py +++ b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py @@ -95,7 +95,7 @@ class initialization directly. from sage.rings.morphism import RingHomomorphism_im_gens from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.quotient_ring import QuotientRing_generic from sage.rings.rational_field import QQ from sage.rings.real_mpfr import RealField @@ -385,7 +385,7 @@ def __classcall_private__(cls, morphism_or_polys, domain=None, names=None): polys = list(morphism_or_polys) if len(polys) == 1: raise ValueError("list/tuple must have at least 2 polynomials") - test = lambda x: isinstance(x, (PolynomialRing_general, MPolynomialRing_base)) + test = lambda x: isinstance(x, (PolynomialRing_generic, MPolynomialRing_base)) if not all(test(poly.parent()) for poly in polys): try: polys = [poly.lift() for poly in polys] @@ -395,7 +395,7 @@ def __classcall_private__(cls, morphism_or_polys, domain=None, names=None): # homogenize! f = morphism_or_polys aff_CR = f.parent() - if (not isinstance(aff_CR, PolynomialRing_general) and not isinstance(aff_CR, FractionField_generic) + if (not isinstance(aff_CR, (PolynomialRing_generic, FractionField_generic)) and not (isinstance(aff_CR, MPolynomialRing_base) and aff_CR.ngens() == 1)): msg = '{} is not a single variable polynomial or rational function' raise ValueError(msg.format(f)) @@ -3533,7 +3533,7 @@ def affine_preperiodic_model(self, m, n, return_conjugation=False): if hyperplane_found: break else: - if isinstance(R, (PolynomialRing_general, + if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base, FractionField_generic)): # for polynomial rings, we can get an infinite family of hyperplanes @@ -4597,7 +4597,7 @@ def preperiodic_points(self, m, n, **kwds): for k in ZZ(n).divisors(): if ZZ(n/k).is_prime(): Sn.append(k) - if isinstance(R, (PolynomialRing_general, + if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base)): phi = FlatteningMorphism(CR) flatCR = phi.codomain() @@ -4954,7 +4954,7 @@ def periodic_points(self, n, minimal=True, formal=False, R=None, algorithm='vari for k in ZZ(n).divisors(): if ZZ(n//k).is_prime(): Sn.append(k) - if isinstance(R, (PolynomialRing_general, + if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base)): phi = FlatteningMorphism(CR) flatCR = phi.codomain() @@ -5789,7 +5789,7 @@ def sigma_invariants(self, n, formal=False, embedding=None, type='point', F = base_ring if isinstance(base_ring, FractionField_generic): if isinstance(base_ring.ring(), (MPolynomialRing_base, - PolynomialRing_general)): + PolynomialRing_generic)): f.normalize_coordinates() f_ring = f.change_ring(base_ring.ring()) X = f_ring.periodic_points(n, minimal=False, formal=formal, return_scheme=True) @@ -5892,7 +5892,7 @@ def sigma_invariants(self, n, formal=False, embedding=None, type='point', base_ring = dom.base_ring() if isinstance(base_ring, FractionField_generic): base_ring = base_ring.ring() - if isinstance(base_ring, (PolynomialRing_general, + if isinstance(base_ring, (PolynomialRing_generic, MPolynomialRing_base)): base_ring = base_ring.base_ring() elif base_ring in FunctionFields(): diff --git a/src/sage/dynamics/complex_dynamics/meson.build b/src/sage/dynamics/complex_dynamics/meson.build index d3961275d3e..ccde4866dd1 100644 --- a/src/sage/dynamics/complex_dynamics/meson.build +++ b/src/sage/dynamics/complex_dynamics/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'mandel_julia.py', subdir: 'sage/dynamics/complex_dynamics', diff --git a/src/sage/dynamics/finite_dynamical_system_catalog.py b/src/sage/dynamics/finite_dynamical_system_catalog.py old mode 100755 new mode 100644 diff --git a/src/sage/dynamics/meson.build b/src/sage/dynamics/meson.build index 134cfd1a296..9ba62964e6c 100644 --- a/src/sage/dynamics/meson.build +++ b/src/sage/dynamics/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'finite_dynamical_system.py', 'finite_dynamical_system_catalog.py', diff --git a/src/sage/ext/fast_callable.pyx b/src/sage/ext/fast_callable.pyx index 89c34b1f0fc..477f8608ef7 100644 --- a/src/sage/ext/fast_callable.pyx +++ b/src/sage/ext/fast_callable.pyx @@ -475,10 +475,11 @@ def fast_callable(x, domain=None, vars=None, x = x.function(*vars) if vars is None: - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base - if isinstance(x.parent(), PolynomialRing_general) or isinstance(x.parent(), MPolynomialRing_base): - vars = x.parent().variable_names() + P = x.parent() + if isinstance(P, (PolynomialRing_generic, MPolynomialRing_base)): + vars = P.variable_names() else: # constant vars = () diff --git a/src/sage/ext/meson.build b/src/sage/ext/meson.build index 73d0e85101d..dc3026cec34 100644 --- a/src/sage/ext/meson.build +++ b/src/sage/ext/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all__sagemath_objects.py', 'ccobject.h', 'cplusplus.pxd', diff --git a/src/sage/features/ffmpeg.py b/src/sage/features/ffmpeg.py index 8214e4d6ff3..c33e36062a1 100644 --- a/src/sage/features/ffmpeg.py +++ b/src/sage/features/ffmpeg.py @@ -76,19 +76,19 @@ def is_functional(self): # The `-nostdin` is needed to avoid the command to hang, see # https://stackoverflow.com/questions/16523746/ffmpeg-hangs-when-run-in-background commands = [] - for ext in ['.avi', '.flv', '.gif', '.mkv', '.mov', #'.mpg', - '.mp4', '.ogg', '.ogv', '.webm', '.wmv']: + for ext in ['.avi', '.flv', '.gif', '.mkv', '.mov', + '.mp4', '.ogg', '.ogv', '.webm', '.wmv']: cmd = ['ffmpeg', '-nostdin', '-y', '-f', 'image2', '-r', '5', - '-i', filename_png, '-pix_fmt', 'rgb24', '-loop', '0', - filename + ext] + '-i', filename_png, '-pix_fmt', 'rgb24', '-loop', '0', + filename + ext] commands.append(cmd) for ext in ['.avi', '.flv', '.gif', '.mkv', '.mov', '.mpg', - '.mp4', '.ogg', '.ogv', '.webm', '.wmv']: + '.mp4', '.ogg', '.ogv', '.webm', '.wmv']: cmd = ['ffmpeg', '-nostdin', '-y', '-f', 'image2', '-i', - filename_png, filename + ext] + filename_png, filename + ext] commands.append(cmd) # Running the commands and reporting any issue encountered diff --git a/src/sage/features/info.py b/src/sage/features/info.py index eeaf0118c0d..22580a42c00 100644 --- a/src/sage/features/info.py +++ b/src/sage/features/info.py @@ -5,6 +5,7 @@ from . import Executable + class Info(Executable): r""" A :class:`~sage.features.Feature` describing the presence of :ref:`info `. @@ -26,5 +27,6 @@ def __init__(self): Executable.__init__(self, 'info', executable='info', spkg='info', type='standard') + def all_features(): return [Info()] diff --git a/src/sage/functions/meson.build b/src/sage/functions/meson.build index c2a77f0e238..85b7b4afa49 100644 --- a/src/sage/functions/meson.build +++ b/src/sage/functions/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'airy.py', 'all.py', 'bessel.py', diff --git a/src/sage/games/meson.build b/src/sage/games/meson.build index d0776c0c71a..8852b13d9cf 100644 --- a/src/sage/games/meson.build +++ b/src/sage/games/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'hexad.py', 'quantumino.py', diff --git a/src/sage/geometry/hyperbolic_space/hyperbolic_isometry.py b/src/sage/geometry/hyperbolic_space/hyperbolic_isometry.py index 2dd20676215..9fe8f9e5a67 100644 --- a/src/sage/geometry/hyperbolic_space/hyperbolic_isometry.py +++ b/src/sage/geometry/hyperbolic_space/hyperbolic_isometry.py @@ -188,9 +188,9 @@ def __eq__(self, other): return False test_matrix = bool((self.matrix() - other.matrix()).norm() < EPSILON) if self.domain().is_isometry_group_projective(): - A,B = self.matrix(), other.matrix() # Rename for simplicity + A, B = self.matrix(), other.matrix() # Rename for simplicity m = self.matrix().ncols() - A = A / sqrt(A.det(), m) # Normalized to have determinant 1 + A = A / sqrt(A.det(), m) # Normalized to have determinant 1 B = B / sqrt(B.det(), m) test_matrix = ((A - B).norm() < EPSILON or (A + B).norm() < EPSILON) @@ -636,7 +636,7 @@ class HyperbolicIsometryUHP(HyperbolicIsometry): [1 0] [0 1] """ - def _call_(self, p): #UHP + def _call_(self, p): # UHP r""" Return image of ``p`` under the action of ``self``. @@ -656,7 +656,7 @@ def _call_(self, p): #UHP coords = coords.conjugate() return self.codomain().get_point(moebius_transform(self._matrix, coords)) - def preserves_orientation(self): #UHP + def preserves_orientation(self): # UHP r""" Return ``True`` if ``self`` is orientation-preserving and ``False`` otherwise. @@ -673,7 +673,7 @@ def preserves_orientation(self): #UHP """ return bool(self._matrix.det() > 0) - def classification(self): #UHP + def classification(self): # UHP r""" Classify the hyperbolic isometry as elliptic, parabolic, or hyperbolic. @@ -725,7 +725,7 @@ def classification(self): #UHP return 'reflection' return 'orientation-reversing hyperbolic' - def translation_length(self): #UHP + def translation_length(self): # UHP r""" For hyperbolic elements, return the translation length; otherwise, raise a :exc:`ValueError`. @@ -800,7 +800,7 @@ def fixed_point_set(self): # UHP d = sqrt(tau - 4) return [pt((M[0,0] - M[1,1] + sign(M[1,0])*d) / (2*M[1,0]))] elif M_cls == 'hyperbolic': - if M[1,0] != 0: #if the isometry doesn't fix infinity + if M[1,0] != 0: # if the isometry does not fix infinity d = sqrt(tau - 4) p_1 = (M[0,0] - M[1,1]+d) / (2*M[1,0]) p_2 = (M[0,0] - M[1,1]-d) / (2*M[1,0]) @@ -898,7 +898,7 @@ class HyperbolicIsometryPD(HyperbolicIsometry): [1 0] [0 1] """ - def _call_(self, p): #PD + def _call_(self, p): # PD r""" Return image of ``p`` under the action of ``self``. @@ -917,7 +917,7 @@ def _call_(self, p): #PD _image = moebius_transform(self._matrix, coords) return self.codomain().get_point(_image) - def __mul__(self, other): #PD + def __mul__(self, other): # PD r""" Return image of ``p`` under the action of ``self``. @@ -935,7 +935,7 @@ def __mul__(self, other): #PD return M.to_model('PD') return super().__mul__(other) - def __pow__(self, n): #PD + def __pow__(self, n): # PD r""" EXAMPLES:: @@ -948,7 +948,7 @@ def __pow__(self, n): #PD """ return (self._cached_isometry**n).to_model('PD') - def preserves_orientation(self): #PD + def preserves_orientation(self): # PD """ Return ``True`` if ``self`` preserves orientation and ``False`` otherwise. @@ -964,7 +964,7 @@ def preserves_orientation(self): #PD return bool(self._matrix.det() > 0) and HyperbolicIsometryPD._orientation_preserving(self._matrix) @staticmethod - def _orientation_preserving(A): #PD + def _orientation_preserving(A): # PD r""" For a matrix ``A`` of a PD isometry, determine if it preserves orientation. @@ -1001,7 +1001,7 @@ class HyperbolicIsometryKM(HyperbolicIsometry): [0 1 0] [0 0 1] """ - def _call_(self, p): #KM + def _call_(self, p): # KM r""" Return image of ``p`` under the action of ``self``. @@ -1019,7 +1019,7 @@ def _call_(self, p): #KM return self.codomain().get_point(v[0:2] / v[2]) ##################################################################### -## Helper functions +# Helper functions def moebius_transform(A, z): diff --git a/src/sage/geometry/meson.build b/src/sage/geometry/meson.build index 8906b859dde..3b48404564d 100644 --- a/src/sage/geometry/meson.build +++ b/src/sage/geometry/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'cone.py', 'cone_catalog.py', diff --git a/src/sage/geometry/polyhedron/combinatorial_polyhedron/meson.build b/src/sage/geometry/polyhedron/combinatorial_polyhedron/meson.build index 4b4ea8df4e7..a279309fc13 100644 --- a/src/sage/geometry/polyhedron/combinatorial_polyhedron/meson.build +++ b/src/sage/geometry/polyhedron/combinatorial_polyhedron/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'base.pxd', 'combinatorial_face.pxd', diff --git a/src/sage/geometry/polyhedron/meson.build b/src/sage/geometry/polyhedron/meson.build index 3b07bbdd9a5..db589c39385 100644 --- a/src/sage/geometry/polyhedron/meson.build +++ b/src/sage/geometry/polyhedron/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'backend_cdd.py', 'backend_cdd_rdf.py', diff --git a/src/sage/geometry/polyhedron/modules/formal_polyhedra_module.py b/src/sage/geometry/polyhedron/modules/formal_polyhedra_module.py index d7ef932a4cf..91101f120fc 100644 --- a/src/sage/geometry/polyhedron/modules/formal_polyhedra_module.py +++ b/src/sage/geometry/polyhedron/modules/formal_polyhedra_module.py @@ -82,7 +82,7 @@ def __classcall__(cls, base_ring, dimension, basis, category=None): """ if isinstance(basis, list): basis = tuple(basis) - if isinstance(basis, tuple): #To make sure it only check for finite input + if isinstance(basis, tuple): # To make sure it only checks for finite input from sage.geometry.polyhedron.base import Polyhedron_base for P in basis: if not isinstance(P, Polyhedron_base): diff --git a/src/sage/geometry/triangulation/meson.build b/src/sage/geometry/triangulation/meson.build index dec407d83d5..e8361a9da09 100644 --- a/src/sage/geometry/triangulation/meson.build +++ b/src/sage/geometry/triangulation/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'data.pxd', 'element.py', diff --git a/src/sage/graphs/base/meson.build b/src/sage/graphs/base/meson.build index 92e205ceb81..badf69f0478 100644 --- a/src/sage/graphs/base/meson.build +++ b/src/sage/graphs/base/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'boost_graph.pxd', 'c_graph.pxd', diff --git a/src/sage/graphs/centrality.pyx b/src/sage/graphs/centrality.pyx old mode 100755 new mode 100644 diff --git a/src/sage/graphs/chrompoly.pyx b/src/sage/graphs/chrompoly.pyx index 17a9837041b..d0ca79b60b5 100644 --- a/src/sage/graphs/chrompoly.pyx +++ b/src/sage/graphs/chrompoly.pyx @@ -31,7 +31,7 @@ from memory_allocator cimport MemoryAllocator from sage.libs.gmp.mpz cimport * from sage.rings.integer_ring import ZZ from sage.rings.integer cimport Integer -from sage.rings.ring cimport Ring +from sage.rings.ring cimport CommutativeRing from sage.rings.polynomial.polynomial_integer_dense_flint cimport Polynomial_integer_dense_flint from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing @@ -436,7 +436,7 @@ def chromatic_polynomial_with_cache(G, cache=None): ... TypeError: parameter cache must be a dictionary or None """ - cdef Ring R = PolynomialRing(ZZ, "x", implementation="FLINT") + cdef CommutativeRing R = PolynomialRing(ZZ, "x", implementation="FLINT") cdef Polynomial_integer_dense_flint one = R.one() cdef Polynomial_integer_dense_flint zero = R.zero() cdef Polynomial_integer_dense_flint x = R.gen() diff --git a/src/sage/graphs/generators/meson.build b/src/sage/graphs/generators/meson.build index 44542f2631e..c98c2647c25 100644 --- a/src/sage/graphs/generators/meson.build +++ b/src/sage/graphs/generators/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'basic.py', 'chessboard.py', diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py index 38714a483fe..1e3025117df 100644 --- a/src/sage/graphs/graph.py +++ b/src/sage/graphs/graph.py @@ -88,6 +88,8 @@ - Jean-Florent Raymond (2019-04): is_redundant, is_dominating, private_neighbors +- Cyril Bouvier (2024-11): is_module + Graph Format ------------ @@ -7181,8 +7183,109 @@ def cores(self, k=None, with_labels=False): return core return list(core.values()) - @doc_index("Leftovers") - def modular_decomposition(self, algorithm=None, style='tuple'): + @doc_index("Modules") + def is_module(self, vertices): + r""" + Check whether ``vertices`` is a module of ``self``. + + A subset `M` of the vertices of a graph is a module if for every + vertex `v` outside of `M`, either all vertices of `M` are neighbors of + `v` or all vertices of `M` are not neighbors of `v`. + + INPUT: + + - ``vertices`` -- iterable; a subset of vertices of ``self`` + + EXAMPLES: + + The whole graph, the empty set and singletons are trivial modules:: + + sage: G = graphs.PetersenGraph() + sage: G.is_module([]) + True + sage: G.is_module([G.random_vertex()]) + True + sage: G.is_module(G) + True + + Prime graphs only have trivial modules:: + + sage: G = graphs.PathGraph(5) + sage: G.is_prime() + True + sage: all(not G.is_module(S) for S in subsets(G) + ....: if len(S) > 1 and len(S) < G.order()) + True + + For edgeless graphs and complete graphs, all subsets are modules:: + + sage: G = Graph(5) + sage: all(G.is_module(S) for S in subsets(G)) + True + sage: G = graphs.CompleteGraph(5) + sage: all(G.is_module(S) for S in subsets(G)) + True + + The modules of a graph and of its complements are the same:: + + sage: G = graphs.TuranGraph(10, 3) + sage: G.is_module([0,1,2]) + True + sage: G.complement().is_module([0,1,2]) + True + sage: G.is_module([3,4,5]) + True + sage: G.complement().is_module([3,4,5]) + True + sage: G.is_module([2,3,4]) + False + sage: G.complement().is_module([2,3,4]) + False + sage: G.is_module([3,4,5,6,7,8,9]) + True + sage: G.complement().is_module([3,4,5,6,7,8,9]) + True + + Elements of ``vertices`` must be in ``self``:: + + sage: G = graphs.PetersenGraph() + sage: G.is_module(['Terry']) + Traceback (most recent call last): + ... + LookupError: vertex (Terry) is not a vertex of the graph + sage: G.is_module([1, 'Graham']) + Traceback (most recent call last): + ... + LookupError: vertex (Graham) is not a vertex of the graph + """ + M = set(vertices) + + for v in M: + if v not in self: + raise LookupError(f"vertex ({v}) is not a vertex of the graph") + + if len(M) <= 1 or len(M) == self.order(): + return True + + N = None # will contains the neighborhood of M + for v in M: + if N is None: + # first iteration, the neighborhood N must be computed + N = {u for u in self.neighbor_iterator(v) if u not in M} + else: + # check that the neighborhood of v is N + n = 0 + for u in self.neighbor_iterator(v): + if u not in M: + n += 1 + if u not in N: + return False # u is a splitter + if n != len(N): + return False + return True + + @doc_index("Modules") + def modular_decomposition(self, algorithm=None, style="tuple"): r""" Return the modular decomposition of the current graph. @@ -7190,11 +7293,21 @@ def modular_decomposition(self, algorithm=None, style='tuple'): vertex outside the module is either connected to all members of the module or to none of them. Every graph that has a nontrivial module can be partitioned into modules, and the increasingly fine partitions into - modules form a tree. The ``modular_decomposition`` function returns - that tree, using an `O(n^3)` algorithm of [HM1979]_. + modules form a tree. The ``modular_decomposition`` method returns + that tree. INPUT: + - ``algorithm`` -- string (default: ``None``); the algorithm to use + among: + + - ``None`` or ``'corneil_habib_paul_tedder'`` -- will use the + Corneil-Habib-Paul-Tedder algorithm from [TCHP2008]_, its complexity + is linear in the number of vertices and edges. + + - ``'habib_maurer'`` -- will use the Habib-Maurer algorithm from + [HM1979]_, its complexity is cubic in the number of vertices. + - ``style`` -- string (default: ``'tuple'``); specifies the output format: @@ -7204,16 +7317,10 @@ def modular_decomposition(self, algorithm=None, style='tuple'): OUTPUT: - A pair of two values (recursively encoding the decomposition) : - - * The type of the current module : - - * ``'PARALLEL'`` - * ``'PRIME'`` - * ``'SERIES'`` - - * The list of submodules (as list of pairs ``(type, list)``, - recursively...) or the vertex's name if the module is a singleton. + The modular decomposition tree, either as nested tuples (if + ``style='tuple'``) or as an object of + :class:`~sage.combinat.rooted_tree.LabelledRootedTree` (if + ``style='tree'``) Crash course on modular decomposition: @@ -7266,7 +7373,19 @@ def modular_decomposition(self, algorithm=None, style='tuple'): The Petersen Graph too:: sage: graphs.PetersenGraph().modular_decomposition() - (PRIME, [1, 4, 5, 0, 2, 6, 3, 7, 8, 9]) + (PRIME, [1, 4, 5, 0, 6, 2, 3, 9, 7, 8]) + + Graph from the :wikipedia:`Modular_decomposition`:: + + sage: G = Graph('Jv\\zoKF@wN?', format='graph6') + sage: G.relabel([1..11]) + sage: G.modular_decomposition() + (PRIME, + [(SERIES, [4, (PARALLEL, [2, 3])]), + 1, + 5, + (PARALLEL, [6, 7]), + (SERIES, [(PARALLEL, [10, 11]), 9, 8])]) This a clique on 5 vertices with 2 pendant edges, though, has a more interesting decomposition:: @@ -7275,14 +7394,20 @@ def modular_decomposition(self, algorithm=None, style='tuple'): sage: g.add_edge(0,5) sage: g.add_edge(0,6) sage: g.modular_decomposition() - (SERIES, [(PARALLEL, [(SERIES, [1, 2, 3, 4]), 5, 6]), 0]) + (SERIES, [(PARALLEL, [(SERIES, [3, 4, 2, 1]), 5, 6]), 0]) + + Turán graphs are co-graphs:: + + sage: graphs.TuranGraph(11, 3).modular_decomposition() + (SERIES, + [(PARALLEL, [7, 8, 9, 10]), (PARALLEL, [3, 4, 5, 6]), (PARALLEL, [0, 1, 2])]) We can choose output to be a :class:`~sage.combinat.rooted_tree.LabelledRootedTree`:: sage: g.modular_decomposition(style='tree') SERIES[0[], PARALLEL[5[], 6[], SERIES[1[], 2[], 3[], 4[]]]] - sage: ascii_art(g.modular_decomposition(style='tree')) + sage: ascii_art(g.modular_decomposition(algorithm="habib_maurer",style='tree')) __SERIES / / 0 ___PARALLEL @@ -7293,7 +7418,9 @@ def modular_decomposition(self, algorithm=None, style='tuple'): ALGORITHM: - This function uses the algorithm of M. Habib and M. Maurer [HM1979]_. + This function can use either the algorithm of D. Corneil, M. Habib, C. + Paul and M. Tedder [TCHP2008]_ or the algorithm of M. Habib and M. + Maurer [HM1979]_. .. SEEALSO:: @@ -7301,10 +7428,16 @@ def modular_decomposition(self, algorithm=None, style='tuple'): - :class:`~sage.combinat.rooted_tree.LabelledRootedTree`. + - :func:`~sage.graphs.graph_decompositions.modular_decomposition.corneil_habib_paul_tedder_algorithm` + + - :func:`~sage.graphs.graph_decompositions.modular_decomposition.habib_maurer_algorithm` + .. NOTE:: - A buggy implementation of linear time algorithm from [TCHP2008]_ was - removed in Sage 9.7, see :issue:`25872`. + A buggy implementation of the linear time algorithm from [TCHP2008]_ + was removed in Sage 9.7, see :issue:`25872`. A new implementation + was reintroduced in Sage 10.6 after some corrections to the original + algorithm, see :issue:`39038`. TESTS: @@ -7343,41 +7476,33 @@ def modular_decomposition(self, algorithm=None, style='tuple'): sage: G2 = Graph('F@Nfg') sage: G1.is_isomorphic(G2) True - sage: G1.modular_decomposition() + sage: G1.modular_decomposition(algorithm="habib_maurer") (PRIME, [1, 2, 5, 6, 0, (PARALLEL, [3, 4])]) - sage: G2.modular_decomposition() + sage: G2.modular_decomposition(algorithm="habib_maurer") (PRIME, [5, 6, 3, 4, 2, (PARALLEL, [0, 1])]) + sage: G1.modular_decomposition(algorithm="corneil_habib_paul_tedder") + (PRIME, [6, 5, 1, 2, 0, (PARALLEL, [3, 4])]) + sage: G2.modular_decomposition(algorithm="corneil_habib_paul_tedder") + (PRIME, [6, 5, (PARALLEL, [0, 1]), 2, 3, 4]) Check that :issue:`37631` is fixed:: sage: G = Graph('GxJEE?') - sage: G.modular_decomposition(style='tree') + sage: G.modular_decomposition(algorithm="habib_maurer",style='tree') PRIME[2[], SERIES[0[], 1[]], PARALLEL[3[], 4[]], PARALLEL[5[], 6[], 7[]]] """ - from sage.graphs.graph_decompositions.modular_decomposition import (NodeType, - habib_maurer_algorithm, - create_prime_node, - create_normal_node) - - if algorithm is not None: - from sage.misc.superseded import deprecation - deprecation(25872, "algorithm=... parameter is obsolete and has no effect.") - self._scream_if_not_simple() + from sage.graphs.graph_decompositions.modular_decomposition import \ + modular_decomposition - if not self.order(): - D = None - elif self.order() == 1: - D = create_normal_node(next(self.vertex_iterator())) - else: - D = habib_maurer_algorithm(self) + D = modular_decomposition(self, algorithm=algorithm) if style == 'tuple': - if D is None: + if D.is_empty(): return tuple() def relabel(x): - if x.node_type == NodeType.NORMAL: + if x.is_leaf(): return x.children[0] return x.node_type, [relabel(y) for y in x.children] @@ -7385,11 +7510,11 @@ def relabel(x): elif style == 'tree': from sage.combinat.rooted_tree import LabelledRootedTree - if D is None: + if D.is_empty(): return LabelledRootedTree([]) def to_tree(x): - if x.node_type == NodeType.NORMAL: + if x.is_leaf(): return LabelledRootedTree([], label=x.children[0]) return LabelledRootedTree([to_tree(y) for y in x.children], label=x.node_type) @@ -7640,7 +7765,14 @@ def is_prime(self, algorithm=None): A graph is prime if all its modules are trivial (i.e. empty, all of the graph or singletons) -- see :meth:`modular_decomposition`. - Use the `O(n^3)` algorithm of [HM1979]_. + This method computes the modular decomposition tree using + :meth:`~sage.graphs.graph.Graph.modular_decomposition`. + + INPUT: + + - ``algorithm`` -- string (default: ``None``); the algorithm used to + compute the modular decomposition tree; the value is forwarded + directly to :meth:`~sage.graphs.graph.Graph.modular_decomposition`. EXAMPLES: @@ -7661,17 +7793,15 @@ def is_prime(self, algorithm=None): sage: graphs.EmptyGraph().is_prime() True """ - if algorithm is not None: - from sage.misc.superseded import deprecation - deprecation(25872, "algorithm=... parameter is obsolete and has no effect.") - from sage.graphs.graph_decompositions.modular_decomposition import NodeType + from sage.graphs.graph_decompositions.modular_decomposition import \ + modular_decomposition if self.order() <= 1: return True - D = self.modular_decomposition() + MD = modular_decomposition(self, algorithm=algorithm) - return D[0] == NodeType.PRIME and len(D[1]) == self.order() + return MD.is_prime() and len(MD.children) == self.order() @doc_index("Connectivity, orientations, trees") def gomory_hu_tree(self, algorithm=None, solver=None, verbose=0, diff --git a/src/sage/graphs/graph_decompositions/meson.build b/src/sage/graphs/graph_decompositions/meson.build index 1fc8bc1d765..913c682ebac 100644 --- a/src/sage/graphs/graph_decompositions/meson.build +++ b/src/sage/graphs/graph_decompositions/meson.build @@ -8,10 +8,11 @@ endif rw = cc.find_library('rw') py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_tdlib.py', 'fast_digraph.pxd', - 'modular_decomposition.py', + 'modular_decomposition.pxd', 'rankwidth.pxd', 'slice_decomposition.pxd', 'tree_decomposition.pxd', @@ -43,6 +44,7 @@ endforeach extension_data_cpp = { 'clique_separators': files('clique_separators.pyx'), 'slice_decomposition' : files('slice_decomposition.pyx'), + 'modular_decomposition' : files('modular_decomposition.pyx'), } foreach name, pyx : extension_data_cpp diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.hpp b/src/sage/graphs/graph_decompositions/modular_decomposition.hpp new file mode 100644 index 00000000000..4b14b03c1bf --- /dev/null +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.hpp @@ -0,0 +1,857 @@ +/* + * Copyright (C) 2024 Cyril Bouvier + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * https://www.gnu.org/licenses/ + */ + +/* + * This file contains inline implementations of utility structs, classes and + * functions used in the implementation of the modular decomposition method + * + * AUTHORS: + * + * - Cyril Bouvier (2024): code for second implementation of the linear time + * algorithm of D. Corneil, M. Habib, C. Paul and M. Tedder [TCHP2008]_ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Labels attached to nodes of a partitive forest. For the meaning of the + * different values, see algorithms 3 and 4 of [TCHP2008]_. + */ +enum class Label : uint8_t { + EMPTY = 0b00, + HOMOGENEOUS = 0b01, + BROKEN = 0b10, + DEAD = 0b11 +}; + +/* + * Flags attached to nodes of a partitive forest. For the meaning of the flag, + * see algorithms 3 and 4 of [TCHP2008]_. + */ +enum class Flag : uint8_t { + UNFLAGGED = 0b00, + FLAGGED = 0b01 +}; + +/* + * A node of a modular decomposition tree is either a leaf or an internal node. + * An internal node can be prime, series or parallel. + */ +enum class Type : uint8_t { + PRIME = 0, + SERIES = 1, + PARALLEL = 2, + LEAF = 3 +}; + +/* + * This struct is used to have a nice interface to the data describing a slice + * decomposition. The slice decomposition is needed by the algorithm that + * compute the modular decomposition. + */ +struct SDData { + /* + * Set the members of the struct; it is useful to initialized the struct + * from the output of the extended_lex_BFS method. + */ + void set_from_data(size_t lex_label_offset_arg, + const int* sigma_arg, + const size_t *xslice_len_arg, + const std::vector *lex_label_arg) { + lex_label_offset = lex_label_offset_arg; + sigma = sigma_arg; + xslice_len = xslice_len_arg; + lex_label = lex_label_arg; + } + + /* + * Set the members of the struct to represent the subslice of sd starting at + * the given offset. + */ + void set_to_subslice(const SDData &sd, size_t offset) { + lex_label_offset = sd.lex_label[offset].size(); + sigma = sd.sigma + offset; + xslice_len = sd.xslice_len + offset; + lex_label = sd.lex_label + offset; + } + + /* + * Return the number of lexicographic labels of the ith vertex of the slice + * decomposition. + */ + size_t lex_label_size(size_t i) const { + if (lex_label[i].size() <= lex_label_offset) { + return 0; + } else { + return lex_label[i].size() - lex_label_offset; + } + } + + /* + * Return the pointer to the lexicographic labels of the ith vertex of the + * slice decomposition. + */ + const int * lex_label_ptr(size_t i) const { + if (lex_label[i].size() <= lex_label_offset) { + return nullptr; + } else { + return lex_label[i].data() + lex_label_offset; + } + } + + /* Return the index of the first slice (always 1). */ + size_t first_slice_index() const { + return 1; + } + + /* Return the index of the slice following the one starting at idx. */ + size_t next_slice_index(size_t idx) const { + return idx + xslice_len[idx]; + } + + /* Return the number of vertices in the slice decomposition. */ + size_t size() const { + return xslice_len[0]; + } + + /* + * Check whether the pivot has any neighbor (i.e., the first slice has no + * lexicographic labels). + */ + bool is_pivot_isolated () const { + return lex_label[1].size() <= lex_label_offset; + } + + size_t lex_label_offset; + const int *sigma; + const size_t *xslice_len; + const std::vector *lex_label; +}; + +/* + * This struct represents a node of a modular decomposition tree. It contains a + * pointer to its parent (or nullptr for the root), a list of children (must be + * empty for leaf) and a type (from the enum Type). + * A leaf of a modular decomposition tree corresponds to a vertex of the graph. + * The id of the vertex is stored in the vertex attribute of the struct. For + * internal nodes, the vertex attribute is used to store the id of any vertex + * belonging to the corresponding module. + * The attributes label, flag, slice, cc_tag are used by the different parts of + * the algorithm that computes the modular decomposition tree. + */ +struct md_tree_node { + /* ctor for non-leaf node */ + md_tree_node(Type type, Label label, Flag flag) + : parent(nullptr), vertex(INT_MAX), type(type), + label(label), flag(flag), + slice(SIZE_MAX), cc_tag(SIZE_MAX) { + } + + /* ctor for leaf */ + md_tree_node(int vertex) + : parent(nullptr), vertex(vertex), type(Type::LEAF), + label(Label::EMPTY), flag(Flag::UNFLAGGED), + slice(SIZE_MAX), cc_tag(SIZE_MAX) { + } + + /* ctor for non-leaf node, with default label and flag. */ + md_tree_node(Type type) + : md_tree_node(type, Label::EMPTY, Flag::UNFLAGGED) { + } + + /* check whether the node is a leaf. */ + bool is_leaf() const { + return type == Type::LEAF; + } + + /* check whether the node is prime. */ + bool is_prime() const { + return type == Type::PRIME; + } + + /* check whether the node is series. */ + bool is_series() const { + return type == Type::SERIES; + } + + /* check whether the node is parallel. */ + bool is_parallel() const { + return type == Type::PARALLEL; + } + + /* check whether the node is degenerate (i.e., series or parallel). */ + bool is_degenerate() const { + return type == Type::SERIES || type == Type::PARALLEL; + } + + /* + * The following methods are used to check the different possible status of + * the label of the node + */ + bool is_empty() const { + return label == Label::EMPTY; + } + + bool is_homogeneous() const { + return label == Label::HOMOGENEOUS; + } + + bool is_homogeneous_or_empty() const { + return !(static_cast(label) >> 1U); + } + + bool is_broken() const { + return label == Label::BROKEN; + } + + bool is_dead() const { + return label == Label::DEAD; + } + + bool is_dead_or_broken() const { + return static_cast(label) >> 1U; + } + + /* add the node c at the beginning of the list of children. */ + void prepend_new_child(md_tree_node *c) { + c->parent = this; + if (children.empty()) { + vertex = c->vertex; + } + children.push_front(c); + } + + /* add the node c at the end of the list of children. */ + void append_new_child(md_tree_node *c) { + c->parent = this; + if (children.empty()) { + vertex = c->vertex; + } + children.push_back(c); + } + + /* + * "Stole" the children from the node n and add them at the end of the list + * of children. ("stole" here means that at the end of this method, the list + * of children of n will be empty). + */ + void append_stolen_children_from(md_tree_node *n) { + if (!n->children.empty()) { + for (md_tree_node *c: n->children) { + c->parent = this; + } + if (children.empty()) { + vertex = n->children.front()->vertex; + } + children.splice(children.end(), n->children); + } + } + + /* Set the label and flag for all nodes of the tree. */ + void set_label_and_flag_recursively(Label l, Flag f) { + label = l; + flag = f; + for (md_tree_node *c: children) { + c->set_label_and_flag_recursively(l, f); + } + } + + md_tree_node *parent; + std::list children; + int vertex; + Type type; + Label label; + Flag flag; + size_t slice; + size_t cc_tag; +}; + +/* A forest is a list of tree */ +using md_forest = std::list; + +/* + * This struct is used to gather data structures needed by the different parts + * of the algorithm computing the modular decomposition tree. It is created + * at the beginning of the algorithm and pass along to any function that needs + * it. The hope is that it will reduce the number of allocations/deallocations + * because the number of creations and destructions of objects will be reduced. + */ +struct ScratchData { + /* + * Sub structure containing objects needed by the implementation of + * algorithms 3 and 4 of [TCHP2008]_. + */ + struct MDSequences { + std::unordered_map leaves; + std::unordered_set Marked; + std::unordered_set Full; + std::deque Explore; + }; + + /* + * Sub structure containing objects needed by the implementation of + * algorithms 5 and 6 of [TCHP2008]_. + */ + struct Clusters { + /* Assumes i < p < j where p is the index of the "cluster" {x}. */ + bool are_clusters_non_adjacent(size_t i, size_t j) const { + size_t sj = clusters[j].front()->slice; + auto e = std::make_pair(0, sj); + for (const md_tree_node *mi: clusters[i]) { + e.first = mi->vertex; + auto it = module_slice_adjacency.find(e); + if (it != module_slice_adjacency.end()) { + return false; + } + } + return true; + } + + struct pair_hash { + inline size_t operator()(const std::pair &v) const { + return ((size_t) v.first)*31+v.second; + } + }; + + std::vector> clusters; + /* adjacency list between a module (represented using the corresponding + * .vertex from the root node) and a slice. + */ + std::unordered_set, pair_hash> module_slice_adjacency; + std::vector Left; + std::vector Right; + std::unordered_map cluster_of_v; + }; + + /* Allocate the node corresponding to the vertex, and add it to the map */ + md_tree_node *new_leaf(int vertex) { + return mdseq.leaves[vertex] = new md_tree_node(vertex); + } + + MDSequences mdseq; + Clusters clusters; +}; + +/* + * This function deallocate (using delete) the node n and all of its + * descendants. It is needed to deallocate the modular decomposition tree + * computed by the function corneil_habib_paul_tedder_inner. + */ +void dealloc_md_tree_nodes_recursively(md_tree_node *n) { + for (md_tree_node *c: n->children) { + dealloc_md_tree_nodes_recursively(c); + } + delete n; +} + +/* Preprocess the trees in the forest: set the label to empty and the flag to + * unflagged for all the nodes, and set the cc_tag needed to compute the cluster + * later. + */ +void md_forest_preprocess(md_forest &MDi) { + Type one_cc_type = Type::PARALLEL; /* only for first iteration */ + size_t s = 0; + for (md_tree_node *md: MDi) { + md->set_label_and_flag_recursively(Label::EMPTY, Flag::UNFLAGGED); + md->slice = s; + if (md->type == Type::PRIME || md->type == one_cc_type) { + md->cc_tag = 0; + } else { + md->cc_tag = SIZE_MAX; + size_t i = 0; + for (md_tree_node *c: md->children) { + c->cc_tag = i; + i++; + } + } + one_cc_type = Type::SERIES; + s += 1; + } +} + +/* + * This function set to BROKEN the ancestors of DEAD nodes and gather into one + * node the HOMOGENEOUS and EMPTY childrend of a broken and degenerate node. + * Corresponds to the end of algorithm 3 of [TCHP2008]_. + */ +void mark_partitive_forest_finish_inner_rec(md_tree_node *r) { + size_t nb = 0; /* number of HOMOGENEOUS or EMPTY children */ + + /* Do a postorder visit: so we first visit the children */ + for (md_tree_node *c: r->children) { + mark_partitive_forest_finish_inner_rec(c); + nb += c->is_homogeneous_or_empty(); + } + + if (r->is_dead_or_broken()) { + if (r->parent != nullptr && !(r->parent->is_dead())) { + /* if parent.label is not DEAD set it to BROKEN */ + r->parent->label = Label::BROKEN; + } + if (r->is_broken() && r->is_degenerate() && nb > 1) { + md_tree_node *newnode = new md_tree_node(r->type, Label::EMPTY, + Flag::UNFLAGGED); + + /* Iterate over the children to gather HOMOGENEOUS and EMPTY + * child under newnode + * */ + auto it = r->children.begin(); + while (it != r->children.end()) { + if ((*it)->is_homogeneous_or_empty()) { + newnode->append_new_child(*it); + it = r->children.erase(it); /* get iterator to next child */ + } else { + ++it; + } + + } + r->append_new_child(newnode); + } + } +} + +/* This is an implementation of algorithm 3 of [TCHP2008]_. */ +void md_forest_mark_partitive_forest(md_forest &MDi, const SDData &sd, + ScratchData::MDSequences &scratch) { + size_t i = sd.first_slice_index(); + i = sd.next_slice_index(i); /* skip first slice */ + scratch.Explore.clear(); + for (; i < sd.size(); i = sd.next_slice_index(i)) { + scratch.Marked.clear(); + scratch.Full.clear(); + + for (auto it = sd.lex_label[i].begin() + sd.lex_label_offset; + it != sd.lex_label[i].end() ; ++it) { + scratch.Explore.push_back(scratch.leaves.at(*it)); + } + + while (scratch.Explore.size() > 0) { + md_tree_node *n = scratch.Explore.front(); + scratch.Explore.pop_front(); + md_tree_node *p = n->parent; + scratch.Full.insert(n); + if (n->is_empty()) { + n->label = Label::HOMOGENEOUS; + } + if (p) { + scratch.Marked.insert(p); + /* if all children of p are Full, move p to Explore */ + bool b = true; + for (md_tree_node *c: p->children) { + if (scratch.Full.find(c) == scratch.Full.end()) { + b = false; + break; + } + } + if (b) { + scratch.Marked.erase(p); + scratch.Explore.push_back(p); + } + } + } + + for (md_tree_node *n: scratch.Marked) { + /* If n is SERIES or PARALLEL => gather children of n in Full below + * the same new node A (needed only if there are >= 2 such children) + * and the children of n not in Full below the same new node B + * (needed only if there is >= 2 such children). + */ + if (n->is_degenerate() && n->children.size() > 2) { + Type t = n->type; + md_tree_node *newnodes[2] = { + new md_tree_node(t, Label::HOMOGENEOUS, Flag::FLAGGED), + new md_tree_node(t, Label::EMPTY, Flag::UNFLAGGED) + }; + auto end = n->children.end(); + for (auto it = n->children.begin(); it != end; ++it){ + bool notFull = scratch.Full.find(*it) == scratch.Full.end(); + newnodes[notFull]->append_new_child(*it); + } + n->children.clear(); + for (size_t i = 0; i < 2; i++) { + if (newnodes[i]->children.size() == 1) { + n->append_new_child(newnodes[i]->children.front()); + } else { + n->append_new_child(newnodes[i]); + } + } + } + + if (n->label != Label::DEAD) { + n->label = Label::DEAD; + /* Set flag to * for children of n that are in Full */ + for (md_tree_node *c: n->children) { + if (scratch.Full.find(c) != scratch.Full.end()) { + c->flag = Flag::FLAGGED; + } + } + } + } + } + + for (md_tree_node *md: MDi) { + mark_partitive_forest_finish_inner_rec(md); + } +} + +/* This function is needed by md_forest_extract_and_sort. */ +void sort_broken_nodes_recursively(md_tree_node *n, + bool dead_and_broken_first) { + if (n->is_dead_or_broken()) { + /* If the label is not DEAD or BROKEN, no need to go deeper: they + * will not be any DEAD or BROKEN nodes. + */ + for (md_tree_node *c: n->children) { + sort_broken_nodes_recursively(c, dead_and_broken_first); + } + + if (n->is_broken()) { + /* if dead_and_broken_first is true + * => put DEAD and BROKEN children at the beginning + * if dead_and_broken_first is false + * => put EMPTY and HOMOGENEOUS children at the beginning + */ + auto b = n->children.begin(); + auto end = n->children.end(); + for (auto it = n->children.begin(); it != end; ++it) { + if (dead_and_broken_first == (*it)->is_dead_or_broken()) { + std::iter_swap(it, b); + ++b; + } + } + } + } +} + +/* This function is needed by md_forest_extract_and_sort. */ +void sort_dead_nodes_recursively(md_tree_node *n, bool flagged_first) { + if (n->is_dead_or_broken()) { + /* If the label is not DEAD or BROKEN, no need to go deeper: they + * will not be any DEAD or BROKEN nodes. + */ + for (md_tree_node *c: n->children) { + sort_dead_nodes_recursively(c, flagged_first); + } + + if (n->is_dead()) { + /* if flagged_first is true => put flagged children at the beginning + * if flagged_first is talse => put unflagged children at the beginning + */ + auto b = n->children.begin(); + auto end = n->children.end(); + for (auto it = n->children.begin(); it != end; ++it) { + if (flagged_first == ((*it)->flag == Flag::FLAGGED)) { + std::iter_swap(it, b); + ++b; + } + } + } + } +} + +/* This is an implementation of algorithm 4 of [TCHP2008]_. */ +void md_forest_extract_and_sort(md_forest &MDi) { + bool is_first_slice = true; + auto it = MDi.begin(); + while (it != MDi.end()) { + md_tree_node *md = *it; + /* sort children of DEAD nodes */ + sort_dead_nodes_recursively(md, is_first_slice); + /* sort children of BROKEN nodes */ + sort_broken_nodes_recursively(md, is_first_slice); + + /* remove DEAD and BROKEN nodes */ + auto it_delete = it; + ++it; + while (it_delete != it) { + md_tree_node *r = *it_delete; + if (r->is_dead_or_broken()) { + for (md_tree_node *c: r->children) { + /* propagate cc tag and slice, if set */ + c->cc_tag = r->cc_tag != SIZE_MAX ? r->cc_tag : c->cc_tag; + c->slice = r->slice != SIZE_MAX ? r->slice : c->slice; + c->parent = nullptr; + } + auto insert_it = MDi.erase(it_delete); + it_delete = r->children.begin(); + MDi.splice(insert_it, r->children); + delete r; + } else { + it_delete++; + } + } + + is_first_slice = false; + } +} + +/* + * This function gathers the trees of the forest in clusters. A cluster is a set + * of trees that belongs to the same slice and (co)connected components. + * It also computes the Left and Right of the clusters (see section 5.2 of + * [TCHP2008]_. + */ +void md_forest_clusters_computation(const md_forest &MDi, const SDData &sd, + ScratchData::Clusters &scratch) { + scratch.clusters.clear(); + scratch.cluster_of_v.clear(); + size_t prev_cc = SIZE_MAX, prev_slice = SIZE_MAX; + for (md_tree_node *n: MDi) { + size_t cc = n->cc_tag; + size_t slice = n->slice; + int v = n->vertex; /* a vertex belonging to the module */ + + if (cc == SIZE_MAX) { /* n is alone in the cluster */ + scratch.clusters.emplace_back(1, n); /* new cluster */ + } else { + if (cc != prev_cc || slice != prev_slice) { + scratch.clusters.emplace_back(); /* start new cluster */ + } + scratch.clusters.back().push_back(n); + } + + prev_cc = cc; + prev_slice = slice; + scratch.cluster_of_v[v] = scratch.clusters.size()-1; + } + + size_t p = scratch.cluster_of_v[sd.sigma[0]]; + size_t q = scratch.clusters.size(); + + /* Left and Right computation. + * Left(i) == i if i <= p + * Left(i) == Left(j) for p < i,j if clusters Ki and Kj in same slice + * Right(i) = p for 0 <= i <= p + * Also compute adjacency between modules and slices (except the first one). + */ + scratch.Left.clear(); + scratch.Right.clear(); + scratch.module_slice_adjacency.clear(); + scratch.Left.reserve(q); + scratch.Right.reserve(q); + for (size_t i = 0; i <= p; i++) { + scratch.Left.push_back(i); + } + scratch.Right.resize(p+1, p); /* Right[i] = p for 0 <= i <= p */ + for (size_t i = p+1; i < q; i++) { + scratch.Right.push_back(i); + } + for (size_t i = sd.first_slice_index(), s = 0, j = 0; i < sd.size(); + i = sd.next_slice_index(i), s++) { + size_t j0 = j; + /* Compute j, the highest index of a cluster of the current slice s */ + for (; j+1 < q && scratch.clusters[j+1].front()->slice == s; j++); + + if (s == 0) { /* nothing to do for the first slice */ + j += 1; /* skip "cluster" {x} */ + } else { + /* for Right and module_slice_adjacency: iterate over the + * lexicographic labels of the slice. + */ + for (auto it = sd.lex_label[i].begin() + sd.lex_label_offset; + it != sd.lex_label[i].end() ; ++it) { + auto c = scratch.cluster_of_v.find(*it); + if (c != scratch.cluster_of_v.end()) { + scratch.module_slice_adjacency.emplace(*it, s); + /* cluster j is adjacent to cluster containing c so Right of + * the cluster c is >= j + */ + scratch.Right[c->second] = j; + } + } + + /* for Left: find the cluster of the first non adjacent module */ + size_t lp; /* lp will be the Left for all clusters of the slice */ + for (lp = 0; lp < p; lp++) { + bool adj = true; + for (const md_tree_node *m: scratch.clusters[lp]) { + if (scratch.module_slice_adjacency.find(std::make_pair(m->vertex, s)) == scratch.module_slice_adjacency.end()) { + adj = false; + break; + } + } + if (!adj) { + break; + } + } + /* Left is lp for all clusters of the slice s */ + std::fill_n(std::back_inserter(scratch.Left), j-j0, lp); + } + } + +} + +/* This is an implementation of algorithms 5 and 6 of [TCHP2008]_. */ +md_tree_node *md_forest_parse_and_assemble(md_tree_node *root, size_t p, + const ScratchData::Clusters &scratch) { + size_t q = scratch.clusters.size(); + size_t l = p; + size_t r = p; + while (l > 0 || r+1 < q) { + Type t; + size_t i; + size_t lp, old_l = l; + size_t rp, old_r = r; + + if (r+1 == q || (l>0 && scratch.are_clusters_non_adjacent(l-1, r+1))) { + lp = l-1; + rp = r; + t = Type::SERIES; + } else { + lp = l; + rp = r+1; + t = Type::PARALLEL; + } + + while (lp < l || r < rp) { + if (lp < l) { + i = l = l-1; + } else { + i = r = r+1; + } + lp = std::min(lp, scratch.Left[i]); + rp = std::max(rp, scratch.Right[i]); + } + + t = (r-l)-(old_r-old_l) > 1 ? Type::PRIME : t; + md_tree_node *old_root = root; + root = new md_tree_node(t); + + for (size_t i = l; i <= r; i++) { + if (i == old_l) { /* add the previous root */ + root->append_new_child(old_root); + i = old_r; + } else { + for (md_tree_node *m: scratch.clusters[i]) { + if (t != Type::PRIME && m->type == t) { + root->append_stolen_children_from(m); + delete m; + } else { + root->append_new_child(m); + } + } + } + } + } + return root; +} + +/* This is the main function: it corresponds to algorithms 7 of [TCHP2008]_. */ +md_tree_node *corneil_habib_paul_tedder_inner_rec(const SDData &sd, + ScratchData &scratch) { + if (sd.size() == 0) { /* empty graph */ + return nullptr; + } + + SDData sub_sd; + std::list MDi; + int x = sd.sigma[0]; + + /* First create a new leaf for x */ + md_tree_node *root = scratch.new_leaf(x); + + if (sd.size() == 1) { /* graph with one vertex */ + return root; + } else if (sd.size() == 2) { /* graph with two vertices */ + int y = sd.sigma[1]; + /* root is SERIES if there is an edge between x and y, else PARALLEL */ + Type t = sd.is_pivot_isolated() ? Type::PARALLEL : Type::SERIES; + root = new md_tree_node(t); + root->append_new_child(scratch.mdseq.leaves[x]); + root->append_new_child(scratch.new_leaf(y)); + return root; + } + + /* Now it is known that the graph has more than two vertices */ + + /* Recursive calls on all the slices */ + size_t first_of_last_slice = 1; /* set to 1 to remove warning */ + for (size_t i = sd.first_slice_index(); i < sd.size(); + i = sd.next_slice_index(i)) { + first_of_last_slice = i; + sub_sd.set_to_subslice(sd, i); + md_tree_node *md = corneil_habib_paul_tedder_inner_rec(sub_sd, scratch); + MDi.push_back(md); + } + + if (sd.is_pivot_isolated()) { /* x is isolated (i.e., has no neighbor) */ + md_tree_node *md = MDi.front(); /* only one slice in this case */ + if (md->type == Type::PARALLEL) { + root = md; + } else { + root = new md_tree_node(Type::PARALLEL); + root->append_new_child(md); + } + root->prepend_new_child(scratch.mdseq.leaves[x]); + return root; + } + + /* Now, it is known that x has at least one neighbor, so the first slice + * contains the neighborhood of x. + * If G is not connected, the last slice is all the connected components + * that do not contains x, it should be treated separately: the tree + * corresponding to the last slice is removed from MDi and will be added + * back before the clusters computation. + */ + md_tree_node *last_md = nullptr; + if (sd.lex_label_size(first_of_last_slice) == 0) { /* not connected */ + last_md = MDi.back(); + last_md->slice = MDi.size()-1; /* remember the slice */ + MDi.pop_back(); + } + + /* Preprocessing of the sub md trees: + * - set the slice attribute + * - set the connected components tag (for clusters computation later) + * - set label to EMPTY and flag to UNFLAGGED on all nodes + */ + md_forest_preprocess(MDi); + + /* Add the pivot {x} in MDi after the first slice (= the neighbors of x) */ + MDi.insert(++MDi.begin(), root); + + /* Mark partitive forest */ + md_forest_mark_partitive_forest(MDi, sd, scratch.mdseq); + + /* Extract and sort */ + md_forest_extract_and_sort(MDi); + + /* Add back the last slice if graph is not connected */ + if (last_md != nullptr) { + MDi.push_back(last_md); + } + + /* Postprocessing for connected (co-)components of slices: compute the + * factoring x-m-cluster sequence + */ + md_forest_clusters_computation(MDi, sd, scratch.clusters); + + size_t p = scratch.clusters.cluster_of_v[x]; + + /* Parse and assemble */ + root = md_forest_parse_and_assemble(root, p, scratch.clusters); + + return root; +} + +/* + * It is the function exported in the pxd file. It creates the ScratchData + * struct before calling the algorithm. + */ +md_tree_node *corneil_habib_paul_tedder_inner(const SDData &sd) { + ScratchData tmp; + return corneil_habib_paul_tedder_inner_rec(sd, tmp); +} diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pxd b/src/sage/graphs/graph_decompositions/modular_decomposition.pxd new file mode 100644 index 00000000000..f8807be6266 --- /dev/null +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pxd @@ -0,0 +1,26 @@ +from libcpp cimport bool +from libcpp.list cimport list as cpplist +from libcpp.vector cimport vector + +cdef extern from "modular_decomposition.hpp": + cdef cppclass SDData: + void set_from_data(size_t lex_label_offset, const int* sigma, + const size_t *xslice_len, + const vector[int] *lex_label) + + cdef cppclass md_tree_node: + bool is_leaf() const + bool is_prime() const + bool is_parallel() const + bool is_series() const + cpplist[md_tree_node *] children + # If is_leaf() is true, the attribute 'vertex' contains the id of the + # corresponding vertex. If is_leaf() is false, the attribute 'vertex' + # contains the id of a vertex corresponding to any leaf below + # the node (i.e., 'vertex' contains the id of a vertex belonging to the + # module corresponding to the node). + int vertex + + void dealloc_md_tree_nodes_recursively(md_tree_node *) + + cdef md_tree_node * corneil_habib_paul_tedder_inner(const SDData &SD) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.py b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx similarity index 70% rename from src/sage/graphs/graph_decompositions/modular_decomposition.py rename to src/sage/graphs/graph_decompositions/modular_decomposition.pyx index 001f127d63d..3616f63259b 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.py +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -1,11 +1,25 @@ +# distutils: language = c++ +# distutils: extra_compile_args = -std=c++11 r""" Modular Decomposition This module implements the function for computing the modular decomposition of undirected graphs. + +AUTHORS: + +- Lokesh Jain (2017): first implementation of the linear time algorithm of + D. Corneil, M. Habib, C. Paul and M. Tedder [TCHP2008]_ + +- David Einstein (2018): added the algorithm of M. Habib and M. Maurer [HM1979]_ + +- Cyril Bouvier (2024): second implementation of the linear time algorithm + of D. Corneil, M. Habib, C. Paul and M. Tedder [TCHP2008]_ """ # **************************************************************************** # Copyright (C) 2017 Lokesh Jain +# 2018 David Einstein +# 2024 Cyril Bouvier # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -13,15 +27,144 @@ # (at your option) any later version. # https://www.gnu.org/licenses/ # **************************************************************************** +from cython.operator cimport dereference as deref -from enum import Enum, IntEnum +from enum import IntEnum +from sage.graphs.base.c_graph cimport CGraph, CGraphBackend +from sage.graphs.graph_decompositions.slice_decomposition cimport \ + extended_lex_BFS +from sage.groups.perm_gps.permgroup_element import PermutationGroupElement from sage.misc.lazy_import import lazy_import from sage.misc.random_testing import random_testing -lazy_import('sage.groups.perm_gps.permgroup_element', 'PermutationGroupElement') + +################################################################################ +# Corneil-Habib-Paul-Tedder algorithm # +################################################################################ +def corneil_habib_paul_tedder_algorithm(G): + r""" + Compute the modular decomposition by the algorithm of Corneil, Habib, Paul + and Tedder. + + INPUT: + + - ``G`` -- the graph for which modular decomposition tree needs to be + computed + + OUTPUT: an object of type Node representing the modular decomposition tree + of the graph G + + This function computes the modular decomposition of the given graph by the + algorithm of Corneil, Habib, Paul and Tedder [TCHP2008]_. It is a recursive, + linear-time algorithm that first computes the slice decomposition of the + graph (via the extended lexBFS algorithm) and then computes the modular + decomposition by calling itself recursively on the slices of the previously + computed slice decomposition. + + This functions is based on the last version of the paper [TCHP2008]_. + Previous versions of the paper and previous implementations were found to + contains errors, see [AP2024]_. + + .. SEEALSO:: + + * :mod:`~sage.graphs.graph_decompositions.slice_decomposition` -- + compute a slice decomposition of the simple undirect graph + + This function should not be used directly, it should be called via the + ``modular_decomposition`` method of ``Graph`` with the parameter + ``algorithm='corneil_habib_paul_tedder'``. + + This functions assumes that ``graph`` is a object of the class ``Graph`` and + is a simple graph. + + TESTS:: + + sage: from sage.graphs.graph_decompositions.modular_decomposition import * + sage: recreate_decomposition(15, corneil_habib_paul_tedder_algorithm, + ....: 3, 4, 0.2) + sage: recreate_decomposition(10, corneil_habib_paul_tedder_algorithm, + ....: 4, 5, 0.2) + sage: recreate_decomposition(3, corneil_habib_paul_tedder_algorithm, + ....: 6, 5, 0.2) + + sage: H = Graph('Hv|mmjz', format='graph6') + sage: H.relabel('abcdefghi') # counter-exemple graph from [AP2024]_ + sage: H.modular_decomposition() + (SERIES, + [(PRIME, ['e', (PARALLEL, ['g', 'h']), 'b', 'c']), + (PARALLEL, [(SERIES, ['i', 'd', 'a']), 'f'])]) + """ + cdef CGraphBackend Gbackend = G._backend + cdef CGraph cg = Gbackend.cg() + + cdef vector[int] sigma + cdef vector[vector[int]] lex_label + cdef vector[size_t] xslice_len + + # Compute the slice decomposition using the extended lexBFS algorithm + extended_lex_BFS(cg, sigma, NULL, -1, NULL, &xslice_len, &lex_label) + + cdef SDData SD + SD.set_from_data(0, sigma.data(), xslice_len.data(), lex_label.data()) + + MD = corneil_habib_paul_tedder_inner(SD) + + r = md_tree_node_to_md_tree(MD, Gbackend) + dealloc_md_tree_nodes_recursively(MD) + return r + + +cdef object _md_tree_node_to_md_tree_inner_rec(const md_tree_node *n, + CGraphBackend Gb): + """ + Utility function for :func:`md_tree_node_to_md_tree`. + """ + cdef md_tree_node *c + if deref(n).is_leaf(): + return Node.create_leaf(Gb.vertex_label(deref(n).vertex)) + + if deref(n).is_series(): + node = Node(NodeType.SERIES) + elif deref(n).is_parallel(): + node = Node(NodeType.PARALLEL) + else: # is_prime + node = Node(NodeType.PRIME) + node.children.extend(_md_tree_node_to_md_tree_inner_rec(c, Gb) + for c in deref(n).children) + return node + + +cdef object md_tree_node_to_md_tree(const md_tree_node *n, CGraphBackend Gb): + """ + This function converts a modular decomposition tree (given as a pointer to a + md_tree_node) into an object of the Python class Node (which is then + converted into the correct output by :meth:`Graph.modular_decomposition`). + + The graph backend is needed to convert the int stored into the md_tree_node + into the corresponding vertex of the Python graph. + + This function deals with the case of an empty tree and then delegates the + actual conversion to :func:`_md_tree_node_to_md_tree_inner_rec`. + + TESTS: + + Indirect doctests:: + + sage: from sage.graphs.graph_decompositions.modular_decomposition import * + sage: corneil_habib_paul_tedder_algorithm(Graph(1)) + NORMAL [0] + sage: corneil_habib_paul_tedder_algorithm(Graph(2)) + PARALLEL [NORMAL [0], NORMAL [1]] + sage: corneil_habib_paul_tedder_algorithm(graphs.CompleteGraph(3)) + SERIES [NORMAL [1], NORMAL [2], NORMAL [0]] + """ + if n == NULL: + return Node(NodeType.EMPTY) + return _md_tree_node_to_md_tree_inner_rec(n, Gb) +################################################################################ class NodeType(IntEnum): """ NodeType is an enumeration class used to define the various types of nodes @@ -35,7 +178,7 @@ class NodeType(IntEnum): - ``PRIME`` -- indicates the node is a prime module - - ``FOREST`` -- indicates a forest containing trees + - ``EMPTY`` -- indicates a empty tree - ``NORMAL`` -- indicates the node is normal containing a vertex """ @@ -43,101 +186,33 @@ class NodeType(IntEnum): SERIES = 1 PARALLEL = 2 NORMAL = 3 - FOREST = -1 + EMPTY = -1 def __repr__(self) -> str: r""" - String representation of this node type. + Return a string representation of a ``NodeType`` object. - EXAMPLES:: + TESTS:: sage: from sage.graphs.graph_decompositions.modular_decomposition import NodeType sage: repr(NodeType.PARALLEL) 'PARALLEL' + sage: str(NodeType.PRIME) + 'PRIME' """ return self.name - def __str__(self): - """ - String representation of this node type. - - EXAMPLES:: - - sage: from sage.graphs.graph_decompositions.modular_decomposition import NodeType - sage: str(NodeType.PARALLEL) - 'PARALLEL' - """ - return repr(self) - - -class NodeSplit(Enum): - """ - Enumeration class used to specify the split that has occurred at the node or - at any of its descendants. - - ``NodeSplit`` is defined for every node in modular decomposition tree and is - required during the refinement and promotion phase of modular decomposition - tree computation. Various node splits defined are - - - ``LEFT_SPLIT`` -- indicates a left split has occurred - - - ``RIGHT_SPLIT`` -- indicates a right split has occurred - - - ``BOTH_SPLIT`` -- indicates both left and right split have occurred - - - ``NO_SPLIT`` -- indicates no split has occurred - """ - LEFT_SPLIT = 1 - RIGHT_SPLIT = 2 - BOTH_SPLIT = 3 - NO_SPLIT = 0 - - -class VertexPosition(Enum): - """ - Enumeration class used to define position of a vertex w.r.t source in - modular decomposition. - - For computing modular decomposition of connected graphs a source vertex is - chosen. The position of vertex is w.r.t this source vertex. The various - positions defined are - - - ``LEFT_OF_SOURCE`` -- indicates vertex is to left of source and is a - neighbour of source vertex - - - ``RIGHT_OF_SOURCE`` -- indicates vertex is to right of source and is - connected to but not a neighbour of source vertex - - - ``SOURCE`` -- indicates vertex is source vertex - """ - LEFT_OF_SOURCE = -1 - RIGHT_OF_SOURCE = 1 - SOURCE = 0 + __str__ = __repr__ class Node: """ - Node class stores information about the node type, node split and index of - the node in the parent tree. + Node class stores information about the node type. Node type can be ``PRIME``, ``SERIES``, ``PARALLEL``, ``NORMAL`` or - ``FOREST``. Node split can be ``NO_SPLIT``, ``LEFT_SPLIT``, ``RIGHT_SPLIT`` - or ``BOTH_SPLIT``. A node is split in the refinement phase and the split - used is propagated to the ancestors. + ``EMPTY``. - ``node_type`` -- is of type NodeType and specifies the type of node - - - ``node_split`` -- is of type NodeSplit and specifies the type of splits - which have occurred in the node and its descendants - - - ``index_in_root`` -- specifies the index of the node in the forest - obtained after promotion phase - - - ``comp_num`` -- specifies the number given to nodes in a (co)component - before refinement - - - ``is_separated`` -- specifies whether a split has occurred with the node - as the root """ def __init__(self, node_type): r""" @@ -152,83 +227,72 @@ def __init__(self, node_type): [] """ self.node_type = node_type - self.node_split = NodeSplit.NO_SPLIT - self.index_in_root = -1 - self.comp_num = -1 - self.is_separated = False self.children = [] - def set_node_split(self, node_split): - """ - Add node_split to the node split of ``self``. + def is_prime(self): + r""" + Check whether ``self`` is a prime node. - ``LEFT_SPLIT`` and ``RIGHT_SPLIT`` can exist together in ``self`` as - ``BOTH_SPLIT``. + EXAMPLES:: - INPUT: + sage: from sage.graphs.graph_decompositions.modular_decomposition import * + sage: n = Node(NodeType.PRIME) + sage: n.children.append(Node.create_leaf(1)) + sage: n.children.append(Node.create_leaf(2)) + sage: n.is_prime() + True + sage: (n.children[0].is_prime(), n.children[1].is_prime()) + (False, False) + """ + return self.node_type == NodeType.PRIME - - ``node_split`` -- ``node_split`` to be added to ``self`` + def is_series(self): + r""" + Check whether ``self`` is a series node. EXAMPLES:: sage: from sage.graphs.graph_decompositions.modular_decomposition import * - sage: node = Node(NodeType.PRIME) - sage: node.set_node_split(NodeSplit.LEFT_SPLIT) - sage: node.node_split == NodeSplit.LEFT_SPLIT - True - sage: node.set_node_split(NodeSplit.RIGHT_SPLIT) - sage: node.node_split == NodeSplit.BOTH_SPLIT + sage: n = Node(NodeType.SERIES) + sage: n.children.append(Node.create_leaf(1)) + sage: n.children.append(Node.create_leaf(2)) + sage: n.is_series() True - sage: node = Node(NodeType.PRIME) - sage: node.set_node_split(NodeSplit.BOTH_SPLIT) - sage: node.node_split == NodeSplit.BOTH_SPLIT - True - """ - if self.node_split == NodeSplit.NO_SPLIT: - self.node_split = node_split - elif ((self.node_split == NodeSplit.LEFT_SPLIT and - node_split == NodeSplit.RIGHT_SPLIT) or - (self.node_split == NodeSplit.RIGHT_SPLIT and - node_split == NodeSplit.LEFT_SPLIT)): - self.node_split = NodeSplit.BOTH_SPLIT - - def has_left_split(self): + sage: (n.children[0].is_series(), n.children[1].is_series()) + (False, False) """ - Check whether ``self`` has ``LEFT_SPLIT``. + return self.node_type == NodeType.SERIES + + def is_empty(self): + r""" + Check whether ``self`` is an empty node. EXAMPLES:: sage: from sage.graphs.graph_decompositions.modular_decomposition import * - sage: node = Node(NodeType.PRIME) - sage: node.set_node_split(NodeSplit.LEFT_SPLIT) - sage: node.has_left_split() - True - sage: node = Node(NodeType.PRIME) - sage: node.set_node_split(NodeSplit.BOTH_SPLIT) - sage: node.has_left_split() + sage: Node(NodeType.EMPTY).is_empty() True + sage: Node.create_leaf(1).is_empty() + False """ - return (self.node_split == NodeSplit.LEFT_SPLIT or - self.node_split == NodeSplit.BOTH_SPLIT) + return self.node_type == NodeType.EMPTY - def has_right_split(self): - """ - Check whether ``self`` has ``RIGHT_SPLIT``. + def is_leaf(self): + r""" + Check whether ``self`` is a leaf. EXAMPLES:: sage: from sage.graphs.graph_decompositions.modular_decomposition import * - sage: node = Node(NodeType.PRIME) - sage: node.set_node_split(NodeSplit.RIGHT_SPLIT) - sage: node.has_right_split() - True - sage: node = Node(NodeType.PRIME) - sage: node.set_node_split(NodeSplit.BOTH_SPLIT) - sage: node.has_right_split() + sage: n = Node(NodeType.PRIME) + sage: n.children.append(Node.create_leaf(1)) + sage: n.children.append(Node.create_leaf(2)) + sage: n.is_leaf() + False + sage: all(c.is_leaf() for c in n.children) True """ - return (self.node_split == NodeSplit.RIGHT_SPLIT or - self.node_split == NodeSplit.BOTH_SPLIT) + return self.node_type == NodeType.NORMAL def __repr__(self): r""" @@ -238,24 +302,12 @@ def __repr__(self): sage: from sage.graphs.graph_decompositions.modular_decomposition import * sage: n = Node(NodeType.PRIME) - sage: n.children.append(create_normal_node(1)) - sage: n.children.append(create_normal_node(2)) + sage: n.children.append(Node.create_leaf(1)) + sage: n.children.append(Node.create_leaf(2)) sage: str(n) 'PRIME [NORMAL [1], NORMAL [2]]' """ - if self.node_type == NodeType.SERIES: - s = "SERIES " - elif self.node_type == NodeType.PARALLEL: - s = "PARALLEL " - elif self.node_type == NodeType.PRIME: - s = "PRIME " - elif self.node_type == NodeType.FOREST: - s = "FOREST " - else: - s = "NORMAL " - - s += str(self.children) - return s + return f"{self.node_type} {self.children}" def __eq__(self, other): r""" @@ -273,82 +325,30 @@ def __eq__(self, other): False """ return (self.node_type == other.node_type and - self.node_split == other.node_split and - self.index_in_root == other.index_in_root and - self.comp_num == other.comp_num and - self.is_separated == other.is_separated and self.children == other.children) + @classmethod + def create_leaf(cls, v): + """ + Return Node object that is a leaf corresponding to the vertex ``v``. -def create_prime_node(): - """ - Return a prime node with no children. - - OUTPUT: a node object with ``node_type`` set as ``NodeType.PRIME`` - - EXAMPLES:: - - sage: from sage.graphs.graph_decompositions.modular_decomposition import create_prime_node - sage: node = create_prime_node() - sage: node - PRIME [] - """ - return Node(NodeType.PRIME) - - -def create_parallel_node(): - """ - Return a parallel node with no children. - - OUTPUT: a node object with ``node_type`` set as ``NodeType.PARALLEL`` - - EXAMPLES:: - - sage: from sage.graphs.graph_decompositions.modular_decomposition import create_parallel_node - sage: node = create_parallel_node() - sage: node - PARALLEL [] - """ - return Node(NodeType.PARALLEL) - - -def create_series_node(): - """ - Return a series node with no children. - - OUTPUT: a node object with ``node_type`` set as ``NodeType.SERIES`` - - EXAMPLES:: - - sage: from sage.graphs.graph_decompositions.modular_decomposition import create_series_node - sage: node = create_series_node() - sage: node - SERIES [] - """ - return Node(NodeType.SERIES) - - -def create_normal_node(vertex): - """ - Return a normal node with no children. - - INPUT: + INPUT: - - ``vertex`` -- vertex number + - ``vertex`` -- vertex number - OUTPUT: a node object representing the vertex with ``node_type`` set as - ``NodeType.NORMAL`` + OUTPUT: a node object representing the vertex with ``node_type`` set as + ``NodeType.NORMAL`` - EXAMPLES:: + EXAMPLES:: - sage: from sage.graphs.graph_decompositions.modular_decomposition import create_normal_node - sage: node = create_normal_node(2) - sage: node - NORMAL [2] - """ - node = Node(NodeType.NORMAL) - node.children.append(vertex) - return node + sage: from sage.graphs.graph_decompositions.modular_decomposition import Node + sage: node = Node.create_leaf(2) + sage: node + NORMAL [2] + """ + node = cls(NodeType.NORMAL) + node.children.append(v) + return node def print_md_tree(root): @@ -362,7 +362,7 @@ def print_md_tree(root): EXAMPLES:: sage: from sage.graphs.graph_decompositions.modular_decomposition import * - sage: print_md_tree(modular_decomposition(graphs.IcosahedralGraph())) + sage: print_md_tree(habib_maurer_algorithm(graphs.IcosahedralGraph())) PRIME 3 4 @@ -467,6 +467,13 @@ def habib_maurer_algorithm(graph, g_classes=None): classes for the current root and each of the submodules. See also [BM1983]_ for an equivalent algorithm described in greater detail. + This function should not be used directly, it should be called via the + ``modular_decomposition`` method of ``Graph`` with the parameter + ``algorithm='habib_maurer'``. + + This functions assumes that ``graph`` is a object of the class ``Graph``, is + a simple graph and has at least 1 vertex. + INPUT: - ``graph`` -- the graph for which modular decomposition tree needs to be @@ -546,16 +553,6 @@ def habib_maurer_algorithm(graph, g_classes=None): sage: test_modular_decomposition(habib_maurer_algorithm(g), g) True - Graph from the :wikipedia:`Modular_decomposition`:: - - sage: d2 = {1:[2,3,4], 2:[1,4,5,6,7], 3:[1,4,5,6,7], 4:[1,2,3,5,6,7], - ....: 5:[2,3,4,6,7], 6:[2,3,4,5,8,9,10,11], - ....: 7:[2,3,4,5,8,9,10,11], 8:[6,7,9,10,11], 9:[6,7,8,10,11], - ....: 10:[6,7,8,9], 11:[6,7,8,9]} - sage: g = Graph(d2) - sage: test_modular_decomposition(habib_maurer_algorithm(g), g) - True - Tetrahedral Graph is Series:: sage: print_md_tree(habib_maurer_algorithm(graphs.TetrahedralGraph())) @@ -581,39 +578,18 @@ def habib_maurer_algorithm(graph, g_classes=None): TESTS: - Bad Input:: - - sage: g = DiGraph() - sage: habib_maurer_algorithm(g) - Traceback (most recent call last): - ... - ValueError: Graph must be undirected - - Empty Graph is Prime:: - - sage: g = Graph() - sage: habib_maurer_algorithm(g) - PRIME [] - - Ensure that a random graph and an isomorphic graph have identical modular decompositions. :: sage: from sage.graphs.graph_decompositions.modular_decomposition import permute_decomposition sage: permute_decomposition(2, habib_maurer_algorithm, 20, 0.5) # needs sage.groups """ - if graph.is_directed(): - raise ValueError("Graph must be undirected") - - if not graph.order(): - return create_prime_node() - if graph.order() == 1: - root = create_normal_node(next(graph.vertex_iterator())) + root = Node.create_leaf(next(graph.vertex_iterator())) return root elif not graph.is_connected(): - root = create_parallel_node() + root = Node(NodeType.PARALLEL) root.children = [habib_maurer_algorithm(graph.subgraph(vertices=sg), g_classes) for sg in graph.connected_components(sort=False)] return root @@ -621,7 +597,7 @@ def habib_maurer_algorithm(graph, g_classes=None): g_comp = graph.complement() if g_comp.is_connected(): from collections import defaultdict - root = create_prime_node() + root = Node(NodeType.PRIME) if g_classes is None: g_classes = gamma_classes(graph) vertex_set = frozenset(graph) @@ -638,19 +614,97 @@ def habib_maurer_algorithm(graph, g_classes=None): for sg in d1.values()] return root - root = create_series_node() + root = Node(NodeType.SERIES) root.children = [habib_maurer_algorithm(graph.subgraph(vertices=sg), g_classes) for sg in g_comp.connected_components(sort=False)] return root -modular_decomposition = habib_maurer_algorithm +################################################################################ +# Exported modular_decomposition function # +################################################################################ +def modular_decomposition(G, algorithm=None): + r""" + Return the modular decomposition of the current graph. + + This function should not be used directly, it should be called via the + ``modular_decomposition`` method of ``Graph``. + + INPUT: + + - ``G`` -- graph whose modular decomposition tree is to be computed + + - ``algorithm`` -- string (default: ``None``); the algorithm to use among: + + - ``None`` or ``'corneil_habib_paul_tedder'`` -- will use the + Corneil-Habib-Paul-Tedder algorithm from [TCHP2008]_, its complexity + is linear in the number of vertices and edges. + + - ``'habib_maurer'`` -- will use the Habib-Maurer algorithm from + [HM1979]_, its complexity is cubic in the number of vertices. + + OUTPUT: The modular decomposition tree, as an object of type ``Node``. + + TESTS:: + + sage: from sage.graphs.graph_decompositions.modular_decomposition import * + + sage: modular_decomposition(Graph()) + EMPTY [] + + sage: modular_decomposition(Graph(1)) + NORMAL [0] + + sage: check_algos_are_equivalent(5,\ + ....: lambda : graphs.RandomProperIntervalGraph(100)) + + sage: check_algos_are_equivalent(5, lambda : graphs.RandomGNM(75, 1000)) + + sage: modular_decomposition(DiGraph()) + Traceback (most recent call last): + ... + TypeError: the input must be an undirected Sage graph + + sage: modular_decomposition(Graph(5, loops=True)) + Traceback (most recent call last): + ... + ValueError: This method is not known to work on graphs with loops... + + sage: modular_decomposition(Graph(5, multiedges=True)) + Traceback (most recent call last): + ... + ValueError: This method is not known to work on graphs with multiedges... + + sage: modular_decomposition(Graph(), algorithm='silly walk') + Traceback (most recent call last): + ... + ValueError: unknown algorithm "silly walk" + """ + from sage.graphs.graph import Graph + if not isinstance(G, Graph): + raise TypeError("the input must be an undirected Sage graph") + G._scream_if_not_simple() + + if algorithm is None: + algorithm = "corneil_habib_paul_tedder" + + if algorithm not in ("habib_maurer", "corneil_habib_paul_tedder"): + raise ValueError(f'unknown algorithm "{algorithm}"') + + if not G.order(): + return Node(NodeType.EMPTY) + if G.order() == 1: + D = Node(NodeType.NORMAL) + D.children.append(next(G.vertex_iterator())) + return D + if algorithm == "habib_maurer": + return habib_maurer_algorithm(G) + return corneil_habib_paul_tedder_algorithm(G) # ============================================================================ # Below functions are implemented to test the modular decomposition tree # ============================================================================ - # Function implemented for testing def test_modular_decomposition(tree_root, graph): """ @@ -758,19 +812,19 @@ def get_vertices(component_root): EXAMPLES:: sage: from sage.graphs.graph_decompositions.modular_decomposition import * - sage: forest = Node(NodeType.FOREST) - sage: forest.children = [create_normal_node(2), - ....: create_normal_node(3), create_normal_node(1)] + sage: forest = Node(NodeType.PRIME) + sage: forest.children = [Node.create_leaf(2), Node.create_leaf(0), + ....: Node.create_leaf(3), Node.create_leaf(1)] sage: series_node = Node(NodeType.SERIES) - sage: series_node.children = [create_normal_node(4), - ....: create_normal_node(5)] + sage: series_node.children = [Node.create_leaf(4), + ....: Node.create_leaf(5)] sage: parallel_node = Node(NodeType.PARALLEL) - sage: parallel_node.children = [create_normal_node(6), - ....: create_normal_node(7)] + sage: parallel_node.children = [Node.create_leaf(6), + ....: Node.create_leaf(7)] sage: forest.children.insert(1, series_node) sage: forest.children.insert(3, parallel_node) sage: get_vertices(forest) - [2, 4, 5, 3, 6, 7, 1] + [2, 4, 5, 0, 6, 7, 3, 1] """ vertices = [] @@ -963,17 +1017,17 @@ def children_node_type(module, node_type): sage: from sage.graphs.graph_decompositions.modular_decomposition import * sage: g = graphs.OctahedralGraph() sage: tree_root = modular_decomposition(g) - sage: print_md_tree(modular_decomposition(g)) + sage: print_md_tree(tree_root) SERIES PARALLEL - 0 - 5 + 2 + 3 PARALLEL 1 4 PARALLEL - 2 - 3 + 0 + 5 sage: children_node_type(tree_root, NodeType.SERIES) False sage: children_node_type(tree_root, NodeType.PARALLEL) @@ -1003,14 +1057,14 @@ def either_connected_or_not_connected(v, vertices_in_module, graph): sage: print_md_tree(modular_decomposition(g)) SERIES PARALLEL - 0 - 5 + 2 + 3 PARALLEL 1 4 PARALLEL - 2 - 3 + 0 + 5 sage: either_connected_or_not_connected(2, [1, 4], g) True sage: either_connected_or_not_connected(2, [3, 4], g) @@ -1043,7 +1097,7 @@ def tree_to_nested_tuple(root): sage: from sage.graphs.graph_decompositions.modular_decomposition import * sage: g = graphs.OctahedralGraph() sage: tree_to_nested_tuple(modular_decomposition(g)) - (SERIES, [(PARALLEL, [0, 5]), (PARALLEL, [1, 4]), (PARALLEL, [2, 3])]) + (SERIES, [(PARALLEL, [2, 3]), (PARALLEL, [1, 4]), (PARALLEL, [0, 5])]) """ if root.node_type == NodeType.NORMAL: return root.children[0] @@ -1075,7 +1129,7 @@ def nested_tuple_to_tree(nest): 4 """ if not isinstance(nest, tuple): - return create_normal_node(nest) + return Node.create_leaf(nest) root = Node(nest[0]) root.children = [nested_tuple_to_tree(n) for n in nest[1:]] @@ -1187,7 +1241,7 @@ def relabel_tree(root, perm): raise TypeError("type of perm is not supported for relabeling") if root.node_type == NodeType.NORMAL: - return create_normal_node(perm[root.children[0]]) + return Node.create_leaf(perm[root.children[0]]) else: new_root = Node(root.node_type) new_root.children = [relabel_tree(child, perm) for child in root.children] @@ -1304,7 +1358,7 @@ def rand_md_tree(max_depth, parent_type): is one less than its parent's. """ if random() < leaf_probability or max_depth == 1: - root = create_normal_node(current_leaf[0]) + root = Node.create_leaf(current_leaf[0]) current_leaf[0] += 1 return root if parent_type == NodeType.PRIME: @@ -1332,18 +1386,18 @@ def rand_md_tree(max_depth, parent_type): return root -def md_tree_to_graph(root): +def md_tree_to_graph(root, prime_node_generator=None): r""" Create a graph having the given MD tree. - For the prime nodes we use that every path of length 4 or more is prime. - - TODO: accept a function that generates prime graphs as a parameter and - use that in the prime nodes. + For the prime nodes, the parameter ``prime_node_generator`` is called with + the number of vertices as the only argument. If it is ``None``, the path + graph is used (it is prime when the length is 4 or more). EXAMPLES:: sage: from sage.graphs.graph_decompositions.modular_decomposition import * + sage: from sage.graphs.graph_generators import graphs sage: tup1 = (NodeType.PRIME, 1, (NodeType.SERIES, 2, 3), ....: (NodeType.PARALLEL, 4, 5), 6) sage: tree1 = nested_tuple_to_tree(tup1) @@ -1352,30 +1406,54 @@ def md_tree_to_graph(root): ....: 4: [2, 3, 6], 5: [2, 3, 6], 6: [4, 5]}) sage: g1.is_isomorphic(g2) True + + sage: G = md_tree_to_graph(Node(NodeType.EMPTY)) + sage: G.is_isomorphic(Graph()) + True + + sage: tree = Node(NodeType.SERIES) + sage: tree.children.extend(Node.create_leaf(i) for i in range(5)) + sage: G = md_tree_to_graph(tree) + sage: G.is_isomorphic(graphs.CompleteGraph(5)) + True + + sage: tree = Node(NodeType.PRIME) + sage: tree.children.extend(Node.create_leaf(i) for i in range(5)) + sage: png = lambda n: (graphs.PathGraph if n == 4 else graphs.CycleGraph)(n) + sage: G = md_tree_to_graph(tree, prime_node_generator=png) + sage: G.is_isomorphic(graphs.CycleGraph(5)) + True """ from itertools import product, combinations from sage.graphs.graph import Graph + if prime_node_generator is None: + from sage.graphs.graph_generators import graphs + prime_node_generator = graphs.PathGraph + def tree_to_vertices_and_edges(root): r""" Give the list of vertices and edges of the graph having the given md tree. """ - if root.node_type == NodeType.NORMAL: + if root.is_leaf(): return (root.children, []) children_ve = [tree_to_vertices_and_edges(child) for child in root.children] vertices = [v for vs, es in children_ve for v in vs] edges = [e for vs, es in children_ve for e in es] vertex_lists = [vs for vs, es in children_ve] - if root.node_type == NodeType.PRIME: - for vs1, vs2 in zip(vertex_lists, vertex_lists[1:]): - for v1, v2 in product(vs1, vs2): - edges.append((v1, v2)) - elif root.node_type == NodeType.SERIES: + if root.is_prime(): + G = prime_node_generator(len(vertex_lists)) + G.relabel(range(len(vertex_lists))) + for i1, i2 in G.edge_iterator(labels=False): + edges.extend(product(vertex_lists[i1], vertex_lists[i2])) + elif root.is_series(): for vs1, vs2 in combinations(vertex_lists, 2): - for v1, v2 in product(vs1, vs2): - edges.append((v1, v2)) + edges.extend(product(vs1, vs2)) + # else: no edge to be created for PARALLEL nodes return (vertices, edges) + if root.is_empty(): + return Graph() vs, es = tree_to_vertices_and_edges(root) return Graph([vs, es], format='vertices_and_edges') @@ -1410,3 +1488,45 @@ def recreate_decomposition(trials, algorithm, max_depth, max_fan_out, assert equivalent_trees(rand_tree, reconstruction) if verbose: print("Passes!") + + +@random_testing +def check_algos_are_equivalent(trials, graph_gen, verbose=False): + r""" + Verify that both algorithms compute the same tree (up to equivalence) for + random graphs. + + INPUT: + + - ``trials`` -- integer; the number of tests the function will run. + + - ``graph_gen`` -- function; a function that can be called without argument + and returns a random graph. + + - ``verbose`` -- boolean (defaul: ``False``); enable printing debug + information. + + OUTPUT: ``None``. Raises an ``AssertionError`` on failure. + + EXAMPLES:: + + sage: from sage.graphs.graph_decompositions.modular_decomposition import * + sage: check_algos_are_equivalent(3, lambda : graphs.RandomGNP(10, 0.1)) + sage: check_algos_are_equivalent(3, lambda : graphs.RandomGNP(10, 0.5)) + sage: check_algos_are_equivalent(3, lambda : graphs.RandomGNP(10, 0.9)) + """ + for _ in range(trials): + graph = graph_gen() + if verbose: + print(graph.graph6_string()) + print(graph.to_dictionary()) + MD = [] + for algo in ('habib_maurer', 'corneil_habib_paul_tedder'): + md = modular_decomposition(graph, algorithm=algo) + MD.append(md) + if verbose: + print(f'Using {algo}:') + print_md_tree(md) + assert equivalent_trees(MD[0], MD[1]) + if verbose: + print("Passes!") diff --git a/src/sage/graphs/meson.build b/src/sage/graphs/meson.build index 28fbcaf24ef..842501734e5 100644 --- a/src/sage/graphs/meson.build +++ b/src/sage/graphs/meson.build @@ -11,6 +11,7 @@ cliquer = cc.find_library('cliquer') planarity = cc.find_library('planarity') py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_bliss.py', 'all__sagemath_mcqd.py', diff --git a/src/sage/graphs/strongly_regular_db.pyx b/src/sage/graphs/strongly_regular_db.pyx index 72db0131c59..2f6f8339aa5 100644 --- a/src/sage/graphs/strongly_regular_db.pyx +++ b/src/sage/graphs/strongly_regular_db.pyx @@ -1068,25 +1068,25 @@ def is_polhill(int v, int k, int l, int mu): # We now define the P_{i,j}. see section 6. P = {} - P[0,1] = list(range((-1) + 1 , 2**(s-2)+1)) - P[1,1] = list(range((-1) + 2**(s-2)+2 , 2**(s-1)+1)) - P[2,1] = list(range((-1) + 2**(s-1)+2 , 2**(s-1)+2**(s-2)+1)) - P[3,1] = list(range((-1) + 2**(s-1)+2**(s-2)+2, 2**(s)+1)) - - P[0,2] = list(range((-1) + 2**(s-2)+2 , 2**(s-1)+2)) - P[1,2] = list(range((-1) + 2**(s-1)+3 , 2**(s-1)+2**(s-2)+2)) - P[2,2] = list(range((-1) + 2**(s-1)+2**(s-2)+3, 2**(s)+1)) + [0] - P[3,2] = list(range((-1) + 2 , 2**(s-2)+1)) - - P[0,3] = list(range((-1) + 2**(s-1)+3 , 2**(s-1)+2**(s-2)+3)) - P[1,3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1] - P[2,3] = list(range((-1) + 3 , 2**(s-2)+2)) - P[3,3] = list(range((-1) + 2**(s-2)+3 , 2**(s-1)+2)) - - P[0,4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) - P[1,4] = list(range((-1) + 3 , 2**(s-2)+1)) + [2**(s-1)+1,2**(s-1)+2**(s-2)+2] - P[2,4] = list(range((-1) + 2**(s-2)+3 , 2**(s-1)+1)) + [2**(s-1)+2**(s-2)+1,1] - P[3,4] = list(range((-1) + 2**(s-1)+3 , 2**(s-1)+2**(s-2)+1)) + [2**(s-2)+1,0] + P[0, 1] = list(range((-1) + 1, 2**(s-2)+1)) + P[1, 1] = list(range((-1) + 2**(s-2)+2, 2**(s-1)+1)) + P[2, 1] = list(range((-1) + 2**(s-1)+2, 2**(s-1)+2**(s-2)+1)) + P[3, 1] = list(range((-1) + 2**(s-1)+2**(s-2)+2, 2**(s)+1)) + + P[0, 2] = list(range((-1) + 2**(s-2)+2, 2**(s-1)+2)) + P[1, 2] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+2)) + P[2, 2] = list(range((-1) + 2**(s-1)+2**(s-2)+3, 2**(s)+1)) + [0] + P[3, 2] = list(range((-1) + 2, 2**(s-2)+1)) + + P[0, 3] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+3)) + P[1, 3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1] + P[2, 3] = list(range((-1) + 3, 2**(s-2)+2)) + P[3, 3] = list(range((-1) + 2**(s-2)+3, 2**(s-1)+2)) + + P[0, 4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + P[1, 4] = list(range((-1) + 3, 2**(s-2)+1)) + [2**(s-1)+1,2**(s-1)+2**(s-2)+2] + P[2, 4] = list(range((-1) + 2**(s-2)+3, 2**(s-1)+1)) + [2**(s-1)+2**(s-2)+1,1] + P[3, 4] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+1)) + [2**(s-2)+1,0] R = {x: copy(P[x]) for x in P} @@ -1100,10 +1100,10 @@ def is_polhill(int v, int k, int l, int mu): # We now define the R_{i,j}. see *end* of section 6. - R[0,3] = list(range((-1) + 2**(s-1)+3 , 2**(s-1)+2**(s-2)+2)) - R[1,3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1,2**(s-1)+2**(s-2)+2] - R[0,4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [2**(s-1)+2**(s-2)+2] - R[1,4] = list(range((-1) + 3 , 2**(s-2)+1)) + [2**(s-1)+1] + R[0, 3] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+2)) + R[1, 3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1,2**(s-1)+2**(s-2)+2] + R[0, 4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [2**(s-1)+2**(s-2)+2] + R[1, 4] = list(range((-1) + 3, 2**(s-2)+1)) + [2**(s-1)+1] for x in R: R[x] = [K[i] for i in R[x]] diff --git a/src/sage/groups/matrix_gps/meson.build b/src/sage/groups/matrix_gps/meson.build index 30b8e2379c0..77c70adf7fa 100644 --- a/src/sage/groups/matrix_gps/meson.build +++ b/src/sage/groups/matrix_gps/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'binary_dihedral.py', 'catalog.py', diff --git a/src/sage/groups/meson.build b/src/sage/groups/meson.build index a1876172c4d..3c5f20a1214 100644 --- a/src/sage/groups/meson.build +++ b/src/sage/groups/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'artin.py', 'braid.py', diff --git a/src/sage/groups/misc_gps/argument_groups.py b/src/sage/groups/misc_gps/argument_groups.py index 61c1151452b..475f260c518 100644 --- a/src/sage/groups/misc_gps/argument_groups.py +++ b/src/sage/groups/misc_gps/argument_groups.py @@ -1006,7 +1006,7 @@ def __init__(self, category): Rational Field """ from sage.rings.rational_field import QQ - return super().__init__(base=QQ, category=category) + super().__init__(base=QQ, category=category) def _repr_(self): r""" @@ -1626,7 +1626,7 @@ def __init__(self, category): sage: S.base() # indirect doctest """ - return super().__init__(base=int, category=category) + super().__init__(base=int, category=category) def _repr_(self): r""" diff --git a/src/sage/groups/perm_gps/meson.build b/src/sage/groups/perm_gps/meson.build index e986fcd964a..6ad30d99fe2 100644 --- a/src/sage/groups/perm_gps/meson.build +++ b/src/sage/groups/perm_gps/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'constructor.py', 'cubegroup.py', diff --git a/src/sage/groups/perm_gps/partn_ref/data_structures.pxd b/src/sage/groups/perm_gps/partn_ref/data_structures.pxd index 1cbb95231d5..af6da5d606f 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pxd +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pxd @@ -81,7 +81,10 @@ cdef inline int OP_copy_from_to(OrbitPartition *OP, OrbitPartition *OP2) noexcep - OP2.degree == OP.degree - OP2.num_cells == OP.num_cells """ - memcpy(OP2.parent, OP.parent, 4*OP.degree * sizeof(int) ) + memcpy(OP2.parent, OP.parent, OP.degree * sizeof(int)) + memcpy(OP2.rank, OP.rank, OP.degree * sizeof(int)) + memcpy(OP2.mcr, OP.mcr, OP.degree * sizeof(int)) + memcpy(OP2.size, OP.size, OP.degree * sizeof(int)) cdef inline OrbitPartition *OP_copy(OrbitPartition *OP) noexcept: """ @@ -138,38 +141,7 @@ cdef inline void OP_join(OrbitPartition *OP, int m, int n) noexcept: if m_root != n_root: OP.num_cells -= 1 - -cdef inline void OP_make_set(OrbitPartition *OP) noexcept: - cdef int i, n = OP.degree - cdef int *new_parent, *new_rank, *new_mcr, *new_size - - cdef int *int_array = sig_malloc(4*(n+1) * sizeof(int)) - if int_array is NULL: - raise MemoryError("MemoryError allocating int_array in make_set method") - - OP.degree = n + 1 - OP.num_cells = OP.num_cells + 1 - new_parent = int_array - new_rank = int_array + (n + 1) - new_mcr = int_array + (2*n + 2) - new_size = int_array + (3 * n + 3) - - memcpy(new_parent, OP.parent, n * sizeof(int)) - memcpy(new_rank, OP.rank, n * sizeof(int)) - memcpy(new_mcr, OP.mcr, n * sizeof(int)) - memcpy(new_size, OP.size, n * sizeof(int)) - - new_parent[n] = n - new_rank[n] = 0 - new_mcr[n] = n - new_size[n] = 1 - - sig_free(OP.parent) - - OP.parent = new_parent - OP.rank = new_rank - OP.mcr = new_mcr - OP.size = new_size +cdef void OP_make_set(OrbitPartition *OP) noexcept cdef inline int OP_merge_list_perm(OrbitPartition *OP, int *gamma) noexcept: """ diff --git a/src/sage/groups/perm_gps/partn_ref/data_structures.pyx b/src/sage/groups/perm_gps/partn_ref/data_structures.pyx index a3ef7193d3d..214e5fda627 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pyx +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pyx @@ -46,25 +46,34 @@ cdef inline OrbitPartition *OP_new(int n) noexcept: """ cdef OrbitPartition *OP = \ sig_malloc(sizeof(OrbitPartition)) - cdef int *int_array = sig_malloc( 4*n * sizeof(int) ) - if OP is NULL or int_array is NULL: + if OP is NULL: + return NULL + OP.parent = sig_malloc(n * sizeof(int)) + OP.rank = sig_malloc(n * sizeof(int)) + OP.mcr = sig_malloc(n * sizeof(int)) + OP.size = sig_malloc(n * sizeof(int)) + if OP.parent is NULL or OP.rank is NULL or OP.mcr is NULL or OP.size is NULL: + sig_free(OP.parent) + sig_free(OP.rank) + sig_free(OP.mcr) + sig_free(OP.size) sig_free(OP) - sig_free(int_array) return NULL OP.degree = n OP.num_cells = n - OP.parent = int_array - OP.rank = int_array + n - OP.mcr = int_array + 2*n - OP.size = int_array + 3*n OP_clear(OP) return OP + cdef inline void OP_dealloc(OrbitPartition *OP) noexcept: if OP is not NULL: sig_free(OP.parent) + sig_free(OP.rank) + sig_free(OP.mcr) + sig_free(OP.size) sig_free(OP) + cdef OP_string(OrbitPartition *OP): """ Return a string representation of the OrbitPartition. @@ -78,6 +87,33 @@ cdef OP_string(OrbitPartition *OP): return s +cdef inline void OP_make_set(OrbitPartition *OP) noexcept: + """ + Increase the degree of the input partition by one. + + An error is raised in case of memory allocation failure. + """ + cdef int n = OP.degree + + OP.parent = sig_realloc(OP.parent, (n + 1) * sizeof(int)) + OP.rank = sig_realloc(OP.rank, (n + 1) * sizeof(int)) + OP.mcr = sig_realloc(OP.mcr, (n + 1) * sizeof(int)) + OP.size = sig_realloc(OP.size, (n + 1) * sizeof(int)) + if OP.parent is NULL or OP.rank is NULL or OP.mcr is NULL or OP.size is NULL: + sig_free(OP.parent) + sig_free(OP.rank) + sig_free(OP.mcr) + sig_free(OP.size) + raise MemoryError("unable to reallocate memory in OP_make_set method") + OP.degree = n + 1 + OP.num_cells = OP.num_cells + 1 + + OP.parent[n] = n + OP.rank[n] = 0 + OP.mcr[n] = n + OP.size[n] = 1 + + def OP_represent(int n, merges, perm): """ Demonstration and testing. @@ -198,6 +234,7 @@ cdef inline PartitionStack *PS_new(int n, bint unit_partition) noexcept: PS_unit_partition(PS) return PS + cdef void PS_unit_partition(PartitionStack *PS) noexcept: """ Set partition stack to a single partition with a single cell. @@ -210,6 +247,7 @@ cdef void PS_unit_partition(PartitionStack *PS) noexcept: PS.entries[n-1] = n - 1 PS.levels[n-1] = -1 + cdef inline PartitionStack *PS_copy(PartitionStack *PS) noexcept: """ Allocate and return a pointer to a copy of PartitionStack PS. Return a null @@ -229,11 +267,13 @@ cdef inline PartitionStack *PS_copy(PartitionStack *PS) noexcept: PS_copy_from_to(PS, PS2) return PS2 + cdef inline void PS_dealloc(PartitionStack *PS) noexcept: if PS is not NULL: sig_free(PS.entries) sig_free(PS) + cdef PartitionStack *PS_from_list(list L) noexcept: """ Allocate and return a pointer to a PartitionStack representing L. Return a @@ -259,6 +299,7 @@ cdef PartitionStack *PS_from_list(list L) noexcept: PS.degree = n return PS + cdef PS_print(PartitionStack *PS): """ Print a visual representation of PS. @@ -267,6 +308,7 @@ cdef PS_print(PartitionStack *PS): for i in range(PS.depth + 1): PS_print_partition(PS, i) + cdef PS_print_partition(PartitionStack *PS, int k): """ Print the partition at depth k. @@ -281,6 +323,7 @@ cdef PS_print_partition(PartitionStack *PS, int k): s = s[:-1] + ')' print(s) + cdef int PS_first_smallest(PartitionStack *PS, bitset_t b, int *second_pos=NULL) noexcept: """ Find the first occurrence of the smallest cell of size greater than one, @@ -345,7 +388,7 @@ cdef int PS_all_new_cells(PartitionStack *PS, bitset_t** nonsingletons_ptr) noex bitset_init(nonsingletons[count-1], n) bitset_copy(nonsingletons[count-1], scratch) else: - if beg==0: + if beg == 0: nonsingletons = sig_realloc(nonsingletons, sizeof(bitset_t)) if nonsingletons is NULL: raise MemoryError("Memory error in PS_all_new_cells") @@ -357,6 +400,7 @@ cdef int PS_all_new_cells(PartitionStack *PS, bitset_t** nonsingletons_ptr) noex nonsingletons_ptr[0] = nonsingletons return count + cdef int PS_find_element(PartitionStack *PS, bitset_t b, int x) except -1: """ Find the cell containing x, store its entries to b and return the location @@ -380,6 +424,7 @@ cdef int PS_find_element(PartitionStack *PS, bitset_t b, int x) except -1: i += 1 return location + cdef list PS_singletons(PartitionStack * part): """ Return the list of all singletons in the ``PartitionStack``. @@ -549,6 +594,7 @@ cdef enum: default_num_gens = 8 default_num_bits = 64 + cdef StabilizerChain *SC_new(int n, bint init_gens=True) noexcept: """ Allocate and return a pointer to a new StabilizerChain of degree n. Return @@ -619,6 +665,7 @@ cdef StabilizerChain *SC_new(int n, bint init_gens=True) noexcept: return SC + cdef inline int SC_realloc_gens(StabilizerChain *SC, int level, int size) noexcept: """ Reallocate generator array at level `level` to size `size`. @@ -641,6 +688,7 @@ cdef inline int SC_realloc_gens(StabilizerChain *SC, int level, int size) noexce SC.array_size[level] = size return 0 + cdef inline void SC_dealloc(StabilizerChain *SC) noexcept: cdef int i, n if SC is not NULL: @@ -649,13 +697,14 @@ cdef inline void SC_dealloc(StabilizerChain *SC) noexcept: for i in range(n): sig_free(SC.generators[i]) sig_free(SC.gen_inverses[i]) - sig_free(SC.generators) # frees int_ptrs - sig_free(SC.orbit_sizes) # frees int_array + sig_free(SC.generators) # frees int_ptrs + sig_free(SC.orbit_sizes) # frees int_array sig_free(SC.gen_used.bits) sig_free(SC.gen_is_id.bits) OP_dealloc(SC.OP_scratch) sig_free(SC) + cdef StabilizerChain *SC_symmetric_group(int n) noexcept: """ Return a stabilizer chain for the symmetric group on {0, 1, ..., n-1}. @@ -690,13 +739,14 @@ cdef StabilizerChain *SC_symmetric_group(int n) noexcept: SC.parents[i][i+j] = b SC.labels[i][i+j] = j for j in range(n - i - 1): - #j-th generator sends i+j+1 to b + # j-th generator sends i+j+1 to b memcpy(SC.generators[i] + n*j, id_perm, n * sizeof(int) ) SC.generators[i][n*j + i+j+1] = b SC.generators[i][n*j + b] = i+j+1 memcpy(SC.gen_inverses[i] + n*j, SC.generators[i] + n*j, n * sizeof(int) ) return SC + cdef StabilizerChain *SC_alternating_group(int n) noexcept: """ Return a stabilizer chain for the alternating group on {0, 1, ..., n-1}. @@ -733,7 +783,7 @@ cdef StabilizerChain *SC_alternating_group(int n) noexcept: SC.labels[i][i+j] = j SC.labels[i][n-1] = -(n-i-2) for j in range(n - i - 2): - #j-th generator sends i+j+1 to b, i+j+2 to i+j+1, and b to i+j+2 + # j-th generator sends i+j+1 to b, i+j+2 to i+j+1, and b to i+j+2 memcpy(SC.generators[i] + n*j, id_perm, n * sizeof(int) ) SC.generators[i][n*j + i+j+1] = b SC.generators[i][n*j + b ] = i+j+2 @@ -741,6 +791,7 @@ cdef StabilizerChain *SC_alternating_group(int n) noexcept: SC_invert_perm(SC.gen_inverses[i] + n*j, SC.generators[i] + n*j, n) return SC + cdef int SC_realloc_bitsets(StabilizerChain *SC, unsigned long size) noexcept: """ If size is larger than current allocation, double the size of the bitsets @@ -770,11 +821,14 @@ cdef int SC_realloc_bitsets(StabilizerChain *SC, unsigned long size) noexcept: SC.gen_used.size = new_size SC.gen_is_id.size = new_size SC.gen_used.bits[size_old >> index_shift] &= limb_lower_bits_down(size_old) - memset(SC.gen_used.bits + (size_old >> index_shift) + 1, 0, (limbs - (size_old >> index_shift) - 1) * sizeof(unsigned long)) + memset(SC.gen_used.bits + (size_old >> index_shift) + 1, 0, + (limbs - (size_old >> index_shift) - 1) * sizeof(unsigned long)) SC.gen_is_id.bits[size_old >> index_shift] &= limb_lower_bits_down(size_old) - memset(SC.gen_is_id.bits + (size_old >> index_shift) + 1, 0, (limbs - (size_old >> index_shift) - 1) * sizeof(unsigned long)) + memset(SC.gen_is_id.bits + (size_old >> index_shift) + 1, 0, + (limbs - (size_old >> index_shift) - 1) * sizeof(unsigned long)) return 0 + cdef StabilizerChain *SC_copy(StabilizerChain *SC, int level) noexcept: """ Create a copy of the first `level` levels of SC. Must have 0 < level. @@ -800,15 +854,16 @@ cdef StabilizerChain *SC_copy(StabilizerChain *SC, int level) noexcept: SC_dealloc(SCC) return NULL SCC.array_size[i] = default_num_gens - SC_copy_nomalloc(SCC, SC, level) # no chance for memory error here... + SC_copy_nomalloc(SCC, SC, level) # no chance for memory error here... return SCC + cdef int SC_copy_nomalloc(StabilizerChain *SC_dest, StabilizerChain *SC, int level) noexcept: cdef int i, n = SC.degree level = min(level, SC.base_size) SC_dest.base_size = level - memcpy(SC_dest.orbit_sizes, SC.orbit_sizes, 2*n * sizeof(int) ) # copies orbit_sizes, num_gens - memcpy(SC_dest.base_orbits[0], SC.base_orbits[0], 3*n*n * sizeof(int) ) # copies base_orbits, parents, labels + memcpy(SC_dest.orbit_sizes, SC.orbit_sizes, 2*n * sizeof(int) ) # copies orbit_sizes, num_gens + memcpy(SC_dest.base_orbits[0], SC.base_orbits[0], 3*n*n * sizeof(int) ) # copies base_orbits, parents, labels for i in range(level): if SC.num_gens[i] > SC_dest.array_size[i]: if SC_realloc_gens(SC_dest, i, max(SC.num_gens[i], 2*SC_dest.array_size[i])): @@ -817,6 +872,7 @@ cdef int SC_copy_nomalloc(StabilizerChain *SC_dest, StabilizerChain *SC, int lev memcpy(SC_dest.gen_inverses[i], SC.gen_inverses[i], SC.num_gens[i]*n * sizeof(int) ) return 0 + cdef SC_print_level(StabilizerChain *SC, int level): cdef int i, j, n = SC.degree if level < SC.base_size: @@ -856,6 +912,7 @@ cdef StabilizerChain *SC_new_base(StabilizerChain *SC, int *base, int base_len) return NULL return NEW + cdef int SC_new_base_nomalloc(StabilizerChain *SC_dest, StabilizerChain *SC, int *base, int base_len) noexcept: cdef int i SC_dest.base_size = 0 @@ -866,6 +923,7 @@ cdef int SC_new_base_nomalloc(StabilizerChain *SC_dest, StabilizerChain *SC, int return 1 return 0 + cdef int SC_update(StabilizerChain *dest, StabilizerChain *source, int level) noexcept: cdef mpz_t src_order, dst_order cdef int *perm = dest.perm_scratch @@ -900,6 +958,7 @@ cdef int SC_update(StabilizerChain *dest, StabilizerChain *source, int level) no mpz_clear(dst_order) return 0 + cdef StabilizerChain *SC_insert_base_point(StabilizerChain *SC, int level, int p) noexcept: """ Insert the point ``p`` as a base point on level ``level``. Return a new @@ -927,6 +986,7 @@ cdef StabilizerChain *SC_insert_base_point(StabilizerChain *SC, int level, int p return NULL return NEW + cdef int SC_insert_base_point_nomalloc(StabilizerChain *SC_dest, StabilizerChain *SC, int level, int p) noexcept: cdef int i, b SC_copy_nomalloc(SC_dest, SC, level) @@ -939,6 +999,7 @@ cdef int SC_insert_base_point_nomalloc(StabilizerChain *SC_dest, StabilizerChain return 1 return 0 + cdef int SC_re_tree(StabilizerChain *SC, int level, int *perm, int x) noexcept: """ Return values: @@ -980,6 +1041,7 @@ cdef int SC_re_tree(StabilizerChain *SC, int level, int *perm, int x) noexcept: i += 1 return 0 + cdef int SC_sift(StabilizerChain *SC, int level, int x, int *gens, int num_gens, int *new_gens) noexcept: """ Apply Schreier's subgroup lemma[1] as follows. Given a level, a point x, and @@ -1001,8 +1063,8 @@ cdef int SC_sift(StabilizerChain *SC, int level, int x, int *gens, int num_gens, # copy a representative taking base to the point x to each of these cdef int i - cdef int *temp = SC.gen_inverses[level] + n*SC.num_gens[level] # one more scratch space - # (available since num_gens > 0) + cdef int *temp = SC.gen_inverses[level] + n*SC.num_gens[level] # one more scratch space + # (available since num_gens > 0) cdef int *rep_inv = temp SC_identify(rep_inv, n) SC_compose_up_to_base(SC, level, x, rep_inv) @@ -1026,6 +1088,7 @@ cdef int SC_sift(StabilizerChain *SC, int level, int x, int *gens, int num_gens, SC_mult_perms(perm, perm, perm_rep_inv, n) return SC_insert(SC, level+1, new_gens, num_gens) + cdef int SC_insert_and_sift(StabilizerChain *SC, int level, int *pi, int num_perms, bint sift) noexcept: cdef int i, j, b, n = SC.degree cdef int perm_gen_index @@ -1075,7 +1138,7 @@ cdef int SC_insert_and_sift(StabilizerChain *SC, int level, int *pi, int num_per bitset_set(&SC.gen_used, perm_gen_index) if SC_re_tree(SC, level, perm, x): return 1 - start_over = 1 # we must look anew + start_over = 1 # we must look anew break if start_over: break @@ -1087,7 +1150,7 @@ cdef int SC_insert_and_sift(StabilizerChain *SC, int level, int *pi, int num_per # now we have an x which maps to a new point under perm, if SC_re_tree(SC, level, perm, x): return 1 - start_over = 1 # we must look anew + start_over = 1 # we must look anew break if start_over: break @@ -1098,7 +1161,7 @@ cdef int SC_insert_and_sift(StabilizerChain *SC, int level, int *pi, int num_per # now we have an x which maps to a new point under perm, if SC_re_tree(SC, level, perm, x): return 1 - start_over = 1 # we must look anew + start_over = 1 # we must look anew break if not sift: return 0 @@ -1133,6 +1196,7 @@ cdef int SC_insert_and_sift(StabilizerChain *SC, int level, int *pi, int num_per section += 1 return 0 + cdef bint SC_is_giant(int n, int num_perms, int *perms, float p, bitset_t support) noexcept: """ Test whether the group generated by the input permutations is a giant, i.e., @@ -1658,6 +1722,7 @@ cdef int sort_by_function(PartitionStack *PS, int start, int *degrees) noexcept: j += 1 return max_location + cdef int refine_by_orbits(PartitionStack *PS, StabilizerChain *SC, int *perm_stack, int *cells_to_refine_by, int *ctrb_len) noexcept: """ Given a stabilizer chain SC, refine the partition stack PS so that each cell @@ -1698,6 +1763,7 @@ cdef int refine_by_orbits(PartitionStack *PS, StabilizerChain *SC, int *perm_sta start += i return invariant + cdef int compute_relabeling(StabilizerChain *group, StabilizerChain *scratch_group, int *permutation, int *relabeling) noexcept: """ diff --git a/src/sage/groups/perm_gps/partn_ref/meson.build b/src/sage/groups/perm_gps/partn_ref/meson.build index 092b0d0b2c8..933d72d2729 100644 --- a/src/sage/groups/perm_gps/partn_ref/meson.build +++ b/src/sage/groups/perm_gps/partn_ref/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'automorphism_group_canonical_label.pxd', 'canonical_augmentation.pxd', diff --git a/src/sage/groups/perm_gps/partn_ref2/meson.build b/src/sage/groups/perm_gps/partn_ref2/meson.build index ef97195574e..69b9bee042d 100644 --- a/src/sage/groups/perm_gps/partn_ref2/meson.build +++ b/src/sage/groups/perm_gps/partn_ref2/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'refinement_generic.pxd', subdir: 'sage/groups/perm_gps/partn_ref2', diff --git a/src/sage/groups/semimonomial_transformations/meson.build b/src/sage/groups/semimonomial_transformations/meson.build index 402cb5244e5..f7958976271 100644 --- a/src/sage/groups/semimonomial_transformations/meson.build +++ b/src/sage/groups/semimonomial_transformations/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'semimonomial_transformation.pxd', 'semimonomial_transformation_group.py', diff --git a/src/sage/interacts/library.py b/src/sage/interacts/library.py index a41ba32b393..a58a0748477 100644 --- a/src/sage/interacts/library.py +++ b/src/sage/interacts/library.py @@ -2,7 +2,7 @@ Sage Interacts Sage interacts are applications of the `@interact decorator <../../sagenb/notebook/interact.html>`_. -They are conveniently accessible in the Sage Notebook via ``interacts.[TAB].[TAB]()``. +They are conveniently accessible in the Sage notebook via ``interacts.[TAB].[TAB]()``. The first ``[TAB]`` lists categories and the second ``[TAB]`` reveals the interact examples. EXAMPLES: diff --git a/src/sage/interacts/meson.build b/src/sage/interacts/meson.build index 4889c06f9fa..b0542f38853 100644 --- a/src/sage/interacts/meson.build +++ b/src/sage/interacts/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'algebra.py', 'all.py', 'calculus.py', diff --git a/src/sage/interfaces/meson.build b/src/sage/interfaces/meson.build index 4a12245d532..aee6b8493d0 100644 --- a/src/sage/interfaces/meson.build +++ b/src/sage/interfaces/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'abc.py', 'all.py', 'all__sagemath_polyhedra.py', diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py index d02ae43149f..d110c17bf16 100644 --- a/src/sage/interfaces/singular.py +++ b/src/sage/interfaces/singular.py @@ -1401,7 +1401,7 @@ def _repr_(self): # this is our cue that singular uses `rp` instead of `ip` if singular_name_mapping['invlex'] == 'rp' and 'doctest' in str(get_display_manager()): s = re.sub('^(// .*block.* : ordering )rp$', '\\1ip', - s, 0, re.MULTILINE) + s, flags=re.MULTILINE) return s def __copy__(self): @@ -1785,7 +1785,7 @@ def sage_poly(self, R=None, kcache=None): # TODO: Refactor imports to move this to the top from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict from sage.rings.polynomial.multi_polynomial_libsingular import MPolynomialRing_libsingular - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.polydict import ETuple from sage.rings.polynomial.polynomial_singular_interface import can_convert_to_singular from sage.rings.quotient_ring import QuotientRing_generic @@ -1876,7 +1876,7 @@ def sage_poly(self, R=None, kcache=None): return R(sage_repr) - elif isinstance(R, PolynomialRing_general) and (ring_is_fine or can_convert_to_singular(R)): + elif isinstance(R, PolynomialRing_generic) and (ring_is_fine or can_convert_to_singular(R)): sage_repr = [0] * int(self.deg() + 1) diff --git a/src/sage/lfunctions/meson.build b/src/sage/lfunctions/meson.build index cf0ffe05e17..24e2f156f5e 100644 --- a/src/sage/lfunctions/meson.build +++ b/src/sage/lfunctions/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'dokchitser.py', 'lcalc.py', diff --git a/src/sage/libs/gap/meson.build b/src/sage/libs/gap/meson.build index 2302a169cb2..def07898f4c 100644 --- a/src/sage/libs/gap/meson.build +++ b/src/sage/libs/gap/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'all_documented_functions.py', 'assigned_names.py', diff --git a/src/sage/libs/meson.build b/src/sage/libs/meson.build index 2e28ef8ff79..34b26b09ff1 100644 --- a/src/sage/libs/meson.build +++ b/src/sage/libs/meson.build @@ -6,6 +6,7 @@ gc = cc.find_library('gc') homfly = cc.find_library('homfly', has_headers: ['homfly.h']) py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_coxeter3.py', 'all__sagemath_meataxe.py', diff --git a/src/sage/libs/mpfi/__init__.pxd b/src/sage/libs/mpfi/__init__.pxd index b55a5129d18..6b81af16593 100644 --- a/src/sage/libs/mpfi/__init__.pxd +++ b/src/sage/libs/mpfi/__init__.pxd @@ -26,7 +26,7 @@ cdef extern from "mpfi.h": int mpfi_set_z(mpfi_ptr, mpz_t) int mpfi_set_q(mpfi_ptr, mpq_t) int mpfi_set_fr(mpfi_ptr, mpfr_srcptr) - int mpfi_set_str(mpfi_ptr, char *, int) + int mpfi_set_str(mpfi_ptr, const char *, int) # combined initialization and assignment functions int mpfi_init_set(mpfi_ptr, mpfi_srcptr) @@ -36,7 +36,7 @@ cdef extern from "mpfi.h": int mpfi_init_set_z(mpfi_ptr, mpz_srcptr) int mpfi_init_set_q(mpfi_ptr, mpq_srcptr) int mpfi_init_set_fr(mpfi_ptr, mpfr_srcptr) - int mpfi_init_set_str(mpfi_ptr, char *, int) + int mpfi_init_set_str(mpfi_ptr, const char *, int) # swapping two intervals void mpfi_swap(mpfi_ptr, mpfi_ptr) diff --git a/src/sage/libs/mpfr/__init__.pxd b/src/sage/libs/mpfr/__init__.pxd index facac9aa6c7..8bb85ff3c1a 100644 --- a/src/sage/libs/mpfr/__init__.pxd +++ b/src/sage/libs/mpfr/__init__.pxd @@ -27,7 +27,7 @@ cdef extern from "mpfr.h": # int mpfr_set_f(mpfr_t rop, mpf_t op, mpfr_rnd_t rnd) int mpfr_set_ui_2exp(mpfr_t rop, unsigned long int op, mp_exp_t e, mpfr_rnd_t rnd) int mpfr_set_si_2exp(mpfr_t rop, long int op, mp_exp_t e, mpfr_rnd_t rnd) - int mpfr_set_str(mpfr_t rop, char *s, int base, mpfr_rnd_t rnd) + int mpfr_set_str(mpfr_t rop, const char *s, int base, mpfr_rnd_t rnd) int mpfr_strtofr(mpfr_t rop, char *nptr, char **endptr, int base, mpfr_rnd_t rnd) void mpfr_set_inf(mpfr_t x, int sign) void mpfr_set_nan(mpfr_t x) @@ -43,7 +43,7 @@ cdef extern from "mpfr.h": int mpfr_init_set_z(mpfr_t rop, mpz_t op, mpfr_rnd_t rnd) int mpfr_init_set_q(mpfr_t rop, mpq_t op, mpfr_rnd_t rnd) # int mpfr_init_set_f(mpfr_t rop, mpf_t op, mpfr_rnd_t rnd) - int mpfr_init_set_str(mpfr_t x, char *s, int base, mpfr_rnd_t rnd) + int mpfr_init_set_str(mpfr_t x, const char *s, int base, mpfr_rnd_t rnd) # Conversion Functions double mpfr_get_d(mpfr_t op, mpfr_rnd_t rnd) diff --git a/src/sage/libs/mpmath/ext_main.pyx b/src/sage/libs/mpmath/ext_main.pyx index 96111f7b942..03840b3d8df 100644 --- a/src/sage/libs/mpmath/ext_main.pyx +++ b/src/sage/libs/mpmath/ext_main.pyx @@ -580,8 +580,7 @@ cdef class Context: s = (x).re.special t = (x).im.special return s == S_NAN or t == S_NAN - if type(x) is int or type(x) is long or isinstance(x, Integer) \ - or isinstance(x, rationallib.mpq): + if isinstance(x, (int, Integer, rationallib.mpq)): return False typ = MPF_set_any(&tmp_opx_re, &tmp_opx_im, x, global_opts, 0) if typ == 1: @@ -622,8 +621,7 @@ cdef class Context: s = (x).re.special t = (x).im.special return s == S_INF or s == S_NINF or t == S_INF or t == S_NINF - if type(x) is int or type(x) is long or isinstance(x, Integer) \ - or isinstance(x, rationallib.mpq): + if isinstance(x, (int, Integer, rationallib.mpq)): return False typ = MPF_set_any(&tmp_opx_re, &tmp_opx_im, x, global_opts, 0) if typ == 1: @@ -671,8 +669,7 @@ cdef class Context: if re == libmp.fzero: return im_normal if im == libmp.fzero: return re_normal return re_normal and im_normal - if type(x) is int or type(x) is long or isinstance(x, Integer) \ - or isinstance(x, rationallib.mpq): + if isinstance(x, (int, Integer, rationallib.mpq)): return bool(x) x = ctx.convert(x) if hasattr(x, '_mpf_') or hasattr(x, '_mpc_'): @@ -708,7 +705,7 @@ cdef class Context: cdef MPF v cdef MPF w cdef int typ - if type(x) is int or type(x) is long or isinstance(x, Integer): + if isinstance(x, (int, Integer)): return True if isinstance(x, mpf): v = (x).value diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx index 7bf2afafbe8..766eb8826e1 100644 --- a/src/sage/libs/singular/function.pyx +++ b/src/sage/libs/singular/function.pyx @@ -97,7 +97,7 @@ from sage.rings.polynomial.multi_polynomial_sequence import PolynomialSequence_g from sage.libs.singular.decl cimport * from sage.libs.singular.option import opt_ctx from sage.libs.singular.polynomial cimport singular_vector_maximal_component -from sage.libs.singular.singular cimport sa2si, si2sa, si2sa_intvec, si2sa_bigintvec +from sage.libs.singular.singular cimport sa2si, si2sa, si2sa_intvec, si2sa_bigintvec, start_catch_error, check_error from sage.libs.singular.singular import error_messages from sage.interfaces.singular import get_docstring @@ -1450,10 +1450,8 @@ EXAMPLES:: cdef inline call_function(SingularFunction self, tuple args, object R, bint signal_handler=True, attributes=None): global currRingHdl - global errorreported global currentVoice global myynest - global error_messages cdef ring *si_ring if isinstance(R, MPolynomialRing_libsingular): @@ -1474,29 +1472,28 @@ cdef inline call_function(SingularFunction self, tuple args, object R, bint sign currentVoice = NULL myynest = 0 - errorreported = 0 - - while error_messages: - error_messages.pop() + start_catch_error() with opt_ctx: # we are preserving the global options state here if signal_handler: - sig_on() - _res = self.call_handler.handle_call(argument_list, si_ring) - sig_off() + try: + sig_on() + _res = self.call_handler.handle_call(argument_list, si_ring) + sig_off() + finally: + s = check_error() else: _res = self.call_handler.handle_call(argument_list, si_ring) + s = check_error() - if myynest: - myynest = 0 + myynest = 0 if currentVoice: currentVoice = NULL - if errorreported: - errorreported = 0 + if s: raise RuntimeError("error in Singular function call %r:\n%s" % - (self._name, "\n".join(error_messages))) + (self._name, "\n".join(s))) res = argument_list.to_python(_res) diff --git a/src/sage/libs/singular/ring.pyx b/src/sage/libs/singular/ring.pyx index f770cc483a5..fa7343f8dca 100644 --- a/src/sage/libs/singular/ring.pyx +++ b/src/sage/libs/singular/ring.pyx @@ -19,7 +19,7 @@ AUTHORS: from sage.cpython.string cimport str_to_bytes, bytes_to_str from sage.libs.gmp.types cimport __mpz_struct -from sage.libs.gmp.mpz cimport mpz_init_set_ui +from sage.libs.gmp.mpz cimport mpz_init_set from sage.libs.singular.decl cimport ring, currRing from sage.libs.singular.decl cimport rChangeCurrRing, rComplete, rDelete, idInit @@ -31,6 +31,7 @@ from sage.libs.singular.decl cimport n_coeffType from sage.libs.singular.decl cimport rDefault, GFInfo, ZnmInfo, nInitChar, AlgExtInfo, TransExtInfo +from sage.rings.integer cimport Integer from sage.rings.integer_ring cimport IntegerRing_class from sage.rings.integer_ring import ZZ import sage.rings.abc @@ -80,7 +81,7 @@ if bytes_to_str(rSimpleOrdStr(ringorder_ip)) == "rp": ############################################################################# cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: - """ + r""" Create a new Singular ring over the ``base_ring`` in ``n`` variables with the names ``names`` and the term order ``term_order``. @@ -159,17 +160,136 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: sage: R. = F[] sage: from sage.libs.singular.function import singular_function sage: sing_print = singular_function('print') - sage: sing_print(R) - 'polynomial ring, over a field, global ordering\n// coefficients: ZZ/7(a, b)\n// number of vars : 3\n// block 1 : ordering dp\n// : names x y z\n// block 2 : ordering C' + sage: print(sing_print(R)) + polynomial ring, over a field, global ordering + // coefficients: ZZ/7(a, b) + // number of vars : 3 + // block 1 : ordering dp + // : names x y z + // block 2 : ordering C :: sage: F = PolynomialRing(QQ, 's,t').fraction_field() sage: R. = F[] sage: from sage.libs.singular.function import singular_function - sage: sing_print = singular_function('print') - sage: sing_print(R) - 'polynomial ring, over a field, global ordering\n// coefficients: QQ(s, t)\n// number of vars : 3\n// block 1 : ordering dp\n// : names x y z\n// block 2 : ordering C' + sage: print(sing_print(R)) + polynomial ring, over a field, global ordering + // coefficients: QQ(s, t) + // number of vars : 3 + // block 1 : ordering dp + // : names x y z + // block 2 : ordering C + + Small primes:: + + sage: R = PolynomialRing(GF(2), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a field, global ordering + // coefficients: ZZ/2 + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + sage: R = PolynomialRing(GF(3), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a field, global ordering + // coefficients: ZZ/3 + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + sage: R = PolynomialRing(GF(1000000007), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a field, global ordering + // coefficients: ZZ/1000000007 + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + When ``Zmod`` is used, use a different Singular type + (note that the print is wrong, the field in fact doesn't have zero-divisors):: + + sage: R = PolynomialRing(Zmod(2), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a ring (with zero-divisors), global ordering + // coefficients: ZZ/(2) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + sage: R = PolynomialRing(Zmod(3), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a ring (with zero-divisors), global ordering + // coefficients: ZZ/(3) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + Large prime (note that the print is wrong, the field in fact doesn't have zero-divisors):: + + sage: R = PolynomialRing(GF(2^128+51), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a ring (with zero-divisors), global ordering + // coefficients: ZZ/bigint(340282366920938463463374607431768211507) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + Finite field with large degree (note that if stack size is too small and the exponent is too large + a stack overflow may happen inside libsingular):: + + sage: R = PolynomialRing(GF(2^160), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a field, global ordering + // coefficients: ZZ/2[z160]/(z160^160+z160^159+z160^155+z160^154+z160^153+z160^152+z160^151+z160^149+z160^148+z160^147+z160^146+z160^145+z160^144+z160^143+z160^141+z160^139+z160^137+z160^131+z160^129+z160^128+z160^127+z160^126+z160^123+z160^122+z160^121+z160^117+z160^116+z160^115+z160^113+z160^111+z160^110+z160^108+z160^106+z160^102+z160^100+z160^99+z160^97+z160^96+z160^95+z160^94+z160^93+z160^92+z160^91+z160^87+z160^86+z160^82+z160^80+z160^79+z160^78+z160^74+z160^73+z160^72+z160^71+z160^70+z160^67+z160^66+z160^65+z160^62+z160^59+z160^58+z160^57+z160^55+z160^54+z160^53+z160^52+z160^51+z160^49+z160^47+z160^44+z160^40+z160^35+z160^32+z160^30+z160^28+z160^27+z160^26+z160^24+z160^23+z160^21+z160^20+z160^18+z160^16+z160^11+z160^10+z160^8+z160^7+1) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + Integer modulo small power of 2:: + + sage: R = PolynomialRing(Zmod(2^32), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a ring (with zero-divisors), global ordering + // coefficients: ZZ/(2^32) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + Integer modulo large power of 2:: + + sage: R = PolynomialRing(Zmod(2^1000), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a ring (with zero-divisors), global ordering + // coefficients: ZZ/(bigint(2)^1000) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + Integer modulo large power of odd prime:: + + sage: R = PolynomialRing(Zmod(3^300), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a ring (with zero-divisors), global ordering + // coefficients: ZZ/(bigint(3)^300) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + Integer modulo non-prime:: + + sage: R = PolynomialRing(Zmod(15^20), ("a", "b"), implementation="singular"); print(sing_print(R)) + polynomial ring, over a ring (with zero-divisors), global ordering + // coefficients: ZZ/bigint(332525673007965087890625) + // number of vars : 2 + // block 1 : ordering dp + // : names a b + // block 2 : ordering C + + Non-prime finite field with large characteristic (not supported, see :issue:`33319`):: + + sage: PolynomialRing(GF((2^31+11)^2), ("a", "b"), implementation="singular") + Traceback (most recent call last): + ... + TypeError: characteristic must be <= 2147483647. """ cdef long cexponent cdef GFInfo* _param @@ -182,7 +302,7 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: cdef int offset cdef int nvars cdef int characteristic - cdef int modbase + cdef Integer ch, modbase cdef int ringorder_column_pos cdef int ringorder_column_asc @@ -377,39 +497,57 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: _cf = nInitChar( n_Z, NULL) # integer coefficient ring _ring = rDefault (_cf, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) - elif (isinstance(base_ring, FiniteField_generic) and base_ring.is_prime_field()): - if base_ring.characteristic() <= 2147483647: + elif isinstance(base_ring, sage.rings.abc.IntegerModRing): + + ch = base_ring.characteristic() + if ch < 2: + raise NotImplementedError(f"polynomials over {base_ring} are not supported in Singular") + + isprime = ch.is_prime() + + if isprime and ch <= 2147483647 and isinstance(base_ring, FiniteField_generic): + # don't use this branch for e.g. Zmod(5) characteristic = base_ring.characteristic() + + # example for simpler ring creation interface without monomial orderings: + #_ring = rDefault(characteristic, nvars, _names) + + _ring = rDefault(characteristic, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) + else: - raise TypeError("Characteristic p must be <= 2147483647.") + modbase, cexponent = ch.perfect_power() - # example for simpler ring creation interface without monomial orderings: - #_ring = rDefault(characteristic, nvars, _names) + if modbase == 2 and cexponent > 1: + _cf = nInitChar(n_Z2m, cexponent) - _ring = rDefault(characteristic, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) + elif modbase.is_prime() and cexponent > 1: + _info.base = <__mpz_struct *>omAlloc(sizeof(__mpz_struct)) + mpz_init_set(_info.base, modbase.value) + _info.exp = cexponent + _cf = nInitChar(n_Znm, &_info) + + else: + _info.base = <__mpz_struct *>omAlloc(sizeof(__mpz_struct)) + mpz_init_set(_info.base, ch.value) + _info.exp = 1 + _cf = nInitChar(n_Zn, &_info) + _ring = rDefault(_cf, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) elif isinstance(base_ring, FiniteField_generic): - if base_ring.characteristic() <= 2147483647: - characteristic = -base_ring.characteristic() # note the negative characteristic - else: + assert not base_ring.is_prime_field() # would have been handled above + if base_ring.characteristic() > 2147483647: raise TypeError("characteristic must be <= 2147483647.") # TODO: This is lazy, it should only call Singular stuff not PolynomialRing() k = PolynomialRing(base_ring.prime_subfield(), - name=base_ring.variable_name(), order='lex', implementation='singular') + name=base_ring.variable_name(), order='lex', + implementation='singular') minpoly = base_ring.polynomial()(k.gen()) - ch = base_ring.characteristic() - F = ch.factor() - assert(len(F)==1) - - modbase = F[0][0] - cexponent = F[0][1] - _ext_names = omAlloc0(sizeof(char*)) _name = str_to_bytes(k._names[0]) _ext_names[0] = omStrDup(_name) - _cfr = rDefault( modbase, 1, _ext_names ) + _cfr = rDefault(base_ring.characteristic(), 1, _ext_names) _cfr.qideal = idInit(1,1) rComplete(_cfr, 1) @@ -422,60 +560,6 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: _ring = rDefault (_cf, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) - elif isinstance(base_ring, sage.rings.abc.IntegerModRing): - - ch = base_ring.characteristic() - if ch < 2: - raise NotImplementedError(f"polynomials over {base_ring} are not supported in Singular") - - isprime = ch.is_prime() - - if not isprime and ch.is_power_of(2): - exponent = ch.nbits() -1 - cexponent = exponent - - if exponent <= 30: - ringtype = n_Z2m - else: - ringtype = n_Znm - - if ringtype == n_Znm: - F = ch.factor() - - modbase = F[0][0] - cexponent = F[0][1] - - _info.base = <__mpz_struct*>omAlloc(sizeof(__mpz_struct)) - mpz_init_set_ui(_info.base, modbase) - _info.exp = cexponent - _cf = nInitChar(ringtype, &_info) - else: # ringtype == n_Z2m - _cf = nInitChar(ringtype, cexponent) - - elif not isprime and ch.is_prime_power() and ch < ZZ(2)**160: - F = ch.factor() - assert(len(F)==1) - - modbase = F[0][0] - cexponent = F[0][1] - - _info.base = <__mpz_struct*>omAlloc(sizeof(__mpz_struct)) - mpz_init_set_ui(_info.base, modbase) - _info.exp = cexponent - _cf = nInitChar( n_Znm, &_info ) - - else: - try: - characteristic = ch - except OverflowError: - raise NotImplementedError("Characteristic %d too big." % ch) - - _info.base = <__mpz_struct*>omAlloc(sizeof(__mpz_struct)) - mpz_init_set_ui(_info.base, characteristic) - _info.exp = 1 - _cf = nInitChar( n_Zn, &_info ) - _ring = rDefault(_cf, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) - else: raise NotImplementedError(f"polynomials over {base_ring} are not supported in Singular") diff --git a/src/sage/libs/singular/singular.pxd b/src/sage/libs/singular/singular.pxd index 9d764b51a6f..a0019fe4ede 100644 --- a/src/sage/libs/singular/singular.pxd +++ b/src/sage/libs/singular/singular.pxd @@ -55,6 +55,13 @@ cdef number *sa2si_NF(object element, ring *_ring) noexcept # dispatches to all the above. cdef number *sa2si(Element elem, ring * _ring) noexcept +# ============== +# Error handling +# ============== + +cdef int start_catch_error() except -1 +cdef object check_error() + # ============== # Initialisation # ============== diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index 9c7b4078583..813765cff3d 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -25,6 +25,7 @@ cdef extern from "limits.h": long INT_MIN import os +from warnings import warn from libc.stdint cimport int64_t from sage.libs.singular.decl cimport * @@ -302,6 +303,9 @@ cdef object si2sa_GFq_generic(number *n, ring *_ring, object base): cdef object ret cdef ring *cfRing = _ring.cf.extRing + if _ring.cf.type in (n_Zn, n_Znm): + return si2sa_ZZmod(n, _ring, base) + if _ring.cf.cfIsZero(n,_ring.cf): return base.zero() elif _ring.cf.cfIsOne(n,_ring.cf): @@ -886,7 +890,7 @@ cdef number *sa2si_QQ(Rational r, ring *_ring) noexcept: - ``r`` -- a sage rational number - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -916,7 +920,7 @@ cdef number *sa2si_GFqGivaro(int quo, ring *_ring) noexcept: - ``quo`` -- sage integer - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -984,7 +988,7 @@ cdef number *sa2si_GFqNTLGF2E(FFgf2eE elem, ring *_ring) noexcept: - ``elem`` -- a sage element of a ntl_gf2e finite field - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -1049,7 +1053,7 @@ cdef number *sa2si_GFq_generic(object elem, ring *_ring) noexcept: - ``elem`` -- a sage element of a generic finite field - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -1075,6 +1079,9 @@ cdef number *sa2si_GFq_generic(object elem, ring *_ring) noexcept: cdef number *coeff cdef number *apow1 cdef number *apow2 + + if _ring.cf.type in (n_Zn, n_Znm): + return sa2si_ZZmod(elem, _ring) elem = elem.polynomial() if _ring != currRing: rChangeCurrRing(_ring) @@ -1115,7 +1122,7 @@ cdef number *sa2si_transext_QQ(object elem, ring *_ring) noexcept: - ``elem`` -- a sage element of a FractionField of polynomials over the rationals - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -1265,7 +1272,7 @@ cdef number *sa2si_transext_FF(object elem, ring *_ring) noexcept: - ``elem`` -- a sage element of a FractionField of polynomials over the rationals - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -1365,7 +1372,7 @@ cdef number *sa2si_NF(object elem, ring *_ring) noexcept: - ``elem`` -- a sage element of a NumberField - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -1457,7 +1464,7 @@ cdef number *sa2si_ZZ(Integer d, ring *_ring) noexcept: - ``elem`` -- a sage Integer - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live OUTPUT: @@ -1488,7 +1495,7 @@ cdef inline number *sa2si_ZZmod(IntegerMod_abstract d, ring *_ring) noexcept: - ``elem`` -- a sage IntegerMod - - ``_ ring`` -- a (pointer to) a singular ring, where the resul will live + - ``_ ring`` -- a (pointer to) a singular ring, where the result will live TESTS:: @@ -1512,7 +1519,7 @@ cdef inline number *sa2si_ZZmod(IntegerMod_abstract d, ring *_ring) noexcept: sage: P. = Integers(2^32)[] sage: P(2^32-1) - 4294967295 + -1 sage: P(3) 3 @@ -1534,8 +1541,11 @@ cdef inline number *sa2si_ZZmod(IntegerMod_abstract d, ring *_ring) noexcept: cdef nMapFunc nMapFuncPtr = NULL + if _ring.cf.type == n_unknown: + return n_Init(int(d), _ring.cf) + if _ring.cf.type == n_Z2m: - _d = long(d) + _d = d return nr2mMapZp(_d, currRing.cf, _ring.cf) elif _ring.cf.type == n_Zn or _ring.cf.type == n_Znm: lift = d.lift() @@ -1577,7 +1587,7 @@ cdef object si2sa(number *n, ring *_ring, object base): An element of ``base`` """ - if isinstance(base, FiniteField_prime_modn): + if isinstance(base, FiniteField_prime_modn) and _ring.cf.type == n_Zp: return base(_ring.cf.cfInt(n, _ring.cf)) elif isinstance(base, RationalField): @@ -1605,8 +1615,6 @@ cdef object si2sa(number *n, ring *_ring, object base): return si2sa_transext_FF(n, _ring, base) elif isinstance(base, IntegerModRing_generic): - if _ring.cf.type == n_unknown: - return base(_ring.cf.cfInt(n, _ring.cf)) return si2sa_ZZmod(n, _ring, base) else: @@ -1628,7 +1636,8 @@ cdef number *sa2si(Element elem, ring * _ring) noexcept: a (pointer to) a singular number """ cdef int i = 0 - if isinstance(elem._parent, FiniteField_prime_modn): + + if isinstance(elem._parent, FiniteField_prime_modn) and _ring.cf.type == n_Zp: return n_Init(int(elem),_ring.cf) elif isinstance(elem._parent, RationalField): @@ -1649,8 +1658,6 @@ cdef number *sa2si(Element elem, ring * _ring) noexcept: elif isinstance(elem._parent, NumberField) and elem._parent.is_absolute(): return sa2si_NF(elem, _ring) elif isinstance(elem._parent, IntegerModRing_generic): - if _ring.cf.type == n_unknown: - return n_Init(int(elem),_ring.cf) return sa2si_ZZmod(elem, _ring) elif isinstance(elem._parent, FractionField_generic) and isinstance(elem._parent.base(), (MPolynomialRing_libsingular, PolynomialRing_field)): if isinstance(elem._parent.base().base_ring(), RationalField): @@ -1806,9 +1813,99 @@ saved_PATH = os.environ["PATH"] init_libsingular() os.environ["PATH"] = saved_PATH +cdef bint catching_error = False + cdef void libsingular_error_callback(const_char_ptr s) noexcept: _s = char_to_str(s) - error_messages.append(_s) + if catching_error: + error_messages.append(_s) + else: + warn(f"error in Singular ignored: {_s}") + +cdef int start_catch_error() except -1: + """ + Helper function to convert Singular errors to Python exceptions. + + Must be used as follows:: + + start_catch_error() + ... + s = check_error() # nonempty tuple[str, ...] (error messages) or None + if s: + # at this point global variable ``error_messages`` is cleared + raise RuntimeError(...) + + Return value is ignored, only used for exception handling. + + Note that :func:`check_error` can only be called exactly once. + + Note that this *must not* be used in conjunction with :func:`sig_on` as follows:: + + start_catch_error() + sig_on() + ... + sig_off() + if check_error(): + raise RuntimeError(...) + + because if the code is interrupted, then :func:`check_error` is never called. + + Use the following instead:: + + start_catch_error() + try: + sig_on() + ... # long time + sig_off() + finally: + if check_error(): + raise RuntimeError(...) + + If the code inside (marked `# long time`) can also raise a Python exception, + the above is still wrong --- :func:`sig_off` may not be called. In this case + use a nested ``try`` as suggested in ``cysignals`` documentation:: + + start_catch_error() + try: + sig_on() # This must be OUTSIDE the inner try + try: + ... # long time + finally: + sig_off() + finally: + if check_error(): + raise RuntimeError(...) + """ + global errorreported, catching_error, error_messages + if catching_error: + warn("internal error: previous start_catch_error not ended with check_error") + catching_error = True + + if errorreported: + warn(f"error in Singular ignored: {', '.join(error_messages)}") + errorreported = False + error_messages.clear() + else: + assert not error_messages + return 0 + +cdef object check_error(): + """ + See :func:`start_catch_error`. + """ + global errorreported, catching_error, error_messages + if not catching_error: + warn("internal error: check_error not preceded with start_catch_error") + catching_error = False + + if errorreported: + result = tuple(error_messages) + assert result + errorreported = False + error_messages.clear() + return result + assert not error_messages + return None def get_resource(id): diff --git a/src/sage/manifolds/differentiable/automorphismfield.py b/src/sage/manifolds/differentiable/automorphismfield.py index c8f2143beb2..320620a0d8b 100644 --- a/src/sage/manifolds/differentiable/automorphismfield.py +++ b/src/sage/manifolds/differentiable/automorphismfield.py @@ -1199,7 +1199,7 @@ def __invert__(self): if isinstance(frame, CoordFrame): chart = frame._chart else: - chart = self._domain._def_chart #!# to be improved + chart = self._domain._def_chart # ! # to be improved try: # TODO: do the computation without the 'SR' enforcement mat_self = matrix( @@ -1370,7 +1370,7 @@ def at(self, point): if dest_map.is_identity(): amb_point = point else: - amb_point = dest_map(point) # "ambient" point + amb_point = dest_map(point) # "ambient" point ts = amb_point._manifold.tangent_space(amb_point) if self._is_identity: return ts.identity_map() diff --git a/src/sage/manifolds/differentiable/integrated_curve.py b/src/sage/manifolds/differentiable/integrated_curve.py index 77d6a419325..8b2d1f0251c 100644 --- a/src/sage/manifolds/differentiable/integrated_curve.py +++ b/src/sage/manifolds/differentiable/integrated_curve.py @@ -1096,7 +1096,7 @@ def solve(self, step=None, method='odeint', solution_key=None, # raise error if coordinates in chart cannot be obtained initial_coord_basis = chart.frame().at(initial_pt) - initial_tgt_vec_comps = list(v0[initial_coord_basis,:]) #idem + initial_tgt_vec_comps = list(v0[initial_coord_basis,:]) # idem dim = self.codomain().dim() @@ -2372,15 +2372,15 @@ def plot_integrated(self, chart=None, ambient_coords=None, else: if across_charts: for key in self._interpolations: - if key[-8:-1] != '_chart_': # check if not a subplot + if key[-8:-1] != '_chart_': # check if not a subplot interpolation_key = key break else: raise ValueError("Did you forget to " "integrate or interpolate the result?") else: - interpolation_key = next(iter(self._interpolations)) #will - # raise error if self._interpolations empty + interpolation_key = next(iter(self._interpolations)) + # will raise error if self._interpolations empty if verbose: print("Plotting from the interpolation associated " + @@ -2484,7 +2484,7 @@ def plot_integrated(self, chart=None, ambient_coords=None, raise ValueError("the argument prange must be a " + "tuple/list of 2 elements") else: - p = prange #'p' declared only for the line below to be shorter + p = prange # 'p' declared only for the line below to be shorter if p[0] < param_min or p[0] > param_max or p[1] < param_min or p[1] > param_max: raise ValueError("parameter range should be a " + "subinterval of the curve domain " + @@ -3972,18 +3972,19 @@ def system(self, verbose=False): if verbose: initial_tgt_space = v0.parent() - initial_pt = initial_tgt_space.base_point()#retrieves - # the initial point as the base point of the tangent space - # to which initial tangent vector belongs + initial_pt = initial_tgt_space.base_point() + # retrieves the initial point as the base point of the + # tangent space to which initial tangent vector belongs + initial_pt_coords = list(initial_pt.coordinates(chart)) - # previous line converts to list since would otherwise be a - # tuple ; will raise error if coordinates in chart are not - # known + # previous line converts to list since would otherwise be + # a tuple ; will raise error if coordinates in chart are + # not known initial_coord_basis = chart.frame().at(initial_pt) - initial_tgt_vec_comps = v0[initial_coord_basis,:] # will - # raise error if components in coordinate basis are not - # known + initial_tgt_vec_comps = v0[initial_coord_basis,:] + # will raise error if components in coordinate basis are + # not known description = "Geodesic " if self._name is not None: diff --git a/src/sage/manifolds/differentiable/tensorfield_paral.py b/src/sage/manifolds/differentiable/tensorfield_paral.py index 3fa7166234c..08b151e50c9 100644 --- a/src/sage/manifolds/differentiable/tensorfield_paral.py +++ b/src/sage/manifolds/differentiable/tensorfield_paral.py @@ -2118,7 +2118,7 @@ def at(self, point): if dest_map.is_identity(): amb_point = point else: - amb_point = dest_map(point) # "ambient" point + amb_point = dest_map(point) # "ambient" point ts = amb_point._manifold.tangent_space(amb_point) resu = ts.tensor(self._tensor_type, name=self._name, latex_name=self._latex_name, sym=self._sym, diff --git a/src/sage/manifolds/differentiable/vectorframe.py b/src/sage/manifolds/differentiable/vectorframe.py index 8cc75ab0f2d..a4df55bd276 100644 --- a/src/sage/manifolds/differentiable/vectorframe.py +++ b/src/sage/manifolds/differentiable/vectorframe.py @@ -1404,7 +1404,7 @@ def at(self, point): """ # Case of a non-trivial destination map if self._from_frame is not None: - if self._dest_map.is_identity(): #!# probably not necessary + if self._dest_map.is_identity(): # ! # probably not necessary raise ValueError("the destination map should not be the identity") ambient_point = self._dest_map(point) return self._from_frame.at(ambient_point) diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi index 96ea3b69ad8..03e60d56394 100644 --- a/src/sage/matrix/matrix_modn_dense_template.pxi +++ b/src/sage/matrix/matrix_modn_dense_template.pxi @@ -73,7 +73,7 @@ We test corner cases for multiplication:: ....: pass """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2004,2005,2006 William Stein # Copyright (C) 2011 Burcin Erocal # Copyright (C) 2011 Martin Albrecht @@ -83,8 +83,8 @@ We test corner cases for multiplication:: # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** from libc.stdint cimport uint64_t from cpython.bytes cimport * @@ -100,7 +100,7 @@ from sage.parallel.parallelism import Parallelism cimport sage.rings.fast_arith cdef sage.rings.fast_arith.arith_int ArithIntObj -ArithIntObj = sage.rings.fast_arith.arith_int() +ArithIntObj = sage.rings.fast_arith.arith_int() # for copying/pickling from libc.string cimport memcpy @@ -110,7 +110,7 @@ from sage.modules.vector_modn_dense cimport Vector_modn_dense from sage.arith.misc import is_prime from sage.structure.element cimport (Element, Vector, Matrix, - ModuleElement, RingElement) + ModuleElement, RingElement) from sage.matrix.matrix_dense cimport Matrix_dense from sage.matrix.matrix_integer_dense cimport Matrix_integer_dense from sage.rings.finite_rings.integer_mod cimport IntegerMod_int, IntegerMod_abstract @@ -146,7 +146,7 @@ cdef inline celement_invert(celement a, celement n): # always: gcd (n,residue) = gcd (x_int,y_int) # sx*n + tx*residue = x_int # sy*n + ty*residue = y_int - q = x_int / y_int # integer quotient + q = x_int / y_int # integer quotient temp = y_int y_int = x_int - q * y_int x_int = temp @@ -155,7 +155,7 @@ cdef inline celement_invert(celement a, celement n): tx = temp if tx < 0: - tx += n + tx += n # now x_int = gcd (n,residue) return tx @@ -175,9 +175,8 @@ cdef inline linbox_echelonize(celement modulus, celement* entries, Py_ssize_t nr """ Return the reduced row echelon form of this matrix. """ - if linbox_is_zero(modulus, entries, nrows, ncols): - return 0,[] + return 0, [] cdef Py_ssize_t i, j cdef ModField *F = new ModField(modulus) @@ -217,12 +216,12 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_ # which would yield a segfault in Sage's debug version. TODO: Fix # that bug upstream. if nrows == 0 or ncols == 0: - return 0,[] + return 0, [] cdef ModField *F = new ModField(modulus) cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols) - cdef Py_ssize_t i,j + cdef Py_ssize_t i, j for i in range(nrows): for j in range(ncols): A.setEntry(i, j, entries[i*ncols+j]) @@ -230,12 +229,12 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_ cdef Py_ssize_t r = reducedRowEchelonize(A[0]) for i in range(nrows): for j in range(ncols): - entries[i*ncols+j] = A.getEntry(i,j) + entries[i*ncols+j] = A.getEntry(i, j) cdef Py_ssize_t ii = 0 cdef list pivots = [] for i in range(r): - for j in range(ii,ncols): + for j in range(ii, ncols): if entries[i*ncols+j] == 1: pivots.append(j) ii = j+1 @@ -316,10 +315,10 @@ cdef inline celement linbox_matrix_matrix_multiply(celement modulus, celement* a pfgemm(F[0], FflasNoTrans, FflasNoTrans, m, n, k, one, A, k, B, n, zero, ans, n, nbthreads) - else : + else: fgemm(F[0], FflasNoTrans, FflasNoTrans, m, n, k, one, - A, k, B, n, zero, - ans, n) + A, k, B, n, zero, + ans, n) if m*n*k > 100000: sig_off() @@ -339,7 +338,7 @@ cdef inline int linbox_matrix_vector_multiply(celement modulus, celement* C, cel sig_on() fgemv(F[0], trans, m, n, one, A, n, b, 1, - zero, C, 1) + zero, C, 1) if m*n > 100000: sig_off() @@ -360,9 +359,7 @@ cdef inline linbox_minpoly(celement modulus, Py_ssize_t nrows, celement* entries if nrows*nrows > 1000: sig_off() - l = [] - for i in range(minP.size()): - l.append( minP.at(i) ) + l = [minP.at(i) for i in range(minP.size())] del F return l @@ -420,10 +417,10 @@ cpdef __matrix_from_rows_of_matrices(X): ``Matrix_modn_dense_float/double._matrix_from_rows_of_matrices`` """ # The code below is just a fast version of the following: - ## from constructor import matrix - ## K = X[0].base_ring() - ## v = sum([y.list() for y in X],[]) - ## return matrix(K, len(X), X[0].nrows()*X[0].ncols(), v) + # from constructor import matrix + # K = X[0].base_ring() + # v = sum([y.list() for y in X],[]) + # return matrix(K, len(X), X[0].nrows()*X[0].ncols(), v) cdef Matrix_modn_dense_template T cdef Py_ssize_t i, n, m @@ -444,7 +441,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): cdef long p = self._base_ring.characteristic() self.p = p if p >= MAX_MODULUS: - raise OverflowError("p (=%s) must be < %s."%(p, MAX_MODULUS)) + raise OverflowError("p (=%s) must be < %s." % (p, MAX_MODULUS)) if zeroed_alloc: self._entries = check_calloc(self._nrows * self._ncols, sizeof(celement)) @@ -729,7 +726,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): PyBytes_AsStringAndSize(s, &buf, &buflen) if buflen != expectedlen: - raise ValueError("incorrect size in matrix pickle (expected %d, got %d)"%(expectedlen, buflen)) + raise ValueError("incorrect size in matrix pickle (expected %d, got %d)" % (expectedlen, buflen)) sig_on() try: @@ -746,7 +743,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): for i from 0 <= i < self._nrows: row_self = self._matrix[i] for j from 0 <= j < self._ncols: - v = (us[0]) + v = (us[0]) v += (us[1]) << 8 v += (us[2]) << 16 v += (us[3]) << 24 @@ -758,7 +755,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): for i from 0 <= i < self._nrows: row_self = self._matrix[i] for j from 0 <= j < self._ncols: - v = (us[word_size-1]) + v = (us[word_size-1]) v += (us[word_size-2]) << 8 v += (us[word_size-3]) << 16 v += (us[word_size-4]) << 24 @@ -790,7 +787,8 @@ cdef class Matrix_modn_dense_template(Matrix_dense): cdef Matrix_modn_dense_template M cdef celement p = self.p - M = self.__class__.__new__(self.__class__, self._parent,None,None,None, zeroed_alloc=False) + M = self.__class__.__new__(self.__class__, self._parent, + None, None, None, zeroed_alloc=False) sig_on() for i in range(self._nrows*self._ncols): @@ -824,12 +822,13 @@ cdef class Matrix_modn_dense_template(Matrix_dense): sage: 3*A + 9*A == 12*A True """ - cdef Py_ssize_t i,j + cdef Py_ssize_t i, j cdef Matrix_modn_dense_template M cdef celement p = self.p cdef celement a = left - M = self.__class__.__new__(self.__class__, self._parent,None,None,None,zeroed_alloc=False) + M = self.__class__.__new__(self.__class__, self._parent, + None, None, None, zeroed_alloc=False) sig_on() for i in range(self._nrows*self._ncols): @@ -848,7 +847,8 @@ cdef class Matrix_modn_dense_template(Matrix_dense): False """ cdef Matrix_modn_dense_template A - A = self.__class__.__new__(self.__class__,self._parent,None,None,None,zeroed_alloc=False) + A = self.__class__.__new__(self.__class__, self._parent, + None, None, None, zeroed_alloc=False) memcpy(A._entries, self._entries, sizeof(celement)*self._nrows*self._ncols) if self._subdivisions is not None: A.subdivide(*self.subdivisions()) @@ -886,7 +886,8 @@ cdef class Matrix_modn_dense_template(Matrix_dense): cdef celement k, p cdef Matrix_modn_dense_template M - M = self.__class__.__new__(self.__class__, self._parent,None,None,None,zeroed_alloc=False) + M = self.__class__.__new__(self.__class__, self._parent, + None, None, None, zeroed_alloc=False) p = self.p cdef celement* other_ent = (right)._entries @@ -1125,7 +1126,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): True """ if get_verbose() >= 2: - verbose('mod-p multiply of %s x %s matrix by %s x %s matrix modulo %s'%( + verbose('mod-p multiply of %s x %s matrix by %s x %s matrix modulo %s' % ( self._nrows, self._ncols, right._nrows, right._ncols, self.p)) if self._ncols != right._nrows: @@ -1174,7 +1175,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): True """ if not isinstance(v, Vector_modn_dense): - return (self.new_matrix(1,self._nrows, entries=v.list()) * self)[0] + return (self.new_matrix(1, self._nrows, entries=v.list()) * self)[0] M = self.row_ambient_module() cdef Vector_modn_dense c = M.zero_vector() @@ -1385,7 +1386,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): return g.change_variable_name(var) if algorithm == 'linbox' and (self.p == 2 or not self.base_ring().is_field()): - algorithm = 'generic' # LinBox only supports Z/pZ (p prime) + algorithm = 'generic' # LinBox only supports Z/pZ (p prime) if algorithm == 'linbox': g = self._charpoly_linbox(var) @@ -1512,7 +1513,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): proof = get_proof_flag(proof, "linear_algebra") if algorithm == 'linbox' and (self.p == 2 or not self.base_ring().is_field()): - algorithm='generic' # LinBox only supports fields + algorithm='generic' # LinBox only supports fields if algorithm == 'linbox': if self._nrows != self._ncols: @@ -1533,9 +1534,9 @@ cdef class Matrix_modn_dense_template(Matrix_dense): raise NotImplementedError("Minimal polynomials are not implemented for Z/nZ.") else: - raise ValueError("no algorithm '%s'"%algorithm) + raise ValueError("no algorithm '%s'" % algorithm) - self.cache('minpoly_%s_%s'%(algorithm, var), g) + self.cache('minpoly_%s_%s' % (algorithm, var), g) return g def _charpoly_linbox(self, var='x'): @@ -1729,7 +1730,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): return # already known to be in echelon form if not self.base_ring().is_field(): - raise NotImplementedError("Echelon form not implemented over '%s'."%self.base_ring()) + raise NotImplementedError("Echelon form not implemented over '%s'." % self.base_ring()) if algorithm == 'linbox': self._echelonize_linbox(efd=True) @@ -1747,7 +1748,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): if A != self or A != B: raise ArithmeticError("Bug in echelon form.") else: - raise ValueError("Algorithm '%s' not known"%algorithm) + raise ValueError("Algorithm '%s' not known" % algorithm) def _echelonize_linbox(self, efd=True): """ @@ -1778,13 +1779,15 @@ cdef class Matrix_modn_dense_template(Matrix_dense): self.check_mutability() self.clear_cache() - t = verbose('Calling echelonize mod %d.'%self.p) + t = verbose('Calling echelonize mod %d.' % self.p) if efd: - r, pivots = linbox_echelonize_efd(self.p, self._entries, self._nrows, self._ncols) + r, pivots = linbox_echelonize_efd(self.p, self._entries, + self._nrows, self._ncols) else: - r, pivots = linbox_echelonize(self.p, self._entries, self._nrows, self._ncols) - verbose('done with echelonize',t) - self.cache('in_echelon_form',True) + r, pivots = linbox_echelonize(self.p, self._entries, + self._nrows, self._ncols) + verbose('done with echelonize', t) + self.cache('in_echelon_form', True) self.cache('rank', r) self.cache('pivots', tuple(pivots)) @@ -1821,11 +1824,11 @@ cdef class Matrix_modn_dense_template(Matrix_dense): fifth = self._ncols / 10 + 1 do_verb = (get_verbose() >= 2) for c from 0 <= c < nc: - if do_verb and (c % fifth == 0 and c>0): - tm = verbose('on column %s of %s'%(c, self._ncols), + if do_verb and (c % fifth == 0 and c > 0): + tm = verbose('on column %s of %s' % (c, self._ncols), level = 2, caller_name = 'matrix_modn_dense echelon') - #end if + # end if sig_check() for r from start_row <= r < nr: a = m[r][c] @@ -1842,7 +1845,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): start_row = start_row + 1 break self.cache('pivots', tuple(pivots)) - self.cache('in_echelon_form',True) + self.cache('in_echelon_form', True) def right_kernel_matrix(self, algorithm='linbox', basis='echelon'): r""" @@ -1990,38 +1993,38 @@ cdef class Matrix_modn_dense_template(Matrix_dense): i = -1 for r from m+1 <= r < n: if h[r][m-1]: - i = r - break + i = r + break if i != -1: - # Found a nonzero entry in column m-1 that is strictly - # below row m. Now set i to be the first nonzero position >= - # m in column m-1. - if h[m][m-1]: - i = m - t = h[i][m-1] - t_inv = celement_invert(t,p) - if i > m: - self.swap_rows_c(i,m) - self.swap_columns_c(i,m) - - # Now the nonzero entry in position (m,m-1) is t. - # Use t to clear the entries in column m-1 below m. - for j from m+1 <= j < n: - if h[j][m-1]: - u = (h[j][m-1] * t_inv) % p - self.add_multiple_of_row_c(j, m, p - u, 0) # h[j] -= u*h[m] - # To maintain charpoly, do the corresponding - # column operation, which doesn't mess up the - # matrix, since it only changes column m, and - # we're only worried about column m-1 right - # now. Add u*column_j to column_m. - self.add_multiple_of_column_c(m, j, u, 0) - # end for + # Found a nonzero entry in column m-1 that is strictly + # below row m. Now set i to be the first nonzero position >= + # m in column m-1. + if h[m][m-1]: + i = m + t = h[i][m-1] + t_inv = celement_invert(t, p) + if i > m: + self.swap_rows_c(i, m) + self.swap_columns_c(i, m) + + # Now the nonzero entry in position (m,m-1) is t. + # Use t to clear the entries in column m-1 below m. + for j from m+1 <= j < n: + if h[j][m-1]: + u = (h[j][m-1] * t_inv) % p + self.add_multiple_of_row_c(j, m, p - u, 0) # h[j] -= u*h[m] + # To maintain charpoly, do the corresponding + # column operation, which doesn't mess up the + # matrix, since it only changes column m, and + # we're only worried about column m-1 right + # now. Add u*column_j to column_m. + self.add_multiple_of_column_c(m, j, u, 0) + # end for # end if # end for sig_off() - self.cache('in_hessenberg_form',True) + self.cache('in_hessenberg_form', True) def _charpoly_hessenberg(self, var): """ @@ -2073,7 +2076,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): # Algorithm 2.2.9. cdef Matrix_modn_dense_template c - c = self.new_matrix(nrows=n+1,ncols=n+1) # the 0 matrix + c = self.new_matrix(nrows=n+1, ncols=n+1) # the 0 matrix c._matrix[0][0] = 1 for m from 1 <= m <= n: # Set the m-th row of c to (x - H[m-1,m-1])*c[m-1] = x*c[m-1] - H[m-1,m-1]*c[m-1] @@ -2088,7 +2091,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): for i from 1 <= i < m: t = (t*H._matrix[m-i][m-i-1]) % p # Set the m-th row of c to c[m] - t*H[m-i-1,m-1]*c[m-i-1] - c.add_multiple_of_row_c(m, m-i-1, p - (t*H._matrix[m-i-1][m-1])%p, 0) + c.add_multiple_of_row_c(m, m-i-1, p - (t*H._matrix[m-i-1][m-1]) % p, 0) # The answer is now the n-th row of c. v = [] @@ -2306,13 +2309,13 @@ cdef class Matrix_modn_dense_template(Matrix_dense): cdef Py_ssize_t nc, i cdef int a = row1[start_col] cdef int b = row2[start_col] - g = ArithIntObj.c_xgcd_int (a,b,&s,&t) + g = ArithIntObj.c_xgcd_int(a, b, &s, &t) v = a/g w = -b/g nc = self.ncols() for i from start_col <= i < nc: - tmp = ( s * row1[i] + t * row2[i]) % p + tmp = (s * row1[i] + t * row2[i]) % p row2[i] = (w* row1[i] + v*row2[i]) % p row1[i] = tmp return g @@ -2446,7 +2449,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): cdef Py_ssize_t i, nc nc = self._ncols for i from start_col <= i < nc: - v_to[i] = ((multiple) * v_from[i] + v_to[i]) % p + v_to[i] = ((multiple) * v_from[i] + v_to[i]) % p cdef add_multiple_of_column_c(self, Py_ssize_t col_to, Py_ssize_t col_from, multiple, Py_ssize_t start_row): """ @@ -2665,7 +2668,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): True """ s = self.base_ring()._magma_init_(magma) - return 'Matrix(%s,%s,%s,StringToIntegerSequence("%s"))'%( + return 'Matrix(%s,%s,%s,StringToIntegerSequence("%s"))' % ( s, self._nrows, self._ncols, self._export_as_string()) cpdef _export_as_string(self): @@ -2758,8 +2761,9 @@ cdef class Matrix_modn_dense_template(Matrix_dense): cdef Py_ssize_t i, j cdef Matrix_integer_dense L - cdef object P = matrix_space.MatrixSpace(ZZ, self._nrows, self._ncols, sparse=False) - L = Matrix_integer_dense(P,ZZ(0),False,False) + cdef object P = matrix_space.MatrixSpace(ZZ, self._nrows, + self._ncols, sparse=False) + L = Matrix_integer_dense(P, ZZ(0), False, False) cdef celement* A_row for i in range(self._nrows): A_row = self._matrix[i] @@ -2808,7 +2812,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense): cdef Py_ssize_t ncols = self._ncols cdef Matrix_modn_dense_template M = self.new_matrix(nrows=ncols, ncols=nrows) - cdef Py_ssize_t i,j + cdef Py_ssize_t i, j for i from 0 <= i < ncols: for j from 0 <= j < nrows: @@ -2955,8 +2959,9 @@ cdef class Matrix_modn_dense_template(Matrix_dense): memcpy(M._entries+selfsize, other._entries, sizeof(celement)*other._ncols*other._nrows) return M - def submatrix(self, Py_ssize_t row=0, Py_ssize_t col=0, - Py_ssize_t nrows=-1, Py_ssize_t ncols=-1): + def submatrix(self, + Py_ssize_t row=0, Py_ssize_t col=0, + Py_ssize_t nrows=-1, Py_ssize_t ncols=-1): r""" Return the matrix constructed from ``self`` using the specified range of rows and columns. @@ -3024,8 +3029,8 @@ cdef class Matrix_modn_dense_template(Matrix_dense): memcpy(M._entries, self._matrix[row], sizeof(celement)*ncols*nrows) return M - cdef Py_ssize_t i,r - for i,r in enumerate(range(row, row+nrows)) : + cdef Py_ssize_t i, r + for i, r in enumerate(range(row, row+nrows)) : memcpy(M._matrix[i], self._matrix[r]+col, sizeof(celement)*ncols) return M diff --git a/src/sage/matrix/matrix_space.py b/src/sage/matrix/matrix_space.py index 2ba59292d54..7f5cb645134 100644 --- a/src/sage/matrix/matrix_space.py +++ b/src/sage/matrix/matrix_space.py @@ -297,7 +297,7 @@ def get_matrix_class(R, nrows, ncols, sparse, implementation): except ImportError: pass else: - if isinstance(R, polynomial_ring.PolynomialRing_general) and R.base_ring() in _Fields: + if isinstance(R, polynomial_ring.PolynomialRing_generic) and R.base_ring() in _Fields: try: from . import matrix_polynomial_dense except ImportError: diff --git a/src/sage/matrix/meson.build b/src/sage/matrix/meson.build index a0168c1a117..0e51c764de7 100644 --- a/src/sage/matrix/meson.build +++ b/src/sage/matrix/meson.build @@ -2,6 +2,7 @@ iml = cc.find_library('iml') py.install_sources( + '__init__.py', 'action.pxd', 'all.py', 'all__sagemath_meataxe.py', diff --git a/src/sage/matroids/basis_exchange_matroid.pyx b/src/sage/matroids/basis_exchange_matroid.pyx index 7cf056c4292..8b04ad20205 100644 --- a/src/sage/matroids/basis_exchange_matroid.pyx +++ b/src/sage/matroids/basis_exchange_matroid.pyx @@ -996,7 +996,7 @@ cdef class BasisExchangeMatroid(Matroid): sage: setprint(M.components()) [{0, 1, 3, 4}, {2, 5}] """ - cdef long i,j,e + cdef long i, j, e if not self._E: return SetSystem(self._E) cdef bitset_t *comp @@ -1098,15 +1098,15 @@ cdef class BasisExchangeMatroid(Matroid): cdef bitset_t SS, TT bitset_init(SS, self._groundset_size) bitset_init(TT, self._groundset_size) - self._pack(SS,S) - self._pack(TT,T) - #F = set(self.groundset()) - (S | T) + self._pack(SS, S) + self._pack(TT, T) + # F = set(self.groundset()) - (S | T) cdef bitset_t F, I bitset_init(F, self._groundset_size) bitset_init(I, self._groundset_size) bitset_union(self._input, SS, TT) bitset_complement(F, self._input) - #I = self._augment(S|T, F) + # I = self._augment(S|T, F) self.__augment(I, self._input, F) cdef bitset_t X, X1, X2, next_layer, todo, out_neighbors, R bitset_init(X, self._groundset_size) @@ -1121,52 +1121,52 @@ cdef class BasisExchangeMatroid(Matroid): cdef long e, u, y cdef bint found_path = True while found_path: - #X = F - I - bitset_difference(X,F,I) - #X1 = X - self._closure(T|I) + # X = F - I + bitset_difference(X, F, I) + # X1 = X - self._closure(T|I) bitset_union(self._input, TT, I) self.__closure(X1, self._input) - bitset_difference(X1,X,X1) - #X2 = X - self._closure(S|I) + bitset_difference(X1, X, X1) + # X2 = X - self._closure(S|I) bitset_union(self._input, SS, I) self.__closure(X2, self._input) - bitset_difference(X2,X,X2) + bitset_difference(X2, X, X2) bitset_intersection(R, X1, X2) e = bitset_first(R) if e >= 0: bitset_add(I, e) continue - #predecessor = {x: None for x in X1} + # predecessor = {x: None for x in X1} e = bitset_first(X1) while e>=0: predecessor[e] = -1 e = bitset_next(X1, e+1) - #next_layer = set(X1) + # next_layer = set(X1) bitset_copy(next_layer, X1) bitset_union(R, SS, X1) found_path = False while not bitset_isempty(next_layer) and not found_path: - #todo = next_layer - bitset_copy(todo,next_layer) - #next_layer = {} + # todo = next_layer + bitset_copy(todo, next_layer) + # next_layer = {} bitset_clear(next_layer) u = bitset_first(todo) - while u>=0 and not found_path: - if bitset_in(X,u): - #out_neighbors = self._circuit(I|S.union([u])) - S.union([u]) + while u >= 0 and not found_path: + if bitset_in(X, u): + # out_neighbors = self._circuit(I|S.union([u])) - S.union([u]) bitset_union(self._input, I, SS) bitset_add(self._input, u) self.__circuit(out_neighbors, self._input) bitset_discard(out_neighbors, u) else: - #out_neighbors = X - self._closure(I|T - set([u])) + # out_neighbors = X - self._closure(I|T - set([u])) bitset_union(self._input, I, TT) bitset_discard(self._input, u) self.__closure(out_neighbors, self._input) bitset_difference(out_neighbors, X, out_neighbors) bitset_difference(out_neighbors, out_neighbors, R) y = bitset_first(out_neighbors) - while y>=0: + while y >= 0: predecessor[y] = u if bitset_in(X2, y): found_path = True @@ -1552,7 +1552,7 @@ cdef class BasisExchangeMatroid(Matroid): res._append(I[i+1]) bitset_copy(self._input, I[i+1]) self.__closure(T[i+1], self._input) - bitset_union(T[i+1],T[i+1],T[i]) + bitset_union(T[i+1], T[i+1], T[i]) i = i + 1 else: i = i - 1 @@ -2102,7 +2102,7 @@ cdef class BasisExchangeMatroid(Matroid): from sage.matroids.basis_matroid import BasisMatroid other = BasisMatroid(other) if self is other: - return {e:e for e in self.groundset()} + return {e: e for e in self.groundset()} if len(self) != len(other): return None if self.full_rank() != other.full_rank(): diff --git a/src/sage/matroids/basis_matroid.pyx b/src/sage/matroids/basis_matroid.pyx index b74a76af956..73c75f27b01 100644 --- a/src/sage/matroids/basis_matroid.pyx +++ b/src/sage/matroids/basis_matroid.pyx @@ -955,7 +955,7 @@ cdef class BasisMatroid(BasisExchangeMatroid): if not isinstance(other, BasisMatroid): return self.isomorphism(BasisMatroid(other)) if self is other: - return {e:e for e in self.groundset()} + return {e: e for e in self.groundset()} if len(self) != len(other): return None if self.full_rank() != other.full_rank(): diff --git a/src/sage/matroids/chow_ring_ideal.py b/src/sage/matroids/chow_ring_ideal.py index d0ac04a23ee..8c067432b33 100644 --- a/src/sage/matroids/chow_ring_ideal.py +++ b/src/sage/matroids/chow_ring_ideal.py @@ -13,6 +13,7 @@ from sage.combinat.posets.posets import Poset from itertools import product + class ChowRingIdeal(MPolynomialIdeal): def matroid(self): r""" @@ -52,9 +53,10 @@ def _lattice_flats(self): flats = list(lattice_flats) flats.sort(key=lambda X: (len(X), sorted(X))) ranks = {F: self._matroid.rank(F) for F in flats} - chains = lattice_flats.chains() #Only chains + chains = lattice_flats.chains() # Only chains return (ranks, chains) + class ChowRingIdeal_nonaug(ChowRingIdeal): r""" The Chow ring ideal of a matroid `M`. @@ -116,8 +118,8 @@ def __init__(self, M, R): for X in self._matroid.flats(i)] names = ['A{}'.format(''.join(str(x) for x in sorted(F, key=cmp_elements_key))) for F in flats] try: - poly_ring = PolynomialRing(R, names) #self.ring - except ValueError: # variables are not proper names + poly_ring = PolynomialRing(R, names) # self.ring + except ValueError: # variables are not proper names poly_ring = PolynomialRing(R, 'A', len(flats)) gens = poly_ring.gens() self._flats_generator = dict(zip(flats, gens)) @@ -392,8 +394,8 @@ def __init__(self, M, R): try: names_groundset = ['A{}'.format(''.join(str(x))) for x in E] names_flats = ['B{}'.format(''.join(str(x) for x in sorted(F, key=cmp_elements_key))) for F in self._flats] - poly_ring = PolynomialRing(R, names_groundset + names_flats) #self.ring() - except ValueError: #variables are not proper names + poly_ring = PolynomialRing(R, names_groundset + names_flats) # self.ring() + except ValueError: # variables are not proper names poly_ring = PolynomialRing(R, 'A', len(E) + len(self._flats)) for i, x in enumerate(E): self._flats_generator[x] = poly_ring.gens()[i] @@ -526,7 +528,7 @@ def groebner_basis(self, algorithm='', *args, **kwargs): for H in lattice_flats.order_filter([F]): term1 += self._flats_generator[H] if term1 != poly_ring.zero(): - gb.append(term1**(self._matroid.rank(F) + 1)) #5.6 (MM2022) + gb.append(term1**(self._matroid.rank(F) + 1)) # 5.6 (MM2022) order_ideal_modified = lattice_flats.order_ideal([F]) order_ideal_modified.remove(F) for G in order_ideal_modified: # nested flats @@ -643,8 +645,8 @@ def __init__(self, M, R): for X in self._matroid.flats(i)] names = ['A{}'.format(''.join(str(x) for x in sorted(F, key=cmp_elements_key))) for F in self._flats] try: - poly_ring = PolynomialRing(R, names) #self.ring - except ValueError: # variables are not proper names + poly_ring = PolynomialRing(R, names) # self.ring + except ValueError: # variables are not proper names poly_ring = PolynomialRing(R, 'A', len(self._flats)) gens = poly_ring.gens() self._flats_generator = dict(zip(self._flats, gens)) @@ -797,4 +799,4 @@ def normal_basis(self, algorithm='', *args, **kwargs): for val, c in zip(subset, combination): expression *= flats_gen[val] ** c monomial_basis.append(expression) - return PolynomialSequence(R, [monomial_basis]) \ No newline at end of file + return PolynomialSequence(R, [monomial_basis]) diff --git a/src/sage/matroids/circuit_closures_matroid.pyx b/src/sage/matroids/circuit_closures_matroid.pyx index a4251298ebc..72cd1c4fc16 100644 --- a/src/sage/matroids/circuit_closures_matroid.pyx +++ b/src/sage/matroids/circuit_closures_matroid.pyx @@ -62,7 +62,8 @@ from cpython.object cimport Py_EQ, Py_NE from sage.structure.richcmp cimport rich_to_bool, richcmp from sage.matroids.matroid cimport Matroid from sage.matroids.set_system cimport SetSystem -from sage.matroids.utilities import setprint_s, cmp_elements_key +from sage.matroids.utilities import setprint_s + cdef class CircuitClosuresMatroid(Matroid): r""" diff --git a/src/sage/matroids/circuits_matroid.pyx b/src/sage/matroids/circuits_matroid.pyx index cd44db7772b..a93efd85b33 100644 --- a/src/sage/matroids/circuits_matroid.pyx +++ b/src/sage/matroids/circuits_matroid.pyx @@ -186,7 +186,6 @@ cdef class CircuitsMatroid(Matroid): 6 """ cdef set XX = set(X) - cdef int i cdef frozenset C while True: try: diff --git a/src/sage/matroids/graphic_matroid.pyx b/src/sage/matroids/graphic_matroid.pyx index 53bd8adef39..c718535b4aa 100644 --- a/src/sage/matroids/graphic_matroid.pyx +++ b/src/sage/matroids/graphic_matroid.pyx @@ -608,7 +608,7 @@ cdef class GraphicMatroid(Matroid): # then use method from abstract matroid class conset, delset = sanitize_contractions_deletions(self, contractions, deletions) M = self._minor(contractions=conset, deletions=delset) - should_be_true, elements = Matroid._has_minor(M, N, certificate=True) + _, elements = Matroid._has_minor(M, N, certificate=True) # elements is a tuple (contractions, deletions, dict) # There should be no more contractions diff --git a/src/sage/matroids/lean_matrix.pyx b/src/sage/matroids/lean_matrix.pyx index e0f86c6db83..82de4b9a648 100644 --- a/src/sage/matroids/lean_matrix.pyx +++ b/src/sage/matroids/lean_matrix.pyx @@ -521,16 +521,16 @@ cdef class LeanMatrix: for z in range(self.ncols()): if z in P_cols+Q_cols: continue - sol,cert = self.shifting(P_rows,P_cols,Q_rows,Q_cols,z,None,m) + sol, cert = self.shifting(P_rows, P_cols, Q_rows, Q_cols, z, None, m) if sol: return True, cert - sol,cert = self.shifting(Q_rows,Q_cols,P_rows,P_cols,None,z,m) + sol, cert = self.shifting(Q_rows, Q_cols, P_rows, P_cols, None, z, m) if sol: return True, cert - sol,cert = self.shifting(P_rows,P_cols,Q_rows,Q_cols,None,z,m) + sol, cert = self.shifting(P_rows, P_cols, Q_rows, Q_cols, None, z, m) if sol: return True, cert - sol,cert = self.shifting(Q_rows,Q_cols,P_rows,P_cols,z,None,m) + sol, cert = self.shifting(Q_rows, Q_cols, P_rows, P_cols, z, None, m) if sol: return True, cert return False, None @@ -600,26 +600,29 @@ cdef class LeanMatrix: B = self.matrix_from_rows_and_columns(list(U_1), range(len(Y))) B.gauss_jordan_reduce(lV_2) # find a unique representation of every rows in X_3xV_1 using rows in U_2xV_1 - BT = self.matrix_from_rows_and_columns(range(len(X)),list(V_1)).transpose() + BT = self.matrix_from_rows_and_columns(range(len(X)), + list(V_1)).transpose() BT.gauss_jordan_reduce(lU_2) cdef set X_p = set(X_1) cdef set Y_p = set(Y_1) while True: - #rowshifts - X_p_new = set([]) + # rowshifts + X_p_new = set() for x in set(X_3): for y in Y_p: - if sum([BT.get_unsafe(rU[u],x)*self.get_unsafe(u,y) for u in U_2]) != self.get_unsafe(x,y): + if sum([BT.get_unsafe(rU[u], x) * self.get_unsafe(u, y) + for u in U_2]) != self.get_unsafe(x, y): X_1.append(x) X_3.remove(x) X_p_new.add(x) break - #colshifts - Y_p_new = set([]) + # colshifts + Y_p_new = set() for y in set(Y_3): for x in X_p: - if sum([B.get_unsafe(rV[v],y)*self.get_unsafe(x,v) for v in V_2]) != self.get_unsafe(x,y): + if sum([B.get_unsafe(rV[v], y) * self.get_unsafe(x, v) + for v in V_2]) != self.get_unsafe(x, y): Y_1.append(y) Y_3.remove(y) Y_p_new.add(y) @@ -1327,7 +1330,7 @@ cdef class BinaryMatrix(LeanMatrix): for r in range(len(rows)): row = self._M[rows[r]] row2 = A._M[r] - bitset_intersection(row2, row, mask) # yes, this is safe + bitset_intersection(row2, row, mask) # yes, this is safe for g in range(lg): if bitset_in(row, cols[g]): bitset_add(row2, gaps[g]) @@ -2006,8 +2009,8 @@ cdef class TernaryMatrix(LeanMatrix): row1 = self._M1[rows[r]] row0_2 = A._M0[r] row1_2 = A._M1[r] - bitset_intersection(row0_2, row0, mask) # yes, this is safe - bitset_intersection(row1_2, row1, mask) # yes, this is safe + bitset_intersection(row0_2, row0, mask) # yes, this is safe + bitset_intersection(row1_2, row1, mask) # yes, this is safe for g in range(lg): p = cols[g] if bitset_in(row0, p): @@ -2590,7 +2593,7 @@ cdef class QuaternaryMatrix(LeanMatrix): row1 = self._M1[rows[r]] row0_2 = A._M0[r] row1_2 = A._M1[r] - bitset_intersection(row0_2, row0, mask) # yes, this is safe + bitset_intersection(row0_2, row0, mask) # yes, this is safe bitset_intersection(row1_2, row1, mask) for g in range(lg): p = cols[g] @@ -3233,11 +3236,11 @@ cdef class RationalMatrix(LeanMatrix): elif isinstance(M, LeanMatrix): for i in range(M.nrows()): for j in range(M.ncols()): - mpq_set(self._entries[i * self._ncols + j], Rational((M).get_unsafe(i,j)).value) + mpq_set(self._entries[i * self._ncols + j], Rational((M).get_unsafe(i, j)).value) else: # Sage Matrix or otherwise for i in range(M.nrows()): for j in range(M.ncols()): - mpq_set(self._entries[i * self._ncols + j], Rational(M[i,j]).value) + mpq_set(self._entries[i * self._ncols + j], Rational(M[i, j]).value) def __dealloc__(self): """ @@ -3358,7 +3361,7 @@ cdef class RationalMatrix(LeanMatrix): A = RationalMatrix(self._nrows, self._ncols + Mn) for i in range(self._nrows): for j in range(self._ncols): - mpq_set(A._entries[A.index(i,j)], self._entries[self.index(i,j)]) + mpq_set(A._entries[A.index(i, j)], self._entries[self.index(i, j)]) mpq_set(A._entries[i*A._ncols + self._ncols + j], (M)._entries[i*Mn + j]) return A @@ -3366,9 +3369,10 @@ cdef class RationalMatrix(LeanMatrix): cdef RationalMatrix A = RationalMatrix(self._nrows, self._ncols + self._nrows) cdef long i, j for i in range(self._nrows): - mpq_set_si(A._entries[A.index(i,i)], 1, 1) + mpq_set_si(A._entries[A.index(i, i)], 1, 1) for j in range(self._ncols): - mpq_set(A._entries[A.index(i,self._nrows+j)], self._entries[self.index(i,j)]) + mpq_set(A._entries[A.index(i, self._nrows + j)], + self._entries[self.index(i, j)]) return A cpdef base_ring(self): diff --git a/src/sage/matroids/linear_matroid.pyx b/src/sage/matroids/linear_matroid.pyx index 9030ce47f25..02d1d3c28d9 100644 --- a/src/sage/matroids/linear_matroid.pyx +++ b/src/sage/matroids/linear_matroid.pyx @@ -2731,15 +2731,15 @@ cdef class LinearMatroid(BasisExchangeMatroid): dX = dict(zip(range(len(X)), X)) dY = dict(zip(range(len(Y)), Y)) - for (x, y) in spanning_forest(M): - P_rows=[x] - P_cols=[y] - Q_rows=[] - Q_cols=[] - sol,cert_pair = M2.shifting_all(P_rows, P_cols, Q_rows, Q_cols, 2) + for x, y in spanning_forest(M): + P_rows = [x] + P_cols = [y] + Q_rows = [] + Q_cols = [] + sol, cert_pair = M2.shifting_all(P_rows, P_cols, Q_rows, Q_cols, 2) if sol: if certificate: - cert = set([]) + cert = set() for x in cert_pair[0]: cert.add(dX[x]) for y in cert_pair[1]: @@ -2795,8 +2795,8 @@ cdef class LinearMatroid(BasisExchangeMatroid): M = M2._matrix_() X, Y = self._current_rows_cols() - dX = dict(zip(range(len(X)),X)) - dY = dict(zip(range(len(Y)),Y)) + dX = dict(zip(range(len(X)), X)) + dY = dict(zip(range(len(Y)), Y)) n = len(X) m = len(Y) @@ -2817,22 +2817,22 @@ cdef class LinearMatroid(BasisExchangeMatroid): Yp = list(range(m)) Yp.remove(y1) - B = B.matrix_from_rows_and_columns(Xp,Yp) + B = B.matrix_from_rows_and_columns(Xp, Yp) # produce a spanning forest of B - for (x,y) in spanning_forest(B): + for x, y in spanning_forest(B): if x >= x1: x = x + 1 if y >= y1: y = y + 1 # rank 2 matrix and rank 0 matrix - P_rows = [x,x1] - P_cols = [y,y1] + P_rows = [x, x1] + P_cols = [y, y1] Q_rows = [] Q_cols = [] # make sure the matrix has rank 2 - if M.matrix_from_rows_and_columns(P_rows,P_cols).rank() == 2: - sol,cert_pair = M2.shifting_all(P_rows, P_cols, Q_rows, Q_cols, 3) + if M.matrix_from_rows_and_columns(P_rows, P_cols).rank() == 2: + sol, cert_pair = M2.shifting_all(P_rows, P_cols, Q_rows, Q_cols, 3) if sol: break # rank 1 matrix and rank 1 matrix @@ -2841,7 +2841,7 @@ cdef class LinearMatroid(BasisExchangeMatroid): Q_rows = [x] Q_cols = [y] # both matrix have rank 1 - sol,cert_pair = M2.shifting_all(P_rows, P_cols, Q_rows, Q_cols, 3) + sol, cert_pair = M2.shifting_all(P_rows, P_cols, Q_rows, Q_cols, 3) if sol: break if sol: @@ -2906,7 +2906,7 @@ cdef class LinearMatroid(BasisExchangeMatroid): if action in Semigroups: G, action = action, G else: - G, action = G_action, None # the None action is g.__call__ + G, action = G_action, None # the None action is g.__call__ from sage.algebras.orlik_terao import OrlikTeraoInvariantAlgebra @@ -3835,7 +3835,7 @@ cdef class BinaryMatroid(LinearMatroid): global GF2 cdef int r, c B= self.basis() - C = [self._fundamental_cocircuit(B,e) for e in B] + C = [self._fundamental_cocircuit(B, e) for e in B] c = 1 col = {} @@ -3850,21 +3850,22 @@ cdef class BinaryMatroid(LinearMatroid): for f in range(e): for g in range(f): if not C[e].issuperset(C[f] & C[g]): - M.append([col[e,f], col[e,g]]) + M.append([col[e, f], col[e, g]]) r += 1 if not C[f].issuperset(C[e] & C[g]): - M.append([col[f,e], col[f,g]]) + M.append([col[f, e], col[f, g]]) r += 1 if not C[g].issuperset(C[e] & C[f]): - M.append([col[g,e], col[g,f]]) + M.append([col[g, e], col[g, f]]) r += 1 if len(C[e] & C[f] & C[g]) > 0: - M.append([0,col[e,f], col[e,g], col[f,e], col[f,g], col[g,e], col[g,f]]) + M.append([0, col[e, f], col[e, g], col[f, e], + col[f, g], col[g, e], col[g, f]]) r += 1 cdef BinaryMatrix m = BinaryMatrix(r, c) for r in range(len(M)): for c in M[r]: - m.set(r,c) + m.set(r, c) # now self is graphic iff there is a binary vector x so that M*x = 0 and x_0 = 1, so: return BinaryMatroid(m).corank(frozenset([0])) > 0 @@ -4730,9 +4731,9 @@ cdef class TernaryMatroid(LinearMatroid): C = [self._idx[f] for f in F] A, C2 = (self._A).matrix_from_rows_and_columns_reordered(R, C) return TernaryMatroid(matrix=A, - groundset=[self._E[c] for c in C2], - basis=bas, - keep_initial_representation=False) + groundset=[self._E[c] for c in C2], + basis=bas, + keep_initial_representation=False) cpdef is_valid(self, certificate=False): r""" @@ -5498,9 +5499,9 @@ cdef class QuaternaryMatroid(LinearMatroid): C = [self._idx[f] for f in F] A, C2 = (self._A).matrix_from_rows_and_columns_reordered(R, C) return QuaternaryMatroid(matrix=A, - groundset=[self._E[c] for c in C2], - basis=bas, - keep_initial_representation=False) + groundset=[self._E[c] for c in C2], + basis=bas, + keep_initial_representation=False) cpdef is_valid(self, certificate=False): r""" @@ -6166,8 +6167,9 @@ cdef class RegularMatroid(LinearMatroid): VO.extend(X) m = isomorphic(HS[2], HO[2], HS[0], VO, 1, 1) if m: - idx={str(f):f for f in other.groundset()} - return {e:idx[m[str(e)]] for e in self.groundset() if str(e) in m} + idx = {str(f): f for f in other.groundset()} + return {e: idx[m[str(e)]] for e in self.groundset() + if str(e) in m} cpdef has_line_minor(self, k, hyperlines=None, certificate=False): r""" diff --git a/src/sage/matroids/matroid.pyx b/src/sage/matroids/matroid.pyx index ff853ba9f5a..fab7b9008bf 100644 --- a/src/sage/matroids/matroid.pyx +++ b/src/sage/matroids/matroid.pyx @@ -3415,7 +3415,7 @@ cdef class Matroid(SageObject): if action in Semigroups: G, action = action, G else: - G, action = G_action, None # the None action is g.__call__ + G, action = G_action, None # the None action is g.__call__ from sage.algebras.orlik_solomon import OrlikSolomonInvariantAlgebra @@ -3669,7 +3669,7 @@ cdef class Matroid(SageObject): False """ if self is other: - return {e:e for e in self.groundset()} + return {e: e for e in self.groundset()} if self.full_rank() == other.full_rank(): return SetSystem(self.groundset(), self.nonbases())._isomorphism(SetSystem(other.groundset(), other.nonbases())) else: @@ -5204,7 +5204,7 @@ cdef class Matroid(SageObject): sage: M._connectivity(frozenset('ab'), frozenset('cd')) 2 """ - return len(self._link(S,T)[0]) - self.full_rank() + self.rank(S) + self.rank(T) + return len(self._link(S, T)[0]) - self.full_rank() + self.rank(S) + self.rank(T) cpdef link(self, S, T): r""" @@ -5409,7 +5409,7 @@ cdef class Matroid(SageObject): continue # Given Q1, Q2 partition of Q, find all extensions for r2 in range(r+1): - for R1 in map(set,combinations(R, r2)): + for R1 in map(set, combinations(R, r2)): R2 = R - R1 # F is the set of elements cannot be in the extension of Q1 F = set([]) @@ -5417,7 +5417,7 @@ cdef class Matroid(SageObject): # if Q1|R1 is full if m-len(Q1)-len(R1) == 0: T = frozenset(Q1 | R1) - for B in map(set,combinations(U, m-len(Q2)-len(R2))): + for B in map(set, combinations(U, m-len(Q2)-len(R2))): S = frozenset(Q2 | R2 | B) _, X = self._link(S, T) if self.connectivity(X) < m: @@ -5434,7 +5434,7 @@ cdef class Matroid(SageObject): # extension of Q2 is full if len(F) == m-len(Q2)-len(R2): S = frozenset(Q2 | R2 | F) - for A in map(set, combinations(U,m-len(Q1)-len(R1))): + for A in map(set, combinations(U, m-len(Q1)-len(R1))): T = frozenset(Q1 | R1 | A) _, X = self._link(S, T) if self.connectivity(X) < m: @@ -5669,7 +5669,7 @@ cdef class Matroid(SageObject): T = frozenset([g, h]) I, X = self._link(S, T) # check if connectivity between S,T is < 2 - if len(I) + 2 < self.full_rank(): # note: rank(S) = rank(T) = 2 + if len(I) + 2 < self.full_rank(): # note: rank(S) = rank(T) = 2 if certificate: return False, X else: @@ -5685,7 +5685,7 @@ cdef class Matroid(SageObject): T = frozenset([f, h]) I, X = self._link(S, T) # check if connectivity between S,T is < 2 - if len(I) + 2 < self.full_rank(): # note: rank(S) = rank(T) = 2 + if len(I) + 2 < self.full_rank(): # note: rank(S) = rank(T) = 2 if certificate: return False, X else: @@ -5700,7 +5700,7 @@ cdef class Matroid(SageObject): T = frozenset([e, h]) I, X = self._link(S, T) # check if connectivity between S,T is < 2 - if len(I) + 2 < self.full_rank(): # note: rank(S) = rank(T) = 2 + if len(I) + 2 < self.full_rank(): # note: rank(S) = rank(T) = 2 if certificate: return False, X else: @@ -5774,12 +5774,12 @@ cdef class Matroid(SageObject): for x in (X & self.fundamental_circuit(X, y)): M[rdX[x], rdY[y]]=1 - for (x,y) in spanning_forest(M): - P_rows=set([dX[x]]) - P_cols=set([dY[y]]) - Q_rows=set([]) - Q_cols=set([]) - sol,cert = self._shifting_all(X, P_rows, P_cols, Q_rows, Q_cols, 2) + for x, y in spanning_forest(M): + P_rows = set([dX[x]]) + P_cols = set([dY[y]]) + Q_rows = set() + Q_cols = set() + sol, cert = self._shifting_all(X, P_rows, P_cols, Q_rows, Q_cols, 2) if sol: if certificate: return False, cert @@ -5837,15 +5837,15 @@ cdef class Matroid(SageObject): # the partial matrix M = matrix(len(X), len(Y)) for y in Y: - for x in (X & self.fundamental_circuit(X,y)): - M[rdX[x],rdY[y]]=1 + for x in (X & self.fundamental_circuit(X, y)): + M[rdX[x], rdY[y]] = 1 n = len(X) m = len(Y) # compute a connected set of stars T = spanning_stars(M) - for (x1,y1) in T: + for x1, y1 in T: # The whiting out B = M for (x, y) in product(range(n), range(m)): @@ -5858,20 +5858,20 @@ cdef class Matroid(SageObject): Xp.remove(x1) Yp = list(range(m)) Yp.remove(y1) - B = B.matrix_from_rows_and_columns(Xp,Yp) + B = B.matrix_from_rows_and_columns(Xp, Yp) # produce a spanning forest of B - for (x,y) in spanning_forest(B): + for x, y in spanning_forest(B): if x >= x1: x = x+1 if y >= y1: y = y+1 # rank 2 matrix and rank 0 matrix - P_rows = set([dX[x],dX[x1]]) - P_cols = set([dY[y],dY[y1]]) - Q_rows = set([]) - Q_cols = set([]) - sol,cert = self._shifting_all(X, P_rows, P_cols, Q_rows, Q_cols, 3) + P_rows = set([dX[x], dX[x1]]) + P_cols = set([dY[y], dY[y1]]) + Q_rows = set() + Q_cols = set() + sol, cert = self._shifting_all(X, P_rows, P_cols, Q_rows, Q_cols, 3) if sol: if certificate: return False, cert @@ -5881,7 +5881,7 @@ cdef class Matroid(SageObject): P_cols = set([dY[y1]]) Q_rows = set([dX[x]]) Q_cols = set([dY[y]]) - sol,cert = self._shifting_all(X, P_rows, P_cols, Q_rows, Q_cols, 3) + sol, cert = self._shifting_all(X, P_rows, P_cols, Q_rows, Q_cols, 3) if sol: if certificate: return False, cert @@ -5937,16 +5937,16 @@ cdef class Matroid(SageObject): """ Y = self.groundset()-X for z in (Y - P_cols) - Q_cols: - sol,cert = self._shifting(X,P_rows,P_cols|set([z]),Q_rows,Q_cols,m) + sol, cert = self._shifting(X, P_rows, P_cols|set([z]), Q_rows, Q_cols, m) if sol: return True, cert - sol,cert = self._shifting(X,Q_rows,Q_cols,P_rows,P_cols|set([z]),m) + sol, cert = self._shifting(X, Q_rows, Q_cols, P_rows, P_cols|set([z]), m) if sol: return True, cert - sol,cert = self._shifting(X,P_rows,P_cols,Q_rows,Q_cols|set([z]),m) + sol, cert = self._shifting(X, P_rows, P_cols, Q_rows, Q_cols|set([z]), m) if sol: return True, cert - sol,cert = self._shifting(X,Q_rows,Q_cols|set([z]),P_rows,P_cols,m) + sol, cert = self._shifting(X, Q_rows, Q_cols|set([z]), P_rows, P_cols, m) if sol: return True, cert return False, None @@ -6008,26 +6008,26 @@ cdef class Matroid(SageObject): Y = self.groundset()-X # Returns true if there is a m-separator if (self._rank(Y_2|(X-X_1)) - len(X-X_1) - + self._rank(Y_1|(X-X_2)) - len(X-X_2) != m-1): + + self._rank(Y_1|(X-X_2)) - len(X-X_2) != m-1): return False, None if len(X_1|Y_1) < m: return False, None remainX = set(X-(X_1|X_2)) remainY = set(Y-(Y_1|Y_2)) while True: - #rowshifts + # rowshifts rowshift = False for x in set(remainX): if (self._rank(Y_1|(X-(X_2|set([x])))) - len(X-(X_2|set([x]))) - > self._rank(Y_1|(X-X_2)) - len(X-X_2)): + > self._rank(Y_1|(X-X_2)) - len(X-X_2)): X_1 = X_1 | {x} remainX.remove(x) rowshift = True - #colshifts + # colshifts colshift = False for y in set(remainY): if (self._rank(Y_2|set([y])|(X-X_1)) - len(X-X_1) - > self._rank(Y_2|(X-X_1)) - len(X-X_1)): + > self._rank(Y_2|(X-X_1)) - len(X-X_1)): Y_1 = Y_1 | {y} remainY.remove(y) colshift = True @@ -6353,7 +6353,7 @@ cdef class Matroid(SageObject): True """ M = self._local_binary_matroid() - m = {e:e for e in self.groundset()} + m = {e: e for e in self.groundset()} if randomized_tests > 0: E = list(self.groundset()) for r in range(randomized_tests): @@ -6458,20 +6458,20 @@ cdef class Matroid(SageObject): for C in G.connected_components_subgraphs(): T.update(C.min_spanning_tree()) for edge in T: - e,f = edge[2] - A.set(bdx[e],idx[f], 1) + e, f = edge[2] + A.set(bdx[e], idx[f], 1) W = list(set(G.edges(sort=False)) - set(T)) H = G.subgraph(edges = T) while W: edge = W.pop(-1) - e,f = edge[2] + e, f = edge[2] path = H.shortest_path(e, f) for i in range(len(W)): edge2 = W[i] if edge2[0] in path and edge2[1] in path: W[i] = edge edge = edge2 - e,f = edge[2] + e, f = edge[2] while path[0]!= e and path[0] != f: path.pop(0) while path[-1]!= e and path[-1] != f: @@ -6485,9 +6485,9 @@ cdef class Matroid(SageObject): else: x = x * A.get(bdx[path[i+1]], idx[path[i]]) if (len(path) % 4 == 0) == self.is_dependent(set(basis).symmetric_difference(path)): - A.set(bdx[e],idx[f],x) + A.set(bdx[e], idx[f], x) else: - A.set(bdx[e],idx[f],-x) + A.set(bdx[e], idx[f], -x) H.add_edge(edge) from sage.matroids.linear_matroid import TernaryMatroid return TernaryMatroid(groundset=E, matrix=A, basis=basis, keep_initial_representation=False) @@ -6534,7 +6534,7 @@ cdef class Matroid(SageObject): NonFano: Ternary matroid of rank 3 on 7 elements, type 0- """ M = self._local_ternary_matroid() - m = {e:e for e in self.groundset()} + m = {e: e for e in self.groundset()} if randomized_tests > 0: E = list(self.groundset()) for r in range(randomized_tests): @@ -6816,7 +6816,7 @@ cdef class Matroid(SageObject): """ cdef frozenset C if k2 is None: - k2 = len(self.groundset()) + 1 # This is always larger than the rank + k2 = len(self.groundset()) + 1 # This is always larger than the rank for C in self.circuits_iterator(): if len(C) < k1 or len(C) > k2: continue @@ -7478,7 +7478,7 @@ cdef class Matroid(SageObject): todo = set(X1) next_layer = set() while todo: - while todo: # todo is subset of X + while todo: # todo is subset of X u = todo.pop() m = w[u] if u not in out_neighbors: @@ -7491,7 +7491,7 @@ cdef class Matroid(SageObject): next_layer.add(y) todo = next_layer next_layer = set() - while todo: # todo is subset of Y + while todo: # todo is subset of Y u = todo.pop() m = w[u] if u not in out_neighbors: @@ -7505,11 +7505,11 @@ cdef class Matroid(SageObject): todo = next_layer next_layer = set() - X3 = X2.intersection(w) # w is the set of elements reachable from X1 - if not X3: # if no path from X1 to X2, then no augmenting set exists + X3 = X2.intersection(w) # w is the set of elements reachable from X1 + if not X3: # if no path from X1 to X2, then no augmenting set exists return False, frozenset(w) else: - s = min([w[x] for x in X3]) # find shortest length of an X1 - X2 path + s = min([w[x] for x in X3]) # find shortest length of an X1 - X2 path for u in X3: if w[u] == s: break @@ -7639,7 +7639,7 @@ cdef class Matroid(SageObject): layers[dist] = set(todo) if X3: break - while todo: # todo is subset of X + while todo: # todo is subset of X u = todo.pop() m = w[u] if u not in out_neighbors: @@ -7658,7 +7658,7 @@ cdef class Matroid(SageObject): break if not todo: break - while todo: # todo is subset of Y + while todo: # todo is subset of Y u = todo.pop() m = w[u] if u not in out_neighbors: @@ -7708,15 +7708,13 @@ cdef class Matroid(SageObject): for v in layers[d[u]+1] - visited: # check if edge (u,v) exists in the auxiliary digraph exist = False - if ((u in Y) and - (v in E-Y) and - (self.is_dependent(Y|set([v]))) and - (self.is_independent((Y|set([v])) - set([u])))): + if ((u in Y) and (v in E-Y) and + (self.is_dependent(Y|{v})) and + (self.is_independent((Y|{v}) - {u}))): exist = True - if ((u in E-Y) and - (v in Y) and - (not other.is_independent(Y|set([u]))) and - (other.is_independent((Y|set([u])) - set([v])))): + if ((u in E-Y) and (v in Y) and + (not other.is_independent(Y|{u})) and + (other.is_independent((Y|{u}) - {v}))): exist = True if exist: stack.append(v) @@ -8172,8 +8170,8 @@ cdef class Matroid(SageObject): B = list(self.basis()) elif B is not None and not self.is_basis(B): return - lineorders2=matroids_plot_helpers.lineorders_union(self._cached_info['lineorders'],lineorders) - return matroids_plot_helpers.geomrep(self,B,lineorders2,pd=pos_dict, sp=save_pos) + lineorders2 = matroids_plot_helpers.lineorders_union(self._cached_info['lineorders'], lineorders) + return matroids_plot_helpers.geomrep(self, B, lineorders2, pd=pos_dict, sp=save_pos) cpdef show(self, B=None, lineorders=None, pos_method=None, pos_dict=None, save_pos=False, lims=None): """ @@ -8216,12 +8214,12 @@ cdef class Matroid(SageObject): B = list(self.basis()) elif B is not None and not self.is_basis(B): return - B1=B - lineorders1=lineorders - pm=pos_method - pd=pos_dict - sp=save_pos - G=self.plot(B1,lineorders1,pm,pd,sp) + B1 = B + lineorders1 = lineorders + pm = pos_method + pd = pos_dict + sp = save_pos + G = self.plot(B1, lineorders1, pm, pd, sp) if lims is None: G.show() else: @@ -8265,7 +8263,7 @@ cdef class Matroid(SageObject): # check sanity of pos_dict and add it to cached info if sane if pos_dict is not None: from sage.matroids import matroids_plot_helpers - if matroids_plot_helpers.posdict_is_sane(self,pos_dict): + if matroids_plot_helpers.posdict_is_sane(self, pos_dict): self._cached_info = {'plot_positions': pos_dict, 'lineorders': lineorders} return @@ -8461,11 +8459,11 @@ cdef class Matroid(SageObject): # constructed yet. DM = IM.disjoint_union(SimplicialComplex()) - ## simplices are \{y_i\}_{i\in I}\cup\{x_{F_1},\ldots,x_{F_\ell}\}, - ## by [BMHPW20a]_ thm 4 it is pure of dimension r(M)-1 + # simplices are \{y_i\}_{i\in I}\cup\{x_{F_1},\ldots,x_{F_\ell}\}, + # by [BMHPW20a]_ thm 4 it is pure of dimension r(M)-1 for c in LM.chains(exclude=LM.maximal_elements()): - if c: # the facets of IM are already present + if c: # the facets of IM are already present # get the cardinality of intersection of facet with IM r = self._rank(self.groundset()) - len(c) diff --git a/src/sage/matroids/meson.build b/src/sage/matroids/meson.build index f60970da5b9..8fd8ae12895 100644 --- a/src/sage/matroids/meson.build +++ b/src/sage/matroids/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'advanced.py', 'all.py', 'basis_exchange_matroid.pxd', diff --git a/src/sage/matroids/union_matroid.pyx b/src/sage/matroids/union_matroid.pyx index e371d5fb313..86c78c8463d 100644 --- a/src/sage/matroids/union_matroid.pyx +++ b/src/sage/matroids/union_matroid.pyx @@ -97,11 +97,11 @@ cdef class MatroidUnion(Matroid): summands.append(e.delete(e.groundset()-X)) sum_matroid = MatroidSum(summands) d = {} - for (i,x) in sum_matroid.groundset(): + for i, x in sum_matroid.groundset(): if x not in d: - d[x]=set() + d[x] = set() d[x].add(i) - part_matroid = PartitionMatroid([[(i,x) for i in d[x]] for x in d]) + part_matroid = PartitionMatroid([[(i, x) for i in d[x]] for x in d]) return len(sum_matroid._intersection_unweighted(part_matroid)) def _repr_(self): @@ -156,7 +156,7 @@ cdef class MatroidSum(Matroid): E = set() for i in range(len(self.summands)): g = self.summands[i].groundset() - E.update(zip([i]*len(g),g)) + E.update(zip([i] * len(g), g)) self._groundset = frozenset(E) def _repr_(self): diff --git a/src/sage/meson.build b/src/sage/meson.build index 80b2a030518..d0cf55161b9 100644 --- a/src/sage/meson.build +++ b/src/sage/meson.build @@ -86,6 +86,7 @@ foreach package : no_processing endforeach py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_bliss.py', 'all__sagemath_categories.py', diff --git a/src/sage/misc/binary_tree.pxd b/src/sage/misc/binary_tree.pxd index 4e54f74a71a..1200b4b3d95 100644 --- a/src/sage/misc/binary_tree.pxd +++ b/src/sage/misc/binary_tree.pxd @@ -4,24 +4,24 @@ cdef struct binary_tree_node: binary_tree_node *right void *value -#cdef binary_tree_node *BinaryTreeNode(int, object) -#cdef void free_binary_tree_node(binary_tree_node *) -#cdef void binary_tree_dealloc(binary_tree_node *) -#cdef void binary_tree_insert(binary_tree_node *self, int, object) -#cdef object binary_tree_get(binary_tree_node *, int) -#cdef object binary_tree_delete(binary_tree_node *, int) -#cdef binary_tree_node *binary_tree_left_excise(binary_tree_node *) -#cdef binary_tree_node *binary_tree_right_excise(binary_tree_node *) -#cdef binary_tree_node *binary_tree_head_excise(binary_tree_node *) -#cdef object binary_tree_list(binary_tree_node *, int) +# cdef binary_tree_node *BinaryTreeNode(int, object) +# cdef void free_binary_tree_node(binary_tree_node *) +# cdef void binary_tree_dealloc(binary_tree_node *) +# cdef void binary_tree_insert(binary_tree_node *self, int, object) +# cdef object binary_tree_get(binary_tree_node *, int) +# cdef object binary_tree_delete(binary_tree_node *, int) +# cdef binary_tree_node *binary_tree_left_excise(binary_tree_node *) +# cdef binary_tree_node *binary_tree_right_excise(binary_tree_node *) +# cdef binary_tree_node *binary_tree_head_excise(binary_tree_node *) +# cdef object binary_tree_list(binary_tree_node *, int) -#cdef int LIST_PREORDER, LIST_POSTORDER, LIST_INORDER, LIST_KEYS, LIST_VALUES -#LIST_PREORDER = 1 -#LIST_INORDER = 2 -#LIST_POSTORDER = 4 -#LIST_KEYS = 8 -#LIST_VALUES = 16 +# cdef int LIST_PREORDER, LIST_POSTORDER, LIST_INORDER, LIST_KEYS, LIST_VALUES +# LIST_PREORDER = 1 +# LIST_INORDER = 2 +# LIST_POSTORDER = 4 +# LIST_KEYS = 8 +# LIST_VALUES = 16 cdef class BinaryTree: diff --git a/src/sage/misc/binary_tree.pyx b/src/sage/misc/binary_tree.pyx index 0756218e53c..14111178271 100644 --- a/src/sage/misc/binary_tree.pyx +++ b/src/sage/misc/binary_tree.pyx @@ -145,7 +145,7 @@ cdef binary_tree_node *binary_tree_head_excise(binary_tree_node *self) noexcept: cdef int LIST_PREORDER, LIST_POSTORDER, LIST_INORDER, LIST_KEYS, LIST_VALUES -LIST_PREORDER = 1 +LIST_PREORDER = 1 LIST_INORDER = 2 LIST_POSTORDER = 4 LIST_KEYS = 8 diff --git a/src/sage/misc/c3.pyx b/src/sage/misc/c3.pyx index 8dc7e9a9feb..9329065a27b 100644 --- a/src/sage/misc/c3.pyx +++ b/src/sage/misc/c3.pyx @@ -192,9 +192,10 @@ cpdef list C3_algorithm(object start, str bases, str attribute, bint proper): cdef object O, X cdef list tails = [getattr(obj, attribute) for obj in args] tails.append(args) - tails = [list(reversed(tail)) for tail in tails] - cdef list heads = [tail.pop() for tail in tails] - cdef list tailsets = [set([O for O in tail]) for tail in tails] + tails = [list(reversed(tail)) for tail in tails] + cdef list heads = [tail.pop() for tail in tails] + cdef list tailsets = [set([O for O in tail]) + for tail in tails] cdef int i, j, nbheads nbheads = len(heads) diff --git a/src/sage/misc/c3_controlled.pyx b/src/sage/misc/c3_controlled.pyx index 885dcf673f0..765e83fbec2 100644 --- a/src/sage/misc/c3_controlled.pyx +++ b/src/sage/misc/c3_controlled.pyx @@ -380,7 +380,7 @@ cdef tuple atoms = ("FacadeSets", "MagmasAndAdditiveMagmas", "Rngs", "Domains", "HopfAlgebras") -cdef dict flags = { atom: 1 << i for i,atom in enumerate(atoms) } +cdef dict flags = {atom: 1 << i for i, atom in enumerate(atoms)} cdef class CmpKey: r""" @@ -574,7 +574,7 @@ cdef class CmpKeyNamed: return result except KeyError: pass - result = _cmp_key.__get__(inst,cls) + result = _cmp_key.__get__(inst, cls) D[key] = result return result @@ -615,9 +615,9 @@ def C3_merge(list lists): cdef list tail, l cdef set tailset - cdef list tails = [l[::-1] for l in lists if l] - cdef list heads = [tail.pop() for tail in tails] - cdef list tailsets = [set(O for O in tail) for tail in tails] # + cdef list tails = [l[::-1] for l in lists if l] + cdef list heads = [tail.pop() for tail in tails] + cdef list tailsets = [set(O for O in tail) for tail in tails] # cdef int i, j, nbheads nbheads = len(heads) @@ -632,7 +632,7 @@ def C3_merge(list lists): if j == i: continue tailset = tailsets[j] - if O in tailset: # O + if O in tailset: # O next_item_found = False break if next_item_found: @@ -641,13 +641,13 @@ def C3_merge(list lists): # if the tail is already empty. # j goes down so that ``del heads[j]`` does not screw up the numbering for j in range(nbheads-1, -1, -1): - if heads[j] == O: # is O + if heads[j] == O: # is O tail = tails[j] if tail: X = tail.pop() heads[j] = X tailset = tailsets[j] - tailset.remove(X) # X) + tailset.remove(X) # X) else: del heads[j] del tails[j] @@ -792,7 +792,7 @@ cpdef tuple C3_sorted_merge(list lists, key=identity): lists = list(lists) if not lists: raise ValueError("The input should be a non empty list of lists (or iterables)") - #for l in lists: + # for l in lists: # assert sorted(l, key = key, reverse=True) == l,\ # "Each input list should be sorted %s"%l @@ -819,10 +819,10 @@ cpdef tuple C3_sorted_merge(list lists, key=identity): cdef list tail, l cdef set tailset - cdef list tails = [l[::-1] for l in lists if l] - cdef list heads = [tail.pop() for tail in tails] + cdef list tails = [l[::-1] for l in lists if l] + cdef list heads = [tail.pop() for tail in tails] cdef set tmp_set - cdef list tailsets = [] # remove closure [set(key(O) for O in tail) for tail in tails] + cdef list tailsets = [] # remove closure [set(key(O) for O in tail) for tail in tails] for tail in tails: tmp_set = set() for O in tail: @@ -855,10 +855,10 @@ cpdef tuple C3_sorted_merge(list lists, key=identity): # "keys should be distinct"%(tails[i]) while nbheads: - #print_state() - #check_state() + # print_state() + # check_state() # Find the position of the largest head which will become the next item - max_i = 0 + max_i = 0 max_key = key(heads[0]) for i in range(1, nbheads): O = heads[i] @@ -915,10 +915,10 @@ cpdef tuple C3_sorted_merge(list lists, key=identity): # Use a heap or something for fast sorted insertion? # Since Python uses TimSort, that's probably not so bad. tails[-1].append(O) - tails[-1].sort(key = key) + tails[-1].sort(key=key) tailsets[-1].add(O_key) suggestion.add(O) - #check_state() + # check_state() # Insert max_value in the last list, if needed to hold off the bad items if max_bad is not None: @@ -927,10 +927,10 @@ cpdef tuple C3_sorted_merge(list lists, key=identity): if last_head is not None and last_head != max_bad: tails[-1].append(last_head) tailsets[-1].add(key(last_head)) - #check_state() + # check_state() heads[-1] = max_value holder[max_bad] = max_value - #check_state() + # check_state() out.append(max_value) # Clear O from other heads, removing the line altogether @@ -951,10 +951,10 @@ cpdef tuple C3_sorted_merge(list lists, key=identity): nbheads -= 1 if last_list_non_empty and j == nbheads: last_list_non_empty = False - #check_state() + # check_state() suggestion.update(holder.values()) cdef list suggestion_list = sorted(suggestion, key=key, reverse=True) - #assert C3_merge(lists[:-1]+[suggestion_list]) == out + # assert C3_merge(lists[:-1]+[suggestion_list]) == out return (out, suggestion_list) @@ -1373,7 +1373,7 @@ class HierarchyElement(object, metaclass=ClasscallMetaclass): sage: sorted([x.value for x in HierarchyElement(10, P).all_bases()]) [1, 2, 5, 10] """ - return {self} | { x for base in self._bases for x in base.all_bases() } + return {self} | {x for base in self._bases for x in base.all_bases()} def all_bases_len(self): """ @@ -1386,7 +1386,7 @@ class HierarchyElement(object, metaclass=ClasscallMetaclass): sage: HierarchyElement(30, P).all_bases_len() # needs sage.graphs 12 """ - return sum( len(x._bases) for x in self.all_bases()) + return sum(len(x._bases) for x in self.all_bases()) def all_bases_controlled_len(self): """ @@ -1399,4 +1399,4 @@ class HierarchyElement(object, metaclass=ClasscallMetaclass): sage: HierarchyElement(30, P).all_bases_controlled_len() # needs sage.graphs 13 """ - return sum( len(x._bases_controlled) for x in self.all_bases()) + return sum(len(x._bases_controlled) for x in self.all_bases()) diff --git a/src/sage/misc/cachefunc.pyx b/src/sage/misc/cachefunc.pyx index f800cfd27f1..df4fa8d4457 100644 --- a/src/sage/misc/cachefunc.pyx +++ b/src/sage/misc/cachefunc.pyx @@ -442,20 +442,21 @@ from inspect import isfunction from sage.misc.weak_dict cimport CachedWeakValueDictionary from sage.misc.decorators import decorator_keywords -cdef frozenset special_method_names = frozenset(['__abs__', '__add__', - '__and__', '__call__', '__cmp__', '__coerce__', '__complex__', '__contains__', '__del__', - '__delattr__', '__delete__', '__delitem__', '__delslice__', '__dir__', '__div__', - '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__get__', '__getattr__', - '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__hex__', - '__iadd__', '__iand__', '__idiv__', '__ifloordiv__', '__ilshift__', '__imod__', '__imul__', - '__index__', '__init__', '__instancecheck__', '__int__', '__invert__', '__ior__', '__ipow__', - '__irshift__', '__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__', '__len__', - '__length_hint__', '__long__', '__lshift__', '__lt__', '__missing__', '__mod__', '__mul__', - '__ne__', '__neg__', '__new__', '__oct__', '__or__', '__pos__', '__pow__', - '__radd__', '__rand__', '__rdiv__', '__repr__', '__reversed__', '__rfloordiv__', '__rlshift__', - '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', - '__rtruediv__', '__rxor__', '__set__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', - '__str__', '__sub__', '__subclasscheck__', '__truediv__', '__unicode__', '__xor__', 'next']) +cdef frozenset special_method_names = frozenset( + ['__abs__', '__add__', + '__and__', '__call__', '__cmp__', '__coerce__', '__complex__', '__contains__', '__del__', + '__delattr__', '__delete__', '__delitem__', '__delslice__', '__dir__', '__div__', + '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__get__', '__getattr__', + '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__hex__', + '__iadd__', '__iand__', '__idiv__', '__ifloordiv__', '__ilshift__', '__imod__', '__imul__', + '__index__', '__init__', '__instancecheck__', '__int__', '__invert__', '__ior__', '__ipow__', + '__irshift__', '__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__', '__len__', + '__length_hint__', '__long__', '__lshift__', '__lt__', '__missing__', '__mod__', '__mul__', + '__ne__', '__neg__', '__new__', '__oct__', '__or__', '__pos__', '__pow__', + '__radd__', '__rand__', '__rdiv__', '__repr__', '__reversed__', '__rfloordiv__', '__rlshift__', + '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', + '__rtruediv__', '__rxor__', '__set__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', + '__str__', '__sub__', '__subclasscheck__', '__truediv__', '__unicode__', '__xor__', 'next']) def _cached_function_unpickle(module, name, cache=None): @@ -500,7 +501,7 @@ def _cached_function_unpickle(module, name, cache=None): sage: f(0) 0 """ - ret = getattr(__import__(module, fromlist=['']),name) + ret = getattr(__import__(module, fromlist=['']), name) if cache is not None: ret.cache.update(cache) return ret @@ -777,8 +778,9 @@ cdef class CachedFunction(): self.__cached_module__ = f.__module__ except AttributeError: self.__cached_module__ = f.__objclass__.__module__ - if argument_fixer is not None: # it is None unless the argument fixer - # was known previously. See #15038. + if argument_fixer is not None: + # it is None unless the argument fixer + # was known previously. See #15038. self._argument_fixer = argument_fixer @property @@ -811,7 +813,7 @@ cdef class CachedFunction(): -1 """ self._argument_fixer = ArgumentFixer(self.f, - classmethod=self.is_classmethod) + classmethod=self.is_classmethod) cdef fix_args_kwds(self, tuple args, dict kwds): r""" @@ -848,10 +850,10 @@ cdef class CachedFunction(): return _cached_function_unpickle, (self.__cached_module__, self.__name__, self.cache) ######### - ## Introspection - ## - ## We provide some methods explicitly, and - ## forward other questions to the cached function. + # Introspection + # + # We provide some methods explicitly, and + # forward other questions to the cached function. def _instancedoc_(self): """ @@ -894,15 +896,15 @@ cdef class CachedFunction(): try: sourcelines = sage_getsourcelines(f) filename = sage_getfile_relative(f) - #this is a rather expensive way of getting the line number, because - #retrieving the source requires reading the source file and in many - #cases this is not required (in cython it's embedded in the docstring, - #on code objects you'll find it in co_filename and co_firstlineno) - #however, this hasn't been factored out yet in sageinspect - #and the logic in sage_getsourcelines is rather intricate. - file_info = "File: {} (starting at line {})".format(filename,sourcelines[1])+os.linesep - - doc = file_info+doc + # this is a rather expensive way of getting the line number, because + # retrieving the source requires reading the source file and in many + # cases this is not required (in cython it's embedded in the docstring, + # on code objects you'll find it in co_filename and co_firstlineno) + # however, this hasn't been factored out yet in sageinspect + # and the logic in sage_getsourcelines is rather intricate. + file_info = "File: {} (starting at line {})".format(filename, sourcelines[1]) + os.linesep + + doc = file_info + doc except IOError: pass return doc @@ -1249,7 +1251,7 @@ cdef class CachedFunction(): ak = normalize_input(a) if self.get_key_args_kwds(ak[0], ak[1]) not in self.cache: arglist2.append(ak) - for ((args,kwargs), val) in P(arglist2): + for ((args, kwargs), val) in P(arglist2): self.set_cache(val, *args, **kwargs) @@ -1605,7 +1607,7 @@ class CachedMethodPickle(): x^2*y*z^3 - x*y^2*z^3 + 2*y^3*z^3 + z^6, x*y^3 + y^4 + x*z^3, x^3 + y^3 + z^3]} """ - return CachedMethodPickle,(self._instance,self._name,self._cache) + return CachedMethodPickle, (self._instance, self._name, self._cache) def __call__(self, *args, **kwds): """ @@ -1629,7 +1631,7 @@ class CachedMethodPickle(): Cached version of """ self._instance.__dict__.__delitem__(self._name) - CM = getattr(self._instance,self._name) + CM = getattr(self._instance, self._name) if self._cache is not None: if isinstance(CM, CachedMethodCallerNoArgs): CM.cache = self._cache @@ -1667,14 +1669,14 @@ class CachedMethodPickle(): Cached version of """ self._instance.__dict__.__delitem__(self._name) - CM = getattr(self._instance,self._name) + CM = getattr(self._instance, self._name) if self._cache is not None: if isinstance(CM, CachedMethodCallerNoArgs): CM.cache = self._cache else: for k, v in self._cache: CM.cache[k] = v - return getattr(CM,s) + return getattr(CM, s) cdef class CachedMethodCaller(CachedFunction): @@ -1786,10 +1788,10 @@ cdef class CachedMethodCaller(CachedFunction): sage: J.groebner_basis Cached version of """ - if isinstance(self._cachedmethod, CachedInParentMethod) or hasattr(self._instance,self._cachedmethod._cache_name): - return CachedMethodPickle,(self._instance,self.__name__) + if isinstance(self._cachedmethod, CachedInParentMethod) or hasattr(self._instance, self._cachedmethod._cache_name): + return CachedMethodPickle, (self._instance, self.__name__) else: - return CachedMethodPickle,(self._instance,self.__name__,self.cache) + return CachedMethodPickle, (self._instance, self.__name__, self.cache) def _instance_call(self, *args, **kwds): """ @@ -2086,11 +2088,12 @@ cdef class CachedMethodCaller(CachedFunction): cls = type(self) Caller = cls(self._cachedmethod, inst, - cache=self._cachedmethod._get_instance_cache(inst), - name=self._cachedmethod._cachedfunc.__name__, key=self.key, do_pickle=self.do_pickle) + cache=self._cachedmethod._get_instance_cache(inst), + name=self._cachedmethod._cachedfunc.__name__, + key=self.key, do_pickle=self.do_pickle) try: - setattr(inst,self._cachedmethod._cachedfunc.__name__, Caller) + setattr(inst, self._cachedmethod._cachedfunc.__name__, Caller) return Caller except AttributeError: pass @@ -2139,7 +2142,7 @@ cdef class CachedMethodCaller(CachedFunction): ak = normalize_input(a) if self.get_key_args_kwds(ak[0], ak[1]) not in self.cache: arglist2.append(ak) - for ((args,kwargs), val) in P(arglist2): + for ((args, kwargs), val) in P(arglist2): self.set_cache(val, *args, **kwargs) @@ -2227,12 +2230,12 @@ cdef class CachedMethodCallerNoArgs(CachedFunction): 4 """ # initialize CachedFunction - if isinstance(f,str): + if isinstance(f, str): try: - F = getattr(inst.__class__,f) + F = getattr(inst.__class__, f) except AttributeError: - F = getattr(inst,f) - if isinstance(F,CachedFunction): + F = getattr(inst, f) + if isinstance(F, CachedFunction): f = F.f else: f = F @@ -2277,9 +2280,8 @@ cdef class CachedMethodCallerNoArgs(CachedFunction): Cached version of """ if self.do_pickle: - return CachedMethodPickle,(self._instance, self.__name__, self.cache) - else: - return CachedMethodPickle,(self._instance, self.__name__) + return CachedMethodPickle, (self._instance, self.__name__, self.cache) + return CachedMethodPickle, (self._instance, self.__name__) def _instance_call(self): """ @@ -2465,7 +2467,7 @@ cdef class CachedMethodCallerNoArgs(CachedFunction): pass Caller = CachedMethodCallerNoArgs(inst, self.f, name=self.__name__, do_pickle=self.do_pickle) try: - setattr(inst,self.__name__, Caller) + setattr(inst, self.__name__, Caller) return Caller except AttributeError: pass @@ -2827,7 +2829,7 @@ cdef class CachedMethod(): if self.nargs == 0: if isinstance(f, object) and not isfunction(f): try: - if METH_NOARGS&PyCFunction_GetFlags(f.__get__(inst,cls)): + if METH_NOARGS&PyCFunction_GetFlags(f.__get__(inst, cls)): self.nargs = 1 except Exception: pass @@ -2971,7 +2973,7 @@ cdef class CachedSpecialMethod(CachedMethod): self.nargs = 1 Caller = CachedMethodCallerNoArgs(inst, f, name=name, do_pickle=self._cachedfunc.do_pickle) else: - self.nargs = 2 # don't need the exact number + self.nargs = 2 # don't need the exact number Caller = CachedMethodCaller(self, inst, cache=self._get_instance_cache(inst), name=name, @@ -2987,7 +2989,7 @@ cdef class CachedSpecialMethod(CachedMethod): do_pickle=self._cachedfunc.do_pickle) if inst is not None: try: - setattr(inst,name, Caller) + setattr(inst, name, Caller) return Caller except AttributeError: pass @@ -3280,7 +3282,7 @@ cdef class CachedInParentMethod(CachedMethod): return P.__dict__.setdefault(self._cache_name, default) except AttributeError: pass - if not hasattr(P,'_cached_methods'): + if not hasattr(P, '_cached_methods'): raise TypeError("The parent of this element does not allow attribute assignment\n" + " and does not descend from the Parent base class.\n" + " Cannot use CachedInParentMethod.") @@ -3295,7 +3297,7 @@ cdef class CachedInParentMethod(CachedMethod): """ Caller = GloballyCachedMethodCaller(self, inst, cache=self._get_instance_cache(inst), key=self._cachedfunc.key, do_pickle=self._cachedfunc.do_pickle) try: - setattr(inst,self._cachedfunc.__name__, Caller) + setattr(inst, self._cachedfunc.__name__, Caller) except AttributeError: pass return Caller @@ -3382,7 +3384,7 @@ class FileCache(): l = len(prefix) for f in os.listdir(dir): if f[:l] == prefix: - files.append( dir + f ) + files.append(dir + f) return files def items(self): @@ -3601,7 +3603,7 @@ class FileCache(): f = self._filename(key) save(key, f+'.key.sobj') - save((key,value), f + '.sobj') + save((key, value), f + '.sobj') if self._cache is not None: self._cache[key] = value diff --git a/src/sage/misc/citation.pyx b/src/sage/misc/citation.pyx index fbe932ba49a..96fe00e98c4 100644 --- a/src/sage/misc/citation.pyx +++ b/src/sage/misc/citation.pyx @@ -97,12 +97,12 @@ def get_systems(cmd): from sage.repl.preparse import preparse cmd = preparse(cmd) - #Run the command and get the stats + # Run the command and get the stats filename = tmp_filename() cProfile.runctx(cmd, globals(), {}, filename) stats = pstats.Stats(filename) - #Strings is a list of method names and modules which get run + # Strings is a list of method names and modules which get run def string_from_stat(a): s = a[0] if SAGE_LOCAL: @@ -114,7 +114,7 @@ def get_systems(cmd): strings = [string_from_stat(a) for a in stats.stats] - #Remove trivial functions + # Remove trivial functions bad_res = [re.compile(r'is_.*Element'), re.compile("is_[a-z_]*_type")] for bad_re in bad_res: i = 0 diff --git a/src/sage/misc/classcall_metaclass.pxd b/src/sage/misc/classcall_metaclass.pxd index 1ae792f074b..24022139808 100644 --- a/src/sage/misc/classcall_metaclass.pxd +++ b/src/sage/misc/classcall_metaclass.pxd @@ -1,10 +1,10 @@ # sage_setup: distribution = sagemath-objects -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2012 Florent Hivert # # Distributed under the terms of the GNU General Public License (GPL) -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** from sage.misc.nested_class cimport NestedClassMetaclass diff --git a/src/sage/misc/constant_function.pyx b/src/sage/misc/constant_function.pyx index 2e9c3d9fe44..044b83ad24f 100644 --- a/src/sage/misc/constant_function.pyx +++ b/src/sage/misc/constant_function.pyx @@ -3,15 +3,15 @@ r""" Constant functions """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2009 Nicolas M. Thiery # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** from sage.structure.richcmp cimport richcmp from sage.structure.sage_object cimport SageObject diff --git a/src/sage/misc/cython.py b/src/sage/misc/cython.py index 95491a5c623..adf2d8a10ef 100644 --- a/src/sage/misc/cython.py +++ b/src/sage/misc/cython.py @@ -226,17 +226,6 @@ def cython(filename, verbose=0, compile_message=False, ....: from sage.misc.cachefunc cimport cache_key ....: ''') - In Cython 0.29.33 using `from PACKAGE cimport MODULE` is broken - when `PACKAGE` is a namespace package, see :issue:`35322`:: - - sage: cython(''' - ....: from sage.misc cimport cachefunc - ....: ''') - Traceback (most recent call last): - ... - RuntimeError: Error compiling Cython file: - ... - ...: 'sage/misc.pxd' not found """ if not filename.endswith('pyx'): print("Warning: file (={}) should have extension .pyx".format(filename), file=sys.stderr) @@ -380,7 +369,7 @@ def cython(filename, verbose=0, compile_message=False, cython_messages = re.sub( "^.*The keyword 'nogil' should appear at the end of the function signature line. " "Placing it before 'except' or 'noexcept' will be disallowed in a future version of Cython.\n", - "", cython_messages, 0, re.MULTILINE) + "", cython_messages, flags=re.MULTILINE) sys.stderr.write(cython_messages) sys.stderr.flush() @@ -578,6 +567,9 @@ def cython_import_all(filename, globals, **kwds): - ``filename`` -- string; name of a file that contains Cython code + + See the function :func:`sage.misc.cython.cython` for documentation + for the other inputs. """ m = cython_import(filename, **kwds) for k, x in m.__dict__.items(): @@ -621,6 +613,9 @@ def compile_and_load(code, **kwds): - ``code`` -- string containing code that could be in a .pyx file that is attached or put in a %cython block in the notebook + See the function :func:`sage.misc.cython.cython` for documentation + for the other inputs. + OUTPUT: a module, which results from compiling the given code and importing it diff --git a/src/sage/misc/decorators.py b/src/sage/misc/decorators.py index f93f1227448..004e7b51922 100644 --- a/src/sage/misc/decorators.py +++ b/src/sage/misc/decorators.py @@ -51,6 +51,18 @@ def sage_wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES): the special attribute ``_sage_argspec_`` of the wrapping function (for an example, see e.g. ``@options`` decorator in this module). + Note that in ``.pyx`` files which is compiled by Cython, because Sage uses + ``binding=False`` compiler directive by default, you need to explicitly + specify ``binding=True`` for all functions decorated with ``sage_wraps``:: + + sage: import cython + sage: def square(f): + ....: @sage_wraps(f) + ....: @cython.binding(True) + ....: def new_f(x): + ....: return f(x)*f(x) + ....: return new_f + EXAMPLES: Demonstrate that documentation string and source are retained from the diff --git a/src/sage/misc/derivative.pyx b/src/sage/misc/derivative.pyx index 24ceb09a1db..24bb401e4be 100644 --- a/src/sage/misc/derivative.pyx +++ b/src/sage/misc/derivative.pyx @@ -1,4 +1,4 @@ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2008 William Stein # # Distributed under the terms of the GNU General Public License (GPL) @@ -10,8 +10,8 @@ # # The full text of the GPL is available at: # -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** r""" Utility functions for making derivative() behave uniformly across Sage. diff --git a/src/sage/misc/fast_methods.pyx b/src/sage/misc/fast_methods.pyx index d38c1802c45..7c939a5f810 100644 --- a/src/sage/misc/fast_methods.pyx +++ b/src/sage/misc/fast_methods.pyx @@ -18,15 +18,15 @@ AUTHOR: - Simon King (2013-10): Add :class:`Singleton` """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2013 Simon A. King # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** from sage.misc.classcall_metaclass import ClasscallMetaclass, typecall from sage.misc.constant_function import ConstantFunction diff --git a/src/sage/misc/function_mangling.pyx b/src/sage/misc/function_mangling.pyx index e410a49a900..6eded73fc63 100644 --- a/src/sage/misc/function_mangling.pyx +++ b/src/sage/misc/function_mangling.pyx @@ -146,7 +146,7 @@ cdef class ArgumentFixer: cdef dict default_map self._defaults = default_map = {} - for k,v in zip(self._arg_names[-self._ndefault:], defaults): + for k, v in zip(self._arg_names[-self._ndefault:], defaults): default_map[k] = v def __repr__(self): @@ -221,10 +221,10 @@ cdef class ArgumentFixer: val = defaults[name] else: val = args[i] - ARGS.append((name,val)) + ARGS.append((name, val)) extra_args = args[self._nargs:] for k in sorted(kwargs_.keys()): - ARGS.append((k,kwargs_[k])) + ARGS.append((k, kwargs_[k])) return tuple(extra_args), tuple(ARGS) def fix_to_pos(self, *args, **kwds): @@ -289,7 +289,7 @@ cdef class ArgumentFixer: if lenargs >= nargs: return args, () # we take the given arguments, plus the default arguments - return args + self._default_tuple[-nargs+lenargs:],() + return args + self._default_tuple[-nargs+lenargs:], () cdef list Largs = list(args) cdef dict kwargs = dict(kwds) cdef Py_ssize_t i diff --git a/src/sage/misc/functional.py b/src/sage/misc/functional.py index 7286501c0f1..fa8b7923d99 100644 --- a/src/sage/misc/functional.py +++ b/src/sage/misc/functional.py @@ -1137,6 +1137,13 @@ def log(*args, **kwds): sage: log(0, 2) -Infinity + + Check if :issue:`37794` is fixed:: + + sage: log(int(0), 2) + -Infinity + sage: log(int(0), 1/2) + +Infinity """ base = kwds.pop('base', None) if base: diff --git a/src/sage/misc/inherit_comparison.pyx b/src/sage/misc/inherit_comparison.pyx index 9758d25574d..5455cfe53a5 100644 --- a/src/sage/misc/inherit_comparison.pyx +++ b/src/sage/misc/inherit_comparison.pyx @@ -26,7 +26,7 @@ AUTHOR: - Jeroen Demeyer (2015-05-22): initial version, see :issue:`18329` """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2015 Jeroen Demeyer # # This program is free software: you can redistribute it and/or modify @@ -34,7 +34,7 @@ AUTHOR: # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # http://www.gnu.org/licenses/ -#***************************************************************************** +# **************************************************************************** from cpython.object cimport PyTypeObject from sage.misc.classcall_metaclass cimport ClasscallMetaclass diff --git a/src/sage/misc/instancedoc.pyx b/src/sage/misc/instancedoc.pyx index 4641b53b13d..0661ac43dd1 100644 --- a/src/sage/misc/instancedoc.pyx +++ b/src/sage/misc/instancedoc.pyx @@ -108,7 +108,7 @@ Check that inheritance works (after passing the subclass to 'Instance docstring' """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2017 Jeroen Demeyer # # This program is free software: you can redistribute it and/or modify @@ -116,7 +116,7 @@ Check that inheritance works (after passing the subclass to # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # https://www.gnu.org/licenses/ -#***************************************************************************** +# **************************************************************************** from cpython.object cimport PyObject, PyTypeObject diff --git a/src/sage/misc/lazy_attribute.pyx b/src/sage/misc/lazy_attribute.pyx index 7514aee1569..7c2eaffa86e 100644 --- a/src/sage/misc/lazy_attribute.pyx +++ b/src/sage/misc/lazy_attribute.pyx @@ -107,7 +107,7 @@ cdef class _lazy_attribute(): """ cdef CM cdef result - if a is None: # when doing cls.x for cls a class and x a lazy attribute + if a is None: # when doing cls.x for cls a class and x a lazy attribute return self try: # _cached_methods is supposed to be a public Cython attribute. @@ -132,7 +132,7 @@ cdef class _lazy_attribute(): for supercls in cls.__mro__: if self.__name__ in supercls.__dict__ and self is supercls.__dict__[self.__name__]: cls = supercls - return getattr(super(cls, a),self.__name__) + return getattr(super(cls, a), self.__name__) try: setattr(a, self.__name__, result) except AttributeError: @@ -497,11 +497,11 @@ class lazy_attribute(_lazy_attribute): self.f = f if hasattr(f, "__doc__"): self.__doc__ = f.__doc__ - elif hasattr(f, "__doc__"): # Needed to handle Cython methods + elif hasattr(f, "__doc__"): # Needed to handle Cython methods self.__doc__ = f.__doc__ if hasattr(f, "__name__"): self.__name__ = f.__name__ - elif hasattr(f, "__name__"): # Needed to handle Cython methods + elif hasattr(f, "__name__"): # Needed to handle Cython methods self.__name__ = f.__name__ if hasattr(f, "__module__"): self.__module__ = f.__module__ diff --git a/src/sage/misc/lazy_import.pyx b/src/sage/misc/lazy_import.pyx index cde9be93d7e..f309429537b 100644 --- a/src/sage/misc/lazy_import.pyx +++ b/src/sage/misc/lazy_import.pyx @@ -990,7 +990,8 @@ cdef class LazyImport(): def lazy_import(module, names, as_=None, *, - at_startup=False, namespace=None, deprecation=None, feature=None): + at_startup=False, namespace=None, + deprecation=None, feature=None): """ Create a lazy import object and inject it into the caller's global namespace. For the purposes of introspection and calling, this is diff --git a/src/sage/misc/lazy_list.pyx b/src/sage/misc/lazy_list.pyx index 65d397996fc..3f48dce9831 100644 --- a/src/sage/misc/lazy_list.pyx +++ b/src/sage/misc/lazy_list.pyx @@ -117,7 +117,7 @@ empty_lazy_list.cache = [] def lazy_list(data=None, initial_values=None, start=None, stop=None, step=None, - update_function=None): + update_function=None): r""" Return a lazy list. @@ -224,7 +224,7 @@ def lazy_list(data=None, initial_values=None, start=None, stop=None, step=None, assert callable(update_function) return lazy_list_from_update_function(update_function, cache) - if isinstance(data, (tuple,list)): + if isinstance(data, (tuple, list)): data = cache + list(data) l = lazy_list_generic(data, start=0, stop=len(data), step=1) elif isinstance(data, lazy_list_generic): @@ -1137,7 +1137,7 @@ cdef class lazy_list_from_update_function(lazy_list_generic): stop 2147483647 # 32-bit step 1 """ - cdef Py_ssize_t l,ll + cdef Py_ssize_t l, ll l = len(self.cache) while l <= i: self.update_function(self.cache) diff --git a/src/sage/misc/lazy_string.pyx b/src/sage/misc/lazy_string.pyx index 48a26c9b609..553664d639f 100644 --- a/src/sage/misc/lazy_string.pyx +++ b/src/sage/misc/lazy_string.pyx @@ -25,13 +25,13 @@ Note that the function is recomputed each time:: l'2' """ -#Copyright (c) 2009 by Armin Ronacher. +# Copyright (c) 2009 by Armin Ronacher. # -#Some rights reserved. +# Some rights reserved. # -#Redistribution and use in source and binary forms, with or without -#modification, are permitted provided that the following conditions are -#met: +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. @@ -45,17 +45,17 @@ Note that the function is recomputed each time:: # promote products derived from this software without specific # prior written permission. # -#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -#"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -#LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -#A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -#OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -#SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -#LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -#DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -#THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -#OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from cpython.object cimport PyObject_Call, PyObject_RichCompare diff --git a/src/sage/misc/meson.build b/src/sage/misc/meson.build index f4ba17ef30a..97d4bf9e6a1 100644 --- a/src/sage/misc/meson.build +++ b/src/sage/misc/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'abstract_method.py', 'all.py', 'all__sagemath_environment.py', diff --git a/src/sage/misc/nested_class.pyx b/src/sage/misc/nested_class.pyx index e42569abe3e..1f661b8240a 100644 --- a/src/sage/misc/nested_class.pyx +++ b/src/sage/misc/nested_class.pyx @@ -91,7 +91,7 @@ cdef dict sys_modules = sys.modules __all__ = ['modify_for_nested_pickle', 'nested_pickle', 'NestedClassMetaclass', 'MainClass' # Comment out to silence Sphinx warning about nested classes. - #, 'SubClass', 'CopiedClass', 'A1' + # , 'SubClass', 'CopiedClass', 'A1' ] cpdef modify_for_nested_pickle(cls, str name_prefix, module, first_run=True): @@ -325,7 +325,7 @@ class MainClass(object, metaclass=NestedClassMetaclass): sage: MainClass.NestedClass.NestedSubClass.__name__ 'MainClass.NestedClass.NestedSubClass' """ - def dummy(self, x, *args, r=(1,2,3.4), **kwds): + def dummy(self, x, *args, r=(1, 2, 3.4), **kwds): """ A dummy method to demonstrate the embedding of method signature for nested classes. diff --git a/src/sage/misc/persist.pyx b/src/sage/misc/persist.pyx index 15476a3ec37..f7f83a696b8 100644 --- a/src/sage/misc/persist.pyx +++ b/src/sage/misc/persist.pyx @@ -72,8 +72,8 @@ from sage.misc.sage_unittest import TestSuite # `already_unpickled` and finally returns the element. # # For a working example, see sage.rings.padics.lazy_template.LazyElement_unknown -already_pickled = { } -already_unpickled = { } +already_pickled = {} +already_unpickled = {} cdef _normalize_filename(s): @@ -92,7 +92,7 @@ def load(*filename, compress=True, verbose=True, **kwargs): an ``.sobj`` extension added if it doesn't have one. Or, if the input is a filename ending in ``.py``, ``.pyx``, ``.sage``, ``.spyx``, ``.f``, ``.f90`` or ``.m``, load that file into the current running - session. + session using :func:`sage.repl.load.load`. Loaded files are not loaded into their own namespace, i.e., this is much more like Python's ``execfile`` than Python's ``import``. @@ -176,7 +176,7 @@ def load(*filename, compress=True, verbose=True, **kwargs): sage.repl.load.load(filename, globals()) return - ## Check if filename starts with "http://" or "https://" + # Check if filename starts with "http://" or "https://" lower = filename.lower() if lower.startswith("http://") or lower.startswith("https://"): from sage.misc.remote_file import get_remote_file @@ -186,7 +186,7 @@ def load(*filename, compress=True, verbose=True, **kwargs): tmpfile_flag = False filename = _normalize_filename(filename) - ## Load file by absolute filename + # Load file by absolute filename with open(filename, 'rb') as fobj: X = loads(fobj.read(), compress=compress, **kwargs) try: @@ -194,7 +194,7 @@ def load(*filename, compress=True, verbose=True, **kwargs): except AttributeError: pass - ## Delete the tempfile, if it exists + # Delete the tempfile, if it exists if tmpfile_flag: os.unlink(filename) @@ -303,7 +303,7 @@ def _base_dumps(obj, compress=True): global already_pickled gherkin = SagePickler.dumps(obj) - already_pickled = { } + already_pickled = {} if compress: return comp.compress(gherkin) @@ -334,7 +334,7 @@ def dumps(obj, compress=True): ans = obj.dumps(compress) except (AttributeError, RuntimeError, TypeError): ans = _base_dumps(obj, compress=compress) - already_pickled = { } + already_pickled = {} return ans @@ -588,8 +588,7 @@ def unpickle_global(module, name): def error(): raise ImportError("cannot import {1} from {0}, call " - "register_unpickle_override({0!r}, {1!r}, ...) to fix this".format( - module, name)) + "register_unpickle_override({0!r}, {1!r}, ...) to fix this".format(module, name)) mod = sys.modules.get(module) if mod is not None: @@ -624,9 +623,9 @@ class _BasePickler(pickle.Pickler): """ def __init__(self, file_obj, protocol=None, persistent_id=None, *, - fix_imports=True): + fix_imports=True): super(_BasePickler, self).__init__(file_obj, protocol, - fix_imports=fix_imports) + fix_imports=fix_imports) self._persistent_id = persistent_id def persistent_id(self, obj): @@ -825,7 +824,7 @@ class SagePickler(_BasePickler): buf = io.BytesIO() pickler = cls(buf, **kwargs) pickler.dump(obj) - already_pickled = { } + already_pickled = {} return buf.getvalue() @@ -988,7 +987,7 @@ def loads(s, compress=True, **kwargs): unpickler = SageUnpickler(io.BytesIO(s), **kwargs) global already_unpickled ans = unpickler.load() - already_unpickled = { } + already_unpickled = {} return ans @@ -1060,7 +1059,7 @@ def picklejar(obj, dir=None): global already_pickled s = comp.compress(SagePickler.dumps(obj)) - already_pickled = { } + already_pickled = {} typ = str(type(obj)) name = ''.join([x if (x.isalnum() or x == '_') else '_' for x in typ]) diff --git a/src/sage/misc/randstate.pyx b/src/sage/misc/randstate.pyx index 79435da9ce7..fe3351d126b 100644 --- a/src/sage/misc/randstate.pyx +++ b/src/sage/misc/randstate.pyx @@ -529,11 +529,11 @@ cdef class randstate: if seed is None: if use_urandom: - seed = long(binascii.hexlify(os.urandom(16)), 16) + seed = int(binascii.hexlify(os.urandom(16)), 16) else: - seed = long(time.time() * 256) + seed = int(time.time() * 256) else: - seed = long(seed) + seed = int(seed) # If seed==0, leave it at the default seed used by # gmp_randinit_default() @@ -605,9 +605,9 @@ cdef class randstate: from sage.rings.integer_ring import ZZ rand = cls() if seed is None: - rand.seed(long(ZZ.random_element(long(1)<<128))) + rand.seed(int(ZZ.random_element(1<<128))) else: - rand.seed(long(seed)) + rand.seed(int(seed)) self._python_random = rand return rand @@ -624,7 +624,7 @@ cdef class randstate: 48314508034782595865062786044921182484 """ from sage.rings.integer_ring import ZZ - return ZZ.random_element(long(1)<<128) + return ZZ.random_element(1<<128) cpdef long_seed(self): r""" @@ -638,7 +638,7 @@ cdef class randstate: 256056279774514099508607350947089272595 """ from sage.rings.integer_ring import ZZ - return long(ZZ.random_element(long(1)<<128)) + return int(ZZ.random_element(1<<128)) cpdef set_seed_libc(self, bint force): r""" @@ -688,7 +688,7 @@ cdef class randstate: if force or _ntl_seed_randstate is not self: import sage.libs.ntl.ntl_ZZ as ntl_ZZ from sage.rings.integer_ring import ZZ - ntl_ZZ.ntl_setSeed(ZZ.random_element(long(1)<<128)) + ntl_ZZ.ntl_setSeed(ZZ.random_element(1<<128)) _ntl_seed_randstate = self def set_seed_gap(self): @@ -715,7 +715,7 @@ cdef class randstate: mersenne_seed, classic_seed = self._gap_saved_seed else: from sage.rings.integer_ring import ZZ - seed = ZZ.random_element(long(1)<<128) + seed = ZZ.random_element(1<<128) classic_seed = seed mersenne_seed = seed @@ -838,8 +838,8 @@ cdef class randstate: sage: current_randstate().c_rand_double() 0.22437207488974298 """ - cdef double a = gmp_urandomb_ui(self.gmp_state, 25) * (1.0 / 33554432.0) # divide by 2^25 - cdef double b = gmp_urandomb_ui(self.gmp_state, 28) * (1.0 / 9007199254740992.0) # divide by 2^53 + cdef double a = gmp_urandomb_ui(self.gmp_state, 25) * (1.0 / 33554432.0) # divide by 2^25 + cdef double b = gmp_urandomb_ui(self.gmp_state, 28) * (1.0 / 9007199254740992.0) # divide by 2^53 return a+b def __dealloc__(self): @@ -1004,9 +1004,7 @@ def benchmark_libc(): sage: timeit('benchmark_mt()') # random 125 loops, best of 3: 2.12 ms per loop """ - cdef int i - cdef randstate rstate = _current_randstate - for i from 0 <= i < 100000: + for _ in range(100000): c_libc_random() diff --git a/src/sage/misc/search.pxd b/src/sage/misc/search.pxd index 8cc43ba1b0f..f73e9061b8d 100644 --- a/src/sage/misc/search.pxd +++ b/src/sage/misc/search.pxd @@ -1 +1 @@ -cpdef search(object v, object x) \ No newline at end of file +cpdef search(object v, object x) diff --git a/src/sage/misc/stopgap.pyx b/src/sage/misc/stopgap.pyx index e6f626ae9b4..ccf18faf22b 100644 --- a/src/sage/misc/stopgap.pyx +++ b/src/sage/misc/stopgap.pyx @@ -2,7 +2,7 @@ Stopgaps """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2012 William Stein # # This program is free software: you can redistribute it and/or modify @@ -10,7 +10,7 @@ Stopgaps # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # https://www.gnu.org/licenses/ -#***************************************************************************** +# **************************************************************************** import warnings diff --git a/src/sage/misc/weak_dict.pyx b/src/sage/misc/weak_dict.pyx index ce69b6a840a..c288d312bd9 100644 --- a/src/sage/misc/weak_dict.pyx +++ b/src/sage/misc/weak_dict.pyx @@ -404,7 +404,7 @@ cdef class WeakValueDictionary(dict): True """ out = WeakValueDictionary() - for k,v in self.items(): + for k, v in self.items(): out[deepcopy(k, memo)] = v return out @@ -624,7 +624,7 @@ cdef class WeakValueDictionary(dict): ... KeyError: 'popitem(): weak value dictionary is empty' """ - for k,v in self.items(): + for k, v in self.items(): del self[k] return k, v raise KeyError('popitem(): weak value dictionary is empty') diff --git a/src/sage/modular/arithgroup/congroup_generic.py b/src/sage/modular/arithgroup/congroup_generic.py index b94568522f6..48ec86783e1 100644 --- a/src/sage/modular/arithgroup/congroup_generic.py +++ b/src/sage/modular/arithgroup/congroup_generic.py @@ -464,7 +464,7 @@ def __init__(self, *args, **kwds): sage: sage.modular.arithgroup.congroup_generic.CongruenceSubgroup(5) # indirect doctest Generic congruence subgroup of level 5 """ - return CongruenceSubgroupBase.__init__(self, *args, **kwds) + CongruenceSubgroupBase.__init__(self, *args, **kwds) def _repr_(self): """ diff --git a/src/sage/modular/arithgroup/meson.build b/src/sage/modular/arithgroup/meson.build index c4a68af3217..52475097b34 100644 --- a/src/sage/modular/arithgroup/meson.build +++ b/src/sage/modular/arithgroup/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'arithgroup_generic.py', 'arithgroup_perm.py', diff --git a/src/sage/modular/drinfeld_modform/ring.py b/src/sage/modular/drinfeld_modform/ring.py index 43c41058fe2..b027edc08ca 100644 --- a/src/sage/modular/drinfeld_modform/ring.py +++ b/src/sage/modular/drinfeld_modform/ring.py @@ -36,7 +36,7 @@ from sage.rings.fraction_field import FractionField_generic from sage.rings.polynomial.ore_polynomial_ring import OrePolynomialRing from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.term_order import TermOrder from sage.rings.integer_ring import ZZ @@ -265,7 +265,7 @@ def __classcall_private__(cls, base_ring, rank=None, group=None, if not isinstance(base_ring, FractionField_generic): raise TypeError("base ring must be a fraction field of a " "polynomial ring") - if not isinstance(base_ring.base(), PolynomialRing_general): + if not isinstance(base_ring.base(), PolynomialRing_generic): raise NotImplementedError("Drinfeld modular forms are currently " "only implemented for A = Fq[T]") if not base_ring.characteristic(): diff --git a/src/sage/modular/meson.build b/src/sage/modular/meson.build index d334cf975c8..8b7e48c94aa 100644 --- a/src/sage/modular/meson.build +++ b/src/sage/modular/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'buzzard.py', 'congroup.py', diff --git a/src/sage/modular/modform/meson.build b/src/sage/modular/modform/meson.build index 7276059448d..541227d9511 100644 --- a/src/sage/modular/modform/meson.build +++ b/src/sage/modular/modform/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'ambient.py', 'ambient_R.py', diff --git a/src/sage/modular/modform_hecketriangle/abstract_space.py b/src/sage/modular/modform_hecketriangle/abstract_space.py index 79352b97ffe..8c9a5db1aac 100644 --- a/src/sage/modular/modform_hecketriangle/abstract_space.py +++ b/src/sage/modular/modform_hecketriangle/abstract_space.py @@ -23,7 +23,7 @@ from sage.rings.integer import Integer from sage.rings.integer_ring import ZZ from sage.rings.laurent_series_ring import LaurentSeriesRing -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.power_series_ring import PowerSeriesRing_generic from sage.rings.rational_field import QQ from sage.structure.element import parent @@ -1707,7 +1707,7 @@ def construct_form(self, laurent_series, order_1=ZZ.zero(), check=True, rational """ base_ring = laurent_series.base_ring() - if isinstance(base_ring.base(), PolynomialRing_general): + if isinstance(base_ring.base(), PolynomialRing_generic): if not (self.coeff_ring().has_coerce_map_from(base_ring)): raise ValueError("The Laurent coefficients don't coerce into the coefficient ring of self!") elif rationalize: @@ -2001,7 +2001,7 @@ def construct_quasi_form(self, laurent_series, order_1=ZZ.zero(), check=True, ra """ base_ring = laurent_series.base_ring() - if isinstance(base_ring.base(), PolynomialRing_general): + if isinstance(base_ring.base(), PolynomialRing_generic): if not (self.coeff_ring().has_coerce_map_from(base_ring)): raise ValueError("The Laurent coefficients don't coerce into the coefficient ring of self!") elif rationalize: @@ -2269,7 +2269,7 @@ def rationalize_series(self, laurent_series, coeff_bound=1e-10, denom_factor=ZZ( # If the coefficients already coerce to our coefficient ring # and are in polynomial form we simply return the Laurent series - if (isinstance(base_ring.base(), PolynomialRing_general)): + if (isinstance(base_ring.base(), PolynomialRing_generic)): if (self.coeff_ring().has_coerce_map_from(base_ring)): return laurent_series else: diff --git a/src/sage/modular/modform_hecketriangle/functors.py b/src/sage/modular/modform_hecketriangle/functors.py index b50d618c3c4..20397eebfb5 100644 --- a/src/sage/modular/modform_hecketriangle/functors.py +++ b/src/sage/modular/modform_hecketriangle/functors.py @@ -79,7 +79,7 @@ def _get_base_ring(ring, var_name='d'): """ # from sage.rings.fraction_field import FractionField_generic - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.categories.pushout import FractionField as FractionFieldFunctor base_ring = ring @@ -87,7 +87,7 @@ def _get_base_ring(ring, var_name='d'): # base_ring = base_ring.base() if (base_ring.construction() and base_ring.construction()[0] == FractionFieldFunctor()): base_ring = base_ring.construction()[1] - if (isinstance(base_ring, PolynomialRing_general) and base_ring.ngens() == 1 and base_ring.variable_name() == var_name): + if (isinstance(base_ring, PolynomialRing_generic) and base_ring.ngens() == 1 and base_ring.variable_name() == var_name): base_ring = base_ring.base() if (base_ring.construction() and base_ring.construction()[0] == FractionFieldFunctor()): base_ring = base_ring.construction()[1] diff --git a/src/sage/modular/modsym/meson.build b/src/sage/modular/modsym/meson.build index f05d0776246..15851710402 100644 --- a/src/sage/modular/modsym/meson.build +++ b/src/sage/modular/modsym/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'ambient.py', 'apply.pxd', diff --git a/src/sage/modular/pollack_stevens/distributions.py b/src/sage/modular/pollack_stevens/distributions.py index 80bc25b22d9..cb387ebd8c1 100644 --- a/src/sage/modular/pollack_stevens/distributions.py +++ b/src/sage/modular/pollack_stevens/distributions.py @@ -39,6 +39,7 @@ # https://www.gnu.org/licenses/ # ************************************************************************* +from sage.categories.commutative_rings import CommutativeRings from sage.categories.fields import Fields from sage.categories.modules import Modules from sage.misc.cachefunc import cached_method @@ -46,7 +47,6 @@ from sage.modules.module import Module from sage.rings.integer_ring import ZZ from sage.rings.rational_field import QQ -from sage.rings.ring import Ring from sage.structure.factory import UniqueFactory from sage.structure.parent import Parent from .sigma0 import _default_adjuster @@ -281,8 +281,8 @@ def __init__(self, k, p=None, prec_cap=None, base=None, character=None, ... ValueError: p must be prime """ - if not isinstance(base, Ring): - raise TypeError("base must be a ring") + if base not in CommutativeRings(): + raise TypeError("base must be a commutative ring") # from sage.rings.padics.pow_computer import PowComputer # should eventually be the PowComputer on ZpCA once that uses longs. Dist, WeightKAction = get_dist_classes(p, prec_cap, base, @@ -649,10 +649,13 @@ def __init__(self, k, base, character, adjuster, act_on_left, dettwist, if hasattr(base, 'prime'): p = base.prime() else: - p = ZZ(0) - OverconvergentDistributions_abstract.__init__(self, k, p, k + 1, base, character, - adjuster, act_on_left, dettwist, - act_padic, implementation) + p = ZZ.zero() + OverconvergentDistributions_abstract.__init__(self, k, p, k + 1, + base, character, + adjuster, act_on_left, + dettwist, + act_padic, + implementation) def _an_element_(self): r""" diff --git a/src/sage/modular/pollack_stevens/meson.build b/src/sage/modular/pollack_stevens/meson.build index d22947db12c..0506a90ac83 100644 --- a/src/sage/modular/pollack_stevens/meson.build +++ b/src/sage/modular/pollack_stevens/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'dist.pxd', 'distributions.py', diff --git a/src/sage/modules/fp_graded/all.py b/src/sage/modules/fp_graded/all.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/element.py b/src/sage/modules/fp_graded/element.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/free_element.py b/src/sage/modules/fp_graded/free_element.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/free_homspace.py b/src/sage/modules/fp_graded/free_homspace.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/free_module.py b/src/sage/modules/fp_graded/free_module.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/free_morphism.py b/src/sage/modules/fp_graded/free_morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/homspace.py b/src/sage/modules/fp_graded/homspace.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/module.py b/src/sage/modules/fp_graded/module.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/morphism.py b/src/sage/modules/fp_graded/morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/steenrod/all.py b/src/sage/modules/fp_graded/steenrod/all.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/steenrod/homspace.py b/src/sage/modules/fp_graded/steenrod/homspace.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/steenrod/module.py b/src/sage/modules/fp_graded/steenrod/module.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/steenrod/morphism.py b/src/sage/modules/fp_graded/steenrod/morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/fp_graded/steenrod/profile.py b/src/sage/modules/fp_graded/steenrod/profile.py old mode 100755 new mode 100644 diff --git a/src/sage/modules/meson.build b/src/sage/modules/meson.build index 48aecfdf0f2..a5c78e98633 100644 --- a/src/sage/modules/meson.build +++ b/src/sage/modules/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'complex_double_vector.py', 'diamond_cutting.py', @@ -16,6 +17,7 @@ py.install_sources( 'module.pxd', 'module_functors.py', 'multi_filtered_vector_space.py', + 'numpy_util.pxd', 'quotient_module.py', 'real_double_vector.py', 'submodule.py', diff --git a/src/sage/modules/with_basis/meson.build b/src/sage/modules/with_basis/meson.build index 1956c6ac99c..7dc1dda551b 100644 --- a/src/sage/modules/with_basis/meson.build +++ b/src/sage/modules/with_basis/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'cell_module.py', 'indexed_element.pxd', diff --git a/src/sage/monoids/meson.build b/src/sage/monoids/meson.build index df2a4ae36be..5f785b5b257 100644 --- a/src/sage/monoids/meson.build +++ b/src/sage/monoids/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'automatic_semigroup.py', 'free_abelian_monoid.py', diff --git a/src/sage/numerical/backends/glpk_backend.pyx b/src/sage/numerical/backends/glpk_backend.pyx index 5e1f0dcdf82..6c6d8dfff90 100644 --- a/src/sage/numerical/backends/glpk_backend.pyx +++ b/src/sage/numerical/backends/glpk_backend.pyx @@ -3197,60 +3197,60 @@ solver_parameter_values = { 'intopt_only': intopt_only, 'exact_simplex_only': exact_simplex_only, - 'GLP_MSG_OFF' : GLP_MSG_OFF, - 'GLP_MSG_ON' : GLP_MSG_ON, - 'GLP_MSG_ERR' : GLP_MSG_ERR, - 'GLP_MSG_ALL' : GLP_MSG_ALL, - 'GLP_MSG_DBG' : GLP_MSG_DBG, - - 'GLP_PRIMAL' : GLP_PRIMAL, - 'GLP_DUAL' : GLP_DUAL, - 'GLP_DUALP' : GLP_DUALP, - - 'GLP_PT_STD' : GLP_PT_STD, - 'GLP_PT_PSE' : GLP_PT_PSE, - - 'GLP_RT_STD' : GLP_RT_STD, - 'GLP_RT_HAR' : GLP_RT_HAR, - - 'DBL_MAX' : DBL_MAX, - 'INT_MAX' : INT_MAX, - - 'GLP_ON' : GLP_ON, - 'GLP_OFF' : GLP_OFF, - - 'GLP_BR_FFV' : GLP_BR_FFV, - 'GLP_BR_LFV' : GLP_BR_LFV, - 'GLP_BR_MFV' : GLP_BR_MFV, - 'GLP_BR_DTH' : GLP_BR_DTH, - 'GLP_BR_PCH' : GLP_BR_PCH, - - 'GLP_BT_DFS' : GLP_BT_DFS, - 'GLP_BT_BFS' : GLP_BT_BFS, - 'GLP_BT_BLB' : GLP_BT_BLB, - 'GLP_BT_BPH' : GLP_BT_BPH, - - 'GLP_PP_NONE' : GLP_PP_NONE, - 'GLP_PP_ROOT' : GLP_PP_ROOT, - 'GLP_PP_ALL' : GLP_PP_ALL, - - 'GLP_MAX' : GLP_MAX, - 'GLP_MIN' : GLP_MIN, - 'GLP_UP' : GLP_UP, - 'GLP_FR' : GLP_FR, - 'GLP_DB' : GLP_DB, - 'GLP_FX' : GLP_FX, - 'GLP_LO' : GLP_LO, - 'GLP_CV' : GLP_CV, - 'GLP_IV' : GLP_IV, - 'GLP_BV' : GLP_BV, - 'GLP_MPS_DECK' : GLP_MPS_DECK, - 'GLP_MPS_FILE' : GLP_MPS_FILE, - - 'GLP_UNDEF' : GLP_UNDEF, - 'GLP_OPT' : GLP_OPT, - 'GLP_FEAS' : GLP_FEAS, - 'GLP_NOFEAS' : GLP_NOFEAS + 'GLP_MSG_OFF': GLP_MSG_OFF, + 'GLP_MSG_ON': GLP_MSG_ON, + 'GLP_MSG_ERR': GLP_MSG_ERR, + 'GLP_MSG_ALL': GLP_MSG_ALL, + 'GLP_MSG_DBG': GLP_MSG_DBG, + + 'GLP_PRIMAL': GLP_PRIMAL, + 'GLP_DUAL': GLP_DUAL, + 'GLP_DUALP': GLP_DUALP, + + 'GLP_PT_STD': GLP_PT_STD, + 'GLP_PT_PSE': GLP_PT_PSE, + + 'GLP_RT_STD': GLP_RT_STD, + 'GLP_RT_HAR': GLP_RT_HAR, + + 'DBL_MAX': DBL_MAX, + 'INT_MAX': INT_MAX, + + 'GLP_ON': GLP_ON, + 'GLP_OFF': GLP_OFF, + + 'GLP_BR_FFV': GLP_BR_FFV, + 'GLP_BR_LFV': GLP_BR_LFV, + 'GLP_BR_MFV': GLP_BR_MFV, + 'GLP_BR_DTH': GLP_BR_DTH, + 'GLP_BR_PCH': GLP_BR_PCH, + + 'GLP_BT_DFS': GLP_BT_DFS, + 'GLP_BT_BFS': GLP_BT_BFS, + 'GLP_BT_BLB': GLP_BT_BLB, + 'GLP_BT_BPH': GLP_BT_BPH, + + 'GLP_PP_NONE': GLP_PP_NONE, + 'GLP_PP_ROOT': GLP_PP_ROOT, + 'GLP_PP_ALL': GLP_PP_ALL, + + 'GLP_MAX': GLP_MAX, + 'GLP_MIN': GLP_MIN, + 'GLP_UP': GLP_UP, + 'GLP_FR': GLP_FR, + 'GLP_DB': GLP_DB, + 'GLP_FX': GLP_FX, + 'GLP_LO': GLP_LO, + 'GLP_CV': GLP_CV, + 'GLP_IV': GLP_IV, + 'GLP_BV': GLP_BV, + 'GLP_MPS_DECK': GLP_MPS_DECK, + 'GLP_MPS_FILE': GLP_MPS_FILE, + + 'GLP_UNDEF': GLP_UNDEF, + 'GLP_OPT': GLP_OPT, + 'GLP_FEAS': GLP_FEAS, + 'GLP_NOFEAS': GLP_NOFEAS } diff --git a/src/sage/numerical/backends/logging_backend.py b/src/sage/numerical/backends/logging_backend.py index a7acf57341f..ae0c6b22d36 100644 --- a/src/sage/numerical/backends/logging_backend.py +++ b/src/sage/numerical/backends/logging_backend.py @@ -7,15 +7,15 @@ See :class:`LoggingBackendFactory` for more information. """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2016 Matthias Koeppe # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** from sage.numerical.backends.generic_backend import GenericBackend @@ -31,7 +31,7 @@ def _format_function_call(fn_name, *v, **k): sage: _format_function_call('foo', 17, hellooooo='goodbyeeee') "foo(17, hellooooo='goodbyeeee')" """ - args = [ repr(a) for a in v ] + [ "%s=%r" % (arg,val) for arg, val in k.items() ] + args = [repr(a) for a in v] + ["%s=%r" % (arg, val) for arg, val in k.items()] return "{}({})".format(fn_name, ", ".join(args)) @@ -359,15 +359,15 @@ def LoggingBackendFactory(solver=None, printing=True, doctest_file=None, test_me # Construct output file name from method name. test_method_file = "test_{}.py".format(test_method) else: - test_method = 'CHANGE' # Will have to be edited by user in - # generated file. + test_method = 'CHANGE' + # Will have to be edited by user in generated file. if doctest_file is not None: - doctest = open(doctest_file, "w", 1) #line-buffered + doctest = open(doctest_file, "w", 1) # line-buffered else: doctest = None if test_method_file is not None: - test_method_output = open(test_method_file, "w", 1) #line-buffered + test_method_output = open(test_method_file, "w", 1) # line-buffered else: test_method_output = None diff --git a/src/sage/numerical/backends/meson.build b/src/sage/numerical/backends/meson.build index a6a53e97033..57eeaeb10b0 100644 --- a/src/sage/numerical/backends/meson.build +++ b/src/sage/numerical/backends/meson.build @@ -2,6 +2,7 @@ glpk = cc.find_library('glpk') py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_polyhedra.py', 'cvxopt_backend_test.py', diff --git a/src/sage/numerical/interactive_simplex_method.py b/src/sage/numerical/interactive_simplex_method.py index 24dd0ded920..e394224a3c9 100644 --- a/src/sage/numerical/interactive_simplex_method.py +++ b/src/sage/numerical/interactive_simplex_method.py @@ -1538,7 +1538,7 @@ def plot(self, *args, **kwds): result += line(level.vertices(), color='black', linestyle='--') result.set_axes_range(xmin, xmax, ymin, ymax) - result.axes_labels(FP.axes_labels()) #FIXME: should be preserved! + result.axes_labels(FP.axes_labels()) # FIXME: should be preserved! return result def plot_feasible_set(self, xmin=None, xmax=None, ymin=None, ymax=None, @@ -3933,7 +3933,7 @@ def _latex_(self): lines.append(r"\renewcommand{\arraystretch}{1.5} %notruncate") if generate_real_LaTeX: lines[-1] += r" \setlength{\arraycolsep}{0.125em}" - relations = [_latex_product(-Ai,N, head=[xi, "=", bi], + relations = [_latex_product(-Ai, N, head=[xi, "=", bi], drop_plus=False, allow_empty=True) + r"\\" for xi, bi, Ai in zip(B, b, A.rows())] objective = _latex_product(c, N, head=[z, "=", v], diff --git a/src/sage/numerical/meson.build b/src/sage/numerical/meson.build index 222deff834e..91257af0880 100644 --- a/src/sage/numerical/meson.build +++ b/src/sage/numerical/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_polyhedra.py', 'interactive_simplex_method.py', diff --git a/src/sage/plot/animate.py b/src/sage/plot/animate.py index c37a17531d8..84433c492e2 100644 --- a/src/sage/plot/animate.py +++ b/src/sage/plot/animate.py @@ -839,7 +839,7 @@ def show(self, delay=None, iterations=None, **kwds): sage: a.show(delay=50) # long time # optional -- ImageMagick - You can also make use of the HTML5 video element in the Sage Notebook:: + You can also make use of the HTML5 video element in the Sage notebook:: sage: # long time, optional -- FFmpeg sage: a.show(format='ogg') diff --git a/src/sage/plot/hyperbolic_regular_polygon.py b/src/sage/plot/hyperbolic_regular_polygon.py index 14e8bdcaf68..a6df71ebc11 100644 --- a/src/sage/plot/hyperbolic_regular_polygon.py +++ b/src/sage/plot/hyperbolic_regular_polygon.py @@ -141,9 +141,9 @@ def __init__(self, sides, i_angle, center, options): # real part of the given center. h_disp = self.center.real() - d_z_k = [z_0[0]*scale + h_disp] #d_k has the points for the polygon in the given center - z_k = z_0 #z_k has the Re(z)>0 vertices for the I centered polygon - r_z_k = [] #r_z_k has the Re(z)<0 vertices + d_z_k = [z_0[0]*scale + h_disp] # d_k has the points for the polygon in the given center + z_k = z_0 # z_k has the Re(z)>0 vertices for the I centered polygon + r_z_k = [] # r_z_k has the Re(z)<0 vertices if is_odd(self.sides): vert = (self.sides - 1) // 2 else: diff --git a/src/sage/plot/meson.build b/src/sage/plot/meson.build index 96a337faf78..8cb44114959 100644 --- a/src/sage/plot/meson.build +++ b/src/sage/plot/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'animate.py', 'arc.py', diff --git a/src/sage/plot/misc.py b/src/sage/plot/misc.py index ca19ef887cb..e5bccb0ffad 100644 --- a/src/sage/plot/misc.py +++ b/src/sage/plot/misc.py @@ -63,10 +63,10 @@ def setup_for_eval_on_grid(funcs, EXAMPLES:: - sage: x,y,z=var('x,y,z') - sage: f(x,y)=x+y-z - sage: g(x,y)=x+y - sage: h(y)=-y + sage: x,y,z = var('x,y,z') + sage: f(x,y) = x+y-z + sage: g(x,y) = x+y + sage: h(y) = -y sage: sage.plot.misc.setup_for_eval_on_grid(f, [(0, 2),(1,3),(-4,1)], plot_points=5) (, [(0.0, 2.0, 0.5), (1.0, 3.0, 0.5), (-4.0, 1.0, 1.25)]) sage: sage.plot.misc.setup_for_eval_on_grid([g,h], [(0, 2),(-1,1)], plot_points=5) @@ -149,7 +149,7 @@ def setup_for_eval_on_grid(funcs, # pad the variables if we don't have enough nargs = len(ranges) if len(vars) < nargs: - vars += ('_',)*(nargs-len(vars)) + vars += ('_',) * (nargs - len(vars)) ranges = [[float(z) for z in r] for r in ranges] @@ -157,12 +157,13 @@ def setup_for_eval_on_grid(funcs, plot_points = 2 if not isinstance(plot_points, (list, tuple)): - plot_points = [plot_points]*len(ranges) + plot_points = [plot_points] * len(ranges) elif len(plot_points) != nargs: raise ValueError("plot_points must be either an integer or a list of integers, one for each range") plot_points = [int(p) if p >= 2 else 2 for p in plot_points] - range_steps = [abs(range[1] - range[0])/(p-1) for range, p in zip(ranges, plot_points)] + range_steps = [abs(range[1] - range[0]) / (p - 1) + for range, p in zip(ranges, plot_points)] if min(range_steps) == float(0): raise ValueError("plot start point and end point must be different") @@ -206,11 +207,12 @@ def try_make_fast(f): # Handle vectors, lists, tuples, etc. if isinstance(funcs, Iterable): - funcs = tuple( try_make_fast(f) for f in funcs ) + funcs = tuple(try_make_fast(f) for f in funcs) else: funcs = try_make_fast(funcs) - #TODO: raise an error if there is a function/method in funcs that takes more values than we have ranges + # TODO: raise an error if there is a function/method in funcs that + # takes more values than we have ranges if return_vars: return (funcs, @@ -242,10 +244,10 @@ def unify_arguments(funcs): EXAMPLES:: - sage: x,y,z=var('x,y,z') - sage: f(x,y)=x+y-z - sage: g(x,y)=x+y - sage: h(y)=-y + sage: x,y,z = var('x,y,z') + sage: f(x,y) = x+y-z + sage: g(x,y) = x+y + sage: h(y) = -y sage: sage.plot.misc.unify_arguments((f,g,h)) ((x, y, z), (z,)) sage: sage.plot.misc.unify_arguments((g,h)) @@ -284,7 +286,9 @@ def _multiple_of_constant(n, pos, const): r""" Function for internal use in formatting ticks on axes with nice-looking multiples of various symbolic constants, such - as `\pi` or `e`. Should only be used via keyword argument + as `\pi` or `e`. + + This should only be used via keyword argument ``tick_formatter`` in :meth:`plot.show`. See documentation for the matplotlib.ticker module for more details. @@ -311,11 +315,11 @@ def _multiple_of_constant(n, pos, const): from sage.misc.latex import latex from sage.rings.continued_fraction import continued_fraction from sage.rings.infinity import Infinity - cf = continued_fraction(n/const) + cf = continued_fraction(n / const) k = 1 while cf.quotient(k) != Infinity and cf.denominator(k) < 12: k += 1 - return '$%s$' % latex(cf.convergent(k-1)*const) + return '$%s$' % latex(cf.convergent(k - 1) * const) def get_matplotlib_linestyle(linestyle, return_type): @@ -401,10 +405,14 @@ def get_matplotlib_linestyle(linestyle, return_type): {'solid', 'dashed', 'dotted', dashdot', 'None'}, respectively {'-', '--', ':', '-.', ''} """ - long_to_short_dict = {'solid' : '-','dashed' : '--', 'dotted' : ':', - 'dashdot':'-.'} - short_to_long_dict = {'-' : 'solid','--' : 'dashed', ':' : 'dotted', - '-.':'dashdot'} + long_to_short_dict = {'solid': '-', + 'dashed': '--', + 'dotted': ':', + 'dashdot': '-.'} + short_to_long_dict = {'-': 'solid', + '--': 'dashed', + ':': 'dotted', + '-.': 'dashdot'} # We need this to take care of region plot. Essentially, if None is # passed, then we just return back the same thing. @@ -416,16 +424,16 @@ def get_matplotlib_linestyle(linestyle, return_type): elif linestyle.startswith("steps"): if linestyle.startswith("steps-mid"): return "steps-mid" + get_matplotlib_linestyle( - linestyle.strip("steps-mid"), "short") + linestyle.strip("steps-mid"), "short") elif linestyle.startswith("steps-post"): return "steps-post" + get_matplotlib_linestyle( - linestyle.strip("steps-post"), "short") + linestyle.strip("steps-post"), "short") elif linestyle.startswith("steps-pre"): return "steps-pre" + get_matplotlib_linestyle( - linestyle.strip("steps-pre"), "short") + linestyle.strip("steps-pre"), "short") else: return "steps" + get_matplotlib_linestyle( - linestyle.strip("steps"), "short") + linestyle.strip("steps"), "short") if return_type == 'short': if linestyle in short_to_long_dict.keys(): diff --git a/src/sage/plot/plot3d/meson.build b/src/sage/plot/plot3d/meson.build index 46cc4a25ffc..ae1dd2a6b41 100644 --- a/src/sage/plot/plot3d/meson.build +++ b/src/sage/plot/plot3d/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'base.pxd', 'implicit_plot3d.py', diff --git a/src/sage/plot/plot3d/parametric_plot3d.py b/src/sage/plot/plot3d/parametric_plot3d.py index 6a3da2b830f..c0eebb5a160 100644 --- a/src/sage/plot/plot3d/parametric_plot3d.py +++ b/src/sage/plot/plot3d/parametric_plot3d.py @@ -989,8 +989,8 @@ def g(x, y): return x, y+sin(y), x**2 + y**2 if isinstance(f, Vector): f = tuple(f) - if isinstance(f, (list, tuple)) and len(f) > 0 and isinstance(f[0], (list, tuple)): - return sum([parametric_plot3d(v, urange, vrange, plot_points=plot_points, **kwds) for v in f]) + if isinstance(f, (list, tuple)) and f and isinstance(f[0], (list, tuple)): + return sum(parametric_plot3d(v, urange, vrange, plot_points=plot_points, **kwds) for v in f) if not isinstance(f, (tuple, list)) or len(f) != 3: raise ValueError("f must be a list, tuple, or vector of length 3") @@ -1121,7 +1121,9 @@ def _parametric_plot3d_surface(f, urange, vrange, plot_points, boundary_style, * if boundary_style is not None: for u in (urange[0], urange[-1]): - G += line3d([(g[0](u,v), g[1](u,v), g[2](u,v)) for v in vrange], **boundary_style) + G += line3d([(g[0](u, v), g[1](u, v), g[2](u, v)) for v in vrange], + **boundary_style) for v in (vrange[0], vrange[-1]): - G += line3d([(g[0](u,v), g[1](u,v), g[2](u,v)) for u in urange], **boundary_style) + G += line3d([(g[0](u, v), g[1](u, v), g[2](u, v)) for u in urange], + **boundary_style) return G diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py index 9f5b9a8d94d..f3fd2078d64 100644 --- a/src/sage/plot/plot3d/plot3d.py +++ b/src/sage/plot/plot3d/plot3d.py @@ -155,7 +155,7 @@ def f(x, y): return math.exp(x/5)*math.cos(y) from sage.plot.plot3d.shapes import arrow3d from sage.plot.plot3d.texture import Texture from sage.plot.plot3d.tri_plot import TrianglePlot - +from . import parametric_plot3d lazy_import("sage.functions.trig", ["cos", "sin"]) @@ -190,8 +190,12 @@ def __init__(self, dep_var, indep_vars): Arbitrary Coordinates coordinate transform (z in terms of x, y) """ all_vars = sage_getargspec(self.transform).args[1:] - if set(all_vars) != set(indep_vars + [dep_var]): - raise ValueError('variables were specified incorrectly for this coordinate system; incorrect variables were %s' % list(set(all_vars).symmetric_difference(set(indep_vars+[dep_var])))) + A = set(all_vars) + B = set(indep_vars + [dep_var]) + if A != B: + raise ValueError('variables were specified incorrectly for this ' + 'coordinate system; incorrect variables ' + 'were %s' % list(A.symmetric_difference(B))) self.dep_var = dep_var self.indep_vars = indep_vars @@ -790,10 +794,7 @@ def smooth_triangle(self, a, b, c, da, db, dc, color=None): sage: sm_tri [[0, 0, 0], [0, 0, 1], [1, 1, 0]] """ - return [a,b,c] - - -from . import parametric_plot3d + return [a, b, c] def plot3d(f, urange, vrange, adaptive=False, transformation=None, **kwds): @@ -1083,7 +1084,7 @@ def plot3d(f, urange, vrange, adaptive=False, transformation=None, **kwds): params = f.variables() from sage.modules.vector_callable_symbolic_dense import Vector_callable_symbolic_dense - if isinstance(transformation, (tuple, list,Vector_callable_symbolic_dense)): + if isinstance(transformation, (tuple, list, Vector_callable_symbolic_dense)): if len(transformation) == 3: if params is None: raise ValueError("must specify independent variable names in the ranges when using generic transformation") @@ -1095,7 +1096,7 @@ def plot3d(f, urange, vrange, adaptive=False, transformation=None, **kwds): raise ValueError("unknown transformation type") # find out which variable is the function variable by # eliminating the parameter variables. - all_vars = set(sum([list(s.variables()) for s in transformation],[])) + all_vars = set(sum([list(s.variables()) for s in transformation], [])) dep_var = all_vars - set(indep_vars) if len(dep_var) == 1: dep_var = dep_var.pop() @@ -1173,11 +1174,11 @@ def plot3d_adaptive(f, x_range, y_range, color='automatic', max_depth = max(max_depth, initial_depth) from sage.plot.misc import setup_for_eval_on_grid - g, ranges = setup_for_eval_on_grid(f, [x_range,y_range], plot_points=2) - xmin,xmax = ranges[0][:2] - ymin,ymax = ranges[1][:2] + g, ranges = setup_for_eval_on_grid(f, [x_range, y_range], plot_points=2) + xmin, xmax = ranges[0][:2] + ymin, ymax = ranges[1][:2] - opacity = float(kwds.get('opacity',1)) + opacity = float(kwds.get('opacity', 1)) if color == "automatic": texture = rainbow(num_colors, 'rgbtuple') @@ -1197,9 +1198,9 @@ def plot3d_adaptive(f, x_range, y_range, color='automatic', if isinstance(texture, (list, tuple)): if len(texture) == 2: # do a grid coloring - xticks = (xmax - xmin)/2**initial_depth - yticks = (ymax - ymin)/2**initial_depth - parts = P.partition(lambda x,y,z: (int((x-xmin)/xticks) + int((y-ymin)/yticks)) % 2) + xticks = (xmax - xmin) / 2**initial_depth + yticks = (ymax - ymin) / 2**initial_depth + parts = P.partition(lambda x, y, z: (int((x - xmin) / xticks) + int((y - ymin) / yticks)) % 2) else: # do a topo coloring bounds = P.bounding_box() @@ -1208,8 +1209,8 @@ def plot3d_adaptive(f, x_range, y_range, color='automatic', if max_z == min_z: span = 0 else: - span = (len(texture)-1) / (max_z - min_z) # max to avoid dividing by 0 - parts = P.partition(lambda x, y, z: int((z-min_z)*span)) + span = (len(texture) - 1) / (max_z - min_z) # max to avoid dividing by 0 + parts = P.partition(lambda x, y, z: int((z - min_z) * span)) all = [] for k, G in parts.items(): G.set_texture(texture[k], opacity=opacity) diff --git a/src/sage/plot/plot3d/plot_field3d.py b/src/sage/plot/plot3d/plot_field3d.py index 99f9449e2f8..a4f415935d2 100644 --- a/src/sage/plot/plot3d/plot_field3d.py +++ b/src/sage/plot/plot3d/plot_field3d.py @@ -2,7 +2,7 @@ """ Plotting 3D fields """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2009 Jason Grout # # Distributed under the terms of the GNU General Public License (GPL) @@ -14,8 +14,8 @@ # # The full text of the GPL is available at: # -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** from sage.arith.srange import srange from sage.plot.misc import setup_for_eval_on_grid @@ -143,16 +143,19 @@ def plot_vector_field3d(functions, xrange, yrange, zrange, from matplotlib.colors import LinearSegmentedColormap cm = LinearSegmentedColormap.from_list('mymap', colors) else: - cm = lambda x: colors + def cm(x): + return colors max_len = max(v.norm() for v in vectors) - scaled_vectors = [v/max_len for v in vectors] + scaled_vectors = [v / max_len for v in vectors] if center_arrows: - G = sum([plot(v, color=cm(v.norm()), **kwds).translate(p-v/2) for v, p in zip(scaled_vectors, points)]) + G = sum(plot(v, color=cm(v.norm()), **kwds).translate(p - v / 2) + for v, p in zip(scaled_vectors, points)) G._set_extra_kwds(kwds) return G else: - G = sum([plot(v, color=cm(v.norm()), **kwds).translate(p) for v, p in zip(scaled_vectors, points)]) + G = sum(plot(v, color=cm(v.norm()), **kwds).translate(p) + for v, p in zip(scaled_vectors, points)) G._set_extra_kwds(kwds) return G diff --git a/src/sage/plot/plot3d/revolution_plot3d.py b/src/sage/plot/plot3d/revolution_plot3d.py index 721573516a5..a98f2ddcc32 100644 --- a/src/sage/plot/plot3d/revolution_plot3d.py +++ b/src/sage/plot/plot3d/revolution_plot3d.py @@ -7,7 +7,7 @@ - Oscar Gerardo Lazo Arjona (2010): initial version. """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2010 Oscar Gerardo Lazo Arjona algebraicamente@gmail.com # # Distributed under the terms of the GNU General Public License (GPL) @@ -19,8 +19,8 @@ # # The full text of the GPL is available at: # -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** from sage.misc.decorators import rename_keyword from sage.plot.plot3d.parametric_plot3d import parametric_plot3d @@ -253,10 +253,10 @@ def cf(u, phi): return float(2 * u / pi) % 1 phirange = (phi, phirange[0], phirange[1]) if isinstance(curve, (tuple, list)): - #this if-else provides a vector v to be plotted - #if curve is a tuple or a list of length 2, it is interpreted as a parametric curve - #in the x-z plane. - #if it is of length 3 it is interpreted as a parametric curve in 3d space + # this if-else provides a vector v to be plotted + # if curve is a tuple or a list of length 2, it is interpreted as a parametric curve + # in the x-z plane. + # if it is of length 3 it is interpreted as a parametric curve in 3d space if len(curve) == 2: x = curve[0] diff --git a/src/sage/plot/plot3d/shapes2.py b/src/sage/plot/plot3d/shapes2.py index 05d6bb6e583..08077c89f2e 100644 --- a/src/sage/plot/plot3d/shapes2.py +++ b/src/sage/plot/plot3d/shapes2.py @@ -7,7 +7,7 @@ - William Stein and Robert Bradshaw (2008-01): Many improvements """ -#***************************************************************************** +# **************************************************************************** # Copyright (C) 2007 William Stein # Copyright (C) 2008 Robert Bradshaw # @@ -20,10 +20,11 @@ # # The full text of the GPL is available at: # -# http://www.gnu.org/licenses/ -#***************************************************************************** +# https://www.gnu.org/licenses/ +# **************************************************************************** import math + from . import shapes from .base import PrimitiveObject, point_list_bounding_box @@ -34,11 +35,10 @@ from sage.arith.srange import srange from .texture import Texture - -TACHYON_PIXEL = 1/200.0 - from .shapes import Text, Sphere +TACHYON_PIXEL = 1 / 200.0 + @rename_keyword(alpha='opacity') def line3d(points, thickness=1, radius=None, arrow_head=False, **kwds): @@ -516,10 +516,12 @@ def frame_labels(lower_left, upper_right, # Helper function for formatting the frame labels from math import log log10 = log(10) - nd = lambda a: int(log(a)/log10) + + def nd(a): + return int(log(a) / log10) def fmt_string(a): - b = a/2.0 + b = a / 2.0 if b >= 1: return "%.1f" n = max(0, 2 - nd(a/2.0)) @@ -527,7 +529,7 @@ def fmt_string(a): # Slightly faster than mean for this situation def avg(a, b): - return (a+b)/2.0 + return (a + b) / 2.0 color = (0.3, 0.3, 0.3) @@ -722,8 +724,8 @@ def ruler_frame(lower_left, upper_right, ticks=4, sub_ticks=4, **kwds): sphinx_plot(ruler_frame([1,2,3],vector([2,3,4]),ticks=6, sub_ticks=2, color='red')) """ return ruler(lower_left, (upper_right[0], lower_left[1], lower_left[2]), ticks=ticks, sub_ticks=sub_ticks, absolute=True, **kwds) \ - + ruler(lower_left, (lower_left[0], upper_right[1], lower_left[2]), ticks=ticks, sub_ticks=sub_ticks, absolute=True, **kwds) \ - + ruler(lower_left, (lower_left[0], lower_left[1], upper_right[2]), ticks=ticks, sub_ticks=sub_ticks, absolute=True, **kwds) + + ruler(lower_left, (lower_left[0], upper_right[1], lower_left[2]), ticks=ticks, sub_ticks=sub_ticks, absolute=True, **kwds) \ + + ruler(lower_left, (lower_left[0], lower_left[1], upper_right[2]), ticks=ticks, sub_ticks=sub_ticks, absolute=True, **kwds) ########################### @@ -1143,8 +1145,8 @@ def tachyon_repr(self, render_params): cmd = ('FCylinder base {pos[0]!r} {pos[1]!r} {pos[2]!r} ' 'apex {apex[0]!r} {apex[1]!r} {apex[2]!r} ' 'rad {radius!r} {texture}').format( - pos=(px, py, pz), apex=(x, y, z), radius=radius, - texture=self.texture.id) + pos=(px, py, pz), apex=(x, y, z), radius=radius, + texture=self.texture.id) cmds.append(cmd) px, py, pz = x, y, z return cmds diff --git a/src/sage/plot/plot3d/tachyon.py b/src/sage/plot/plot3d/tachyon.py index adb1d80b7be..d04b4332a8c 100644 --- a/src/sage/plot/plot3d/tachyon.py +++ b/src/sage/plot/plot3d/tachyon.py @@ -371,8 +371,8 @@ def __init__(self, antialiasing=False, aspectratio=1.0, raydepth=8, - camera_position=None, # default value (-3, 0, 0), - camera_center=None, # alternative equivalent name + camera_position=None, # default value (-3, 0, 0), + camera_center=None, # alternative equivalent name updir=[0, 0, 1], look_at=[0, 0, 0], viewdir=None, @@ -397,10 +397,10 @@ def __init__(self, self._raydepth = raydepth if camera_position is not None: self._camera_position = camera_position - elif camera_center is not None: # make sure that old programs continue to work + elif camera_center is not None: # make sure that old programs continue to work self._camera_position = camera_center else: - self._camera_position = (-3, 0, 0) # default value + self._camera_position = (-3, 0, 0) # default value self._updir = updir self._projection = projection self._focallength = focallength @@ -689,8 +689,8 @@ def str(self): {} {} end_scene""".format(self._res(), - self._camera(), - '\n'.join(x.str() for x in self._objects)) + self._camera(), + '\n'.join(x.str() for x in self._objects)) def light(self, center, radius, color): r""" @@ -1249,15 +1249,15 @@ def str(self): phong {} {} phong_size {} color {} texfunc {} """.format(self._name, - self._ambient, - self._diffuse, - self._specular, - self._opacity, - self._phongtype, - self._phong, - self._phongsize, - tostr(self._color), - self._texfunc) + self._ambient, + self._diffuse, + self._specular, + self._opacity, + self._phongtype, + self._phong, + self._phongsize, + tostr(self._color), + self._texfunc) class Sphere: @@ -1338,7 +1338,7 @@ def str(self): return r""" ring center {} normal {} inner {} outer {} {} """.format(tostr(self._center), tostr(self._normal), - self._inner, self._outer, self._texture) + self._inner, self._outer, self._texture) class FractalLandscape: @@ -1380,7 +1380,7 @@ def str(self): return r""" scape res {} scale {} center {} {} """.format(tostr(self._res, 2, int), tostr(self._scale, 2, int), - tostr(self._center), self._texture) + tostr(self._center), self._texture) class Cylinder: diff --git a/src/sage/plot/plot3d/texture.py b/src/sage/plot/plot3d/texture.py index 561b8efbc3a..21c901fc0c3 100644 --- a/src/sage/plot/plot3d/texture.py +++ b/src/sage/plot/plot3d/texture.py @@ -421,10 +421,10 @@ def mtl_str(self): illum {illumination} Ns {shininess!r} d {opacity!r}""" - ).format(id=self.id, ambient=self.ambient, diffuse=self.diffuse, - specular=self.specular, - illumination=(2 if sum(self.specular) > 0 else 1), - shininess=self.shininess, opacity=self.opacity) + ).format(id=self.id, ambient=self.ambient, diffuse=self.diffuse, + specular=self.specular, + illumination=(2 if sum(self.specular) > 0 else 1), + shininess=self.shininess, opacity=self.opacity) def jmol_str(self, obj): r""" @@ -447,6 +447,6 @@ def jmol_str(self, obj): """ translucent = "translucent %s" % float(1 - self.opacity) if self.opacity < 1 else "" return "color {} {} [{},{},{}]".format(obj, translucent, - int(255 * self.color[0]), - int(255 * self.color[1]), - int(255 * self.color[2])) + int(255 * self.color[0]), + int(255 * self.color[1]), + int(255 * self.color[2])) diff --git a/src/sage/plot/plot3d/tri_plot.py b/src/sage/plot/plot3d/tri_plot.py index a2e843778eb..4011995a0a7 100644 --- a/src/sage/plot/plot3d/tri_plot.py +++ b/src/sage/plot/plot3d/tri_plot.py @@ -241,7 +241,7 @@ def str(self): return "".join(o.str() for o in self._objects) def __init__(self, triangle_factory, f, min_x__max_x, min_y__max_y, g=None, - min_depth=4, max_depth=8, num_colors=None, max_bend=.3): + min_depth=4, max_depth=8, num_colors=None, max_bend=.3): """ TESTS:: @@ -345,28 +345,28 @@ def plot_block(self, min_x, mid_x, max_x, min_y, mid_y, max_y, sw_z, nw_z, se_z, se_depth = next_depth ne_depth = next_depth else: - #compute the midpoint-to-corner vectors + # compute the midpoint-to-corner vectors sw_v = (min_x - mid_x, min_y - mid_y, sw_z[0] - mid_z[0]) nw_v = (min_x - mid_x, max_y - mid_y, nw_z[0] - mid_z[0]) se_v = (max_x - mid_x, min_y - mid_y, se_z[0] - mid_z[0]) ne_v = (max_x - mid_x, max_y - mid_y, ne_z[0] - mid_z[0]) - #compute triangle normal unit vectors by taking the cross-products - #of the midpoint-to-corner vectors. always go around clockwise - #so we're guaranteed to have a positive value near 1 when neighboring - #triangles are parallel - #However -- crossunit doesn't really return a unit vector. It returns - #the length of the vector to avoid numerical instability when the - #length is nearly zero -- rather than divide by nearly zero, we multiply - #the other side of the inequality by nearly zero -- in general, this - #should work a bit better because of the density of floating-point - #numbers near zero. + # compute triangle normal unit vectors by taking the cross-products + # of the midpoint-to-corner vectors. always go around clockwise + # so we're guaranteed to have a positive value near 1 when neighboring + # triangles are parallel + # However -- crossunit doesn't really return a unit vector. It returns + # the length of the vector to avoid numerical instability when the + # length is nearly zero -- rather than divide by nearly zero, we multiply + # the other side of the inequality by nearly zero -- in general, this + # should work a bit better because of the density of floating-point + # numbers near zero. norm_w = crossunit(sw_v, nw_v) norm_n = crossunit(nw_v, ne_v) norm_e = crossunit(ne_v, se_v) norm_s = crossunit(se_v, sw_v) - #compute the dot products of the triangle unit norms + # compute the dot products of the triangle unit norms e_sw = norm_w[0]*norm_s[0] + norm_w[1]*norm_s[1] + norm_w[2]*norm_s[2] e_nw = norm_w[0]*norm_n[0] + norm_w[1]*norm_n[1] + norm_w[2]*norm_n[2] e_se = norm_e[0]*norm_s[0] + norm_e[1]*norm_s[1] + norm_e[2]*norm_s[2] diff --git a/src/sage/probability/meson.build b/src/sage/probability/meson.build index 83b6a7e091e..2981a7496c4 100644 --- a/src/sage/probability/meson.build +++ b/src/sage/probability/meson.build @@ -1,4 +1,9 @@ -py.install_sources('all.py', 'random_variable.py', subdir: 'sage/probability') +py.install_sources( + '__init__.py', + 'all.py', + 'random_variable.py', + subdir: 'sage/probability', +) extension_data = { 'probability_distribution' : files('probability_distribution.pyx'), diff --git a/src/sage/quadratic_forms/binary_qf.py b/src/sage/quadratic_forms/binary_qf.py old mode 100755 new mode 100644 diff --git a/src/sage/quadratic_forms/meson.build b/src/sage/quadratic_forms/meson.build index 0e352ed72be..3208c9f15f6 100644 --- a/src/sage/quadratic_forms/meson.build +++ b/src/sage/quadratic_forms/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'binary_qf.py', 'bqf_class_group.py', diff --git a/src/sage/quivers/meson.build b/src/sage/quivers/meson.build index cdefdce952b..aa6d757721d 100644 --- a/src/sage/quivers/meson.build +++ b/src/sage/quivers/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'algebra.py', 'algebra_elements.pxd', 'all.py', diff --git a/src/sage/repl/attach.py b/src/sage/repl/attach.py index 89b6a789fc4..b3e20fe61d8 100644 --- a/src/sage/repl/attach.py +++ b/src/sage/repl/attach.py @@ -318,8 +318,12 @@ def attach(*files): .. SEEALSO:: - :meth:`~sage.repl.load.load` is the same as :func:`attach`, but - does not automatically reload a file when it changes. + :func:`~sage.repl.load.load` is the same as :func:`attach`, but + does not automatically reload a file when it changes unless + ``attach=True`` is passed. + + ``%attach`` magic can also be used, see + :meth:`~sage.repl.ipython_extension.SageMagics.attach`. EXAMPLES: diff --git a/src/sage/repl/interpreter.py b/src/sage/repl/interpreter.py index 83d22127cd3..664fa9a8444 100644 --- a/src/sage/repl/interpreter.py +++ b/src/sage/repl/interpreter.py @@ -75,8 +75,7 @@ sage: from sage.repl.interpreter import get_test_shell sage: shell = get_test_shell() - sage: print("dummy line"); shell.run_cell('1/0') # known bug (meson doesn't include the Cython source code) # see #25320 for the reason of the `...` and the dummy line in this test - dummy line + sage: shell.run_cell('1/0') # known bug (meson doesn't include the Cython source code) ... ZeroDivisionError...Traceback (most recent call last) ... diff --git a/src/sage/repl/ipython_extension.py b/src/sage/repl/ipython_extension.py index d7b1821d7d0..329a7b9b95a 100644 --- a/src/sage/repl/ipython_extension.py +++ b/src/sage/repl/ipython_extension.py @@ -107,6 +107,10 @@ def runfile(self, s): - ``s`` -- string; the file to be loaded + .. SEEALSO:: + + This is the same as :func:`~sage.repl.load.load`. + EXAMPLES:: sage: import os @@ -133,6 +137,10 @@ def attach(self, s): - ``s`` -- string. The file to be attached + .. SEEALSO:: + + This is the same as :func:`~sage.repl.attach.attach`. + EXAMPLES:: sage: from sage.repl.interpreter import get_test_shell @@ -395,14 +403,13 @@ def cython(self, line, cell): ....: ''') UsageError: unrecognized arguments: --help - Test invalid quotes (see :mod:`sage.repl.interpreter` for explanation of the dummy line):: + Test invalid quotes:: sage: # needs sage.misc.cython - sage: print("dummy line"); shell.run_cell(''' + sage: shell.run_cell(''' ....: %%cython --a=' ....: print(1) ....: ''') - dummy line ... ValueError...Traceback (most recent call last) ... diff --git a/src/sage/repl/ipython_kernel/widgets.py b/src/sage/repl/ipython_kernel/widgets.py index 42d674b7c9a..6b32b3a1ded 100644 --- a/src/sage/repl/ipython_kernel/widgets.py +++ b/src/sage/repl/ipython_kernel/widgets.py @@ -119,7 +119,7 @@ def __init__(self, *args, **kwds): <... 'dict'> """ self.__transform = kwds.pop("transform", None) - return super().__init__(*args, **kwds) + super().__init__(*args, **kwds) def get_value(self): """ diff --git a/src/sage/repl/load.py b/src/sage/repl/load.py index a1a1451f1c2..6cd0c792c76 100644 --- a/src/sage/repl/load.py +++ b/src/sage/repl/load.py @@ -87,6 +87,14 @@ def load(filename, globals, attach=False): from t import * + .. NOTE:: + + The global ``load`` function is :func:`sage.misc.persist.load`, + which delegates to this function for code file formats. + + ``%runfile`` magic can also be used, see + :meth:`~sage.repl.ipython_extension.SageMagics.runfile`. + INPUT: - ``filename`` -- string (denoting a filename or URL) or a :class:`Path` object @@ -97,13 +105,15 @@ def load(filename, globals, attach=False): - ``attach`` -- boolean (default: ``False``); whether to add the file to the list of attached files - Loading an executable Sage script from the command prompt will run whatever - code is inside an + Loading an executable Sage script from the :ref:`command line ` + will run whatever code is inside an + + :: if __name__ == "__main__": section, as the condition on ``__name__`` will hold true (code run from the - command prompt is considered to be running in the ``__main__`` module.) + command line is considered to be running in the ``__main__`` module.) EXAMPLES: @@ -159,7 +169,8 @@ def load(filename, globals, attach=False): sage: sage.repl.load.load('https://raw.githubusercontent.com/sagemath/sage-patchbot/3.0.0/sage_patchbot/util.py', globals()) # optional - internet - We attach a file:: + We attach a file (note that :func:`~sage.repl.attach.attach` + is equivalent, but available at the global scope by default):: sage: t = tmp_filename(ext='.py') sage: with open(t, 'w') as f: diff --git a/src/sage/rings/abc.pyx b/src/sage/rings/abc.pyx index e8078f97743..ef74bf34d4a 100644 --- a/src/sage/rings/abc.pyx +++ b/src/sage/rings/abc.pyx @@ -1,7 +1,6 @@ """ Abstract base classes for rings """ -from sage.rings.ring import IntegralDomain class NumberField_quadratic(Field): @@ -419,7 +418,7 @@ class Order: pass -class pAdicRing(IntegralDomain): +class pAdicRing(CommutativeRing): r""" Abstract base class for :class:`~sage.rings.padics.generic_nodes.pAdicRingGeneric`. diff --git a/src/sage/rings/asymptotic/asymptotic_ring.py b/src/sage/rings/asymptotic/asymptotic_ring.py index f7b8b6bb893..91a5775624e 100644 --- a/src/sage/rings/asymptotic/asymptotic_ring.py +++ b/src/sage/rings/asymptotic/asymptotic_ring.py @@ -428,7 +428,7 @@ lazy_import('sage.rings.lazy_series_ring', 'LazyPowerSeriesRing') lazy_import('sage.rings.polynomial.multi_polynomial_ring_base', 'MPolynomialRing_base') -lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_general') +lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_generic') lazy_import('sage.rings.power_series_ring', 'PowerSeriesRing_generic') lazy_import('sage.symbolic.ring', 'SymbolicRing') @@ -4013,7 +4013,7 @@ def _element_constructor_(self, data, simplify=True, convert=True): (data, self)), e) return sum(summands, self.zero()) - elif isinstance(P, PolynomialRing_general): + elif isinstance(P, PolynomialRing_generic): p = P.gen() try: return sum(iter(self.create_summand('exact', growth=p**i, diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py index 69ee6a36f6c..8603936d232 100644 --- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py +++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py @@ -502,10 +502,10 @@ def dimension(self): sage: F.dimension() 2 """ - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base R = self.denominator_ring - if isinstance(R, (PolynomialRing_general, MPolynomialRing_base)): + if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base)): return R.ngens() raise NotImplementedError('only polynomial rings are supported as base') @@ -3165,9 +3165,9 @@ def _element_constructor_(self, *args, **kwargs): p = numerator q = R(denominator) - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base - if isinstance(R, (PolynomialRing_general, MPolynomialRing_base)): + if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base)): if not R(q).is_unit(): # Factor denominator try: @@ -3233,11 +3233,10 @@ def _coerce_map_from_(self, P): from sage.rings.fraction_field import FractionField_generic if isinstance(P, FractionField_generic): B = P.base() - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base - if isinstance(B, (PolynomialRing_general, MPolynomialRing_base)): - if self.base().has_coerce_map_from(B): - return True + if isinstance(B, (PolynomialRing_generic, MPolynomialRing_base)) and self.base().has_coerce_map_from(B): + return True if self.base().has_coerce_map_from(P): return True diff --git a/src/sage/rings/asymptotic/growth_group.py b/src/sage/rings/asymptotic/growth_group.py index ca2afc2b92c..a82188ed355 100644 --- a/src/sage/rings/asymptotic/growth_group.py +++ b/src/sage/rings/asymptotic/growth_group.py @@ -1745,9 +1745,9 @@ def _initial_category_(base): # The following block can be removed once #19269 is fixed. from sage.rings.integer_ring import ZZ from sage.rings.rational_field import QQ - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic if base is ZZ or base is QQ or \ - isinstance(base, PolynomialRing_general) and \ + isinstance(base, PolynomialRing_generic) and \ (base.base_ring() is ZZ or base.base_ring() is QQ): return Posets() else: @@ -3463,7 +3463,7 @@ def _convert_(self, data): from sage.symbolic.ring import SR return self._convert_(SR(data)) - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import \ MPolynomialRing_base from sage.rings.power_series_ring import PowerSeriesRing_generic @@ -3473,7 +3473,7 @@ def _convert_(self, data): base, exponent = data.operands() if str(base) == var: return exponent - elif isinstance(P, (PolynomialRing_general, MPolynomialRing_base)): + elif isinstance(P, (PolynomialRing_generic, MPolynomialRing_base)): if data.is_monomial() and len(data.variables()) == 1: if var == str(data.variables()[0]): return data.degree() diff --git a/src/sage/rings/asymptotic/misc.py b/src/sage/rings/asymptotic/misc.py index e3d7a013285..740529a374e 100644 --- a/src/sage/rings/asymptotic/misc.py +++ b/src/sage/rings/asymptotic/misc.py @@ -34,7 +34,7 @@ lazy_import('sage.rings.lazy_series_ring', 'LazyPowerSeriesRing') lazy_import('sage.rings.multi_power_series_ring', 'MPowerSeriesRing_generic') lazy_import('sage.rings.polynomial.multi_polynomial_ring_base', 'MPolynomialRing_base') -lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_general') +lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_generic') lazy_import('sage.rings.power_series_ring', 'PowerSeriesRing_generic') @@ -168,7 +168,7 @@ def abbreviate(P): pass raise ValueError('Cannot abbreviate %s.' % (P,)) - poly = isinstance(P, (PolynomialRing_general, MPolynomialRing_base)) + poly = isinstance(P, (PolynomialRing_generic, MPolynomialRing_base)) power = isinstance(P, (PowerSeriesRing_generic, MPowerSeriesRing_generic, LazyPowerSeriesRing)) if poly or power: diff --git a/src/sage/rings/cfinite_sequence.py b/src/sage/rings/cfinite_sequence.py index 4166083de4a..f0d1c22c147 100644 --- a/src/sage/rings/cfinite_sequence.py +++ b/src/sage/rings/cfinite_sequence.py @@ -95,7 +95,7 @@ from sage.rings.integer_ring import ZZ from sage.rings.rational_field import QQ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.laurent_series_ring import LaurentSeriesRing from sage.rings.power_series_ring import PowerSeriesRing from sage.rings.fraction_field import FractionField @@ -142,7 +142,7 @@ def CFiniteSequences(base_ring, names=None, category=None): sage: TestSuite(C).run() """ - if isinstance(base_ring, PolynomialRing_general): + if isinstance(base_ring, PolynomialRing_generic): polynomial_ring = base_ring base_ring = polynomial_ring.base_ring() if names is None: diff --git a/src/sage/rings/convert/meson.build b/src/sage/rings/convert/meson.build index 0b485247bf1..04b9e285593 100644 --- a/src/sage/rings/convert/meson.build +++ b/src/sage/rings/convert/meson.build @@ -1,4 +1,9 @@ -py.install_sources('all.py', 'mpfi.pxd', subdir: 'sage/rings/convert') +py.install_sources( + '__init__.py', + 'all.py', + 'mpfi.pxd', + subdir: 'sage/rings/convert', +) extension_data = {'mpfi' : files('mpfi.pyx')} diff --git a/src/sage/rings/convert/mpfi.pyx b/src/sage/rings/convert/mpfi.pyx index 106a94c5aca..0c95ff6af94 100644 --- a/src/sage/rings/convert/mpfi.pyx +++ b/src/sage/rings/convert/mpfi.pyx @@ -11,11 +11,16 @@ Convert Sage/Python objects to real/complex intervals # http://www.gnu.org/licenses/ #***************************************************************************** +import re + from cpython.float cimport PyFloat_AS_DOUBLE from cpython.complex cimport PyComplex_RealAsDouble, PyComplex_ImagAsDouble +from libc.stdio cimport printf + from sage.libs.mpfr cimport * from sage.libs.mpfi cimport * +from sage.libs.gmp.mpz cimport * from sage.libs.gsl.complex cimport * from sage.arith.long cimport integer_check_long @@ -45,6 +50,243 @@ cdef inline int return_real(mpfi_ptr im) noexcept: return 0 +NUMBER = re.compile(rb'([+-]?(0[XxBb])?[0-9A-Za-z]+)\.([0-9A-Za-z]*)\?([0-9]*)(?:([EePp@])([+-]?[0-9]+))?') +# example: -0xABC.DEF?12@5 +# match groups: (-0xABC) (0x) (DEF) (12) (@) (5) + +cdef int _from_str_question_style(mpfi_ptr x, bytes s, int base) except -1: + """ + Convert a string in question style to an MPFI interval. + + INPUT: + + - ``x`` -- a pre-initialized MPFI interval + + - ``s`` -- the string to convert + + - ``base`` -- base to use for string conversion + + OUTPUT: + + - if conversion is possible: set ``x`` and return 0. + + - in all other cases: return some nonzero value, or raise an exception. + + TESTS: + + Double check that ``ZZ``, ``RR`` and ``RIF`` follows the string + conversion rule for base different from `10` (except ``ZZ`` + which only allows base up to `36`):: + + sage: ZZ("0x123", base=0) + 291 + sage: RR("0x123.e1", base=0) # rel tol 1e-12 + 291.878906250000 + sage: RR("0x123.@1", base=0) # rel tol 1e-12 + 4656.00000000000 + sage: RIF("0x123.4@1", base=0) + 4660 + sage: ZZ("1Xx", base=36) # case insensitive + 2517 + sage: ZZ("1Xx", base=62) + Traceback (most recent call last): + ... + ValueError: base (=62) must be 0 or between 2 and 36 + sage: RR("1Xx", base=36) # rel tol 1e-12 + 2517.00000000000 + sage: RR("0x123", base=36) # rel tol 1e-12 + 1.54101900000000e6 + sage: RR("-1Xx@-1", base=62) # rel tol 1e-12 + -95.9516129032258 + sage: RIF("1Xx@-1", base=62) # rel tol 1e-12 + 95.95161290322580? + sage: RIF("1aE1", base=11) + Traceback (most recent call last): + ... + TypeError: unable to convert '1aE1' to real interval + sage: RIF("1aE1", base=11) + Traceback (most recent call last): + ... + TypeError: unable to convert '1aE1' to real interval + + General checks:: + + sage: RIF("123456.?2").endpoints() # rel tol 1e-12 + (123454.0, 123458.0) + sage: RIF("1234.56?2").endpoints() # rel tol 1e-12 + (1234.54, 1234.58) + sage: RIF("1234.56?2e2").endpoints() # rel tol 1e-12 + (123454.0, 123458.0) + sage: x = RIF("-1234.56?2e2"); x.endpoints() # rel tol 1e-12 + (-123458.0, -123454.0) + sage: x + -1.2346?e5 + sage: x.str(style="question", error_digits=1) + '-123456.?2' + sage: RIF("1.?100").endpoints() # rel tol 1e-12 + (-99.0, 101.0) + sage: RIF("1.?100").str(style="question", error_digits=3) + '1.?100' + + Large exponent (ensure precision is not lost):: + + sage: x = RIF("1.123456?2e100000000"); x + 1.12346?e100000000 + sage: x.str(style="question", error_digits=3) + '1.12345600?201e100000000' + + Large precision:: + + sage: F = RealIntervalField(1000) + sage: x = F(sqrt(2)); x.endpoints() # rel tol 1e-290 + (1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798, + 1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140799) + sage: x in F(x.str(style="question", error_digits=3)) + True + sage: x in F(x.str(style="question", error_digits=0)) + True + sage: F("1.123456789123456789123456789123456789123456789123456789123456789123456789?987654321987654321987654321e500").endpoints() # rel tol 1e-290 + (1.123456789123456789123456789123456789123456788135802467135802467135802468e500, + 1.12345678912345678912345678912345678912345679011111111111111111111111111e500) + + Stress test:: + + sage: for F in [RealIntervalField(15), RIF, RealIntervalField(100), RealIntervalField(1000)]: + ....: for i in range(1000): + ....: a, b = randint(-10^9, 10^9), randint(0, 50) + ....: c, d = randint(-2^b, 2^b), randint(2, 5) + ....: x = a * F(d)^c + ....: assert x in F(x.str(style="question", error_digits=3)), (x, a, c, d) + ....: assert x in F(x.str(style="question", error_digits=0)), (x, a, c, d) + + Base different from `10` (note that the error and exponent are specified in decimal):: + + sage: RIF("10000.?0", base=2).endpoints() # rel tol 1e-12 + (16.0, 16.0) + sage: RIF("10000.?0e10", base=2).endpoints() # rel tol 1e-12 + (16384.0, 16384.0) + sage: x = RIF("10000.?10", base=2); x.endpoints() # rel tol 1e-12 + (6.0, 26.0) + sage: x.str(base=2, style="question", error_digits=2) + '10000.000?80' + sage: x = RIF("10000.000?80", base=2); x.endpoints() # rel tol 1e-12 + (6.0, 26.0) + sage: x = RIF("12a.?", base=16); x.endpoints() # rel tol 1e-12 + (297.0, 299.0) + sage: x = RIF("12a.BcDeF?", base=16); x.endpoints() # rel tol 1e-12 + (298.737775802611, 298.737777709962) + sage: x = RIF("12a.BcDeF?@10", base=16); x.endpoints() # rel tol 1e-12 + (3.28465658150911e14, 3.28465660248065e14) + sage: x = RIF("12a.BcDeF?p10", base=16); x.endpoints() # rel tol 1e-12 + (305907.482421875, 305907.484375000) + sage: x = RIF("0x12a.BcDeF?p10", base=0); x.endpoints() # rel tol 1e-12 + (305907.482421875, 305907.484375000) + + Space is allowed:: + + sage: RIF("-1234.56?2").endpoints() # rel tol 1e-12 + (-1234.58, -1234.54) + sage: RIF("- 1234.56 ?2").endpoints() # rel tol 1e-12 + (-1234.58, -1234.54) + + Erroneous input:: + + sage: RIF("1234.56?2e2.3") + Traceback (most recent call last): + ... + TypeError: unable to convert '1234.56?2e2.3' to real interval + sage: RIF("1234?2") # decimal point required + Traceback (most recent call last): + ... + TypeError: unable to convert '1234?2' to real interval + sage: RIF("1234.?2e") + Traceback (most recent call last): + ... + TypeError: unable to convert '1234.?2e' to real interval + sage: RIF("1.?e999999999999999999999999") + [-infinity .. +infinity] + sage: RIF("0X1.?", base=33) # X is not valid digit in base 33 + Traceback (most recent call last): + ... + TypeError: unable to convert '0X1.?' to real interval + sage: RIF("1.a?1e10", base=12) + Traceback (most recent call last): + ... + TypeError: unable to convert '1.a?1e10' to real interval + sage: RIF("1.1?a@10", base=12) + Traceback (most recent call last): + ... + TypeError: unable to convert '1.1?a@10' to real interval + sage: RIF("0x1?2e1", base=0) # e is not allowed in base > 10, use @ instead + Traceback (most recent call last): + ... + TypeError: unable to convert '0x1?2e1' to real interval + sage: RIF("0x1?2p1", base=36) + Traceback (most recent call last): + ... + TypeError: unable to convert '0x1?2p1' to real interval + """ + cdef mpz_t error_part + cdef mpfi_t error + cdef mpfr_t radius, neg_radius + cdef bytes int_part_string, base_prefix, frac_part_string, error_string, e, sci_expo_string, optional_expo, tmp + + match = NUMBER.fullmatch(s) + if match is None: + return 1 + int_part_string, base_prefix, frac_part_string, error_string, e, sci_expo_string = match.groups() + + if (base > 10 or (base == 0 and base_prefix in (b'0X', b'0X'))) and e in (b'e', b'E'): + return 1 + if base > 16 and e in (b'p', b'P'): + return 1 + if base > 16 or not base_prefix: + base_prefix = b'' + + if error_string: + if mpz_init_set_str(error_part, error_string, 10): + mpz_clear(error_part) + return 1 + else: + mpz_init_set_ui(error_part, 1) + + optional_expo = e + sci_expo_string if e else b'' + if mpfi_set_str(x, int_part_string + b'.' + frac_part_string + optional_expo, base): + mpz_clear(error_part) + return 1 + + mpfr_init2(radius, mpfi_get_prec(x)) + tmp = base_prefix + ( + b'0.' + b'0'*(len(frac_part_string)-1) + b'1' + optional_expo + if frac_part_string else + b'1.' + optional_expo) + # if base = 0: + # when s = '-0x123.456@7', tmp = '0x0.001@7' + # when s = '-0x123.@7', tmp = '0x1.@7' + # if base = 36: + # when s = '-0x123.456@7', tmp = '0.001@7' + if mpfr_set_str(radius, tmp, base, MPFR_RNDU): + mpfr_clear(radius) + mpz_clear(error_part) + return 1 + + mpfr_mul_z(radius, radius, error_part, MPFR_RNDU) + mpz_clear(error_part) + + mpfr_init2(neg_radius, mpfi_get_prec(x)) + mpfr_neg(neg_radius, radius, MPFR_RNDD) + + mpfi_init2(error, mpfi_get_prec(x)) + mpfi_interv_fr(error, neg_radius, radius) + mpfr_clear(radius) + mpfr_clear(neg_radius) + + mpfi_add(x, x, error) + mpfi_clear(error) + + return 0 + + cdef int mpfi_set_sage(mpfi_ptr re, mpfi_ptr im, x, field, int base) except -1: """ Convert any object ``x`` to an MPFI interval or a pair of @@ -186,6 +428,11 @@ cdef int mpfi_set_sage(mpfi_ptr re, mpfi_ptr im, x, field, int base) except -1: if isinstance(x, unicode): x = x.encode("ascii") if isinstance(x, bytes): + if b"?" in x: + if _from_str_question_style(re, (x).replace(b' ', b''), base): + x = bytes_to_str(x) + raise TypeError(f"unable to convert {x!r} to real interval") + return return_real(im) s = (x).replace(b'..', b',').replace(b' ', b'').replace(b'+infinity', b'@inf@').replace(b'-infinity', b'-@inf@') if mpfi_set_str(re, s, base): x = bytes_to_str(x) diff --git a/src/sage/rings/derivation.py b/src/sage/rings/derivation.py index a1f80611473..4375ddfe656 100644 --- a/src/sage/rings/derivation.py +++ b/src/sage/rings/derivation.py @@ -193,7 +193,7 @@ from sage.structure.element import ModuleElement from sage.rings.integer_ring import ZZ -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base from sage.rings.power_series_ring import PowerSeriesRing_generic from sage.rings.laurent_series_ring import LaurentSeriesRing @@ -331,9 +331,9 @@ def __init__(self, domain, codomain, twist=None): self._basis = [ ] self._dual_basis = [ ] self._constants = (domain, True) - elif (isinstance(domain, (PolynomialRing_general, MPolynomialRing_base, PowerSeriesRing_generic, LaurentSeriesRing)) + elif (isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base, PowerSeriesRing_generic, LaurentSeriesRing)) or (isinstance(domain, FractionField_generic) - and isinstance(domain.ring(), (PolynomialRing_general, MPolynomialRing_base)))): + and isinstance(domain.ring(), (PolynomialRing_generic, MPolynomialRing_base)))): self._base_derivation = RingDerivationModule(domain.base_ring(), defining_morphism) self.Element = RingDerivationWithoutTwist_function try: diff --git a/src/sage/rings/finite_rings/element_base.pyx b/src/sage/rings/finite_rings/element_base.pyx old mode 100755 new mode 100644 diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index c1d0c58a4d3..332fedc4713 100644 --- a/src/sage/rings/finite_rings/finite_field_base.pyx +++ b/src/sage/rings/finite_rings/finite_field_base.pyx @@ -1358,7 +1358,7 @@ cdef class FiniteField(Field): False """ from sage.rings.integer_ring import ZZ - if R is int or R is long or R is ZZ: + if R is int or R is ZZ: return True if isinstance(R, sage.rings.abc.IntegerModRing) and self.characteristic().divides(R.characteristic()): return R.hom((self.one(),), check=False) diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index cf2d43ca59a..19525b40937 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -2039,8 +2039,12 @@ cdef class IntegerMod_gmp(IntegerMod_abstract): sage: e = Mod(19, 10^10) sage: e << 102 9443608576 + sage: e << (2^200) + Traceback (most recent call last): + ... + OverflowError: Python int too large to convert to C long """ - return self.shift(long(k)) + return self.shift(k) def __rshift__(IntegerMod_gmp self, k): r""" @@ -2053,8 +2057,12 @@ cdef class IntegerMod_gmp(IntegerMod_abstract): sage: e = Mod(19, 10^10) sage: e >> 1 9 + sage: e << (2^200) + Traceback (most recent call last): + ... + OverflowError: Python int too large to convert to C long """ - return self.shift(-long(k)) + return self.shift(-k) cdef shift(IntegerMod_gmp self, long k): r""" diff --git a/src/sage/rings/finite_rings/meson.build b/src/sage/rings/finite_rings/meson.build index 7f7a5744a1f..7e6c338636f 100644 --- a/src/sage/rings/finite_rings/meson.build +++ b/src/sage/rings/finite_rings/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'conway_polynomials.py', 'element_base.pxd', diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index be83c5165f6..f6f8c08666f 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -189,7 +189,7 @@ from sage.rings.number_field.number_field_ideal import NumberFieldIdeal from sage.rings.fraction_field import FractionField_generic from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.polynomial_element import Polynomial from sage.structure.element cimport Element, parent, Vector @@ -337,7 +337,7 @@ class ResidueFieldFactory(UniqueFactory): raise ValueError("p must be an ideal or element of a number field or function field.") if not p.is_prime(): raise ValueError("p (%s) must be prime" % p) - if isinstance(p.ring(), PolynomialRing_general): + if isinstance(p.ring(), PolynomialRing_generic): if not p.ring().base_ring().is_finite(): raise ValueError("residue fields only supported for polynomial rings over finite fields") if not p.ring().base_ring().is_prime_field(): @@ -373,7 +373,7 @@ class ResidueFieldFactory(UniqueFactory): if pring is ZZ: return ResidueFiniteField_prime_modn(p, names, p.gen(), None, None, None) - if isinstance(pring, PolynomialRing_general): + if isinstance(pring, PolynomialRing_generic): K = pring.fraction_field() Kbase = pring.base_ring() f = p.gen() @@ -1400,7 +1400,7 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): # No special code for residue fields of Z, since we just use the normal reduction map to GF(p) if self._K is ZZ: return self._F(x) - if isinstance(self._K, PolynomialRing_general): + if isinstance(self._K, PolynomialRing_generic): p = self._F.p.gen() if p.degree() == 1: return self._F((x % p)[0]) @@ -1658,7 +1658,7 @@ cdef class LiftingMap(Section): return self._K(self._K.ring_of_integers()(x)) else: return self._K(self._K.ring_of_integers()(x.polynomial().list())) - elif isinstance(self._K, PolynomialRing_general): + elif isinstance(self._K, PolynomialRing_generic): return self._K(x.polynomial().list()) # Else the lifting map is just x |--> to_order(x * PB) x = self._F(x) diff --git a/src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py b/src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py index e29626593b4..0b8d4cd32ff 100644 --- a/src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py +++ b/src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py @@ -38,7 +38,7 @@ from sage.rings.integer import Integer from sage.rings.integer_ring import ZZ from sage.rings.polynomial.ore_polynomial_element import OrePolynomial -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.structure.parent import Parent from sage.structure.sage_object import SageObject from sage.structure.sequence import Sequence @@ -564,7 +564,7 @@ def __classcall_private__(cls, function_ring, gen, name='t'): # duplicate. As a general comment, there are sanity checks both # here and in the category constructor, which is not ideal. # Check domain is Fq[T] - if not isinstance(function_ring, PolynomialRing_general): + if not isinstance(function_ring, PolynomialRing_generic): raise NotImplementedError('function ring must be a polynomial ' 'ring') function_ring_base = function_ring.base_ring() diff --git a/src/sage/rings/function_field/khuri_makdisi.pyx b/src/sage/rings/function_field/khuri_makdisi.pyx index aa64322b0ed..d32677bed6f 100644 --- a/src/sage/rings/function_field/khuri_makdisi.pyx +++ b/src/sage/rings/function_field/khuri_makdisi.pyx @@ -871,13 +871,31 @@ cdef class KhuriMakdisi_small(KhuriMakdisi_base): sage: p2 = G.point(pl2 - b) sage: -(-p1) == p1 # indirect doctest True + + Check that :issue:`39148` is fixed:: + + sage: # long time + sage: k. = FunctionField(GF(17)); t = polygen(k) + sage: F. = k.extension(t^4 + (14*x + 14)*t^3 + 9*t^2 + (10*x^2 + 15*x + 8)*t + ....: + 7*x^3 + 15*x^2 + 6*x + 16) + sage: infty1, infty2 = F.places_infinite() + sage: O = F.maximal_order() + sage: P = O.ideal((x + 1, y + 7)).divisor() + sage: D1 = 3*infty2 + infty1 - 4*P + sage: D2 = F.divisor_group().zero() + sage: J = F.jacobian(model='km-small', base_div=4*P) + sage: J(D1) + J(D2) == J(D1) + True """ cdef int d0 = self.d0 cdef int g = self.g cdef Matrix w1, w2, w3, w4 w1 = self.mu_image(self.wV2, wd, self.mu_mat23, 4*d0 - g + 1) - w2 = self.mu_preimage(self.wV3, w1, self.mu_mat23, d0) + # The row space of w2 represents H^0(O(2D_0 - D)), whose dimension is + # at least d0 - g + 1, and hence the codimension is at most d0. Thus, + # we cannot provide an expected_codim argument for mu_preimage. + w2 = self.mu_preimage(self.wV3, w1, self.mu_mat23) # efficient than # wf = matrix(w2[0]) # w3 = self.mu_image(wf, self.wV4, self.mu_mat24, 4*d0 - g + 1) diff --git a/src/sage/rings/function_field/meson.build b/src/sage/rings/function_field/meson.build index 16e5fa6fa6f..0ed61989167 100644 --- a/src/sage/rings/function_field/meson.build +++ b/src/sage/rings/function_field/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'constructor.py', 'derivations.py', diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index ffc5ee16e0f..c9d1ff65bc6 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -645,7 +645,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): mpz_set_pylong(self.value, x) elif isinstance(x, float): - n = long(x) + n = int(x) if n == x: mpz_set_pylong(self.value, n) else: @@ -7434,7 +7434,7 @@ cdef class int_to_Z(Morphism): def __init__(self): import sage.categories.homset from sage.sets.pythonclass import Set_PythonType - Morphism.__init__(self, sage.categories.homset.Hom(Set_PythonType(long), integer_ring.ZZ)) + Morphism.__init__(self, sage.categories.homset.Hom(Set_PythonType(int), integer_ring.ZZ)) cpdef Element _call_(self, a): cdef Integer r diff --git a/src/sage/rings/laurent_series_ring.py b/src/sage/rings/laurent_series_ring.py index 2142f717460..1feba6e675b 100644 --- a/src/sage/rings/laurent_series_ring.py +++ b/src/sage/rings/laurent_series_ring.py @@ -52,7 +52,7 @@ lazy_import('sage.rings.polynomial.laurent_polynomial_ring_base', 'LaurentPolynomialRing_generic') lazy_import('sage.rings.lazy_series_ring', ('LazyPowerSeriesRing', 'LazyLaurentSeriesRing')) -lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_general') +lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_generic') lazy_import('sage.rings.power_series_ring', 'PowerSeriesRing_generic') @@ -691,7 +691,7 @@ def _coerce_map_from_(self, P): if (isinstance(P, (LaurentSeriesRing, LazyLaurentSeriesRing, LaurentPolynomialRing_generic, PowerSeriesRing_generic, LazyPowerSeriesRing, - PolynomialRing_general)) + PolynomialRing_generic)) and P.variable_name() == self.variable_name() and A.has_coerce_map_from(P.base_ring())): return True diff --git a/src/sage/rings/lazy_series.py b/src/sage/rings/lazy_series.py index 1b4f4dca508..d28a4e81b5e 100644 --- a/src/sage/rings/lazy_series.py +++ b/src/sage/rings/lazy_series.py @@ -4204,8 +4204,8 @@ def __call__(self, g): if not isinstance(g, LazyModuleElement): # Check to see if it belongs to a polynomial ring # that we can extend to a lazy series ring - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(P, PolynomialRing_general): + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(P, PolynomialRing_generic): from sage.rings.lazy_series_ring import LazyLaurentSeriesRing R = LazyLaurentSeriesRing(P.base_ring(), P.variable_names(), P.is_sparse()) g = R(P(g)) @@ -5205,7 +5205,7 @@ def __call__(self, *g): # f now has (potentially) infinitely many terms # Lift the resulting parent to a lazy series (if possible) # Also make sure each element of g is a LazyModuleElement - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing_univariate from sage.rings.lazy_series_ring import LazySeriesRing @@ -5213,7 +5213,7 @@ def __call__(self, *g): if fP._laurent_poly_ring.has_coerce_map_from(P): S = fP._laurent_poly_ring P = fP - if isinstance(P, (PolynomialRing_general, MPolynomialRing_base)): + if isinstance(P, (PolynomialRing_generic, MPolynomialRing_base)): from sage.rings.lazy_series_ring import LazyPowerSeriesRing S = P try: diff --git a/src/sage/rings/localization.py b/src/sage/rings/localization.py index ab6916d36c8..e5015e95a7a 100644 --- a/src/sage/rings/localization.py +++ b/src/sage/rings/localization.py @@ -180,7 +180,7 @@ from sage.structure.unique_representation import UniqueRepresentation from sage.categories.integral_domains import IntegralDomains -from sage.rings.ring import IntegralDomain +from sage.structure.parent import Parent from sage.structure.element import IntegralDomainElement @@ -193,7 +193,7 @@ def normalize_extra_units(base_ring, add_units, warning=True): INPUT: - - ``base_ring`` -- an instance of :class:`IntegralDomain` + - ``base_ring`` -- a ring in the category of :class:`IntegralDomains` - ``add_units`` -- list of elements from base ring - ``warning`` -- boolean (default: ``True``); to suppress a warning which is thrown if no normalization was possible @@ -561,7 +561,7 @@ def _integer_(self, Z=None): return self._value._integer_(Z=Z) -class Localization(IntegralDomain, UniqueRepresentation): +class Localization(Parent, UniqueRepresentation): r""" The localization generalizes the construction of the field of fractions of an integral domain to an arbitrary ring. Given a (not necessarily @@ -580,21 +580,18 @@ class Localization(IntegralDomain, UniqueRepresentation): this class relies on the construction of the field of fraction and is therefore restricted to integral domains. - Accordingly, this class is inherited from :class:`IntegralDomain` and can - only be used in that context. Furthermore, the base ring should support + Accordingly, the base ring must be in the category of ``IntegralDomains``. + Furthermore, the base ring should support :meth:`sage.structure.element.CommutativeRingElement.divides` and the exact division operator ``//`` (:meth:`sage.structure.element.Element.__floordiv__`) in order to guarantee a successful application. INPUT: - - ``base_ring`` -- an instance of :class:`Ring` allowing the construction - of :meth:`fraction_field` (that is an integral domain) + - ``base_ring`` -- a ring in the category of ``IntegralDomains`` - ``extra_units`` -- tuple of elements of ``base_ring`` which should be turned into units - - ``names`` -- passed to :class:`IntegralDomain` - - ``normalize`` -- boolean (default: ``True``); passed to :class:`IntegralDomain` - - ``category`` -- (default: ``None``) passed to :class:`IntegralDomain` + - ``category`` -- (default: ``None``) passed to :class:`Parent` - ``warning`` -- boolean (default: ``True``); to suppress a warning which is thrown if ``self`` cannot be represented uniquely @@ -712,7 +709,7 @@ def __init__(self, base_ring, extra_units, names=None, normalize=True, category= # since by construction the base ring must contain non units self must be infinite category = IntegralDomains().Infinite() - IntegralDomain.__init__(self, base_ring, names=names, normalize=normalize, category=category) + Parent.__init__(self, base=base_ring, names=names, normalize=normalize, category=category) self._extra_units = tuple(extra_units) self._fraction_field = base_ring.fraction_field() self._populate_coercion_lists_() diff --git a/src/sage/rings/meson.build b/src/sage/rings/meson.build index 171592eccbd..a3be9efe30b 100644 --- a/src/sage/rings/meson.build +++ b/src/sage/rings/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'abc.pxd', 'algebraic_closure_finite_field.py', 'all.py', diff --git a/src/sage/rings/morphism.pyx b/src/sage/rings/morphism.pyx index 3079bfa3974..791e8b70b93 100644 --- a/src/sage/rings/morphism.pyx +++ b/src/sage/rings/morphism.pyx @@ -1036,7 +1036,7 @@ cdef class RingHomomorphism(RingMap): from sage.rings.polynomial.polynomial_quotient_ring import PolynomialQuotientRing_generic from sage.rings.quotient_ring import QuotientRing_nc from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic B = self.codomain() graph, from_B, to_A = self._graph_ideal() Q = graph.ring() @@ -1045,7 +1045,7 @@ cdef class RingHomomorphism(RingMap): # avoid adding the 0-ideal to the graph ideal in order to benefit # from a cached Gröbner basis graph_I = graph - elif (isinstance(B, MPolynomialRing_base) or isinstance(B, PolynomialRing_general) + elif (isinstance(B, MPolynomialRing_base) or isinstance(B, PolynomialRing_generic) or isinstance(B, QuotientRing_nc) or isinstance(B, PolynomialQuotientRing_generic)): graph_I = graph + from_B(I) else: @@ -3137,7 +3137,7 @@ def _tensor_product_ring(B, A): from sage.rings.number_field.number_field_base import NumberField from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base from sage.rings.polynomial.polynomial_quotient_ring import PolynomialQuotientRing_generic - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.rings.polynomial.term_order import TermOrder from sage.rings.quotient_ring import QuotientRing_nc @@ -3150,7 +3150,7 @@ def _tensor_product_ring(B, A): def term_order(A): # univariate rings do not have a term order - if (isinstance(A, PolynomialRing_general) or isinstance(A, PolynomialQuotientRing_generic) + if (isinstance(A, (PolynomialRing_generic, PolynomialQuotientRing_generic)) or (isinstance(A, (NumberField, FiniteField)) and not A.is_prime_field())): return TermOrder('lex', 1) @@ -3166,7 +3166,7 @@ def _tensor_product_ring(B, A): order=term_order(B) + term_order(A)) def relations(A, R_gens_A): - if isinstance(A, MPolynomialRing_base) or isinstance(A, PolynomialRing_general): + if isinstance(A, (MPolynomialRing_base, PolynomialRing_generic)): return [] elif isinstance(A, PolynomialQuotientRing_generic): to_R = A.ambient().hom(R_gens_A, R, check=False) diff --git a/src/sage/rings/multi_power_series_ring.py b/src/sage/rings/multi_power_series_ring.py index 3a30b89b9e9..43f446a7e09 100644 --- a/src/sage/rings/multi_power_series_ring.py +++ b/src/sage/rings/multi_power_series_ring.py @@ -208,7 +208,7 @@ from sage.misc.lazy_import import lazy_import from sage.rings.infinity import infinity from sage.rings.multi_power_series_ring_element import MPowerSeries -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base from sage.rings.polynomial.term_order import TermOrder @@ -674,7 +674,7 @@ def _coerce_impl(self, f): True """ P = f.parent() - if isinstance(P, (PolynomialRing_general, MPolynomialRing_base, + if isinstance(P, (PolynomialRing_generic, MPolynomialRing_base, PowerSeriesRing_generic, MPowerSeriesRing_generic, LazyPowerSeriesRing)): if set(P.variable_names()).issubset(set(self.variable_names())): @@ -841,7 +841,7 @@ def _coerce_map_from_(self, P): True """ if isinstance(P, (MPolynomialRing_base, MPowerSeriesRing_generic, LazyPowerSeriesRing, - PolynomialRing_general, PowerSeriesRing_generic)): + PolynomialRing_generic, PowerSeriesRing_generic)): if set(P.variable_names()).issubset(set(self.variable_names())): if self.has_coerce_map_from(P.base_ring()): return True diff --git a/src/sage/rings/multi_power_series_ring_element.py b/src/sage/rings/multi_power_series_ring_element.py index 046f8338e05..5f8bba84c49 100644 --- a/src/sage/rings/multi_power_series_ring_element.py +++ b/src/sage/rings/multi_power_series_ring_element.py @@ -158,7 +158,7 @@ from sage.rings.finite_rings.integer_mod_ring import Zmod from sage.rings.infinity import infinity, InfinityElement from sage.rings.integer import Integer -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.power_series_ring_element import PowerSeries from sage.structure.richcmp import richcmp @@ -406,7 +406,7 @@ def __init__(self, parent, x=0, prec=infinity, is_gen=False, check=False): self._bg_value = parent._send_to_bg(x).add_bigoh(prec) # test whether x coerces to underlying polynomial ring of parent - elif isinstance(xparent, PolynomialRing_general): + elif isinstance(xparent, PolynomialRing_generic): self._bg_value = parent._send_to_bg(x).add_bigoh(prec) else: diff --git a/src/sage/rings/number_field/meson.build b/src/sage/rings/number_field/meson.build index 46162077eb8..5b612679d40 100644 --- a/src/sage/rings/number_field/meson.build +++ b/src/sage/rings/number_field/meson.build @@ -1,5 +1,6 @@ py.install_sources( 'S_unit_solver.py', + '__init__.py', 'all.py', 'bdd_height.py', 'class_group.py', diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 2559771ae62..dbd8e7e2edf 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -75,10 +75,12 @@ # https://www.gnu.org/licenses/ # **************************************************************************** from __future__ import annotations +from itertools import count +from collections import Counter + from sage.misc.cachefunc import cached_method from sage.misc.superseded import deprecation - import sage.libs.ntl.all as ntl import sage.rings.abc import sage.rings.complex_mpfr @@ -99,7 +101,6 @@ from sage.rings.finite_rings.integer_mod import mod from sage.categories.number_fields import NumberFields -from sage.rings.ring import Ring from sage.misc.latex import latex_variable_name from .unit_group import UnitGroup @@ -118,8 +119,6 @@ from . import maps from . import structure from . import number_field_morphisms -from itertools import count -from collections import Counter from sage.categories.homset import Hom from sage.categories.sets_cat import Sets @@ -128,6 +127,7 @@ from sage.rings.real_mpfr import RR from sage.interfaces.abc import GapElement +from sage.rings.number_field.morphism import RelativeNumberFieldHomomorphism_from_abs lazy_import('sage.libs.gap.element', 'GapElement', as_='LibGapElement') lazy_import('sage.rings.universal_cyclotomic_field', 'UniversalCyclotomicFieldElement') @@ -136,13 +136,12 @@ _NumberFields = NumberFields() -from sage.rings.number_field.morphism import RelativeNumberFieldHomomorphism_from_abs - - def is_NumberFieldHomsetCodomain(codomain): """ Return whether ``codomain`` is a valid codomain for a number - field homset. This is used by NumberField._Hom_ to determine + field homset. + + This is used by NumberField._Hom_ to determine whether the created homsets should be a :class:`sage.rings.number_field.homset.NumberFieldHomset`. @@ -414,8 +413,8 @@ def NumberField(polynomial, name=None, check=True, names=None, embedding=None, sage: RR(g) -1.25992104989487 - If no embedding is specified or is complex, the comparison is not returning something - meaningful.:: + If no embedding is specified or is complex, the comparison is not + returning something meaningful. :: sage: N. = NumberField(x^3 + 2) sage: 1 < g diff --git a/src/sage/rings/number_field/number_field_base.pyx b/src/sage/rings/number_field/number_field_base.pyx index 910f6ff7904..1c8259a8250 100644 --- a/src/sage/rings/number_field/number_field_base.pyx +++ b/src/sage/rings/number_field/number_field_base.pyx @@ -65,7 +65,7 @@ cdef class NumberField(Field): +Infinity """ # This token docstring is mostly there to prevent Sphinx from pasting in - # the docstring of the __init__ method inherited from IntegralDomain, which + # the docstring of the __init__ method inherited from Field, which # is rather confusing. def _pushout_(self, other): r""" diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py index 3686840ccba..171fba9af6e 100644 --- a/src/sage/rings/number_field/number_field_ideal.py +++ b/src/sage/rings/number_field/number_field_ideal.py @@ -2170,17 +2170,18 @@ def reduce(self, f): M = MatrixSpace(ZZ,n)([R.coordinates(y) for y in self.basis()]) D = M.hermite_form() - d = [D[i,i] for i in range(n)] + d = [D[i, i] for i in range(n)] v = R.coordinates(f) for i in range(n): - q, r = ZZ(v[i]).quo_rem(d[i])#v is a vector of rationals, we want division of integers + q, r = ZZ(v[i]).quo_rem(d[i]) + # v is a vector of rationals, we want division of integers if 2*r > d[i]: q = q + 1 v = v - q*D[i] - return sum([v[i]*Rbasis[i] for i in range(n)]) + return sum([v[i] * Rbasis[i] for i in range(n)]) def residues(self): r""" diff --git a/src/sage/rings/padics/factory.py b/src/sage/rings/padics/factory.py index 44093d2cf67..a0990ad1720 100644 --- a/src/sage/rings/padics/factory.py +++ b/src/sage/rings/padics/factory.py @@ -3548,7 +3548,7 @@ def krasner_check(poly, prec): sage: krasner_check(1,2) # this is a stupid example. True """ - return True #This needs to be implemented + return True # This needs to be implemented def is_eisenstein(poly): diff --git a/src/sage/rings/padics/generic_nodes.py b/src/sage/rings/padics/generic_nodes.py index 27ca55b274f..5b8c7468c75 100644 --- a/src/sage/rings/padics/generic_nodes.py +++ b/src/sage/rings/padics/generic_nodes.py @@ -257,7 +257,7 @@ def _test_additive_associativity(self, **options): tester = self._tester(**options) S = tester.some_elements() from sage.misc.misc import some_tuples - for x,y,z in some_tuples(S, 3, tester._max_runs): + for x, y, z in some_tuples(S, 3, tester._max_runs): tester.assertTrue(((x + y) + z).is_equal_to(x + (y + z), min(x.precision_absolute(), y.precision_absolute(), z.precision_absolute()))) @@ -265,7 +265,8 @@ class FloatingPointRingGeneric(FloatingPointGeneric): pass -class FloatingPointFieldGeneric(FloatingPointGeneric):#, sage.rings.ring.Field): +class FloatingPointFieldGeneric(FloatingPointGeneric): + # in category of Fields() pass @@ -273,7 +274,8 @@ class CappedRelativeRingGeneric(CappedRelativeGeneric): pass -class CappedRelativeFieldGeneric(CappedRelativeGeneric):#, sage.rings.ring.Field): +class CappedRelativeFieldGeneric(CappedRelativeGeneric): + # in category of Fields() pass diff --git a/src/sage/rings/padics/meson.build b/src/sage/rings/padics/meson.build index 9cb64492095..f589881042e 100644 --- a/src/sage/rings/padics/meson.build +++ b/src/sage/rings/padics/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'common_conversion.pxd', 'eisenstein_extension_generic.py', diff --git a/src/sage/rings/padics/padic_valuation.py b/src/sage/rings/padics/padic_valuation.py index 1050055e1fb..3d150562508 100644 --- a/src/sage/rings/padics/padic_valuation.py +++ b/src/sage/rings/padics/padic_valuation.py @@ -554,8 +554,8 @@ def is_unramified(self, G, include_steps=False, assume_squarefree=False): """ R = G.parent() - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if not isinstance(R, PolynomialRing_general) or R.base_ring() is not self.domain() or not G.is_monic(): + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if not isinstance(R, PolynomialRing_generic) or R.base_ring() is not self.domain() or not G.is_monic(): raise ValueError("G must be a monic univariate polynomial over the domain of this valuation") if not assume_squarefree and not G.is_squarefree(): raise ValueError("G must be squarefree") @@ -651,8 +651,8 @@ def is_totally_ramified(self, G, include_steps=False, assume_squarefree=False): """ R = G.parent() - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if not isinstance(R, PolynomialRing_general) or R.base_ring() is not self.domain() or not G.is_monic(): + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if not isinstance(R, PolynomialRing_generic) or R.base_ring() is not self.domain() or not G.is_monic(): raise ValueError("G must be a monic univariate polynomial over the domain of this valuation") if not assume_squarefree and not G.is_squarefree(): raise ValueError("G must be squarefree") diff --git a/src/sage/rings/padics/relative_extension_leaves.py b/src/sage/rings/padics/relative_extension_leaves.py index 3005ae0825b..b88aebf129a 100644 --- a/src/sage/rings/padics/relative_extension_leaves.py +++ b/src/sage/rings/padics/relative_extension_leaves.py @@ -378,7 +378,7 @@ def __init__(self, exact_modulus, approx_modulus, prec, print_mode, shift_seed, """ self._exact_modulus = exact_modulus unram_prec = (prec + approx_modulus.degree() - 1) // approx_modulus.degree() - KFP = approx_modulus.base_ring()#.change(field=False, show_prec=False) + KFP = approx_modulus.base_ring() # .change(field=False, show_prec=False) self.prime_pow = PowComputer_relative_maker(approx_modulus.base_ring().prime(), max(min(unram_prec - 1, 30), 1), unram_prec, prec, False, exact_modulus.change_ring(KFP), shift_seed.change_ring(KFP), 'floating-point') self._implementation = 'Polynomial' EisensteinExtensionGeneric.__init__(self, approx_modulus, prec, print_mode, names, RelativeRamifiedFloatingPointElement) @@ -416,7 +416,7 @@ def __init__(self, exact_modulus, approx_modulus, prec, print_mode, shift_seed, """ self._exact_modulus = exact_modulus unram_prec = (prec + approx_modulus.degree() - 1) // approx_modulus.degree() - KFP = approx_modulus.base_ring()#.change(field=False, show_prec=False) + KFP = approx_modulus.base_ring() # .change(field=False, show_prec=False) self.prime_pow = PowComputer_relative_maker(approx_modulus.base_ring().prime(), max(min(unram_prec - 1, 30), 1), unram_prec, prec, True, exact_modulus.change_ring(KFP), shift_seed.change_ring(KFP), 'floating-point') self._implementation = 'Polynomial' EisensteinExtensionGeneric.__init__(self, approx_modulus, prec, print_mode, names, RelativeRamifiedFloatingPointElement) diff --git a/src/sage/rings/padics/relaxed_template.pxi b/src/sage/rings/padics/relaxed_template.pxi index 1b6b4fb0833..79869e9b7a1 100644 --- a/src/sage/rings/padics/relaxed_template.pxi +++ b/src/sage/rings/padics/relaxed_template.pxi @@ -1659,7 +1659,7 @@ cdef class RelaxedElement(pAdicGenericElement): 964*997^4 + 572*997^5 + 124*997^6 + ... """ cdef long start - cdef long shift = long(s) + cdef long shift = s if shift: if (self)._parent.is_field(): start = -maxordp diff --git a/src/sage/rings/polynomial/cyclotomic.pyx b/src/sage/rings/polynomial/cyclotomic.pyx index 8c9088434fa..e9eb5675b90 100644 --- a/src/sage/rings/polynomial/cyclotomic.pyx +++ b/src/sage/rings/polynomial/cyclotomic.pyx @@ -4,7 +4,7 @@ Fast calculation of cyclotomic polynomials This module provides a function :func:`cyclotomic_coeffs`, which calculates the coefficients of cyclotomic polynomials. This is not intended to be invoked directly by the user, but it is called by the method -:meth:`~sage.rings.polynomial.polynomial_ring.PolynomialRing_general.cyclotomic_polynomial` +:meth:`~sage.rings.polynomial.polynomial_ring.PolynomialRing_generic.cyclotomic_polynomial` method of univariate polynomial ring objects and the top-level :func:`~sage.misc.functional.cyclotomic_polynomial` function. """ diff --git a/src/sage/rings/polynomial/flatten.py b/src/sage/rings/polynomial/flatten.py index 32d07423e91..174c1d7b1bd 100644 --- a/src/sage/rings/polynomial/flatten.py +++ b/src/sage/rings/polynomial/flatten.py @@ -38,7 +38,7 @@ from sage.categories.morphism import Morphism from sage.misc.cachefunc import cached_method from .polynomial_ring_constructor import PolynomialRing -from .polynomial_ring import PolynomialRing_general +from .polynomial_ring import PolynomialRing_generic from .multi_polynomial_ring_base import MPolynomialRing_base from sage.rings.fraction_field import FractionField_generic from sage.rings.fraction_field_element import FractionFieldElement @@ -160,14 +160,14 @@ def __init__(self, domain): sage: fl.section()(fl(p)) == p True """ - if not isinstance(domain, PolynomialRing_general) and not isinstance(domain, MPolynomialRing_base): + if not isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base)): raise ValueError("domain should be a polynomial ring") ring = domain variables = [] intermediate_rings = [] - while isinstance(ring, (PolynomialRing_general, MPolynomialRing_base)): + while isinstance(ring, (PolynomialRing_generic, MPolynomialRing_base)): intermediate_rings.append(ring) v = ring.variable_names() variables.extend(reversed(v)) @@ -221,7 +221,7 @@ def _call_(self, p): for ring in self._intermediate_rings: new_p = {} - if isinstance(ring, PolynomialRing_general): + if isinstance(ring, PolynomialRing_generic): for mon, pp in p.items(): assert pp.parent() is ring for i, j in pp.monomial_coefficients().items(): @@ -347,14 +347,14 @@ def __init__(self, domain, codomain): """ if not isinstance(domain, MPolynomialRing_base): raise ValueError("domain should be a multivariate polynomial ring") - if not isinstance(codomain, PolynomialRing_general) and not isinstance(codomain, MPolynomialRing_base): + if not isinstance(codomain, (PolynomialRing_generic, MPolynomialRing_base)): raise ValueError("codomain should be a polynomial ring") ring = codomain intermediate_rings = [] while True: - is_polynomial_ring = isinstance(ring, PolynomialRing_general) + is_polynomial_ring = isinstance(ring, PolynomialRing_generic) if not (is_polynomial_ring or isinstance(ring, MPolynomialRing_base)): break intermediate_rings.append((ring, is_polynomial_ring)) @@ -499,7 +499,7 @@ def __init__(self, domain, D): Defn: Defined on coordinates by sending (z) to (z^2 + 1.00000000000000) """ - if not isinstance(domain, PolynomialRing_general) and not isinstance(domain, MPolynomialRing_base): + if not isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base)): raise TypeError("domain should be a polynomial ring") # use only the generators that are in the stack somewhere, @@ -538,7 +538,7 @@ def __init__(self, domain, D): # Construct unflattened codomain R new_vars = [] R = domain - while isinstance(R, (PolynomialRing_general, + while isinstance(R, (PolynomialRing_generic, MPolynomialRing_base, FractionField_generic)): if isinstance(R, FractionField_generic): diff --git a/src/sage/rings/polynomial/laurent_polynomial.pyx b/src/sage/rings/polynomial/laurent_polynomial.pyx index 0fed2467c05..cdd459c8218 100644 --- a/src/sage/rings/polynomial/laurent_polynomial.pyx +++ b/src/sage/rings/polynomial/laurent_polynomial.pyx @@ -13,7 +13,7 @@ from sage.structure.element import coerce_binop, parent from sage.structure.factorization import Factorization from sage.misc.derivative import multi_derivative from sage.rings.polynomial.polynomial_element import Polynomial -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.structure.richcmp cimport richcmp, rich_to_bool from sage.rings.infinity import minus_infinity @@ -429,7 +429,7 @@ cdef class LaurentPolynomial_univariate(LaurentPolynomial): if self.__n < 0: raise ValueError("Laurent polynomial with negative valuation cannot be converted to polynomial") - if isinstance(R, PolynomialRing_general): + if isinstance(R, PolynomialRing_generic): return R(self.__u) << self.__n elif self.__n == 0: return R(self.__u) diff --git a/src/sage/rings/polynomial/laurent_polynomial_ring.py b/src/sage/rings/polynomial/laurent_polynomial_ring.py index 2e4cf5ce6ea..0e48259a531 100644 --- a/src/sage/rings/polynomial/laurent_polynomial_ring.py +++ b/src/sage/rings/polynomial/laurent_polynomial_ring.py @@ -236,14 +236,14 @@ def LaurentPolynomialRing(base_ring, *args, **kwds): sage: (w0 + 2*w8 + w13)^2 # needs sage.modules w0^2 + 4*w0*w8 + 4*w8^2 + 2*w0*w13 + 4*w8*w13 + w13^2 """ - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base R = PolynomialRing(base_ring, *args, **kwds) if R in _cache: return _cache[R] # put () here to re-enable weakrefs - if isinstance(R, PolynomialRing_general): + if isinstance(R, PolynomialRing_generic): # univariate case P = LaurentPolynomialRing_univariate(R) else: diff --git a/src/sage/rings/polynomial/meson.build b/src/sage/rings/polynomial/meson.build index cbd48976335..a74efed061a 100644 --- a/src/sage/rings/polynomial/meson.build +++ b/src/sage/rings/polynomial/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'binary_form_reduce.py', 'commutative_polynomial.pxd', diff --git a/src/sage/rings/polynomial/multi_polynomial_element.py b/src/sage/rings/polynomial/multi_polynomial_element.py index a22330ef4b8..3b18664f505 100644 --- a/src/sage/rings/polynomial/multi_polynomial_element.py +++ b/src/sage/rings/polynomial/multi_polynomial_element.py @@ -636,12 +636,12 @@ def degree(self, x=None, std_grading=False): sage: GF(3037000453)['x','y'].gen(0).degree(x0) # needs sage.rings.finite_rings Traceback (most recent call last): ... - TypeError: x must canonically coerce to parent + TypeError: argument is not coercible to the parent sage: GF(3037000453)['x','y'].gen(0).degree(x^2) # needs sage.rings.finite_rings Traceback (most recent call last): ... - TypeError: x must be one of the generators of the parent + TypeError: argument is not a generator TESTS:: @@ -817,7 +817,7 @@ def monomial_coefficients(self, copy=None): ``dict`` is an alias:: - sage: f.dict() # needs sage.rings.number_field + sage: f.dict() # needs sage.rings.number_field {(1, 5, 2): 1, (2, 0, 1): 1, (4, 1, 3): 1} """ return self.element().dict() diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py index 8db6eb03ea6..adf1dc5db01 100644 --- a/src/sage/rings/polynomial/multi_polynomial_ideal.py +++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py @@ -601,10 +601,10 @@ def _groebner_cover(self): """ from sage.rings.fraction_field import FractionField_generic from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic F = self.base_ring() if (not isinstance(F, FractionField_generic) or - not isinstance(F.ring(), (MPolynomialRing_base, PolynomialRing_general))): + not isinstance(F.ring(), (MPolynomialRing_base, PolynomialRing_generic))): raise TypeError("the base ring must be a field with parameters") from sage.arith.functions import lcm from sage.libs.singular.function import lib, singular_function @@ -4528,8 +4528,7 @@ def groebner_basis(self, algorithm='', deg_bound=None, mult_bound=None, prot=Fal sage: R. = PolynomialRing(Zmod(2233497349584)) sage: I = R.ideal([z*(x-3*y), 3^2*x^2-y*z, z^2+y^2]) sage: I.groebner_basis() - [2*z^4, y*z^2 + 81*z^3, 248166372176*z^3, 9*x^2 - y*z, y^2 + z^2, x*z + - 2233497349581*y*z, 248166372176*y*z] + [2*z^4, y*z^2 + 81*z^3, 248166372176*z^3, 9*x^2 + 2233497349583*y*z, y^2 + z^2, x*z + 2233497349581*y*z, 248166372176*y*z] Sage also supports local orderings:: diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 9c940755987..d86aba9170c 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -65,7 +65,7 @@ We show how to construct various multivariate polynomial rings:: sage: P. = Zmod(25213521351515232)[]; P Multivariate Polynomial Ring in x, y, z over Ring of integers modulo 25213521351515232 sage: type(P) - + We construct the Frobenius morphism on `\GF{5}[x,y,z]` over `\GF{5}`:: @@ -170,6 +170,8 @@ AUTHORS: # * pNext and pIter don't need currRing # * p_Normalize apparently needs currRing +from warnings import warn + from cpython.object cimport Py_NE from cysignals.memory cimport sig_malloc, sig_free from cysignals.signals cimport sig_on, sig_off @@ -183,7 +185,6 @@ from sage.libs.singular.decl cimport (ring, poly, ideal, intvec, number, # singular functions from sage.libs.singular.decl cimport ( - errorreported, n_Invers, n_GetChar, p_ISet, rChangeCurrRing, p_Copy, p_Init, p_SetCoeff, p_Setm, p_SetExp, p_Add_q, p_NSet, p_GetCoeff, p_Delete, p_GetExp, pNext, rRingVar, omAlloc0, omStrDup, @@ -198,7 +199,7 @@ from sage.libs.singular.decl cimport ( prCopyR, prCopyR_NoSort) # singular conversion routines -from sage.libs.singular.singular cimport si2sa, sa2si, overflow_check +from sage.libs.singular.singular cimport si2sa, sa2si, overflow_check, start_catch_error, check_error # singular poly arith from sage.libs.singular.polynomial cimport ( @@ -212,13 +213,15 @@ from sage.libs.singular.polynomial cimport ( # singular rings from sage.libs.singular.ring cimport singular_ring_new, singular_ring_reference, singular_ring_delete +from sage.rings.finite_rings.finite_field_prime_modn import FiniteField_prime_modn + # polynomial imports from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict, MPolynomialRing_polydict_domain from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRing_base from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal from sage.rings.polynomial.polydict cimport ETuple -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic # base ring imports import sage.rings.abc @@ -340,11 +343,11 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base): Multivariate Polynomial Ring in x, y, z over Ring of integers modulo 25213521351515232 sage: type(P) - + sage: P. = PolynomialRing(Integers(2^32), order='lex') sage: P(2^32-1) - 4294967295 + -1 TESTS: @@ -508,7 +511,7 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base): return True elif base_ring.has_coerce_map_from(other._mpoly_base_ring(self.variable_names())): return True - elif isinstance(other, PolynomialRing_general): + elif isinstance(other, PolynomialRing_generic): if base_ring.has_coerce_map_from(other._mpoly_base_ring(self.variable_names())): return True @@ -4151,6 +4154,37 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): True sage: p*q//p == q True + + Test many base rings:: + + sage: R. = GF(2^32+15)[] + sage: ((x+y)^3+x+z)//(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over non fields by non-monomials not implemented. + sage: R. = Zmod(2^29-3)[] + sage: ((x+y)^3+x+z)//(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over non fields by non-monomials not implemented. + sage: R. = GF(2^29+11)[] + sage: ((x+y)^3+x+z)//(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29+10)[] + sage: ((x+y)^3+x+z)//(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = GF((2^29-3)^2)[] + sage: ((x+y)^3+x+z)//(x+y) + x^2 + 2*x*y + y^2 + sage: R. = Zmod(7^2)[] + sage: ((x+y)^3+x+z)//(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over non fields by non-monomials not implemented. """ cdef MPolynomialRing_libsingular parent = self._parent cdef MPolynomial_libsingular _right = right @@ -4461,12 +4495,58 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): sage: N = -a^4*z^8 + 2*a^2*b^2*z^8 - b^4*z^8 - 16*a^3*b*z^7 + 16*a*b^3*z^7 + 28*a^4*z^6 - 56*a^2*b^2*z^6 + 28*b^4*z^6 + 112*a^3*b*z^5 - 112*a*b^3*z^5 - 70*a^4*z^4 + 140*a^2*b^2*z^4 - 70*b^4*z^4 - 112*a^3*b*z^3 + 112*a*b^3*z^3 + 28*a^4*z^2 - 56*a^2*b^2*z^2 + 28*b^4*z^2 + 16*a^3*b*z - 16*a*b^3*z - a^4 + 2*a^2*b^2 - b^4 sage: N.factor() (-1) * (-a + b) * (a + b) * (-z^4*a + z^4*b - 4*z^3*a - 4*z^3*b + 6*z^2*a - 6*z^2*b + 4*z*a + 4*z*b - a + b) * (z^4*a + z^4*b - 4*z^3*a + 4*z^3*b - 6*z^2*a - 6*z^2*b + 4*z*a - 4*z*b + a + b) + + Test many base rings:: + + sage: R. = GF(2^32+15)[] + sage: ((x+y)^2*(x+z)^3).factor() + Traceback (most recent call last): + ... + NotImplementedError: Factorization of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29-3)[] + sage: ((x+y)^2*(x+z)^3).factor() + (x + y)^2 * (x + z)^3 + sage: R. = GF(2^29+11)[] + sage: ((x+y)^2*(x+z)^3).factor() + Traceback (most recent call last): + ... + NotImplementedError: Factorization of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29+10)[] + sage: ((x+y)^2*(x+z)^3).factor() + Traceback (most recent call last): + ... + NotImplementedError: Factorization of multivariate polynomials over Ring of integers modulo 536870922 is not implemented. + sage: R. = GF((2^29-3)^2)[] + sage: ((x+y)^2*(x+z)^3).factor() + (x + y)^2 * (x + z)^3 + sage: R. = Zmod(7^2)[] + sage: ((x+y)^2*(x+z)^3).factor() + Traceback (most recent call last): + ... + NotImplementedError: Factorization of multivariate polynomials over Ring of integers modulo 49 is not implemented. + + Ensure interrupt does not make the internal state inconsistent:: + + sage: R. = QQ[] + sage: n = 11 # chosen so that the computation takes > 1 second but not excessively long. + ....: # when Singular improves the algorithm or hardware gets faster, increase n. + sage: alarm(0.5); h = (x^2^n-y^2^n).factor() + Traceback (most recent call last): + ... + AlarmInterrupt + sage: alarm(0.5); h = (x^2^n-y^2^n).factor() + Traceback (most recent call last): + ... + AlarmInterrupt + sage: h = (x^2^n-y^2^n).factor() + sage: h + (x - y) * (x + y) * (x^2 + y^2) * (x^4 + y^4) * (x^8 + y^8) * (x^16 + y^16) * (x^32 + y^32) * (x^64 + y^64) * (x^128 + y^128) * (x^256 + y^256) * (x^512 + y^512) * (x^1024 + y^1024) """ cdef ring *_ring = self._parent_ring cdef poly *ptemp cdef intvec *iv cdef int *ivv - cdef ideal *I + cdef ideal *I = NULL cdef MPolynomialRing_libsingular parent = self._parent cdef int i @@ -4485,31 +4565,31 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): except Exception: raise NotImplementedError("Factorization of multivariate polynomials over %s is not implemented."%self._parent._base) - if n_GetChar(_ring.cf) > 1<<29: - raise NotImplementedError("Factorization of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") - - # I make a temporary copy of the poly in self because singclap_factorize appears to modify it's parameter - ptemp = p_Copy(self._poly, _ring) iv = NULL - sig_on() if _ring != currRing: rChangeCurrRing(_ring) # singclap_factorize - I = singclap_factorize(ptemp, &iv, 0, _ring) - sig_off() - - ivv = iv.ivGetVec() - v = [(new_MP(parent, p_Copy(I.m[i], _ring)), ivv[i]) - for i in range(1, I.ncols)] - v = [(f, m) for f, m in v if f != 0] # we might have zero in there - unit = new_MP(parent, p_Copy(I.m[0], _ring)) - - F = Factorization(v, unit) - F.sort() - - del iv - id_Delete(&I, _ring) - - return F + start_catch_error() + try: + try: + sig_on() + I = singclap_factorize(p_Copy(self._poly, _ring), &iv, 0, _ring) + sig_off() + finally: + if check_error(): + raise NotImplementedError("Factorization of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") + + ivv = iv.ivGetVec() + v = [(new_MP(parent, p_Copy(I.m[i], _ring)), ivv[i]) + for i in range(1, I.ncols)] + v = [(f, m) for f, m in v if f != 0] # we might have zero in there + unit = new_MP(parent, p_Copy(I.m[0], _ring)) + + F = Factorization(v, unit) + F.sort() + return F + finally: + del iv + id_Delete(&I, _ring) def lift(self, I): """ @@ -4559,7 +4639,6 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): sage: M [y^7, x^7*y^2 + x^8 + x^5*y^3 + x^6*y + x^3*y^4 + x^4*y^2 + x*y^5 + x^2*y^3 + y^4] - TESTS: Check that :issue:`13714` is fixed:: @@ -4573,16 +4652,32 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): sage: foo = I.complete_primary_decomposition() # indirect doctest sage: foo[0][0] Ideal (x1 + 1, x2^2 - 3) of Multivariate Polynomial Ring in x1, x2 over Rational Field - """ - global errorreported + Ensure interrupt does not make the internal state inconsistent:: + + sage: R. = QQ[] + sage: n = 17 # chosen so that the computation takes > 1 second but not excessively long. + ....: # when Singular improves the algorithm or hardware gets faster, increase n. + sage: I = R.ideal([(x-i)*(y-j) for i in (0..n) for j in (0..n)]) + sage: f = prod((x-i)*(y-j) for i in (0..n) for j in (0..n)) + sage: alarm(0.5); f.lift(I) + Traceback (most recent call last): + ... + AlarmInterrupt + sage: alarm(0.5); f.lift(I) + Traceback (most recent call last): + ... + AlarmInterrupt + sage: f.lift(I) + Polynomial Sequence with 324 Polynomials in 2 Variables + """ cdef ideal *fI = idInit(1, 1) cdef ideal *_I cdef MPolynomialRing_libsingular parent = self._parent cdef int i = 0 cdef int j cdef ring *r = self._parent_ring - cdef ideal *res + cdef ideal *res = NULL if isinstance(I, MPolynomialIdeal): I = I.gens() @@ -4606,24 +4701,25 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): if r != currRing: rChangeCurrRing(r) # idLift - sig_on() - res = idLift(_I, fI, NULL, 0, 0, 0) - sig_off() - if errorreported != 0: - errorcode = errorreported - errorreported = 0 - if errorcode == 1: + try: + start_catch_error() + try: + sig_on() + res = idLift(_I, fI, NULL, 0, 0, 0) + sig_off() + finally: + s = check_error() + if s: + if s != ('2nd module does not lie in the first',): + warn(f'unexpected error from singular: {s}') raise ValueError("polynomial is not in the ideal") - raise RuntimeError - - l = [] - for i from 0 <= i < IDELEMS(res): - for j from 1 <= j <= IDELEMS(_I): - l.append( new_MP(parent, pTakeOutComp(&res.m[i], 1)) ) - id_Delete(&fI, r) - id_Delete(&_I, r) - id_Delete(&res, r) + l = [new_MP(parent, pTakeOutComp(&res.m[i], 1)) + for i in range(IDELEMS(res)) for _ in range(IDELEMS(_I))] + finally: + id_Delete(&fI, r) + id_Delete(&_I, r) + id_Delete(&res, r) return Sequence(l, check=False, immutable=True) def reduce(self, I): @@ -4731,7 +4827,8 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): id_Delete(&_I,r) return new_MP(parent,res) - def divides(self, other): + @coerce_binop + def divides(self, MPolynomial_libsingular other): """ Return ``True`` if this polynomial divides ``other``. @@ -4763,27 +4860,21 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): rChangeCurrRing(r) _I = idInit(1, 1) - if not (isinstance(other,MPolynomial_libsingular) - and (other)._parent is parent): - try: - other = parent.coerce(other) - except TypeError as msg: - id_Delete(&_I,r) - raise TypeError(msg) - _I.m[0] = p_Copy(self._poly, r) if r != currRing: rChangeCurrRing(r) - sig_on() - rem = kNF(_I, NULL, (other)._poly, 0, 1) - sig_off() - id_Delete(&_I, r) + try: + sig_on() + rem = kNF(_I, NULL, other._poly, 0, 1) + sig_off() + finally: + id_Delete(&_I, r) res = new_MP(parent, rem).is_zero() return res @coerce_binop - def gcd(self, right, algorithm=None, **kwds): + def gcd(self, MPolynomial_libsingular right, algorithm=None, **kwds): """ Return the greatest common divisor of ``self`` and ``right``. @@ -4858,10 +4949,40 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): sage: q = -3*x^2*y^7*z + 2*x*y^6*z^3 + 2*x^2*y^3*z^4 + x^2*y^5 - 7*x*y^5*z sage: (21^3*p^2*q).gcd(35^2*p*q^2) == -49*p*q True + + Test many base rings:: + + sage: R. = GF(2^32+15)[] + sage: ((x+y)^2*(x+z)^3).gcd((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + NotImplementedError: GCD over rings not implemented. + sage: R. = Zmod(2^29-3)[] + sage: ((x+y)^2*(x+z)^3).gcd((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + NotImplementedError: GCD over rings not implemented. + sage: R. = GF(2^29+11)[] + sage: ((x+y)^2*(x+z)^3).gcd((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + NotImplementedError: GCD of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29+10)[] + sage: ((x+y)^2*(x+z)^3).gcd((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + NotImplementedError: GCD over rings not implemented. + sage: R. = GF((2^29-3)^2)[] + sage: ((x+y)^2*(x+z)^3).gcd((x+y)^3*(y+z)^5) + x^2 + 2*x*y + y^2 + sage: R. = Zmod(7^2)[] + sage: ((x+y)^2*(x+z)^3).gcd((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + NotImplementedError: GCD over rings not implemented. """ cdef poly *_res cdef ring *_ring = self._parent_ring - cdef MPolynomial_libsingular _right = right if algorithm is None or algorithm == "modular": On(SW_USE_CHINREM_GCD) @@ -4872,13 +4993,13 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): else: raise TypeError("algorithm %s not supported" % algorithm) - if _right._poly == NULL: + if right._poly == NULL: return self elif self._poly == NULL: return right elif p_IsOne(self._poly, _ring): return self - elif p_IsOne(_right._poly, _ring): + elif p_IsOne(right._poly, _ring): return right if _ring.cf.type != n_unknown: @@ -4889,10 +5010,10 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): raise NotImplementedError("GCD of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") cdef int count = singular_polynomial_length_bounded(self._poly, 20) \ - + singular_polynomial_length_bounded(_right._poly,20) + + singular_polynomial_length_bounded(right._poly, 20) if count >= 20: sig_on() - _res = singclap_gcd(p_Copy(self._poly, _ring), p_Copy(_right._poly, _ring), _ring ) + _res = singclap_gcd(p_Copy(self._poly, _ring), p_Copy(right._poly, _ring), _ring) if count >= 20: sig_off() @@ -4944,6 +5065,37 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 2*x*y sage: lcm(2*x, 2*x*y) 2*x*y + + Test many base rings:: + + sage: R. = GF(2^32+15)[] + sage: ((x+y)^2*(x+z)^3).lcm((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + TypeError: LCM over non-integral domains not available. + sage: R. = Zmod(2^29-3)[] + sage: ((x+y)^2*(x+z)^3).lcm((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + TypeError: LCM over non-integral domains not available. + sage: R. = GF(2^29+11)[] + sage: ((x+y)^2*(x+z)^3).lcm((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + NotImplementedError: LCM of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29+10)[] + sage: ((x+y)^2*(x+z)^3).lcm((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + TypeError: LCM over non-integral domains not available. + sage: R. = GF((2^29-3)^2)[] + sage: ((x+y)^2*(x+z)^3).lcm((x+y)^3*(y+z)^5) + x^6*y^5 + 3*x^5*y^6 + 3*x^4*y^7 + x^3*y^8 + 5*x^6*y^4*z + 18*x^5*y^5*z + 24*x^4*y^6*z + 14*x^3*y^7*z + 3*x^2*y^8*z + 10*x^6*y^3*z^2 + 45*x^5*y^4*z^2 + 78*x^4*y^5*z^2 + 64*x^3*y^6*z^2 + 24*x^2*y^7*z^2 + 3*x*y^8*z^2 + 10*x^6*y^2*z^3 + 60*x^5*y^3*z^3 + 135*x^4*y^4*z^3 + 146*x^3*y^5*z^3 + 78*x^2*y^6*z^3 + 18*x*y^7*z^3 + y^8*z^3 + 5*x^6*y*z^4 + 45*x^5*y^2*z^4 + 135*x^4*y^3*z^4 + 190*x^3*y^4*z^4 + 135*x^2*y^5*z^4 + 45*x*y^6*z^4 + 5*y^7*z^4 + x^6*z^5 + 18*x^5*y*z^5 + 78*x^4*y^2*z^5 + 146*x^3*y^3*z^5 + 135*x^2*y^4*z^5 + 60*x*y^5*z^5 + 10*y^6*z^5 + 3*x^5*z^6 + 24*x^4*y*z^6 + 64*x^3*y^2*z^6 + 78*x^2*y^3*z^6 + 45*x*y^4*z^6 + 10*y^5*z^6 + 3*x^4*z^7 + 14*x^3*y*z^7 + 24*x^2*y^2*z^7 + 18*x*y^3*z^7 + 5*y^4*z^7 + x^3*z^8 + 3*x^2*y*z^8 + 3*x*y^2*z^8 + y^3*z^8 + sage: R. = Zmod(7^2)[] + sage: ((x+y)^2*(x+z)^3).lcm((x+y)^3*(y+z)^5) + Traceback (most recent call last): + ... + TypeError: LCM over non-integral domains not available. """ cdef ring *_ring = self._parent_ring cdef poly *ret @@ -5026,6 +5178,56 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Traceback (most recent call last): ... ZeroDivisionError + + Test many base rings:: + + sage: R. = GF(2^32+15)[] + sage: ((x+y)^3+x+z).quo_rem(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29-3)[] + sage: ((x+y)^3+x+z).quo_rem(x+y) + (x^2 + 2*x*y + y^2, x + z) + sage: R. = GF(2^29+11)[] + sage: ((x+y)^3+x+z).quo_rem(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29+10)[] + sage: ((x+y)^3+x+z).quo_rem(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = GF((2^29-3)^2)[] + sage: ((x+y)^3+x+z).quo_rem(x+y) + (x^2 + 2*x*y + y^2, x + z) + sage: R. = Zmod(7^2)[] + sage: ((x+y)^3+x+z).quo_rem(x+y) + Traceback (most recent call last): + ... + NotImplementedError: Division of multivariate polynomials over non fields by non-monomials not implemented. + + Ensure interrupt does not make the internal state inconsistent:: + + sage: R. = PolynomialRing(QQ, order="lex") + sage: n = 300 # chosen so that the computation takes > 1 second but not excessively long. + ....: # when Singular improves the algorithm or hardware gets faster, increase n. + sage: f = z^n-2 + sage: g = z^2-z-x^2*y-x*y^3 + sage: alarm(0.5); f.quo_rem(g) + Traceback (most recent call last): + ... + AlarmInterrupt + sage: alarm(0.5); f.quo_rem(g) + Traceback (most recent call last): + ... + AlarmInterrupt + sage: q, r = f.quo_rem(g) + sage: len(dict(q)) + 307638 + sage: len(dict(r)) + 11409 """ cdef poly *quo cdef poly *rem @@ -5041,17 +5243,17 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): py_rem = self - right*py_quo return py_quo, py_rem - if n_GetChar(r.cf) > 1<<29: - raise NotImplementedError("Division of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") - - cdef int count = singular_polynomial_length_bounded(self._poly, 15) - if count >= 15: # note that _right._poly must be of shorter length than self._poly for us to care about this call + if r != currRing: + rChangeCurrRing(r) # singclap_pdivide + start_catch_error() + try: sig_on() - if r!=currRing: rChangeCurrRing(r) # singclap_pdivide - quo = singclap_pdivide( self._poly, right._poly, r ) - rem = p_Add_q(p_Copy(self._poly, r), p_Neg(pp_Mult_qq(right._poly, quo, r), r), r) - if count >= 15: + quo = singclap_pdivide(self._poly, right._poly, r) sig_off() + finally: + if check_error(): + raise NotImplementedError("Division of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") + rem = p_Add_q(p_Copy(self._poly, r), p_Neg(pp_Mult_qq(right._poly, quo, r), r), r) return new_MP(parent, quo), new_MP(parent, rem) def _singular_init_(self, singular=None): @@ -5424,6 +5626,7 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): _p = p_Add_q(_p, mon, _ring) return new_MP(self._parent, _p) + @coerce_binop def resultant(self, MPolynomial_libsingular other, variable=None): """ Compute the resultant of this polynomial and the first @@ -5479,40 +5682,91 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): sage: g=y^2+x sage: f.resultant(g,y) x^2 + x + + sage: R. = GF(2^32+15)[] + sage: (x-z).resultant(y-z,z) + Traceback (most recent call last): + ... + NotImplementedError: Resultants of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29-3)[] + sage: (x-z).resultant(y-z,z) + x + 536870908*y + sage: R. = GF(2^29+11)[] + sage: (x-z).resultant(y-z,z) + Traceback (most recent call last): + ... + NotImplementedError: Resultants of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented. + sage: R. = Zmod(2^29+10)[] + sage: (x-z).resultant(y-z,z) + Traceback (most recent call last): + ... + NotImplementedError: Resultants require base fields or integer base ring. + sage: R. = GF((2^29-3)^2)[] + sage: (x-z).resultant(y-z,z) + x - y + sage: R. = Zmod(7^2)[] + sage: (x-z).resultant(y-z,z) + Traceback (most recent call last): + ... + NotImplementedError: Resultants require base fields or integer base ring. + + Sometimes simple-looking computations can take a long time:: + + sage: R. = QQ[] + sage: n = 22 # chosen so that the computation takes > 1 second but not excessively long. + ....: # when Singular improves the algorithm or hardware gets faster, increase n. + sage: f = x^n+y^(n-1)+z^(n-2)+y^3*z^2 + sage: g = x^(n-3)+y^(n-4)+z^(n-5)+y*z + sage: h = f.resultant(g, x) + sage: len(dict(h)) + 89 + + As such we test the computation is interruptible (previously it wasn't):: + + sage: alarm(0.5); h = f.resultant(g, x) + Traceback (most recent call last): + ... + AlarmInterrupt + + Test again to ensure interrupt does not make the internal state inconsistent:: + + sage: alarm(0.5); h = f.resultant(g, x); cancel_alarm() + Traceback (most recent call last): + ... + AlarmInterrupt + sage: h = f.resultant(g, x) + sage: len(dict(h)) + 89 """ cdef ring *_ring = self._parent_ring cdef poly *rt if variable is None: variable = self.parent().gen(0) - - if self._parent is not other._parent: - raise TypeError("first parameter needs to be an element of self.parent()") - - if not variable.parent() is self.parent(): + elif variable.parent() is not self.parent(): raise TypeError("second parameter needs to be an element of self.parent() or None") - if n_GetChar(_ring.cf) > 1<<29: - raise NotImplementedError("Resultants of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") - if isinstance(self._parent._base, IntegerRing_class): ret = self.change_ring(QQ).resultant(other.change_ring(QQ), variable.change_ring(QQ)) return ret.change_ring(ZZ) - elif not self._parent._base.is_field(): - raise ValueError("Resultants require base fields or integer base ring.") - cdef int count = singular_polynomial_length_bounded(self._poly, 20) \ - + singular_polynomial_length_bounded(other._poly,20) - if count >= 20: + start_catch_error() + try: sig_on() - if _ring != currRing: rChangeCurrRing(_ring) # singclap_resultant - rt = singclap_resultant(p_Copy(self._poly, _ring), - p_Copy(other._poly, _ring), - p_Copy((variable)._poly, _ring ), - _ring) - if count >= 20: + if _ring != currRing: + rChangeCurrRing(_ring) # singclap_resultant + rt = singclap_resultant(p_Copy(self._poly, _ring), + p_Copy(other._poly, _ring), + p_Copy((variable)._poly, _ring), + _ring) sig_off() + finally: + if check_error(): + if isinstance(self._parent._base, FiniteField_prime_modn): + raise NotImplementedError("Resultants of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") + raise NotImplementedError("Resultants require base fields or integer base ring.") + return new_MP(self._parent, rt) def coefficients(self): diff --git a/src/sage/rings/polynomial/multi_polynomial_ring.py b/src/sage/rings/polynomial/multi_polynomial_ring.py index 43f1c0f6294..26c32fe036c 100644 --- a/src/sage/rings/polynomial/multi_polynomial_ring.py +++ b/src/sage/rings/polynomial/multi_polynomial_ring.py @@ -60,14 +60,12 @@ # https://www.gnu.org/licenses/ # **************************************************************************** -from sage.rings.ring import IntegralDomain import sage.rings.fraction_field_element as fraction_field_element from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base, is_MPolynomialRing from sage.rings.polynomial.polynomial_singular_interface import PolynomialRing_singular_repr from sage.rings.polynomial.polydict import PolyDict, ETuple from sage.rings.polynomial.term_order import TermOrder - import sage.interfaces.abc try: @@ -558,9 +556,9 @@ def __call__(self, x=0, check=True): c = self.base_ring()(x) return MPolynomial_polydict(self, {self._zero_tuple: c}) -# The following methods are handy for implementing Groebner -# basis algorithms. They do only superficial type/sanity checks -# and should be called carefully. + # The following methods are handy for implementing Groebner + # basis algorithms. They do only superficial type/sanity checks + # and should be called carefully. def monomial_quotient(self, f, g, coeff=False): r""" @@ -930,21 +928,17 @@ def sum(self, terms): elt = PolyDict({}, check=False) for t in terms: elt += self(t).element() - # NOTE: here we should be using self.element_class but polynomial rings are not complient - # with categories... + # NOTE: here we should be using self.element_class but + # polynomial rings are not complient with categories... from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict return MPolynomial_polydict(self, elt) -class MPolynomialRing_polydict_domain(IntegralDomain, - MPolynomialRing_polydict): +class MPolynomialRing_polydict_domain(MPolynomialRing_polydict): def __init__(self, base_ring, n, names, order): order = TermOrder(order, n) MPolynomialRing_polydict.__init__(self, base_ring, n, names, order) - def is_integral_domain(self, proof=True): - return True - def is_field(self, proof=True): if self.ngens() == 0: return self.base_ring().is_field(proof) diff --git a/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx b/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx index ac5e445908d..0434679d93d 100644 --- a/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx @@ -142,7 +142,7 @@ cdef class MPolynomialRing_base(CommutativeRing): Multivariate Polynomial Ring in x, y over Rational Field """ base = self.base_ring() - if isinstance(base, MPolynomialRing_base) or isinstance(base, polynomial_ring.PolynomialRing_general): + if isinstance(base, (MPolynomialRing_base, polynomial_ring.PolynomialRing_generic)): from sage.rings.polynomial.flatten import FlatteningMorphism return FlatteningMorphism(self) else: @@ -602,7 +602,7 @@ cdef class MPolynomialRing_base(CommutativeRing): elif self.base_ring().has_coerce_map_from(P._mpoly_base_ring(self.variable_names())): return self(x) - elif isinstance(P, polynomial_ring.PolynomialRing_general): + elif isinstance(P, polynomial_ring.PolynomialRing_generic): if P.variable_name() in self.variable_names(): if self.has_coerce_map_from(P.base_ring()): return self(x) diff --git a/src/sage/rings/polynomial/pbori/pbori.pyx b/src/sage/rings/polynomial/pbori/pbori.pyx index 686edf8892d..14a929c3238 100644 --- a/src/sage/rings/polynomial/pbori/pbori.pyx +++ b/src/sage/rings/polynomial/pbori/pbori.pyx @@ -194,7 +194,7 @@ from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF from sage.rings.polynomial.polynomial_element cimport Polynomial from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal from sage.rings.polynomial.term_order import TermOrder -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.ideal import FieldIdeal @@ -674,7 +674,7 @@ cdef class BooleanPolynomialRing(BooleanPolynomialRing_base): """ if self._base.has_coerce_map_from(S): return True - if isinstance(S, (MPolynomialRing_base, PolynomialRing_general, + if isinstance(S, (MPolynomialRing_base, PolynomialRing_generic, BooleanMonomialMonoid)): try: get_var_mapping(self, S) diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx index 389e538f83e..05de5dfe104 100644 --- a/src/sage/rings/polynomial/polynomial_element.pyx +++ b/src/sage/rings/polynomial/polynomial_element.pyx @@ -118,7 +118,7 @@ from sage.arith.functions import lcm from sage.rings.polynomial import polynomial_fateman from sage.rings.ideal import Ideal_generic -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base from sage.rings.polynomial.multi_polynomial cimport MPolynomial from sage.rings.polynomial.polynomial_quotient_ring_element import PolynomialQuotientRingElement @@ -7522,7 +7522,7 @@ cdef class Polynomial(CommutativePolynomial): raise TypeError("p2 must be a polynomial") p1, p2 = coercion_model.canonical_coercion(p1, p2) K = p1.parent() - assert isinstance(p1.parent(), PolynomialRing_general) + assert isinstance(p1.parent(), PolynomialRing_generic) S = K.base_ring() Sf = S.fraction_field() diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index 8391d791e92..6be288de70f 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -141,6 +141,7 @@ import sys +from sage.misc.superseded import deprecation from sage.structure.element import Element from sage.structure.category_object import check_default_category @@ -149,7 +150,7 @@ from sage.categories.principal_ideal_domains import PrincipalIdealDomains from sage.categories.rings import Rings -from sage.rings.ring import (Ring, IntegralDomain) +from sage.rings.ring import Ring, CommutativeRing from sage.structure.element import RingElement import sage.rings.rational_field as rational_field from sage.rings.rational_field import QQ @@ -193,7 +194,7 @@ def is_PolynomialRing(x): sage: is_PolynomialRing(2) doctest:warning... DeprecationWarning: The function is_PolynomialRing is deprecated; - use 'isinstance(..., PolynomialRing_general)' instead. + use 'isinstance(..., PolynomialRing_generic)' instead. See https://github.com/sagemath/sage/issues/38266 for details. False @@ -232,13 +233,13 @@ def is_PolynomialRing(x): from sage.misc.superseded import deprecation deprecation(38266, "The function is_PolynomialRing is deprecated; " - "use 'isinstance(..., PolynomialRing_general)' instead.") - return isinstance(x, PolynomialRing_general) + "use 'isinstance(..., PolynomialRing_generic)' instead.") + return isinstance(x, PolynomialRing_generic) ######################################################################################### -class PolynomialRing_general(Ring): +class PolynomialRing_generic(Ring): """ Univariate polynomial ring over a ring. """ @@ -534,12 +535,12 @@ def _implementation_names(cls, implementation, base_ring, sparse=False): EXAMPLES:: - sage: from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - sage: PolynomialRing_general._implementation_names(None, ZZ, True) + sage: from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + sage: PolynomialRing_generic._implementation_names(None, ZZ, True) [None, 'generic'] - sage: PolynomialRing_general._implementation_names("generic", ZZ, True) + sage: PolynomialRing_generic._implementation_names("generic", ZZ, True) [None, 'generic'] - sage: PolynomialRing_general._implementation_names("xyzzy", ZZ, True) + sage: PolynomialRing_generic._implementation_names("xyzzy", ZZ, True) Traceback (most recent call last): ... ValueError: unknown implementation 'xyzzy' for sparse polynomial rings over Integer Ring @@ -563,8 +564,8 @@ def _implementation_names_impl(implementation, base_ring, sparse): EXAMPLES:: - sage: from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - sage: PolynomialRing_general._implementation_names_impl("xyzzy", ZZ, True) + sage: from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + sage: PolynomialRing_generic._implementation_names_impl("xyzzy", ZZ, True) NotImplemented """ if implementation is None or implementation == "generic": @@ -642,7 +643,7 @@ def flattening_morphism(self): """ from .multi_polynomial_ring import MPolynomialRing_base base = self.base_ring() - if isinstance(base, (PolynomialRing_general, MPolynomialRing_base)): + if isinstance(base, (PolynomialRing_generic, MPolynomialRing_base)): from .flatten import FlatteningMorphism return FlatteningMorphism(self) else: @@ -827,7 +828,7 @@ def _coerce_map_from_(self, P): # polynomial rings in the same variable over a base that canonically # coerces into self.base_ring() - if isinstance(P, PolynomialRing_general): + if isinstance(P, PolynomialRing_generic): if self.construction()[0] != P.construction()[0]: # Construction (including variable names) must be the # same to allow coercion @@ -1590,7 +1591,7 @@ def _polys_degree(self, of_degree): coeffs.reverse() yield self(coeffs) - def _polys_max( self, max_degree ): + def _polys_max(self, max_degree): """ Refer to polynomials() for full documentation. """ @@ -1617,7 +1618,7 @@ def _Karatsuba_threshold(self): 0 """ base_ring = self.base_ring() - if isinstance(base_ring, PolynomialRing_general): + if isinstance(base_ring, PolynomialRing_generic): return 0 try: from sage.matrix.matrix_space import MatrixSpace @@ -1669,7 +1670,7 @@ def set_karatsuba_threshold(self, Karatsuba_threshold): """ self._Karatsuba_threshold = int(Karatsuba_threshold) - def polynomials( self, of_degree=None, max_degree=None ): + def polynomials(self, of_degree=None, max_degree=None): """ Return an iterator over the polynomials of specified degree. @@ -1733,7 +1734,7 @@ def polynomials( self, of_degree=None, max_degree=None ): return self._polys_max( max_degree ) raise ValueError("you should pass exactly one of of_degree and max_degree") - def monics( self, of_degree=None, max_degree=None ): + def monics(self, of_degree=None, max_degree=None): """ Return an iterator over the monic polynomials of specified degree. @@ -1794,7 +1795,11 @@ def monics( self, of_degree=None, max_degree=None ): raise ValueError("you should pass exactly one of of_degree and max_degree") -class PolynomialRing_commutative(PolynomialRing_general): +# PolynomialRing_general is deprecated since 2024-12-03. See Issue #38207. +PolynomialRing_general = PolynomialRing_generic + + +class PolynomialRing_commutative(PolynomialRing_generic): """ Univariate polynomial ring over a commutative ring. """ @@ -1808,7 +1813,7 @@ def __init__(self, base_ring, name=None, sparse=False, implementation=None, else: defaultcat = polynomial_default_category(base_ring.category(), 1) category = check_default_category(defaultcat, category) - PolynomialRing_general.__init__(self, base_ring, name=name, + PolynomialRing_generic.__init__(self, base_ring, name=name, sparse=sparse, implementation=implementation, element_class=element_class, category=category) @@ -1923,8 +1928,7 @@ def _roots_univariate_polynomial(self, p, ring=None, multiplicities=True, algori return roots -class PolynomialRing_integral_domain(PolynomialRing_commutative, PolynomialRing_singular_repr, - IntegralDomain): +class PolynomialRing_integral_domain(PolynomialRing_commutative, PolynomialRing_singular_repr, CommutativeRing): def __init__(self, base_ring, name='x', sparse=False, implementation=None, element_class=None, category=None): """ diff --git a/src/sage/rings/polynomial/polynomial_ring_constructor.py b/src/sage/rings/polynomial/polynomial_ring_constructor.py index 5cbc74dd1d5..78074c8a1d2 100644 --- a/src/sage/rings/polynomial/polynomial_ring_constructor.py +++ b/src/sage/rings/polynomial/polynomial_ring_constructor.py @@ -798,7 +798,7 @@ def _single_variate(base_ring, name, sparse=None, implementation=None, order=Non from sage.rings.semirings.tropical_polynomial import TropicalPolynomialSemiring constructor = TropicalPolynomialSemiring elif base_ring not in _CommutativeRings: - constructor = polynomial_ring.PolynomialRing_general + constructor = polynomial_ring.PolynomialRing_generic elif base_ring in _CompleteDiscreteValuationRings: constructor = polynomial_ring.PolynomialRing_cdvr elif base_ring in _CompleteDiscreteValuationFields: diff --git a/src/sage/rings/polynomial/weil/meson.build b/src/sage/rings/polynomial/weil/meson.build index 2c9bd006919..77432ffef30 100644 --- a/src/sage/rings/polynomial/weil/meson.build +++ b/src/sage/rings/polynomial/weil/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'power_sums.h', subdir: 'sage/rings/polynomial/weil', diff --git a/src/sage/rings/polynomial/weil/weil_polynomials.pyx b/src/sage/rings/polynomial/weil/weil_polynomials.pyx old mode 100755 new mode 100644 diff --git a/src/sage/rings/power_series_pari.pyx b/src/sage/rings/power_series_pari.pyx index baeef616e02..350362cadb7 100644 --- a/src/sage/rings/power_series_pari.pyx +++ b/src/sage/rings/power_series_pari.pyx @@ -416,7 +416,7 @@ cdef class PowerSeries_pari(PowerSeries): # to an ideal I, and the element a lies in I. Here we only # implement a few special cases. from sage.rings.padics.padic_generic import pAdicGeneric - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.power_series_ring import PowerSeriesRing_generic from sage.rings.laurent_series_ring import LaurentSeriesRing if isinstance(Q, pAdicGeneric): @@ -433,7 +433,7 @@ cdef class PowerSeries_pari(PowerSeries): # subst(1 + O(x), x, 1/y) yields O(y^-1). if a.valuation() <= 0: raise ValueError("can only substitute elements of positive valuation") - elif isinstance(Q, PolynomialRing_general): + elif isinstance(Q, PolynomialRing_generic): Q = Q.completion(Q.gen()) elif Q.is_exact() and not a: pass diff --git a/src/sage/rings/power_series_ring.py b/src/sage/rings/power_series_ring.py index e6c932aadff..42ca735e671 100644 --- a/src/sage/rings/power_series_ring.py +++ b/src/sage/rings/power_series_ring.py @@ -148,7 +148,7 @@ from sage.rings.fraction_field_element import FractionFieldElement from sage.rings.infinity import infinity from sage.rings.polynomial.multi_polynomial_ring_base import MPolynomialRing_base -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.structure.category_object import normalize_names from sage.structure.element import Expression, parent @@ -717,7 +717,7 @@ def _coerce_map_from_(self, S): """ if self.base_ring().has_coerce_map_from(S): return True - if (isinstance(S, (PolynomialRing_general, PowerSeriesRing_generic, LazyPowerSeriesRing)) + if (isinstance(S, (PolynomialRing_generic, PowerSeriesRing_generic, LazyPowerSeriesRing)) and self.base_ring().has_coerce_map_from(S.base_ring()) and self.variable_names() == S.variable_names()): return True @@ -1323,7 +1323,9 @@ def laurent_series_ring(self): return self.__laurent_series_ring -class PowerSeriesRing_domain(PowerSeriesRing_generic, ring.IntegralDomain): +class PowerSeriesRing_domain(PowerSeriesRing_generic): + _default_category = _IntegralDomains + def fraction_field(self): """ Return the Laurent series ring over the fraction field of the base diff --git a/src/sage/rings/puiseux_series_ring_element.pyx b/src/sage/rings/puiseux_series_ring_element.pyx index 902ce96bd7c..3533c9c4c85 100644 --- a/src/sage/rings/puiseux_series_ring_element.pyx +++ b/src/sage/rings/puiseux_series_ring_element.pyx @@ -201,7 +201,7 @@ cdef class PuiseuxSeries(AlgebraElement): l = l.add_bigoh(prec / d) self._l = l - self._e = long(abs(e)) + self._e = int(abs(e)) def __reduce__(self): """ diff --git a/src/sage/rings/quotient_ring.py b/src/sage/rings/quotient_ring.py index c867ba41bbc..7e3dd8c6d53 100644 --- a/src/sage/rings/quotient_ring.py +++ b/src/sage/rings/quotient_ring.py @@ -502,7 +502,7 @@ def __init__(self, R, I, names, category=None): # However, we don't just want to use the given category without mixing in # some quotient stuff - unless Parent.__init__ was called # previously, in which case the quotient ring stuff is just - # a vaste of time. This is the case for FiniteField_prime_modn. + # a waste of time. This is the case for FiniteField_prime_modn. if not self._is_category_initialized(): if category is None: try: diff --git a/src/sage/rings/rational.pyx b/src/sage/rings/rational.pyx index bc29e952b1a..68ee004a251 100644 --- a/src/sage/rings/rational.pyx +++ b/src/sage/rings/rational.pyx @@ -3030,7 +3030,7 @@ cdef class Rational(sage.structure.element.FieldElement): Convert this rational to a Python ``int``. This truncates ``self`` if ``self`` has a denominator (which is - consistent with Python's ``long(floats)``). + consistent with Python's ``int(floats)``). EXAMPLES:: @@ -4243,7 +4243,7 @@ cdef class int_to_Q(Morphism): import sage.categories.homset from sage.sets.pythonclass import Set_PythonType Morphism.__init__(self, sage.categories.homset.Hom( - Set_PythonType(long), rational_field.QQ)) + Set_PythonType(int), rational_field.QQ)) cpdef Element _call_(self, a): """ diff --git a/src/sage/rings/real_lazy.pyx b/src/sage/rings/real_lazy.pyx index 8fe3a8281d0..b2212871dfa 100644 --- a/src/sage/rings/real_lazy.pyx +++ b/src/sage/rings/real_lazy.pyx @@ -174,7 +174,7 @@ cdef class LazyField(Field): True """ if isinstance(R, type): - if R in [int, long]: + if R is int: from sage.sets.pythonclass import Set_PythonType return LazyWrapperMorphism(Set_PythonType(R), self) elif R.is_exact(): diff --git a/src/sage/rings/real_mpfi.pyx b/src/sage/rings/real_mpfi.pyx index 11953a50ab5..ce9958ce7e7 100644 --- a/src/sage/rings/real_mpfi.pyx +++ b/src/sage/rings/real_mpfi.pyx @@ -120,6 +120,26 @@ satisfying, but we have chosen the latter. sage: a == 2 False +Some default printing options can be set by modifying module globals:: + + sage: from sage.rings import real_mpfi + sage: x = RIF(sqrt(2), sqrt(2)+1e-10); x + 1.4142135624? + sage: real_mpfi.printing_error_digits = 2 + sage: x + 1.414213562424?51 + sage: real_mpfi.printing_style = 'brackets' + sage: x + [1.4142135623730949 .. 1.4142135624730952] + sage: real_mpfi.printing_style = 'question'; real_mpfi.printing_error_digits = 0 # revert to default + +The default value of using scientific notation can be configured at field construction instead:: + + sage: RealIntervalField(53, sci_not=False)(0.5) + 0.50000000000000000? + sage: RealIntervalField(53, sci_not=True)(0.5) + 5.0000000000000000?e-1 + COMPARISONS: Comparison operations (``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``) @@ -816,9 +836,7 @@ cdef class RealIntervalField_class(sage.rings.abc.RealIntervalField): prec = self._prec # Direct and efficient conversions - if S is ZZ or S is QQ: - return True - if S is int or S is long: + if S is ZZ or S is QQ or S is int: return True if isinstance(S, RealIntervalField_class): return (S)._prec >= prec diff --git a/src/sage/rings/real_mpfr.pyx b/src/sage/rings/real_mpfr.pyx index a870c6bf0c7..31d0bb96aed 100644 --- a/src/sage/rings/real_mpfr.pyx +++ b/src/sage/rings/real_mpfr.pyx @@ -753,8 +753,6 @@ cdef class RealField_class(sage.rings.abc.RealField): return QQtoRR(QQ, self) elif (S is RDF or S is float) and self._prec <= 53: return double_toRR(S, self) - elif S is long: - return int_toRR(long, self) elif S is int: return int_toRR(int, self) elif isinstance(S, RealField_class) and S.prec() >= self._prec: diff --git a/src/sage/rings/ring.pyx b/src/sage/rings/ring.pyx index c4137a6974f..36b84c399fe 100644 --- a/src/sage/rings/ring.pyx +++ b/src/sage/rings/ring.pyx @@ -773,25 +773,6 @@ cdef class CommutativeRing(Ring): Ring.__init__(self, base_ring, names=names, normalize=normalize, category=category) - def localization(self, additional_units, names=None, normalize=True, category=None): - """ - Return the localization of ``self`` at the given additional units. - - EXAMPLES:: - - sage: R. = GF(3)[] - sage: R.localization((x*y, x**2 + y**2)) # needs sage.rings.finite_rings - Multivariate Polynomial Ring in x, y over Finite Field of size 3 - localized at (y, x, x^2 + y^2) - sage: ~y in _ # needs sage.rings.finite_rings - True - """ - if not self.is_integral_domain(): - raise TypeError("self must be an integral domain.") - - from sage.rings.localization import Localization - return Localization(self, additional_units, names=names, normalize=normalize, category=category) - def fraction_field(self): """ Return the fraction field of ``self``. @@ -1018,29 +999,6 @@ cdef class IntegralDomain(CommutativeRing): CommutativeRing.__init__(self, base_ring, names=names, normalize=normalize, category=category) - def is_field(self, proof=True): - r""" - Return ``True`` if this ring is a field. - - EXAMPLES:: - - sage: GF(7).is_field() - True - - The following examples have their own ``is_field`` implementations:: - - sage: ZZ.is_field(); QQ.is_field() - False - True - sage: R. = PolynomialRing(QQ); R.is_field() - False - """ - if self.is_finite(): - return True - if proof: - raise NotImplementedError("unable to determine whether or not is a field.") - else: - return False cdef class NoetherianRing(CommutativeRing): _default_category = NoetherianRings() diff --git a/src/sage/rings/ring_extension_morphism.pyx b/src/sage/rings/ring_extension_morphism.pyx index d4aad7f8253..7294e90c319 100644 --- a/src/sage/rings/ring_extension_morphism.pyx +++ b/src/sage/rings/ring_extension_morphism.pyx @@ -461,7 +461,7 @@ cdef class RingExtensionHomomorphism(RingMap): if self.base_map() is not None: s += "with map on base ring" ss = self.base_map()._repr_defn() - ss = re.sub('\nwith map on base ring:?$', '', ss, 0, re.MULTILINE) + ss = re.sub('\nwith map on base ring:?$', '', ss, flags=re.MULTILINE) if ss != "": s += ":\n" + ss if s != "" and s[-1] == "\n": s = s[:-1] diff --git a/src/sage/rings/semirings/meson.build b/src/sage/rings/semirings/meson.build index e1e4e627ba3..6cbfce4f84c 100644 --- a/src/sage/rings/semirings/meson.build +++ b/src/sage/rings/semirings/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'non_negative_integer_semiring.py', 'tropical_mpolynomial.py', diff --git a/src/sage/rings/semirings/tropical_polynomial.py b/src/sage/rings/semirings/tropical_polynomial.py index 4e4e239edd2..42caa0601f9 100644 --- a/src/sage/rings/semirings/tropical_polynomial.py +++ b/src/sage/rings/semirings/tropical_polynomial.py @@ -806,7 +806,7 @@ def random_element(self, degree=(-1, 2), monic=False, *args, **kwds): .. SEEALSO:: - :meth:`sage.rings.polynomial.polynomial_ring.PolynomialRing_general.random_element` + :meth:`sage.rings.polynomial.polynomial_ring.PolynomialRing_generic.random_element` EXAMPLES: diff --git a/src/sage/rings/semirings/tropical_variety.py b/src/sage/rings/semirings/tropical_variety.py index dbc1b85cd52..63d92e6509f 100644 --- a/src/sage/rings/semirings/tropical_variety.py +++ b/src/sage/rings/semirings/tropical_variety.py @@ -32,6 +32,7 @@ from sage.rings.rational_field import QQ from sage.rings.infinity import infinity + class TropicalVariety(UniqueRepresentation, SageObject): r""" A tropical variety in `\RR^n`. diff --git a/src/sage/rings/valuation/augmented_valuation.py b/src/sage/rings/valuation/augmented_valuation.py index b9f0229f787..5b4666d45cb 100644 --- a/src/sage/rings/valuation/augmented_valuation.py +++ b/src/sage/rings/valuation/augmented_valuation.py @@ -538,8 +538,8 @@ def extensions(self, ring): if ring is self.domain(): return [self] - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ring, PolynomialRing_general): # univariate + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ring, PolynomialRing_generic): # univariate base_valuations = self._base_valuation.extensions(ring) phi = self.phi().change_ring(ring.base_ring()) @@ -578,8 +578,8 @@ def restriction(self, ring): base = self._base_valuation.restriction(ring) if ring.is_subring(self.domain().base_ring()): return base - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ring, PolynomialRing_general): # univariate + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ring, PolynomialRing_generic): # univariate return base.augmentation(self.phi().change_ring(ring.base_ring()), self._mu) return super().restriction(ring) @@ -790,8 +790,8 @@ def change_domain(self, ring): sage: v.change_domain(QQ['x']) [ Gauss valuation induced by 2-adic valuation, v(x) = 1 ] """ - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ring, PolynomialRing_general) and ring.variable_name() == self.domain().variable_name(): + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ring, PolynomialRing_generic) and ring.variable_name() == self.domain().variable_name(): return self._base_valuation.change_domain(ring).augmentation(self.phi().change_ring(ring.base_ring()), self._mu, check=False) return super().change_domain(ring) diff --git a/src/sage/rings/valuation/developing_valuation.py b/src/sage/rings/valuation/developing_valuation.py index 8b77224f591..a73130c9cea 100644 --- a/src/sage/rings/valuation/developing_valuation.py +++ b/src/sage/rings/valuation/developing_valuation.py @@ -81,8 +81,8 @@ def __init__(self, parent, phi): DiscretePseudoValuation.__init__(self, parent) domain = parent.domain() - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if not isinstance(domain, PolynomialRing_general) or not domain.ngens() == 1: + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if not isinstance(domain, PolynomialRing_generic) or not domain.ngens() == 1: raise TypeError("domain must be a univariate polynomial ring but %r is not" % (domain,)) phi = domain.coerce(phi) diff --git a/src/sage/rings/valuation/gauss_valuation.py b/src/sage/rings/valuation/gauss_valuation.py index 0e867e0a2f5..4fc1c555a79 100644 --- a/src/sage/rings/valuation/gauss_valuation.py +++ b/src/sage/rings/valuation/gauss_valuation.py @@ -88,8 +88,8 @@ def create_key(self, domain, v=None): ... ValueError: the domain of v must be the base ring of domain but 2-adic valuation is not defined over Integer Ring but over Rational Field """ - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if not isinstance(domain, PolynomialRing_general): + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if not isinstance(domain, PolynomialRing_generic): raise TypeError("GaussValuations can only be created over polynomial rings but %r is not a polynomial ring" % (domain,)) if not domain.ngens() == 1: raise NotImplementedError("domain must be univariate but %r is not univariate" % (domain,)) @@ -509,8 +509,8 @@ def change_domain(self, ring): sage: w.change_domain(QQ['x']) Gauss valuation induced by 2-adic valuation """ - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ring, PolynomialRing_general) and ring.ngens() == 1: + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ring, PolynomialRing_generic) and ring.ngens() == 1: base_valuation = self._base_valuation.change_domain(ring.base_ring()) return GaussValuation(self.domain().change_ring(ring.base_ring()), base_valuation) return super().change_domain(ring) @@ -527,8 +527,8 @@ def extensions(self, ring): sage: w.extensions(GaussianIntegers()['x']) # needs sage.rings.number_field [Gauss valuation induced by 2-adic valuation] """ - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ring, PolynomialRing_general) and ring.ngens() == 1: + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ring, PolynomialRing_generic) and ring.ngens() == 1: if self.domain().is_subring(ring): return [GaussValuation(ring, w) for w in self._base_valuation.extensions(ring.base_ring())] return super().extensions(ring) @@ -547,8 +547,8 @@ def restriction(self, ring): """ if ring.is_subring(self.domain().base_ring()): return self._base_valuation.restriction(ring) - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ring, PolynomialRing_general) and ring.ngens() == 1: + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ring, PolynomialRing_generic) and ring.ngens() == 1: if ring.base().is_subring(self.domain().base()): return GaussValuation(ring, self._base_valuation.restriction(ring.base())) return super().restriction(ring) diff --git a/src/sage/rings/valuation/limit_valuation.py b/src/sage/rings/valuation/limit_valuation.py index 86a64d23f99..19e5c71e95c 100644 --- a/src/sage/rings/valuation/limit_valuation.py +++ b/src/sage/rings/valuation/limit_valuation.py @@ -409,8 +409,8 @@ def extensions(self, ring): """ if self.domain() is ring: return [self] - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ring, PolynomialRing_general) and self.domain().base_ring().is_subring(ring.base_ring()): + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ring, PolynomialRing_generic) and self.domain().base_ring().is_subring(ring.base_ring()): if self.domain().base_ring().fraction_field() is ring.base_ring(): return [LimitValuation(self._initial_approximation.change_domain(ring), self._G.change_ring(ring.base_ring()))] @@ -661,8 +661,8 @@ def residue_ring(self): # the approximation ends in v(phi)=infty return R else: - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - assert (isinstance(R, PolynomialRing_general)) + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + assert (isinstance(R, PolynomialRing_generic)) return R.base_ring() def _ge_(self, other): diff --git a/src/sage/rings/valuation/valuation_space.py b/src/sage/rings/valuation/valuation_space.py index d5f5dc8e5ec..7736f787600 100644 --- a/src/sage/rings/valuation/valuation_space.py +++ b/src/sage/rings/valuation/valuation_space.py @@ -515,8 +515,8 @@ def residue_field(self): from sage.categories.fields import Fields if ret in Fields(): return ret - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general - if isinstance(ret, PolynomialRing_general): + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic + if isinstance(ret, PolynomialRing_generic): from sage.rings.function_field.constructor import FunctionField return FunctionField(ret.base_ring().fraction_field(), names=(ret.variable_name(),)) return ret.fraction_field() diff --git a/src/sage/sat/meson.build b/src/sage/sat/meson.build index a1a0246dfce..85d9be286e2 100644 --- a/src/sage/sat/meson.build +++ b/src/sage/sat/meson.build @@ -1,4 +1,9 @@ -py.install_sources('all.py', 'boolean_polynomials.py', subdir: 'sage/sat') +py.install_sources( + '__init__.py', + 'all.py', + 'boolean_polynomials.py', + subdir: 'sage/sat', +) install_subdir('converters', install_dir: sage_install_dir / 'sat') subdir('solvers') diff --git a/src/sage/schemes/affine/affine_homset.py b/src/sage/schemes/affine/affine_homset.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/affine/affine_morphism.py b/src/sage/schemes/affine/affine_morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/affine/affine_point.py b/src/sage/schemes/affine/affine_point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/affine/affine_rational_point.py b/src/sage/schemes/affine/affine_rational_point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/affine/affine_space.py b/src/sage/schemes/affine/affine_space.py old mode 100755 new mode 100644 index 42aeae0e2f9..702381f6ea4 --- a/src/sage/schemes/affine/affine_space.py +++ b/src/sage/schemes/affine/affine_space.py @@ -15,7 +15,7 @@ from sage.rings.integer_ring import ZZ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.rings.rational_field import RationalField -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base from sage.rings.finite_rings.finite_field_base import FiniteField from sage.categories.map import Map @@ -109,7 +109,7 @@ def AffineSpace(n, R=None, names=None, ambient_projective_space=None, ... NameError: variable names passed to AffineSpace conflict with names in ring """ - if isinstance(n, (MPolynomialRing_base, PolynomialRing_general)) and R is None: + if isinstance(n, (MPolynomialRing_base, PolynomialRing_generic)) and R is None: R = n if names is not None: # Check for the case that the user provided a variable name diff --git a/src/sage/schemes/affine/affine_subscheme.py b/src/sage/schemes/affine/affine_subscheme.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/berkovich/berkovich_cp_element.py b/src/sage/schemes/berkovich/berkovich_cp_element.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/berkovich/berkovich_space.py b/src/sage/schemes/berkovich/berkovich_space.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/affine_curve.py b/src/sage/schemes/curves/affine_curve.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/closed_point.py b/src/sage/schemes/curves/closed_point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/constructor.py b/src/sage/schemes/curves/constructor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/curve.py b/src/sage/schemes/curves/curve.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/plane_curve_arrangement.py b/src/sage/schemes/curves/plane_curve_arrangement.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/point.py b/src/sage/schemes/curves/point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/projective_curve.py b/src/sage/schemes/curves/projective_curve.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/curves/zariski_vankampen.py b/src/sage/schemes/curves/zariski_vankampen.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/cyclic_covers/charpoly_frobenius.py b/src/sage/schemes/cyclic_covers/charpoly_frobenius.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/cyclic_covers/constructor.py b/src/sage/schemes/cyclic_covers/constructor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/cyclic_covers/cycliccover_finite_field.py b/src/sage/schemes/cyclic_covers/cycliccover_finite_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/cyclic_covers/cycliccover_generic.py b/src/sage/schemes/cyclic_covers/cycliccover_generic.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/BSD.py b/src/sage/schemes/elliptic_curves/BSD.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/Qcurves.py b/src/sage/schemes/elliptic_curves/Qcurves.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py new file mode 100644 index 00000000000..3846f9f0c7d --- /dev/null +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -0,0 +1,89 @@ + +def _add(E, P, Q): + r""" + Addition formulas for elliptic curves over general rings + with trivial Picard group. + + This function returns a generator which yields tuples of projective + coordinates. Some linear combination of those coordinate tuples is + guaranteed to form a valid projective point. + + .. NOTE:: + + This function is for internal use. To add two elliptic-curve + points, users should simply use the `+` operator. + + REFERENCES: + + These formulas were derived by Bosma and Lenstra [BL1995]_, + with corrections by Best [Best2021]_ (Appendix A). + + EXAMPLES:: + + sage: from sage.schemes.elliptic_curves.addition_formulas_ring import _add + sage: M = Zmod(13*17*19) + sage: R. = M[] + sage: S. = R.quotient(U*V - 17) + sage: E = EllipticCurve(S, [1,2,3,4,5]) + sage: P = E(817, 13, 19) + sage: Q = E(425, 123, 17) + sage: PQ1, PQ2 = _add(E, P, Q) + sage: PQ1 + (1188, 1674, 540) + sage: PQ2 + (582, 2347, 1028) + sage: E(PQ1) == E(PQ2) + True + + TESTS: + + We ensure that these formulas return the same result as the ones over a field:: + + sage: from sage.schemes.elliptic_curves.addition_formulas_ring import _add + sage: F = GF(2^127-1) + sage: E = EllipticCurve(j=F.random_element()) + sage: E = choice(E.twists()) + sage: P = E.random_point() + sage: Q = E.random_point() + sage: PQ1, PQ2 = _add(E, P, Q) + sage: assert E(*PQ1) == P + Q + sage: assert E(*PQ2) == P + Q + """ + a1, a2, a3, a4, a6 = E.a_invariants() + b2, b4, b6, b8 = E.b_invariants() + + if P not in E: + raise ValueError('P must be in E') + if Q not in E: + raise ValueError('Q must be in E') + X1, Y1, Z1 = P + X2, Y2, Z2 = Q + + # TODO: I've made a half-hearted attempt at simplifying the formulas + # by caching common subexpressions. This could almost certainly be + # sped up significantly with some more serious optimization effort. + + XYdif = X1*Y2 - X2*Y1 + XYsum = X1*Y2 + X2*Y1 + XZdif = X1*Z2 - X2*Z1 + XZsum = X1*Z2 + X2*Z1 + YZdif = Y1*Z2 - Y2*Z1 + YZsum = Y1*Z2 + Y2*Z1 + + a1sq, a2sq, a3sq, a4sq = (a**2 for a in (a1, a2, a3, a4)) + + X31 = XYdif*YZsum+XZdif*Y1*Y2+a1*X1*X2*YZdif+a1*XYdif*XZsum-a2*X1*X2*XZdif+a3*XYdif*Z1*Z2+a3*XZdif*YZsum-a4*XZsum*XZdif-3*a6*XZdif*Z1*Z2 + + Y31 = -3*X1*X2*XYdif-Y1*Y2*YZdif-2*a1*XZdif*Y1*Y2+(a1sq+3*a2)*X1*X2*YZdif-(a1sq+a2)*XYsum*XZdif+(a1*a2-3*a3)*X1*X2*XZdif-(2*a1*a3+a4)*XYdif*Z1*Z2+a4*XZsum*YZdif+(a1*a4-a2*a3)*XZsum*XZdif+(a3sq+3*a6)*YZdif*Z1*Z2+(3*a1*a6-a3*a4)*XZdif*Z1*Z2 + + Z31 = 3*X1*X2*XZdif-YZsum*YZdif+a1*XYdif*Z1*Z2-a1*XZdif*YZsum+a2*XZsum*XZdif-a3*YZdif*Z1*Z2+a4*XZdif*Z1*Z2 + + yield (X31, Y31, Z31) + + X32 = Y1*Y2*XYsum+a1*(2*X1*Y2+X2*Y1)*X2*Y1+a1sq*X1*X2**2*Y1-a2*X1*X2*XYsum-a1*a2*X1**2*X2**2+a3*X2*Y1*(YZsum+Y2*Z1)+a1*a3*X1*X2*YZdif-a1*a3*XYsum*XZdif-a4*X1*X2*YZsum-a4*XYsum*XZsum-a1sq*a3*X1**2*X2*Z2-a1*a4*X1*X2*(X1*Z2+XZsum)-a2*a3*X1*X2**2*Z1-a3sq*X1*Z2*(Y2*Z1+YZsum)-3*a6*XYsum*Z1*Z2-3*a6*XZsum*YZsum-a1*a3sq*X1*Z2*(XZsum+X2*Z1)-3*a1*a6*X1*Z2*(XZsum+X2*Z1)-a3*a4*(X1*Z2+XZsum)*X2*Z1-b8*YZsum*Z1*Z2-a1*b8*X1*Z1*Z2**2-a3**3*XZsum*Z1*Z2-3*a3*a6*(XZsum+X2*Z1)*Z1*Z2-a3*b8*Z1**2*Z2**2 + + Y32 = Y1**2*Y2**2+a1*X2*Y1**2*Y2+(a1*a2-3*a3)*X1*X2**2*Y1+a3*Y1**2*Y2*Z2-(a2sq-3*a4)*X1**2*X2**2+(a1*a4-a2*a3)*(2*X1*Z2+X2*Z1)*X2*Y1+(a1sq*a4-2*a1*a2*a3+3*a3sq)*X1**2*X2*Z2-(a2*a4-9*a6)*X1*X2*XZsum+(3*a1*a6-a3*a4)*(XZsum+X2*Z1)*Y1*Z2+(3*a1sq*a6-2*a1*a3*a4+a2*a3sq+3*a2*a6-a4sq)*X1*Z2*(XZsum+X2*Z1)+(3*a2*a6-a4sq)*X2*Z1*(2*X1*Z2+Z1*X2)+(a1**3*a6-a1sq*a3*a4+a1*a2*a3sq-a1*a4sq+4*a1*a2*a6-a3**3-3*a3*a6)*Y1*Z1*Z2**2+(a1**4*a6-a1**3*a3*a4+5*a1sq*a2*a6+a1sq*a2*a3sq-a1*a2*a3*a4-a1*a3**3-3*a1*a3*a6-a1sq*a4sq+a2sq*a3sq-a2*a4sq+4*a2sq*a6-a3**2*a4-3*a4*a6)*X1*Z1*Z2**2+(a1sq*a2*a6-a1*a2*a3*a4+3*a1*a3*a6+a2sq*a3sq-a2*a4sq+4*a2sq*a6-2*a3sq*a4-3*a4*a6)*X2*Z1**2*Z2+(a1**3*a3*a6-a1sq*a3sq*a4+a1sq*a4*a6+a1*a2*a3**3+4*a1*a2*a3*a6-2*a1*a3*a4sq+a2*a3sq*a4+4*a2*a4*a6-a3**4-6*a3**2*a6-a4**3-9*a6**2)*Z1**2*Z2**2 + + Z32 = 3*X1*X2*XYsum+Y1*Y2*YZsum+3*a1*X1**2*X2**2+a1*(2*X1*Y2+Y1*X2)*Y1*Z2+a1sq*X1*Z2*(2*X2*Y1+X1*Y2)+a2*X1*X2*YZsum+a2*XYsum*XZsum+a1**3*X1**2*X2*Z2+a1*a2*X1*X2*(2*X1*Z2+X2*Z1)+3*a3*X1*X2**2*Z1+a3*Y1*Z2*(YZsum+Y2*Z1)+2*a1*a3*X1*Z2*YZsum+2*a1*a3*X2*Y1*Z1*Z2+a4*XYsum*Z1*Z2+a4*XZsum*YZsum+(a1sq*a3+a1*a4)*X1*Z2*(XZsum+X2*Z1)+a2*a3*X2*Z1*(2*X1*Z2+X2*Z1)+a3sq*Y1*Z1*Z2**2+(a3sq+3*a6)*YZsum*Z1*Z2+a1*a3sq*(2*X1*Z2+X2*Z1)*Z1*Z2+3*a1*a6*X1*Z1*Z2**2+a3*a4*(XZsum+X2*Z1)*Z1*Z2+(a3**3+3*a3*a6)*Z1**2*Z2**2 + + yield (X32, Y32, Z32) diff --git a/src/sage/schemes/elliptic_curves/cm.py b/src/sage/schemes/elliptic_curves/cm.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/constructor.py b/src/sage/schemes/elliptic_curves/constructor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/descent_two_isogeny.pyx b/src/sage/schemes/elliptic_curves/descent_two_isogeny.pyx old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ec_database.py b/src/sage/schemes/elliptic_curves/ec_database.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_curve_isogeny.py b/src/sage/schemes/elliptic_curves/ell_curve_isogeny.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_egros.py b/src/sage/schemes/elliptic_curves/ell_egros.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py old mode 100755 new mode 100644 index 9bed4936f7b..3ff2826f3e7 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1529,6 +1529,55 @@ def isogeny_codomain(self, kernel): E._fetch_cached_order(self) return E + def period_lattice(self): + r""" + Return the period lattice of the elliptic curve for the given + embedding of its base field with respect to the differential + `dx/(2y + a_1x + a_3)`. + + Only supported for some base rings. + + EXAMPLES:: + + sage: EllipticCurve(RR, [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 6.00000000000000 over Real Field with 53 bits of precision + + TESTS:: + + sage: EllipticCurve(QQ, [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + x + 6 over Rational Field + sage: EllipticCurve(RR, [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 6.00000000000000 over Real Field with 53 bits of precision + sage: EllipticCurve(RealField(100), [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.0000000000000000000000000000*x + 6.0000000000000000000000000000 over Real Field with 100 bits of precision + sage: EllipticCurve(CC, [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 6.00000000000000 over Complex Field with 53 bits of precision + sage: EllipticCurve(ComplexField(100), [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.0000000000000000000000000000*x + 6.0000000000000000000000000000 over Complex Field with 100 bits of precision + sage: EllipticCurve(AA, [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + x + 6 over Algebraic Real Field + sage: EllipticCurve(QQbar, [1, 6]).period_lattice() + Period lattice associated to Elliptic Curve defined by y^2 = x^3 + x + 6 over Algebraic Field + + Unsupported cases (the exact error being raised may change in the future):: + + sage: EllipticCurve(ZZ, [1, 6]).period_lattice() + Traceback (most recent call last): + ... + AttributeError: 'EllipticCurve_generic_with_category' object has no attribute 'period_lattice' + sage: QQt. = QQ[] + sage: EllipticCurve(QQt.fraction_field(), [1, 6]).period_lattice() + Traceback (most recent call last): + ... + AttributeError: 'FractionField_1poly_field_with_category' object has no attribute ... + sage: EllipticCurve(GF(7), [1, 6]).period_lattice() + Traceback (most recent call last): + ... + IndexError: list index out of range + """ + from sage.schemes.elliptic_curves.period_lattice import PeriodLattice_ell + return PeriodLattice_ell(self) + def kernel_polynomial_from_point(self, P, *, algorithm=None): r""" Given a point `P` on this curve which generates a rational subgroup, diff --git a/src/sage/schemes/elliptic_curves/ell_finite_field.py b/src/sage/schemes/elliptic_curves/ell_finite_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py old mode 100755 new mode 100644 index 6f2532e2b3b..44f552ae4af --- a/src/sage/schemes/elliptic_curves/ell_generic.py +++ b/src/sage/schemes/elliptic_curves/ell_generic.py @@ -55,8 +55,6 @@ import math from sage.arith.misc import valuation -import sage.rings.abc -from sage.rings.finite_rings.integer_mod import mod from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.rings.polynomial.polynomial_ring import polygen, polygens from sage.rings.polynomial.polynomial_element import polynomial_is_variable @@ -175,15 +173,49 @@ def __init__(self, K, ainvs, category=None): self.__divpolys = ({}, {}, {}) - # See #1975: we deliberately set the class to - # EllipticCurvePoint_finite_field for finite rings, so that we - # can do some arithmetic on points over Z/NZ, for teaching - # purposes. - if isinstance(K, sage.rings.abc.IntegerModRing): - self._point = ell_point.EllipticCurvePoint_finite_field - _point = ell_point.EllipticCurvePoint + def assume_base_ring_is_field(self, flag=True): + r""" + Set a flag to pretend that this elliptic curve is defined over a + field while doing arithmetic, which is useful in some algorithms. + + + .. WARNING:: + + The flag affects all points created while the flag is set. Note + that elliptic curves are unique parents, hence setting this flag + may break seemingly unrelated parts of Sage. + + .. NOTE:: + + This method is a **hack** provided for educational purposes. + + EXAMPLES:: + + sage: E = EllipticCurve(Zmod(35), [1,1]) + sage: P = E(-5, 9) + sage: 4*P + (23 : 26 : 1) + sage: 9*P + (10 : 11 : 5) + sage: E.assume_base_ring_is_field() + sage: P = E(-5, 9) + sage: 4*P + (23 : 26 : 1) + sage: 9*P + Traceback (most recent call last): + ... + ZeroDivisionError: Inverse of 5 does not exist (characteristic = 35 = 5*7) + """ + if flag: + if self.__base_ring.is_finite(): + self._point = ell_point.EllipticCurvePoint_finite_field + else: + self._point = ell_point.EllipticCurvePoint_field + else: + self._point = ell_point.EllipticCurvePoint + def _defining_params_(self): r""" Internal function. Return a tuple of the base ring of this @@ -582,7 +614,7 @@ def __call__(self, *args, **kwds): # infinity. characteristic = self.base_ring().characteristic() if characteristic != 0 and isinstance(args[0][0], Rational) and isinstance(args[0][1], Rational): - if mod(args[0][0].denominator(),characteristic) == 0 or mod(args[0][1].denominator(),characteristic) == 0: + if characteristic.divides(args[0][0].denominator()) or characteristic.divides(args[0][1].denominator()): return self._reduce_point(args[0], characteristic) args = tuple(args[0]) diff --git a/src/sage/schemes/elliptic_curves/ell_local_data.py b/src/sage/schemes/elliptic_curves/ell_local_data.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_modular_symbols.py b/src/sage/schemes/elliptic_curves/ell_modular_symbols.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_number_field.py b/src/sage/schemes/elliptic_curves/ell_number_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_padic_field.py b/src/sage/schemes/elliptic_curves/ell_padic_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py old mode 100755 new mode 100644 index 6aa63fc6370..d05196240a1 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -1,14 +1,16 @@ r""" Points on elliptic curves -The base class :class:`EllipticCurvePoint` currently provides little -functionality of its own. Its derived class -:class:`EllipticCurvePoint_field` provides support for points on -elliptic curves over general fields. The derived classes -:class:`EllipticCurvePoint_number_field` and -:class:`EllipticCurvePoint_finite_field` provide further support for -points on curves over number fields (including the rational field -`\QQ`) and over finite fields. +The base class :class:`EllipticCurvePoint` provides support for +points on elliptic curves defined over general rings, including +generic addition formulas. + +The derived classes :class:`EllipticCurvePoint_field` and its +child classes :class:`EllipticCurvePoint_number_field` and +:class:`EllipticCurvePoint_finite_field` provide further support +for points on curves defined over arbitrary fields, as well as +specialized functionality for points on curves over number fields +(including the rational field `\QQ`) and finite fields. EXAMPLES: @@ -73,15 +75,24 @@ sage: P*(n+1)-P*n == P True -Arithmetic over `\ZZ/N\ZZ` with composite `N` is supported. When an -operation tries to invert a non-invertible element, a -:exc:`ZeroDivisionError` is raised and a factorization of the modulus appears -in the error message:: +Arithmetic over `\Zmod{N}` with composite `N` is supported:: sage: N = 1715761513 sage: E = EllipticCurve(Integers(N), [3,-13]) sage: P = E(2,1) sage: LCM([2..60])*P + (1643112467 : 9446995 : 26927) + +However, some algorithms (e.g., toy examples of ECM) involve performing +elliptic-curve operations as if the base ring were a field even when it +is not, and exploit the failures when attempting to invert a non-unit. +Sage provides a *hack* to support such educational examples via the +:meth:`EllipticCurve_generic.assume_base_ring_is_field` method. +Example:: + + sage: E.assume_base_ring_is_field() + sage: P = E(2,1) + sage: LCM([2..60])*P Traceback (most recent call last): ... ZeroDivisionError: Inverse of 26927 does not exist @@ -104,6 +115,8 @@ - Mariah Lenox (March 2011) -- Added ``tate_pairing`` and ``ate_pairing`` functions to ``EllipticCurvePoint_finite_field`` class + +- Lorenz Panny (2022): point addition over general rings """ # **************************************************************************** @@ -127,15 +140,21 @@ from sage.rings.integer_ring import ZZ from sage.rings.padics.precision_error import PrecisionError from sage.rings.rational_field import QQ +from sage.rings.finite_rings.integer_mod import Mod from sage.rings.real_mpfr import RealField, RR +from sage.rings.quotient_ring import QuotientRing_generic +import sage.groups.generic as generic + +from sage.structure.element import AdditiveGroupElement +from sage.structure.sequence import Sequence +from sage.structure.richcmp import richcmp + +from sage.structure.coerce_actions import IntegerMulAction + from sage.schemes.curves.projective_curve import Hasse_bounds from sage.schemes.elliptic_curves.constructor import EllipticCurve from sage.schemes.projective.projective_point import (SchemeMorphism_point_projective_ring, SchemeMorphism_point_abelian_variety_field) -from sage.structure.coerce_actions import IntegerMulAction -from sage.structure.element import AdditiveGroupElement -from sage.structure.richcmp import richcmp -from sage.structure.sequence import Sequence lazy_import('sage.rings.padics.factory', 'Qp') lazy_import('sage.schemes.generic.morphism', 'SchemeMorphism') @@ -151,6 +170,28 @@ class EllipticCurvePoint(AdditiveGroupElement, """ A point on an elliptic curve. """ + def __init__(self, *args, **kwds): + r""" + Initialize this elliptic-curve point. + + EXAMPLES:: + + sage: E = EllipticCurve(Zmod(77), [1,1,1,1,1]) + sage: E(0) + (0 : 1 : 0) + sage: E(3, 9) + (3 : 9 : 1) + sage: E(6, 18, 2) + (3 : 9 : 1) + sage: E(66, 23, 22) + (33 : 50 : 11) + """ + super().__init__(*args, **kwds) + try: + self.normalize_coordinates() + except NotImplementedError: + pass + def curve(self): """ Return the curve that this point is on. @@ -179,6 +220,259 @@ def curve(self): """ return self.scheme() + def _add_(self, other): + r""" + Add this point to another point on the same elliptic curve. + + This method computes point additions for fairly general rings. + + ALGORITHM: + + Over quotient rings of Euclidean domains modulo principal ideals: + The standard formulas for fields, extended to non-fields via the + Chinese remainder theorem. + + In more general rings: Formulas due to Bosma and Lenstra [BL1995]_ + with corrections by Best [Best2021]_ (Appendix A). + See :mod:`sage.schemes.elliptic_curves.addition_formulas_ring`. + + EXAMPLES:: + + sage: N = 1113121 + sage: E = EllipticCurve(Zmod(N), [1,0]) + sage: R1 = E(301098, 673883, 644675) + sage: R2 = E(411415, 758555, 255837) + sage: R3 = E(983009, 342673, 207687) + sage: R1 + R2 == R3 + True + + TESTS: + + We check on random examples that the results are compatible modulo + all divisors of the characteristic. (In particular, this includes + prime divisors, for which the result is computed using the "old", + much simpler formulas for fields.) :: + + sage: N = ZZ(randrange(2, 10**5)) + sage: E = None + sage: while True: + ....: try: + ....: E = EllipticCurve(list((Zmod(N)^5).random_element())) + ....: except ArithmeticError: + ....: pass + ....: else: + ....: if E.discriminant().is_unit(): + ....: break + sage: pts = [] + sage: X = polygen(Zmod(N^2)) + sage: while len(pts) < 2: + ....: y, z = (Zmod(N)^2).random_element() + ....: f = E.defining_polynomial()(X, y, z) + ....: xs = f.roots(multiplicities=False) + ....: xs = [x for x in xs if 1 in Zmod(N).ideal([x,y,z])] + ....: if xs: + ....: pts.append(E(choice(xs), y, z)) + sage: P, Q = pts + sage: R = P + Q + sage: for d in N.divisors(): + ....: if d > 1: + ....: assert R.change_ring(Zmod(d)) == P.change_ring(Zmod(d)) + Q.change_ring(Zmod(d)) + """ + if self.is_zero(): + return other + if other.is_zero(): + return self + + E = self.curve() + R = E.base_ring() + + # We handle Euclidean domains modulo principal ideals separately. + # Important special cases of this include quotient rings of the + # integers as well as of univariate polynomial rings over fields. + if isinstance(R, QuotientRing_generic): + from sage.categories.euclidean_domains import EuclideanDomains + if R.cover_ring() in EuclideanDomains(): + I = R.defining_ideal() + if I.ngens() == 1: + mod, = I.gens() + + a1, a2, a3, a4, a6 = E.ainvs() + x1, y1, z1 = map(R, self) + x2, y2, z2 = map(R, other) + + mod_1st = mod.gcd(z2.lift()) + mod //= mod_1st + mod_2nd = mod.gcd(z1.lift()) + mod //= mod_2nd + + xz, zx = x1*z2, x2*z1 + yz, zy = y1*z2, y2*z1 + zz = z1*z2 + + # addition + num_add = yz - zy + den_add = xz - zx + mod_dbl = mod.gcd(num_add.lift()).gcd(den_add.lift()) + mod_add = mod // mod_dbl + + # doubling + if not mod_dbl.is_one(): + num_dbl = (3*x1 + 2*a2*z1) * x1 + (a4*z1 - a1*y1) * z1 + den_dbl = (2*y1 + a1*x1 + a3*z1) * z1 + else: + num_dbl = den_dbl = 0 + + if mod_dbl.gcd(mod_add).is_one(): + from sage.arith.misc import CRT_vectors + if mod_dbl.is_one(): + num, den = num_add, den_add + elif mod_add.is_one(): + num, den = num_dbl, den_dbl + else: + num, den = CRT_vectors([(num_add, den_add), (num_dbl, den_dbl)], [mod_add, mod_dbl]) + + den2 = den**2 + x3 = ((num + a1*den)*zz*num - (xz + zx + a2*zz)*den2) * den + y3 = ((2*xz + zx + (a2 - a1**2)*zz)*num + (a1*(xz + zx + a2*zz) - a3*zz - yz)*den) * den2 - (num + 2*a1*den)*zz*num**2 + z3 = zz * den * den2 + + pt = x3.lift(), y3.lift(), z3.lift() + if not mod_1st.is_one(): + pt = CRT_vectors([pt, [x1.lift(), y1.lift(), z1.lift()]], [mod, mod_1st]) + mod = mod.lcm(mod_1st) + if not mod_2nd.is_one(): + pt = CRT_vectors([pt, [x2.lift(), y2.lift(), z2.lift()]], [mod, mod_2nd]) + + return E.point(Sequence(pt, E.base_ring()), check=False) + + from sage.schemes.elliptic_curves.addition_formulas_ring import _add + from sage.modules.free_module_element import vector + + pts = [] + for pt in filter(any, _add(E, self, other)): + if R.one() in R.ideal(pt): + return E.point(pt) + pts.append(pt) + assert len(pts) == 2, 'bug in elliptic-curve point addition' + + #TODO: If the base ring has trivial Picard group, it is known + # that some linear combination of the two vectors is a valid + # projective point (whose coordinates generate the unit ideal). + # Below, we simply try random linear combinations until we + # find a good choice. Is there a general method that doesn't + # involve guessing? + + pts = [vector(R, pt) for pt in pts] + for _ in range(1000): + result = tuple(sum(R.random_element() * pt for pt in pts)) + if R.one() in R.ideal(result): + return E.point(result, check=False) + + assert False, 'bug: failed to compute elliptic-curve point addition' + + def _neg_(self): + """ + Return the negative of this elliptic-curve point, over a general ring. + + EXAMPLES:: + + sage: E = EllipticCurve('389a') + sage: P = E([-1,1]) + sage: Q = -P; Q + (-1 : -2 : 1) + sage: Q + P + (0 : 1 : 0) + + :: + + sage: N = 1113121 + sage: E = EllipticCurve(Zmod(N), [1,0]) + sage: R = E(301098, 673883, 644675) + sage: -R + (136211 : 914033 : 107) + sage: ((-R) + R) == 0 + True + """ + if self.is_zero(): + return self + E = self.curve() + a1, _, a3, _, _ = E.a_invariants() + x, y, z = self + return E.point([x, -y - a1*x - a3*z, z], check=False) + + def _sub_(self, other): + """ + Subtract ``other`` from ``self``. + + ALGORITHM: :meth:`_add_` and :meth:`_neg_`. + + EXAMPLES:: + + sage: E = EllipticCurve('389a') + sage: P = E([-1,1]); Q = E([0,0]) + sage: P - Q + (4 : 8 : 1) + sage: P - Q == P._sub_(Q) + True + sage: (P - Q) + Q + (-1 : 1 : 1) + sage: P + (-1 : 1 : 1) + + :: + + sage: N = 1113121 + sage: E = EllipticCurve(Zmod(N), [1,0]) + sage: R1 = E(301098, 673883, 644675) + sage: R2 = E(411415, 758555, 255837) + sage: R3 = E(983009, 342673, 207687) + sage: R1 == R3 - R2 + True + """ + return self + (-other) + + def _acted_upon_(self, other, side): + r""" + We implement ``_acted_upon_`` to provide scalar multiplications. + + EXAMPLES:: + + sage: # needs sage.rings.finite_rings + sage: N = 1113121 + sage: E = EllipticCurve(Zmod(N), [1,0]) + sage: R = E(301098, 673883, 644675) + sage: 123*R + (703739 : 464106 : 107) + sage: 70200*R + (0 : 1 : 0) + """ + return IntegerMulAction(ZZ, self.parent())._act_(other, self) + + def __bool__(self): + r""" + Test whether this elliptic-curve point equals the neutral + element of the group (i.e., the point at infinity). + + EXAMPLES:: + + sage: E = EllipticCurve(GF(7), [1,1]) + sage: bool(E(0)) + False + sage: bool(E.lift_x(2)) + True + + sage: + + sage: E = EllipticCurve(Zmod(77), [1,1,1,1,1]) + sage: bool(E(0)) + False + sage: P = E(66, 23, 22); P + (33 : 50 : 11) + sage: bool(P) + True + """ + return bool(self[2]) + class EllipticCurvePoint_field(EllipticCurvePoint, SchemeMorphism_point_abelian_variety_field): @@ -680,9 +974,11 @@ def plot(self, **args): else: return point((self[0], self[1]), **args) - def _add_(self, right): - """ - Add ``self`` to ``right``. + def _add_(self, other): + r""" + Add this point to another point on the same elliptic curve. + + This method is specialized to elliptic curves over fields. EXAMPLES:: @@ -693,6 +989,8 @@ def _add_(self, right): sage: P._add_(Q) == P + Q True + TESTS: + Example to show that bug :issue:`4820` is fixed:: sage: [type(c) for c in 2*EllipticCurve('37a1').gen(0)] @@ -704,6 +1002,7 @@ def _add_(self, right): sage: N = 1715761513 sage: E = EllipticCurve(Integers(N), [3,-13]) + sage: E.assume_base_ring_is_field() sage: P = E(2,1) sage: LCM([2..60])*P Traceback (most recent call last): @@ -713,6 +1012,7 @@ def _add_(self, right): sage: N = 35 sage: E = EllipticCurve(Integers(N), [5,1]) + sage: E.assume_base_ring_is_field() sage: P = E(0,1) sage: 4*P Traceback (most recent call last): @@ -727,72 +1027,52 @@ def _add_(self, right): sage: 2*P (15 : 14 : 1) """ - # Use Prop 7.1.7 of Cohen "A Course in Computational Algebraic - # Number Theory" + # Use Prop 7.1.7 of Cohen "A Course in Computational Algebraic Number Theory" + if self.is_zero(): - return right - if right.is_zero(): + return other + if other.is_zero(): return self + E = self.curve() a1, a2, a3, a4, a6 = E.ainvs() - x1, y1 = self[0], self[1] - x2, y2 = right[0], right[1] + x1, y1 = self.xy() + x2, y2 = other.xy() + if x1 == x2 and y1 == -y2 - a1*x2 - a3: return E(0) # point at infinity - if x1 == x2 and y1 == y2: - try: + try: + if x1 == x2 and y1 == y2: m = (3*x1*x1 + 2*a2*x1 + a4 - a1*y1) / (2*y1 + a1*x1 + a3) - except ZeroDivisionError: - R = E.base_ring() - if R.is_finite(): - N = R.characteristic() - N1 = N.gcd(Integer(2*y1 + a1*x1 + a3)) - N2 = N//N1 - raise ZeroDivisionError("Inverse of %s does not exist (characteristic = %s = %s*%s)" % (2*y1 + a1*x1 + a3, N, N1, N2)) - else: - raise ZeroDivisionError("Inverse of %s does not exist" % (2*y1 + a1*x1 + a3)) - else: + else: + m = (y1 - y2) / (x1 - x2) + except ZeroDivisionError as ex: try: - m = (y1-y2)/(x1-x2) - except ZeroDivisionError: - R = E.base_ring() - if R.is_finite(): - N = R.characteristic() - N1 = N.gcd(Integer(x1-x2)) - N2 = N//N1 - raise ZeroDivisionError("Inverse of %s does not exist (characteristic = %s = %s*%s)" % (x1-x2, N, N1, N2)) - else: - raise ZeroDivisionError("Inverse of %s does not exist" % (x1-x2)) + d = next(d for d in (x1 - x2, 2*y1 + a1*x1 + a3) if d and not d.is_unit()) + m, = d.parent().defining_ideal().gens() + f1 = d.lift().gcd(m) + f2 = m // f1 + assert m == f1 * f2 + except Exception: + raise ex + else: + raise ZeroDivisionError(f'Inverse of {d} does not exist (characteristic = {m} = {f1}*{f2})') x3 = -x1 - x2 - a2 + m*(m+a1) y3 = -y1 - a3 - a1*x3 + m*(x1-x3) # See trac #4820 for why we need to coerce 1 into the base ring here: return E.point([x3, y3, E.base_ring().one()], check=False) - def _sub_(self, right): - """ - Subtract ``right`` from ``self``. + _sub_ = EllipticCurvePoint._sub_ - EXAMPLES:: - - sage: E = EllipticCurve('389a') - sage: P = E([-1,1]); Q = E([0,0]) - sage: P - Q - (4 : 8 : 1) - sage: P - Q == P._sub_(Q) - True - sage: (P - Q) + Q - (-1 : 1 : 1) - sage: P - (-1 : 1 : 1) - """ - return self + (-right) - - def __neg__(self): + def _neg_(self): """ Return the additive inverse of this point. + Same as :meth:`EllipticCurvePoint._neg_`, but specialized + to points over fields, which are normalized to satisfy `z=1`. + EXAMPLES:: sage: E = EllipticCurve('389a') @@ -2575,7 +2855,7 @@ def _has_order_at_least(self, bound, *, attempts=999): sage: P = next(filter(bool, E.torsion_points())) sage: P._has_order_at_least(5) True - sage: P._has_order_at_least(6) + sage: P._has_order_at_least(6) # long time -- 5s sage: P.order() 5 sage: Q = E.lift_x(10^42, extend=True) @@ -3992,8 +4272,9 @@ def _magma_init_(self, magma): def _acted_upon_(self, other, side): r""" - We implement ``_acted_upon_`` to keep track of cached - point orders when scalar multiplications are applied. + We implement ``_acted_upon_`` to make use of the specialized faster + scalar multiplication from PARI, and to keep track of cached point + orders when scalar multiplications are applied. EXAMPLES:: diff --git a/src/sage/schemes/elliptic_curves/ell_rational_field.py b/src/sage/schemes/elliptic_curves/ell_rational_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_tate_curve.py b/src/sage/schemes/elliptic_curves/ell_tate_curve.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_torsion.py b/src/sage/schemes/elliptic_curves/ell_torsion.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/ell_wp.py b/src/sage/schemes/elliptic_curves/ell_wp.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/formal_group.py b/src/sage/schemes/elliptic_curves/formal_group.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/gal_reps.py b/src/sage/schemes/elliptic_curves/gal_reps.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/gal_reps_number_field.py b/src/sage/schemes/elliptic_curves/gal_reps_number_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/heegner.py b/src/sage/schemes/elliptic_curves/heegner.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/height.py b/src/sage/schemes/elliptic_curves/height.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/hom.py b/src/sage/schemes/elliptic_curves/hom.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/hom_composite.py b/src/sage/schemes/elliptic_curves/hom_composite.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/hom_sum.py b/src/sage/schemes/elliptic_curves/hom_sum.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/hom_velusqrt.py b/src/sage/schemes/elliptic_curves/hom_velusqrt.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/isogeny_class.py b/src/sage/schemes/elliptic_curves/isogeny_class.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/jacobian.py b/src/sage/schemes/elliptic_curves/jacobian.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/kodaira_symbol.py b/src/sage/schemes/elliptic_curves/kodaira_symbol.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/kraus.py b/src/sage/schemes/elliptic_curves/kraus.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/lseries_ell.py b/src/sage/schemes/elliptic_curves/lseries_ell.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/meson.build b/src/sage/schemes/elliptic_curves/meson.build index 3448c5d1c0a..b2a3dda08c9 100644 --- a/src/sage/schemes/elliptic_curves/meson.build +++ b/src/sage/schemes/elliptic_curves/meson.build @@ -1,6 +1,8 @@ py.install_sources( 'BSD.py', 'Qcurves.py', + '__init__.py', + 'addition_formulas_ring.py', 'all.py', 'cardinality.py', 'cm.py', diff --git a/src/sage/schemes/elliptic_curves/mod_poly.py b/src/sage/schemes/elliptic_curves/mod_poly.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/mod_sym_num.pyx b/src/sage/schemes/elliptic_curves/mod_sym_num.pyx old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/modular_parametrization.py b/src/sage/schemes/elliptic_curves/modular_parametrization.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/padic_lseries.py b/src/sage/schemes/elliptic_curves/padic_lseries.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/padics.py b/src/sage/schemes/elliptic_curves/padics.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/period_lattice.py b/src/sage/schemes/elliptic_curves/period_lattice.py old mode 100755 new mode 100644 index e6008a09279..54cd135dea9 --- a/src/sage/schemes/elliptic_curves/period_lattice.py +++ b/src/sage/schemes/elliptic_curves/period_lattice.py @@ -111,11 +111,12 @@ from sage.misc.cachefunc import cached_method from sage.misc.lazy_import import lazy_import from sage.modules.free_module import FreeModule_generic_pid -from sage.rings.complex_mpfr import ComplexField, ComplexNumber +from sage.rings.complex_mpfr import ComplexField, ComplexNumber, ComplexField_class from sage.rings.infinity import Infinity from sage.rings.integer_ring import ZZ +from sage.rings.qqbar import AA, QQbar from sage.rings.rational_field import QQ -from sage.rings.real_mpfr import RealField, RealNumber +from sage.rings.real_mpfr import RealField, RealField_class, RealNumber from sage.schemes.elliptic_curves.constructor import EllipticCurve from sage.structure.richcmp import richcmp_method, richcmp, richcmp_not_equal @@ -212,9 +213,16 @@ def __init__(self, E, embedding=None): sage: L = PeriodLattice_ell(E,emb) sage: L == loads(dumps(L)) True - """ - from sage.rings.qqbar import AA, QQbar + Elliptic curve over imaginary number field without ``embedding`` specified:: + + sage: E = EllipticCurve(QQ[I], [5, -3*I]) + sage: L = PeriodLattice_ell(E, embedding=None) + sage: L.elliptic_logarithm(E(I+1, I+2)) # abs tol 1e-15 + -0.773376784700140 - 0.177736018028666*I + sage: L.elliptic_exponential(_) # abs tol 1e-15 + (1.00000000000000 - 1.00000000000000*I : 2.00000000000000 - 1.00000000000000*I : 1.00000000000000) + """ # First we cache the elliptic curve with this period lattice: self.E = E @@ -223,12 +231,20 @@ def __init__(self, E, embedding=None): # the given embedding: K = E.base_field() + self.is_approximate = isinstance(K, (RealField_class, ComplexField_class)) if embedding is None: - embs = K.embeddings(AA) - real = len(embs) > 0 - if not real: - embs = K.embeddings(QQbar) - embedding = embs[0] + if K in (AA, QQbar): + embedding = K.hom(QQbar) + real = K == AA + elif self.is_approximate: + embedding = K.hom(K) + real = isinstance(K, RealField_class) + else: + embs = K.embeddings(AA) + real = len(embs) > 0 + if not real: + embs = K.embeddings(QQbar) + embedding = embs[0] else: embedding = refine_embedding(embedding, Infinity) real = embedding(K.gen()).imag().is_zero() @@ -255,20 +271,24 @@ def __init__(self, E, embedding=None): # The ei are used both for period computation and elliptic # logarithms. - self.Ebar = self.E.change_ring(self.embedding) - self.f2 = self.Ebar.two_division_polynomial() + if self.is_approximate: + self.f2 = self.E.two_division_polynomial() + else: + self.Ebar = self.E.change_ring(self.embedding) + self.f2 = self.Ebar.two_division_polynomial() if self.real_flag == 1: # positive discriminant - self._ei = self.f2.roots(AA,multiplicities=False) + self._ei = self.f2.roots(K if self.is_approximate else AA,multiplicities=False) self._ei.sort() # e1 < e2 < e3 e1, e2, e3 = self._ei elif self.real_flag == -1: # negative discriminant - self._ei = self.f2.roots(QQbar, multiplicities=False) + self._ei = self.f2.roots(ComplexField(K.precision()) if self.is_approximate else QQbar, multiplicities=False) self._ei = sorted(self._ei, key=lambda z: z.imag()) e1, e3, e2 = self._ei # so e3 is real - e3 = AA(e3) + if not self.is_approximate: + e3 = AA(e3) self._ei = [e1, e2, e3] else: - self._ei = self.f2.roots(QQbar, multiplicities=False) + self._ei = self.f2.roots(ComplexField(K.precision()) if self.is_approximate else QQbar, multiplicities=False) e1, e2, e3 = self._ei # The quantities sqrt(e_i-e_j) are cached (as elements of @@ -329,7 +349,8 @@ def __repr__(self): To: Algebraic Real Field Defn: a |--> 1.259921049894873? """ - if self.E.base_field() is QQ: + K = self.E.base_field() + if K in (QQ, AA, QQbar) or isinstance(K, (RealField_class, ComplexField_class)): return "Period lattice associated to %s" % (self.E) return "Period lattice associated to %s with respect to the embedding %s" % (self.E, self.embedding) @@ -364,8 +385,8 @@ def __call__(self, P, prec=None): sage: P = E([-1,1]) sage: P.is_on_identity_component () False - sage: L(P, prec=96) - 0.4793482501902193161295330101 + 0.985868850775824102211203849...*I + sage: L(P, prec=96) # abs tol 1e-27 + 0.4793482501902193161295330101 + 0.985868850775824102211203849*I sage: Q = E([3,5]) sage: Q.is_on_identity_component() True @@ -630,6 +651,13 @@ def tau(self, prec=None, algorithm='sage'): w1, w2 = self.normalised_basis(prec=prec, algorithm=algorithm) return w1/w2 + @cached_method + def _compute_default_prec(self): + r""" + Internal function to compute the default precision to be used if nothing is passed in. + """ + return self.E.base_field().precision() if self.is_approximate else RealField().precision() + @cached_method def _compute_periods_real(self, prec=None, algorithm='sage'): r""" @@ -670,13 +698,13 @@ def _compute_periods_real(self, prec=None, algorithm='sage'): 1.9072648860892725468182549468 - 1.3404778596244020196600112394*I) """ if prec is None: - prec = 53 + prec = self._compute_default_prec() R = RealField(prec) C = ComplexField(prec) if algorithm == 'pari': ainvs = self.E.a_invariants() - if self.E.base_field() is not QQ: + if self.E.base_field() is not QQ and not self.is_approximate: ainvs = [C(self.embedding(ai)).real() for ai in ainvs] # The precision for omega() is determined by ellinit() @@ -688,9 +716,8 @@ def _compute_periods_real(self, prec=None, algorithm='sage'): raise ValueError("invalid value of 'algorithm' parameter") pi = R.pi() - # Up to now everything has been exact in AA or QQbar, but now - # we must go transcendental. Only now is the desired - # precision used! + # Up to now everything has been exact in AA or QQbar (unless self.is_approximate), + # but now we must go transcendental. Only now is the desired precision used! if self.real_flag == 1: # positive discriminant a, b, c = (R(x) for x in self._abc) w1 = R(pi/a.agm(b)) # least real period @@ -758,12 +785,11 @@ def _compute_periods_complex(self, prec=None, normalise=True): 0.692321964451917 """ if prec is None: - prec = RealField().precision() + prec = self._compute_default_prec() C = ComplexField(prec) - # Up to now everything has been exact in AA, but now we - # must go transcendental. Only now is the desired - # precision used! + # Up to now everything has been exact in AA or QQbar (unless self.is_approximate), + # but now we must go transcendental. Only now is the desired precision used! pi = C.pi() a, b, c = (C(x) for x in self._abc) if (a+b).abs() < (a-b).abs(): @@ -1107,7 +1133,7 @@ def sigma(self, z, prec=None, flag=0): 2.60912163570108 - 0.200865080824587*I """ if prec is None: - prec = RealField().precision() + prec = self._compute_default_prec() try: return self.E.pari_curve().ellsigma(z, flag, precision=prec) except AttributeError: @@ -1211,14 +1237,14 @@ def coordinates(self, z, rounding=None): sage: L = E.period_lattice() sage: w1, w2 = L.basis(prec=100) sage: P = E([-1,1]) - sage: zP = P.elliptic_logarithm(precision=100); zP + sage: zP = P.elliptic_logarithm(precision=100); zP # abs tol 1e-28 0.47934825019021931612953301006 + 0.98586885077582410221120384908*I - sage: L.coordinates(zP) + sage: L.coordinates(zP) # abs tol 1e-28 (0.19249290511394227352563996419, 0.50000000000000000000000000000) - sage: sum([x*w for x, w in zip(L.coordinates(zP), L.basis(prec=100))]) + sage: sum([x*w for x, w in zip(L.coordinates(zP), L.basis(prec=100))]) # abs tol 1e-28 0.47934825019021931612953301006 + 0.98586885077582410221120384908*I - sage: L.coordinates(12*w1 + 23*w2) + sage: L.coordinates(12*w1 + 23*w2) # abs tol 1e-28 (12.000000000000000000000000000, 23.000000000000000000000000000) sage: L.coordinates(12*w1 + 23*w2, rounding='floor') (11, 22) @@ -1276,17 +1302,17 @@ def reduce(self, z): sage: L = E.period_lattice() sage: w1, w2 = L.basis(prec=100) sage: P = E([-1,1]) - sage: zP = P.elliptic_logarithm(precision=100); zP + sage: zP = P.elliptic_logarithm(precision=100); zP # abs tol 1e-28 0.47934825019021931612953301006 + 0.98586885077582410221120384908*I - sage: z = zP + 10*w1 - 20*w2; z + sage: z = zP + 10*w1 - 20*w2; z # abs tol 1e-28 25.381473858740770069343110929 - 38.448885180257139986236950114*I - sage: L.reduce(z) + sage: L.reduce(z) # abs tol 1e-28 0.47934825019021931612953301006 + 0.98586885077582410221120384908*I - sage: L.elliptic_logarithm(2*P) + sage: L.elliptic_logarithm(2*P) # abs tol 1e-15 0.958696500380439 - sage: L.reduce(L.elliptic_logarithm(2*P)) + sage: L.reduce(L.elliptic_logarithm(2*P)) # abs tol 1e-15 0.958696500380439 - sage: L.reduce(L.elliptic_logarithm(2*P) + 10*w1 - 20*w2) + sage: L.reduce(L.elliptic_logarithm(2*P) + 10*w1 - 20*w2) # abs tol 1e-15 0.958696500380444 """ C = z.parent() @@ -1366,12 +1392,12 @@ def e_log_RC(self, xP, yP, prec=None, reduce=True): The elliptic log from the real coordinates:: - sage: L.e_log_RC(xP, yP) + sage: L.e_log_RC(xP, yP) # abs tol 1e-15 0.479348250190219 + 0.985868850775824*I The same elliptic log from the algebraic point:: - sage: L(P) + sage: L(P) # abs tol 1e-15 0.479348250190219 + 0.985868850775824*I A number field example:: @@ -1383,10 +1409,10 @@ def e_log_RC(self, xP, yP, prec=None, reduce=True): sage: v = K.real_places()[0] sage: L = E.period_lattice(v) sage: P = E.lift_x(1/3*a^2 + a + 5/3) - sage: L(P) + sage: L(P) # abs tol 1e-15 3.51086196882538 sage: xP, yP = [v(c) for c in P.xy()] - sage: L.e_log_RC(xP, yP) + sage: L.e_log_RC(xP, yP) # abs tol 1e-15 3.51086196882538 Elliptic logs of real points which do not come from algebraic @@ -1396,11 +1422,11 @@ def e_log_RC(self, xP, yP, prec=None, reduce=True): sage: ER = EllipticCurve([v(ai) for ai in E.a_invariants()]) sage: P = ER.lift_x(12.34) sage: xP, yP = P.xy() - sage: xP, yP + sage: xP, yP # abs tol 1e-15 (12.3400000000000, -43.3628968710567) - sage: L.e_log_RC(xP, yP) + sage: L.e_log_RC(xP, yP) # abs tol 1e-15 0.284656841192041 - sage: xP, yP = ER.lift_x(0).xy() + sage: xP, yP = ER.lift_x(0).xy() # abs tol 1e-15 sage: L.e_log_RC(xP, yP) 1.34921304541057 @@ -1410,18 +1436,18 @@ def e_log_RC(self, xP, yP, prec=None, reduce=True): sage: v = K.complex_embeddings()[0] sage: L = E.period_lattice(v) sage: P = E.lift_x(1/3*a^2 + a + 5/3) - sage: L(P) + sage: L(P) # abs tol 1e-15 1.68207104397706 - 1.87873661686704*I sage: xP, yP = [v(c) for c in P.xy()] - sage: L.e_log_RC(xP, yP) + sage: L.e_log_RC(xP, yP) # abs tol 1e-15 1.68207104397706 - 1.87873661686704*I sage: EC = EllipticCurve([v(ai) for ai in E.a_invariants()]) sage: xP, yP = EC.lift_x(0).xy() - sage: L.e_log_RC(xP, yP) + sage: L.e_log_RC(xP, yP) # abs tol 1e-15 2.06711431204080 - 1.73451485683471*I """ if prec is None: - prec = RealField().precision() + prec = self._compute_default_prec() # Note: using log2(prec) + 3 guard bits is usually enough. # To avoid computing a logarithm, we use 40 guard bits which # should be largely enough in practice. @@ -1709,11 +1735,61 @@ def elliptic_logarithm(self, P, prec=None, reduce=True): 1.17058357737548897849026170185581196033579563441850967539191867385734983296504066660506637438866628981886518901958717288150400849746892393771983141354 - 1.13513899565966043682474529757126359416758251309237866586896869548539516543734207347695898664875799307727928332953834601460994992792519799260968053875*I sage: L.elliptic_logarithm(P, prec=1000) 1.17058357737548897849026170185581196033579563441850967539191867385734983296504066660506637438866628981886518901958717288150400849746892393771983141354014895386251320571643977497740116710952913769943240797618468987304985625823413440999754037939123032233879499904283600304184828809773650066658885672885 - 1.13513899565966043682474529757126359416758251309237866586896869548539516543734207347695898664875799307727928332953834601460994992792519799260968053875387282656993476491590607092182964878750169490985439873220720963653658829712494879003124071110818175013453207439440032582917366703476398880865439217473*I + + Elliptic curve over ``QQbar``:: + + sage: E = EllipticCurve(QQbar, [sqrt(2), I]) + sage: L = E.period_lattice() + sage: P = E.lift_x(3) + sage: L.elliptic_logarithm(P) + -1.97657221097437 - 1.05021415535949*I + sage: L.elliptic_exponential(_) # abs tol 1e-15 + (3.00000000000000 + 9.20856947066460e-16*I : -5.59022723358798 - 0.0894418024719718*I : 1.00000000000000) + sage: L.elliptic_logarithm(P, prec=100) # abs tol 1e-15 + -3.4730631218714889933426781799 + 0.44627675553762761312098773197*I + sage: L.elliptic_exponential(_) # abs tol 1e-28 + (3.0000000000000000000000000000 - 1.4773628579202938936348512161e-30*I : -5.5902272335879800026836302686 - 0.089441802471969391005702381090*I : 1.0000000000000000000000000000) + + Real approximate field, negative discriminant. Note that the output precision uses the precision of the base field:: + + sage: E = EllipticCurve(RealField(100), [1, 6]) + sage: L = E.period_lattice() + sage: L.real_flag + -1 + sage: P = E(3, 6) + sage: L.elliptic_logarithm(P) + 2.4593388737550379526023682666 + sage: L.elliptic_exponential(_) + (3.0000000000000000000000000000 : 5.9999999999999999999999999999 : 1.0000000000000000000000000000) + + Real approximate field, positive discriminant:: + + sage: E = EllipticCurve(RealField(100), [-4, 3]) + sage: L = E.period_lattice() + sage: L.real_flag + 1 + sage: P = E.lift_x(4) + sage: L.elliptic_logarithm(P) + 0.51188849089267627141925354967 + sage: L.elliptic_exponential(_) + (4.0000000000000000000000000000 : -7.1414284285428499979993998114 : 1.0000000000000000000000000000) + + Complex approximate field:: + + sage: E = EllipticCurve(ComplexField(100), [I, 3*I+4]) + sage: L = E.period_lattice() + sage: L.real_flag + 0 + sage: P = E.lift_x(4) + sage: L.elliptic_logarithm(P) + -1.1447032790074574712147458157 - 0.72429843602171875396186134806*I + sage: L.elliptic_exponential(_) + (4.0000000000000000000000000000 + 1.2025589033682610849950210280e-30*I : -8.2570982991257407680322611854 - 0.42387771989714340809597881586*I : 1.0000000000000000000000000000) """ if P.curve() is not self.E: raise ValueError("Point is on the wrong curve") if prec is None: - prec = RealField().precision() + prec = self._compute_default_prec() if P.is_zero(): return ComplexField(prec)(0) @@ -1826,8 +1902,8 @@ def elliptic_exponential(self, z, to_curve=True): sage: E = EllipticCurve('37a') sage: K. = QuadraticField(-5) sage: L = E.change_ring(K).period_lattice(K.places()[0]) - sage: L.elliptic_exponential(CDF(.1,.1)) - (0.0000142854026029... - 49.9960001066650*I + sage: L.elliptic_exponential(CDF(.1,.1)) # abs tol 1e-15 + (0.0000142854026029 - 49.9960001066650*I : 249.520141250950 + 250.019855549131*I : 1.00000000000000) sage: L.elliptic_exponential(CDF(.1,.1), to_curve=False) (0.0000142854026029447 - 49.9960001066650*I, @@ -1926,7 +2002,10 @@ def elliptic_exponential(self, z, to_curve=True): if to_curve: K = x.parent() - v = refine_embedding(self.embedding, Infinity) + if self.is_approximate: + v = self.embedding + else: + v = refine_embedding(self.embedding, Infinity) a1, a2, a3, a4, a6 = (K(v(a)) for a in self.E.ainvs()) b2 = K(v(self.E.b2())) x = x - b2 / 12 diff --git a/src/sage/schemes/elliptic_curves/period_lattice_region.pyx b/src/sage/schemes/elliptic_curves/period_lattice_region.pyx old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/saturation.py b/src/sage/schemes/elliptic_curves/saturation.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/sha_tate.py b/src/sage/schemes/elliptic_curves/sha_tate.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/weierstrass_morphism.py b/src/sage/schemes/elliptic_curves/weierstrass_morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/elliptic_curves/weierstrass_transform.py b/src/sage/schemes/elliptic_curves/weierstrass_transform.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/algebraic_scheme.py b/src/sage/schemes/generic/algebraic_scheme.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/ambient_space.py b/src/sage/schemes/generic/ambient_space.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/divisor.py b/src/sage/schemes/generic/divisor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/divisor_group.py b/src/sage/schemes/generic/divisor_group.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/glue.py b/src/sage/schemes/generic/glue.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/homset.py b/src/sage/schemes/generic/homset.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/hypersurface.py b/src/sage/schemes/generic/hypersurface.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/morphism.py b/src/sage/schemes/generic/morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/point.py b/src/sage/schemes/generic/point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/scheme.py b/src/sage/schemes/generic/scheme.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/generic/spec.py b/src/sage/schemes/generic/spec.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/constructor.py b/src/sage/schemes/hyperelliptic_curves/constructor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/hypellfrob.pyx b/src/sage/schemes/hyperelliptic_curves/hypellfrob.pyx old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py b/src/sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py b/src/sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py b/src/sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py b/src/sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/invariants.py b/src/sage/schemes/hyperelliptic_curves/invariants.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py b/src/sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/jacobian_generic.py b/src/sage/schemes/hyperelliptic_curves/jacobian_generic.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/jacobian_morphism.py b/src/sage/schemes/hyperelliptic_curves/jacobian_morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/meson.build b/src/sage/schemes/hyperelliptic_curves/meson.build index e4b017d4192..170d08baaca 100644 --- a/src/sage/schemes/hyperelliptic_curves/meson.build +++ b/src/sage/schemes/hyperelliptic_curves/meson.build @@ -1,5 +1,6 @@ inc_hypellfrob = include_directories('hypellfrob') py.install_sources( + '__init__.py', 'all.py', 'constructor.py', 'hyperelliptic_finite_field.py', diff --git a/src/sage/schemes/hyperelliptic_curves/mestre.py b/src/sage/schemes/hyperelliptic_curves/mestre.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py b/src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/jacobians/abstract_jacobian.py b/src/sage/schemes/jacobians/abstract_jacobian.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/meson.build b/src/sage/schemes/meson.build index c74c532b930..4dac80900e9 100644 --- a/src/sage/schemes/meson.build +++ b/src/sage/schemes/meson.build @@ -1,4 +1,9 @@ -py.install_sources('all.py', 'overview.py', subdir: 'sage/schemes') +py.install_sources( + '__init__.py', + 'all.py', + 'overview.py', + subdir: 'sage/schemes', +) install_subdir('affine', install_dir: sage_install_dir / 'schemes') install_subdir('berkovich', install_dir: sage_install_dir / 'schemes') diff --git a/src/sage/schemes/plane_conics/con_field.py b/src/sage/schemes/plane_conics/con_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/plane_conics/con_finite_field.py b/src/sage/schemes/plane_conics/con_finite_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/plane_conics/con_number_field.py b/src/sage/schemes/plane_conics/con_number_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/plane_conics/con_rational_field.py b/src/sage/schemes/plane_conics/con_rational_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/plane_conics/con_rational_function_field.py b/src/sage/schemes/plane_conics/con_rational_function_field.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/plane_conics/constructor.py b/src/sage/schemes/plane_conics/constructor.py old mode 100755 new mode 100644 index a08089522c2..49e3f77e28e --- a/src/sage/schemes/plane_conics/constructor.py +++ b/src/sage/schemes/plane_conics/constructor.py @@ -33,7 +33,7 @@ from sage.rings.number_field.number_field_base import NumberField from sage.rings.polynomial.multi_polynomial import MPolynomial from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.schemes.affine.affine_point import SchemeMorphism_point_affine from sage.schemes.projective.projective_point import SchemeMorphism_point_projective_field @@ -240,7 +240,7 @@ def Conic(base_field, F=None, names=None, unique=True): return ProjectiveConic_rational_field(P2, F) if isinstance(base_field, NumberField): return ProjectiveConic_number_field(P2, F) - if isinstance(base_field, FractionField_generic) and isinstance(base_field.ring(), (PolynomialRing_general, MPolynomialRing_base)): + if isinstance(base_field, FractionField_generic) and isinstance(base_field.ring(), (PolynomialRing_generic, MPolynomialRing_base)): return ProjectiveConic_rational_function_field(P2, F) return ProjectiveConic_field(P2, F) diff --git a/src/sage/schemes/plane_quartics/quartic_constructor.py b/src/sage/schemes/plane_quartics/quartic_constructor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/plane_quartics/quartic_generic.py b/src/sage/schemes/plane_quartics/quartic_generic.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/product_projective/homset.py b/src/sage/schemes/product_projective/homset.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/product_projective/morphism.py b/src/sage/schemes/product_projective/morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/product_projective/point.py b/src/sage/schemes/product_projective/point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/product_projective/rational_point.py b/src/sage/schemes/product_projective/rational_point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/product_projective/space.py b/src/sage/schemes/product_projective/space.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/product_projective/subscheme.py b/src/sage/schemes/product_projective/subscheme.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/projective/proj_bdd_height.py b/src/sage/schemes/projective/proj_bdd_height.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/projective/projective_homset.py b/src/sage/schemes/projective/projective_homset.py old mode 100755 new mode 100644 index 7f86f7ea0f6..da3f5b502cd --- a/src/sage/schemes/projective/projective_homset.py +++ b/src/sage/schemes/projective/projective_homset.py @@ -640,6 +640,8 @@ def _element_constructor_(self, *v, **kwds): """ if len(v) == 1: v = v[0] + if v == 0: + return self.zero() return self.codomain()._point(self.extended_codomain(), v, **kwds) def _repr_(self): @@ -689,6 +691,23 @@ def base_extend(self, R): 'implemented as modules over rings other than ZZ') return self + def zero(self): + r""" + Return the neutral element in this group of points. + + EXAMPLES:: + + sage: S = EllipticCurve(GF(5), [1,1]).point_homset() + sage: S.zero() + (0 : 1 : 0) + sage: S = EllipticCurve(Zmod(15), [1,1]).point_homset() + sage: S.zero() + (0 : 1 : 0) + """ + return self.codomain()(0) + + _an_element_ = zero + from sage.misc.persist import register_unpickle_override register_unpickle_override('sage.schemes.generic.homset', diff --git a/src/sage/schemes/projective/projective_morphism.py b/src/sage/schemes/projective/projective_morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/projective/projective_point.py b/src/sage/schemes/projective/projective_point.py old mode 100755 new mode 100644 index c5d6b02c05a..88ab4eadcfc --- a/src/sage/schemes/projective/projective_point.py +++ b/src/sage/schemes/projective/projective_point.py @@ -533,7 +533,11 @@ def scale_by(self, t): def normalize_coordinates(self): """ - Removes the gcd from the coordinates of this point (including `-1`). + Removes the gcd from the coordinates of this point (including `-1`) + and rescales everything so that the last nonzero entry is as "simple" + as possible. The notion of "simple" here depends on the base ring; + concretely, the last nonzero coordinate will be `1` in a field and + positive over an ordered ring. .. WARNING:: The gcd will depend on the base ring. @@ -552,7 +556,7 @@ def normalize_coordinates(self): sage: P = ProjectiveSpace(Zp(7), 2, 'x') sage: p = P([-5, -15, -2]) sage: p.normalize_coordinates(); p - (5 + O(7^20) : 1 + 2*7 + O(7^20) : 2 + O(7^20)) + (6 + 3*7 + 3*7^2 + 3*7^3 + 3*7^4 + 3*7^5 + 3*7^6 + 3*7^7 + 3*7^8 + 3*7^9 + 3*7^10 + 3*7^11 + 3*7^12 + 3*7^13 + 3*7^14 + 3*7^15 + 3*7^16 + 3*7^17 + 3*7^18 + 3*7^19 + O(7^20) : 4 + 4*7 + 3*7^2 + 3*7^3 + 3*7^4 + 3*7^5 + 3*7^6 + 3*7^7 + 3*7^8 + 3*7^9 + 3*7^10 + 3*7^11 + 3*7^12 + 3*7^13 + 3*7^14 + 3*7^15 + 3*7^16 + 3*7^17 + 3*7^18 + 3*7^19 + O(7^20) : 1 + O(7^20)) :: @@ -576,8 +580,8 @@ def normalize_coordinates(self): sage: R. = PolynomialRing(QQ) sage: P = ProjectiveSpace(R, 1) sage: Q = P(2*c, 4*c) - sage: Q.normalize_coordinates();Q - (2 : 4) + sage: Q.normalize_coordinates(); Q + (1/2 : 1) A polynomial ring over a ring gives the more intuitive result. :: @@ -614,15 +618,19 @@ def normalize_coordinates(self): else: GCD = R(gcd(self._coords[0], self._coords[1])) index = 2 - neg = self._coords[0] <= 0 and self._coords[1] <= 0 - while not GCD.is_one() and index < len(self._coords): - neg = self._coords[index] <= 0 + while not GCD.is_unit() and index < len(self._coords): GCD = R(gcd(GCD, self._coords[index])) index += 1 - if not GCD.is_one(): + if not GCD.is_unit(): self.scale_by(~GCD) - if neg: - self.scale_by(-ZZ.one()) + index = len(self._coords) - 1 + while not self._coords[index]: + index -= 1 + if self._coords[index].is_unit(): + if not self._coords[index].is_one(): + self.scale_by(~self._coords[index]) + elif self._coords[index] < 0: + self.scale_by(-R.one()) self._normalized = True def dehomogenize(self, n): diff --git a/src/sage/schemes/projective/projective_rational_point.py b/src/sage/schemes/projective/projective_rational_point.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/projective/projective_space.py b/src/sage/schemes/projective/projective_space.py old mode 100755 new mode 100644 index 89d4f28f48b..9073faa9706 --- a/src/sage/schemes/projective/projective_space.py +++ b/src/sage/schemes/projective/projective_space.py @@ -100,7 +100,7 @@ from sage.rings.integer import Integer from sage.rings.integer_ring import ZZ from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.rings.rational_field import QQ, RationalField from sage.schemes.generic.ambient_space import AmbientSpace @@ -248,7 +248,7 @@ def ProjectiveSpace(n, R=None, names=None): sage: P.gens() == R.gens() True """ - if isinstance(n, (MPolynomialRing_base, PolynomialRing_general)) and R is None: + if isinstance(n, (MPolynomialRing_base, PolynomialRing_generic)) and R is None: if names is not None: # Check for the case that the user provided a variable name # That does not match what we wanted to use from R diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/riemann_surfaces/riemann_surface.py b/src/sage/schemes/riemann_surfaces/riemann_surface.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/chow_group.py b/src/sage/schemes/toric/chow_group.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/divisor.py b/src/sage/schemes/toric/divisor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/divisor_class.pyx b/src/sage/schemes/toric/divisor_class.pyx old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/fano_variety.py b/src/sage/schemes/toric/fano_variety.py old mode 100755 new mode 100644 index fcf5d03d476..fb8265818bd --- a/src/sage/schemes/toric/fano_variety.py +++ b/src/sage/schemes/toric/fano_variety.py @@ -129,7 +129,7 @@ from sage.rings.rational_field import QQ from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base -from sage.rings.polynomial.polynomial_ring import PolynomialRing_general +from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.fraction_field import FractionField_generic from sage.schemes.toric.toric_subscheme import AlgebraicScheme_subscheme_toric @@ -1583,7 +1583,7 @@ def add_variables(field, variables): if isinstance(field, FractionField_generic): # Q(a) ---> Q(a, b) rather than Q(a)(b) R = field.ring() - if isinstance(R, (PolynomialRing_general, MPolynomialRing_base)): + if isinstance(R, (PolynomialRing_generic, MPolynomialRing_base)): new_variables = list(R.variable_names()) for v in variables: if v not in new_variables: diff --git a/src/sage/schemes/toric/homset.py b/src/sage/schemes/toric/homset.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/ideal.py b/src/sage/schemes/toric/ideal.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/library.py b/src/sage/schemes/toric/library.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/meson.build b/src/sage/schemes/toric/meson.build index d9dea45fcc8..0e85031ccf5 100644 --- a/src/sage/schemes/toric/meson.build +++ b/src/sage/schemes/toric/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'chow_group.py', 'divisor.py', diff --git a/src/sage/schemes/toric/morphism.py b/src/sage/schemes/toric/morphism.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/points.py b/src/sage/schemes/toric/points.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/sheaf/constructor.py b/src/sage/schemes/toric/sheaf/constructor.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/sheaf/klyachko.py b/src/sage/schemes/toric/sheaf/klyachko.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/toric_subscheme.py b/src/sage/schemes/toric/toric_subscheme.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/variety.py b/src/sage/schemes/toric/variety.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/weierstrass.py b/src/sage/schemes/toric/weierstrass.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/weierstrass_covering.py b/src/sage/schemes/toric/weierstrass_covering.py old mode 100755 new mode 100644 diff --git a/src/sage/schemes/toric/weierstrass_higher.py b/src/sage/schemes/toric/weierstrass_higher.py old mode 100755 new mode 100644 diff --git a/src/sage/sets/disjoint_set.pyx b/src/sage/sets/disjoint_set.pyx index b991094924b..53e793755ec 100644 --- a/src/sage/sets/disjoint_set.pyx +++ b/src/sage/sets/disjoint_set.pyx @@ -560,6 +560,7 @@ cdef class DisjointSet_of_integers(DisjointSet_class): the new element. The new set is added at the end of ``self``. EXAMPLES:: + sage: d = DisjointSet(5) sage: d.union(1, 2) sage: d.union(0, 1) @@ -568,6 +569,13 @@ cdef class DisjointSet_of_integers(DisjointSet_class): {{0, 1, 2}, {3}, {4}, {5}} sage: d.find(1) 1 + + TESTS:: + + sage: d = DisjointSet(0) + sage: d.make_set() + sage: d + {{0}} """ OP_make_set(self._nodes) diff --git a/src/sage/sets/meson.build b/src/sage/sets/meson.build index 73faddaf9c7..92d4cb4cd17 100644 --- a/src/sage/sets/meson.build +++ b/src/sage/sets/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_objects.py', 'cartesian_product.py', diff --git a/src/sage/stats/distributions/meson.build b/src/sage/stats/distributions/meson.build index 129d5f74d13..db152755b95 100644 --- a/src/sage/stats/distributions/meson.build +++ b/src/sage/stats/distributions/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'catalog.py', 'dgs.pxd', diff --git a/src/sage/stats/hmm/meson.build b/src/sage/stats/hmm/meson.build index cbf4a30caa5..661c578252e 100644 --- a/src/sage/stats/hmm/meson.build +++ b/src/sage/stats/hmm/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'distributions.pxd', 'hmm.pxd', diff --git a/src/sage/stats/meson.build b/src/sage/stats/meson.build index 414a909270c..52c4b684ac4 100644 --- a/src/sage/stats/meson.build +++ b/src/sage/stats/meson.build @@ -1,4 +1,5 @@ py.install_sources( + '__init__.py', 'all.py', 'basic_stats.py', 'intlist.pxd', diff --git a/src/sage/stats/time_series.pyx b/src/sage/stats/time_series.pyx index 28318238a25..edcc8e39ea1 100644 --- a/src/sage/stats/time_series.pyx +++ b/src/sage/stats/time_series.pyx @@ -465,7 +465,7 @@ cdef class TimeSeries: """ cdef Py_ssize_t i cdef TimeSeries t = new_time_series(self._length) - memcpy(t._values, self._values , sizeof(double)*self._length) + memcpy(t._values, self._values, sizeof(double)*self._length) return t def __add__(left, right): diff --git a/src/sage/structure/element.pyx b/src/sage/structure/element.pyx index 4860b4efabd..9fd976fdfc7 100644 --- a/src/sage/structure/element.pyx +++ b/src/sage/structure/element.pyx @@ -4737,6 +4737,7 @@ def coerce_binop(method): TypeError: algorithm 1 not supported """ @sage_wraps(method) + @cython.binding(True) def new_method(self, other, *args, **kwargs): if have_same_parent(self, other): return method(self, other, *args, **kwargs) diff --git a/src/sage/structure/mutability.pyx b/src/sage/structure/mutability.pyx index 69d034bd8c3..a8808a29623 100644 --- a/src/sage/structure/mutability.pyx +++ b/src/sage/structure/mutability.pyx @@ -12,6 +12,7 @@ Mutability Cython Implementation # https://www.gnu.org/licenses/ ########################################################################## +cimport cython from sage.misc.decorators import sage_wraps cdef class Mutability: @@ -286,6 +287,7 @@ def require_mutable(f): - Simon King """ @sage_wraps(f) + @cython.binding(True) def new_f(self, *args, **kwds): if getattr(self, '_is_immutable', False): raise ValueError("{} instance is immutable, {} must not be called".format(type(self), repr(f))) @@ -338,6 +340,7 @@ def require_immutable(f): - Simon King """ @sage_wraps(f) + @cython.binding(True) def new_f(self, *args, **kwds): if not getattr(self,'_is_immutable',False): raise ValueError("{} instance is mutable, {} must not be called".format(type(self), repr(f))) diff --git a/src/sage/structure/parent.pyx b/src/sage/structure/parent.pyx index 8e8940b5846..1dd2ae070ca 100644 --- a/src/sage/structure/parent.pyx +++ b/src/sage/structure/parent.pyx @@ -2599,17 +2599,19 @@ cdef class Parent(sage.structure.category_object.CategoryObject): sage: # needs sage.schemes sage: E = EllipticCurve([1,0]) sage: coercion_model.get_action(E, ZZ, operator.mul) - Right Integer Multiplication by Integer Ring - on Elliptic Curve defined by y^2 = x^3 + x over Rational Field + Right action by Integer Ring on Elliptic Curve defined by y^2 = x^3 + x over Rational Field sage: coercion_model.get_action(ZZ, E, operator.mul) - Left Integer Multiplication by Integer Ring - on Elliptic Curve defined by y^2 = x^3 + x over Rational Field + Left action by Integer Ring on Elliptic Curve defined by y^2 = x^3 + x over Rational Field sage: coercion_model.get_action(E, int, operator.mul) - Right Integer Multiplication by Set of Python objects of class 'int' - on Elliptic Curve defined by y^2 = x^3 + x over Rational Field + Right action by Integer Ring on Elliptic Curve defined by y^2 = x^3 + x over Rational Field + with precomposition on right by Native morphism: + From: Set of Python objects of class 'int' + To: Integer Ring sage: coercion_model.get_action(int, E, operator.mul) - Left Integer Multiplication by Set of Python objects of class 'int' - on Elliptic Curve defined by y^2 = x^3 + x over Rational Field + Left action by Integer Ring on Elliptic Curve defined by y^2 = x^3 + x over Rational Field + with precomposition on left by Native morphism: + From: Set of Python objects of class 'int' + To: Integer Ring :: @@ -3042,8 +3044,7 @@ cdef class EltPair: sage: K. = Qq(9) # needs sage.rings.padics sage: E = EllipticCurve_from_j(0).base_extend(K) # needs sage.rings.padics sage: E.get_action(ZZ) # needs sage.rings.padics - Right Integer Multiplication - by Integer Ring + Right action by Integer Ring on Elliptic Curve defined by y^2 + (1+O(3^20))*y = x^3 over 3-adic Unramified Extension Field in a defined by x^2 + 2*x + 2 diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx index 52da8232dc6..da4d5db908f 100644 --- a/src/sage/symbolic/expression.pyx +++ b/src/sage/symbolic/expression.pyx @@ -372,6 +372,7 @@ More sanity tests:: # https://www.gnu.org/licenses/ # **************************************************************************** +cimport cython from cysignals.signals cimport sig_on, sig_off from sage.ext.cplusplus cimport ccrepr, ccreadstr @@ -13574,6 +13575,7 @@ def _eval_on_operands(f): Some documentation. """ @sage_wraps(f) + @cython.binding(True) def new_f(ex, *args, **kwds): new_args = list(ex._unpack_operands()) new_args.extend(args) diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp index e973390ffa2..02b07296193 100644 --- a/src/sage/symbolic/ginac/numeric.cpp +++ b/src/sage/symbolic/ginac/numeric.cpp @@ -3665,7 +3665,7 @@ const numeric numeric::log(const numeric &b, PyObject* parent) const { } // General log -// Handle special cases here that return MPZ/MPQ +// Handle special cases here that return MPZ/MPQ (or an infinity) const numeric numeric::ratlog(const numeric &b, bool& israt) const { israt = true; if (b.is_one()) { @@ -3688,6 +3688,9 @@ const numeric numeric::ratlog(const numeric &b, bool& israt) const { israt = false; return *_num0_p; } + if (v._long == 0) { + return py_funcs.py_eval_neg_infinity(); + } int c = 0; std::ldiv_t ld; ld.quot = v._long; diff --git a/src/sage/symbolic/meson.build b/src/sage/symbolic/meson.build index 0ba39cb4d45..fc1f2a806e3 100644 --- a/src/sage/symbolic/meson.build +++ b/src/sage/symbolic/meson.build @@ -2,6 +2,7 @@ inc_ginac = include_directories('ginac') inc_pynac = include_directories('.') py.install_sources( + '__init__.py', 'all.py', 'assumptions.py', 'benchmark.py', diff --git a/src/sage/symbolic/ring.pyx b/src/sage/symbolic/ring.pyx index 65fccee5324..eaaa5cbdc15 100644 --- a/src/sage/symbolic/ring.pyx +++ b/src/sage/symbolic/ring.pyx @@ -187,7 +187,7 @@ cdef class SymbolicRing(sage.rings.abc.SymbolicRing): True """ if isinstance(R, type): - if R in [int, float, long, complex, bool]: + if R in (int, float, complex, bool): return True if is_numpy_type(R): @@ -207,7 +207,7 @@ cdef class SymbolicRing(sage.rings.abc.SymbolicRing): return False else: from sage.rings.fraction_field import FractionField_generic - from sage.rings.polynomial.polynomial_ring import PolynomialRing_general + from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base from sage.rings.polynomial.laurent_polynomial_ring_base import LaurentPolynomialRing_generic from sage.rings.infinity import InfinityRing, UnsignedInfinityRing @@ -219,7 +219,7 @@ cdef class SymbolicRing(sage.rings.abc.SymbolicRing): if R._is_numerical(): # Almost anything with a coercion into any precision of CC return R not in (RLF, CLF) - elif isinstance(R, PolynomialRing_general) or isinstance(R, MPolynomialRing_base) or isinstance(R, FractionField_generic) or isinstance(R, LaurentPolynomialRing_generic): + elif isinstance(R, (PolynomialRing_generic, MPolynomialRing_base, FractionField_generic, LaurentPolynomialRing_generic)): base = R.base_ring() return base is not self and self.has_coerce_map_from(base) elif (R is InfinityRing or R is UnsignedInfinityRing diff --git a/src/sage/tensor/modules/comp.py b/src/sage/tensor/modules/comp.py index 32ac954c7b4..f52cdfb744b 100644 --- a/src/sage/tensor/modules/comp.py +++ b/src/sage/tensor/modules/comp.py @@ -1688,7 +1688,7 @@ def __sub__(self, other): """ if isinstance(other, (int, Integer)) and other == 0: return +self - return self + (-other) #!# correct, deals properly with + return self + (-other) # ! # correct, deals properly with # symmetries, but is probably not optimal def __rsub__(self, other): diff --git a/src/sage/version.py b/src/sage/version.py index 37c771ba0f2..73436924039 100644 --- a/src/sage/version.py +++ b/src/sage/version.py @@ -1,5 +1,5 @@ # Sage version information for Python scripts # This file is auto-generated by the sage-update-version script, do not edit! -version = '10.6.beta0' -date = '2024-12-08' -banner = 'SageMath version 10.6.beta0, Release Date: 2024-12-08' +version = '10.6.beta2' +date = '2024-12-22' +banner = 'SageMath version 10.6.beta2, Release Date: 2024-12-22' diff --git a/src/sage_docbuild/conf.py b/src/sage_docbuild/conf.py index d90c2eb2dd1..6c8f2d923e9 100644 --- a/src/sage_docbuild/conf.py +++ b/src/sage_docbuild/conf.py @@ -670,6 +670,7 @@ def linkcode_resolve(domain, info): # used when building html version pngmath_latex_preamble += macro + '\n' + # ------------------------------------------ # add custom context variables for templates # ------------------------------------------ @@ -712,10 +713,12 @@ def add_page_context(app, pagename, templatename, context, doctree): dangling_debug = False + def debug_inf(app, message): if dangling_debug: app.info(message) + def call_intersphinx(app, env, node, contnode): r""" Call intersphinx and make links between Sage manuals relative. @@ -749,6 +752,7 @@ def call_intersphinx(app, env, node, contnode): debug_inf(app, "---- Intersphinx: %s not Found" % node['reftarget']) return res + def find_sage_dangling_links(app, env, node, contnode): r""" Try to find dangling link in local module imports or all.py. @@ -859,6 +863,7 @@ def find_sage_dangling_links(app, env, node, contnode): '__builtin__', ] + def check_nested_class_picklability(app, what, name, obj, skip, options): """ Print a warning if pickling is broken for nested classes. @@ -879,6 +884,7 @@ def check_nested_class_picklability(app, what, name, obj, skip, options): 'sage.misc.nested_class.NestedClassMetaclass.' % ( v.__module__ + '.' + name + '.' + nm)) + def skip_member(app, what, name, obj, skip, options): """ To suppress Sphinx warnings / errors, we diff --git a/src/sage_docbuild/ext/sage_autodoc.py b/src/sage_docbuild/ext/sage_autodoc.py index 6f048222437..94e7d076fa9 100644 --- a/src/sage_docbuild/ext/sage_autodoc.py +++ b/src/sage_docbuild/ext/sage_autodoc.py @@ -81,8 +81,12 @@ is_function_or_cython_function) _getdoc = getdoc + + def getdoc(obj, *args, **kwargs): return sage_getdoc_original(obj) + + # ------------------------------------------------------------------ if TYPE_CHECKING: @@ -1616,7 +1620,7 @@ def can_document_member( try: result_bool = isinstance(member, type) or ( isattr and isinstance(member, NewType | TypeVar)) - except: + except Exception: result_bool = isinstance(member, type) or ( isattr and (inspect.isNewType(member) or isinstance(member, TypeVar))) return result_bool @@ -1695,7 +1699,7 @@ def import_object(self, raiseerror: bool = False) -> bool: # support both sphinx 8 and py3.9/older sphinx try: test_bool = isinstance(self.object, NewType | TypeVar) - except: + except Exception: test_bool = inspect.isNewType(self.object) or isinstance(self.object, TypeVar) if test_bool: modname = getattr(self.object, '__module__', self.modname) @@ -1709,7 +1713,7 @@ def _get_signature(self) -> tuple[Any | None, str | None, Signature | None]: # support both sphinx 8 and py3.9/older sphinx try: test_bool = isinstance(self.object, NewType | TypeVar) - except: + except Exception: test_bool = inspect.isNewType(self.object) or isinstance(self.object, TypeVar) if test_bool: # Suppress signature @@ -1899,7 +1903,7 @@ def add_directive_header(self, sig: str) -> None: # support both sphinx 8 and py3.9/older sphinx try: test_bool = isinstance(self.object, NewType | TypeVar) - except: + except Exception: test_bool = inspect.isNewType(self.object) or isinstance(self.object, TypeVar) if test_bool: return @@ -1911,7 +1915,7 @@ def add_directive_header(self, sig: str) -> None: # support both sphinx 8 and py3.9/older sphinx try: newtype_test = isinstance(self.object, NewType) - except: + except Exception: newtype_test = inspect.isNewType(self.object) if (not self.doc_as_attr and not newtype_test and canonical_fullname and self.fullname != canonical_fullname): @@ -2053,7 +2057,7 @@ def add_content(self, more_content: StringList | None) -> None: # support both sphinx 8 and py3.9/older sphinx try: newtype_test = isinstance(self.object, NewType) - except: + except Exception: newtype_test = inspect.isNewType(self.object) if newtype_test: if self.config.autodoc_typehints_format == "short": diff --git a/src/sage_setup/autogen/interpreters/internal/instructions.py b/src/sage_setup/autogen/interpreters/internal/instructions.py index aad7583196d..475c312b274 100644 --- a/src/sage_setup/autogen/interpreters/internal/instructions.py +++ b/src/sage_setup/autogen/interpreters/internal/instructions.py @@ -385,6 +385,7 @@ def instr_funcall_1arg_mpfr(name, io, op): """ return InstrSpec(name, io, code='%s(o0, i0, MPFR_RNDN);' % op) + def instr_funcall_2args_mpc(name, io, op): r""" A helper function for creating MPC instructions with two inputs @@ -400,6 +401,7 @@ def instr_funcall_2args_mpc(name, io, op): """ return InstrSpec(name, io, code='%s(o0, i0, i1, MPC_RNDNN);' % op) + def instr_funcall_1arg_mpc(name, io, op): r""" A helper function for creating MPC instructions with one input diff --git a/src/sage_setup/autogen/interpreters/internal/memory.py b/src/sage_setup/autogen/interpreters/internal/memory.py index 801596e98c8..54710efd6a3 100644 --- a/src/sage_setup/autogen/interpreters/internal/memory.py +++ b/src/sage_setup/autogen/interpreters/internal/memory.py @@ -36,7 +36,7 @@ def string_of_addr(a): """ if isinstance(a, int): return str(a) - assert(isinstance(a, MemoryChunk)) + assert isinstance(a, MemoryChunk) return '*%s++' % a.name diff --git a/src/sage_setup/autogen/interpreters/internal/specs/cc.py b/src/sage_setup/autogen/interpreters/internal/specs/cc.py index cc42a6defab..569ebc633c9 100644 --- a/src/sage_setup/autogen/interpreters/internal/specs/cc.py +++ b/src/sage_setup/autogen/interpreters/internal/specs/cc.py @@ -101,6 +101,7 @@ def pass_call_c_argument(self): """ return "result" + class CCInterpreter(StackInterpreter): r""" A subclass of StackInterpreter, specifying an interpreter over diff --git a/src/sage_setup/autogen/interpreters/internal/storage.py b/src/sage_setup/autogen/interpreters/internal/storage.py index ce77abbe586..76c4f06e06f 100644 --- a/src/sage_setup/autogen/interpreters/internal/storage.py +++ b/src/sage_setup/autogen/interpreters/internal/storage.py @@ -852,6 +852,7 @@ def assign_c_from_py(self, c, py): ty_mpfr = StorageTypeMPFR() + class StorageTypeMPC(StorageTypeAutoReference): r""" StorageTypeMPC is a subtype of StorageTypeAutoReference that deals diff --git a/src/sage_setup/command/sage_build_cython.py b/src/sage_setup/command/sage_build_cython.py index f4b1357c543..880ce7383e2 100644 --- a/src/sage_setup/command/sage_build_cython.py +++ b/src/sage_setup/command/sage_build_cython.py @@ -49,6 +49,7 @@ if DEVEL: extra_compile_args.append('-ggdb') + class sage_build_cython(Command): name = 'build_cython' description = "compile Cython extensions into C/C++ extensions" diff --git a/src/sage_setup/command/sage_build_ext.py b/src/sage_setup/command/sage_build_ext.py index a9c5a87a673..5ef452316f0 100644 --- a/src/sage_setup/command/sage_build_ext.py +++ b/src/sage_setup/command/sage_build_ext.py @@ -15,6 +15,7 @@ from distutils.errors import DistutilsSetupError from sage_setup.run_parallel import execute_list_of_commands + class sage_build_ext(build_ext): def finalize_options(self): build_ext.finalize_options(self) diff --git a/src/sage_setup/excepthook.py b/src/sage_setup/excepthook.py index e5206d9c082..a40cf7cec4d 100644 --- a/src/sage_setup/excepthook.py +++ b/src/sage_setup/excepthook.py @@ -1,6 +1,7 @@ import os import sys + def excepthook(*exc): """ When an error occurs, display an error message similar to the error diff --git a/src/sage_setup/find.py b/src/sage_setup/find.py index e00336b3443..fa963c2a124 100644 --- a/src/sage_setup/find.py +++ b/src/sage_setup/find.py @@ -172,6 +172,7 @@ def find_python_sources(src_dir, modules=['sage'], distributions=None, os.chdir(cwd) return python_packages, python_modules, cython_modules + def filter_cython_sources(src_dir, distributions, exclude_distributions=None): """ Find all Cython modules in the given source directory that belong to the @@ -221,6 +222,7 @@ def filter_cython_sources(src_dir, distributions, exclude_distributions=None): return files + def _cythonized_dir(src_dir=None, editable_install=None): """ Return the path where Cython-generated files are placed by the build system. @@ -343,6 +345,7 @@ def find_extra_files(src_dir, modules, cythonized_dir, special_filenames=[], *, return data_files + def installed_files_by_module(site_packages, modules=('sage',)): """ Find all currently installed files diff --git a/src/sage_setup/run_parallel.py b/src/sage_setup/run_parallel.py index 5e25cd1b6a6..a920f4070e8 100644 --- a/src/sage_setup/run_parallel.py +++ b/src/sage_setup/run_parallel.py @@ -22,6 +22,7 @@ keep_going = False + def run_command(cmd): """ INPUT: @@ -35,6 +36,7 @@ def run_command(cmd): sys.stdout.flush() return os.system(cmd) + def apply_func_progress(p): """ Given a triple p consisting of a function, value and a string, @@ -49,6 +51,7 @@ def apply_func_progress(p): sys.stdout.flush() return p[0](p[1]) + def execute_list_of_commands_in_parallel(command_list, nthreads): """ Execute the given list of commands, possibly in parallel, using @@ -83,6 +86,7 @@ def execute_list_of_commands_in_parallel(command_list, nthreads): pool.join() process_command_results(result) + def process_command_results(result_values): error = None for r in result_values: @@ -94,6 +98,7 @@ def process_command_results(result_values): if error: sys.exit(1) + def execute_list_of_commands(command_list): """ INPUT: @@ -124,10 +129,10 @@ def execute_list_of_commands(command_list): nthreads = min(len(command_list), nthreads) nthreads = max(1, nthreads) - def plural(n,noun): + def plural(n, noun): if n == 1: return "1 %s" % noun - return "%i %ss" % (n,noun) + return "%i %ss" % (n, noun) print("Executing %s (using %s)" % (plural(len(command_list),"command"), plural(nthreads,"thread"))) execute_list_of_commands_in_parallel(command_list, nthreads) diff --git a/src/sage_setup/setenv.py b/src/sage_setup/setenv.py index 48a38afad74..e7ad6552440 100644 --- a/src/sage_setup/setenv.py +++ b/src/sage_setup/setenv.py @@ -4,6 +4,7 @@ import platform from pathlib import Path + def _environ_prepend(var, value, separator=':'): if value: if var in os.environ: @@ -11,6 +12,7 @@ def _environ_prepend(var, value, separator=':'): else: os.environ[var] = value + def setenv(): from sage.env import SAGE_LOCAL, SAGE_VENV, SAGE_ARCHFLAGS, SAGE_PKG_CONFIG_PATH diff --git a/src/tox.ini b/src/tox.ini index a88e9c7f879..68a64b498d5 100644 --- a/src/tox.ini +++ b/src/tox.ini @@ -302,7 +302,6 @@ passenv = RUFF_OUTPUT_FORMAT # 12 F811 [*] Redefinition of unused `CompleteDiscreteValuationRings` from line 49 # 8 PLC0414 [*] Import alias does not rename original package # 7 E743 [ ] Ambiguous function name: `I` -# 7 PLE0101 [ ] Explicit return in `__init__` # 7 PLR0124 [ ] Name compared with itself, consider replacing `a == a` # 5 PLW0127 [ ] Self-assignment of variable `a` # 4 F541 [*] f-string without any placeholders @@ -314,7 +313,7 @@ passenv = RUFF_OUTPUT_FORMAT # 1 F402 [ ] Import `factor` from line 259 shadowed by loop variable # 1 PLC0208 [*] Use a sequence type instead of a `set` when iterating over values # -commands = ruff check --ignore PLR2004,I001,F401,E741,F821,PLR0912,PLR0913,E402,PLR0915,PLW2901,PLR5501,PLR0911,E731,F405,PLR1714,PLR1736,F403,PLR0402,PLW0603,F841,PLW0602,PLW0642,PLR1711,SIM101,PLR1704,PLW3301,PLW1510,E721,PLW0211,PLW0120,F811,PLC2401,PLC0414,E743,PLE0101,PLR0124,PLW0127,F541,PLW1508,PLC3002,E742,PLE0302,PLW0129,F402,PLC0208,PLC0206 {posargs:{toxinidir}/sage/} +commands = ruff check --ignore E402,E721,E731,E741,E742,E743,F401,F402,F403,F405,F541,F811,F821,F841,I001,PLC0206,PLC0208,PLC0414,PLC2401,PLC3002,PLE0302,PLR0124,PLR0402,PLR0911,PLR0912,PLR0913,PLR0915,PLR1704,PLR1711,PLR1714,PLR1736,PLR2004,PLR5501,PLW0120,PLW0127,PLW0129,PLW0211,PLW0602,PLW0603,PLW0642,PLW1508,PLW1510,PLW2901,PLW3301 {posargs:{toxinidir}/sage/} [flake8] rst-roles = diff --git a/subprojects/factory b/subprojects/factory new file mode 160000 index 00000000000..769668a07b8 --- /dev/null +++ b/subprojects/factory @@ -0,0 +1 @@ +Subproject commit 769668a07b8110213dc5d8113ad24dd096439d4c diff --git a/tools/README.md b/tools/README.md index b0c2e4bb68b..4e4905739b5 100644 --- a/tools/README.md +++ b/tools/README.md @@ -2,6 +2,22 @@ This folder contains various command-line tools that are used to facilitate different development tasks. Below is a brief description of each command available in this directory. +## Update Conda Environment Files + +This command is used to update the Conda environment files in the project. It automatically adds new dependencies to the Conda files, removes deleted dependencies, and updates the version of existing dependencies. The source of the dependencies is the `pyproject.toml` file, which specifies the following dependencies: + +- `build-system.requires`: Python dependencies required for building +- `project.dependencies`: Python dependencies required for running +- `external.build-requires`: External dependencies required for building +- `external.host-requires`: External dependencies required for running + + +Within an active virtual environment where `grayskull`, `conda-lock` and `toml` are installed, run the following command: + +```bash +tools/update-conda.py +``` + ## Update Meson Build Files This command is used to updates the Meson build files in the project. It automatically adds new source files (py, pyx) to the Meson files and removes deleted source files. This command is useful when adding or removing source files from the project. @@ -9,5 +25,5 @@ This command is used to updates the Meson build files in the project. It automat Within an active virtual environment where Meson is installed, run the following command: ```bash -tools/update_meson.py +tools/update-meson.py ``` diff --git a/tools/update-conda.py b/tools/update-conda.py new file mode 100644 index 00000000000..7372a3e2379 --- /dev/null +++ b/tools/update-conda.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python3 +# Requirements: pip install https://github.com/conda/grayskull conda-lock +# Usage: python tools/update-conda.py . + +import argparse +import subprocess +from pathlib import Path + +import toml as tomllib +from grayskull.config import Configuration +from grayskull.strategy.py_base import merge_setup_toml_metadata +from grayskull.strategy.py_toml import get_all_toml_info +from grayskull.strategy.pypi import extract_requirements, normalize_requirements_list +from packaging.requirements import Requirement + +# Get source directory from command line arguments +parser = argparse.ArgumentParser() +parser.add_argument( + "sourcedir", help="Source directory", nargs="?", default=".", type=Path +) +options = parser.parse_args() + +platforms = { + "linux-64": "linux", + "linux-aarch64": "linux-aarch64", + "osx-64": "macos-x86_64", + "osx-arm64": "macos", + # "win-64": "win", +} +pythons = ["3.9", "3.10", "3.11"] +tags = [""] + + +def write_env_file(env_file: Path, dependencies: list[str]) -> None: + env_file.write_text( + """name: sage +channels: + - conda-forge + - nodefaults +dependencies: +""" + + "".join(f" - {req}" + "\n" for req in dependencies) + ) + print(f"Conda environment file written to {env_file}") + + +def filter_requirements(dependencies: set[str], python: str) -> set[str]: + def filter_dep(dep: str): + req = Requirement(dep) + env = {"python_version": python} + if not req.marker or req.marker.evaluate(env): + # Serialize the requirement without the marker + req.marker = None + return str(req) + return None + + return set(filter(None, map(filter_dep, dependencies))) + + +def update_conda(source_dir: Path) -> None: + pyproject_toml = source_dir / "pyproject.toml" + if not pyproject_toml.exists(): + print(f"pyproject.toml not found in {pyproject_toml}") + return + + for platform_key, platform_value in platforms.items(): + for python in pythons: + dependencies = get_dependencies(pyproject_toml, python) + for tag in tags: + # Pin Python version + pinned_dependencies = { + f"python={python}" if dep == "python" else dep + for dep in dependencies + } + + dev_dependencies = get_dev_dependencies(pyproject_toml) + print(f"Adding dev dependencies: {dev_dependencies}") + pinned_dependencies = pinned_dependencies.union(dev_dependencies) + + pinned_dependencies = sorted(pinned_dependencies) + + env_file = source_dir / f"environment{tag}-{python}.yml" + write_env_file(env_file, pinned_dependencies) + lock_file = source_dir / f"environment{tag}-{python}-{platform_value}" + lock_file_gen = ( + source_dir / f"environment{tag}-{python}-{platform_value}.yml" + ) + print( + f"Updating lock file for {env_file} at {lock_file_gen}", flush=True + ) + subprocess.run( + [ + "conda-lock", + "--mamba", + "--channel", + "conda-forge", + "--kind", + "env", + "--platform", + platform_key, + "--file", + str(env_file), + "--lockfile", + str(lock_file), + "--filename-template", + str(lock_file), + ], + check=True, + ) + + # Add conda env name to lock file at beginning + with open(lock_file_gen, "r+") as f: + content = f.read() + f.seek(0, 0) + f.write(f"name: sage{tag or '-dev'}\n{content}") + + +def get_dependencies(pyproject_toml: Path, python: str) -> list[str]: + grayskull_config = Configuration("sagemath") + pyproject_metadata = merge_setup_toml_metadata( + {}, get_all_toml_info(pyproject_toml) + ) + requirements = extract_requirements(pyproject_metadata, grayskull_config, {}) + all_requirements = ( + requirements.get("build", []) + + requirements.get("host", []) + + requirements.get("run", []) + ) + + # Specify concrete package for some virtual packages + all_requirements.remove("{{ blas }}") + all_requirements.append("blas=2.*=openblas") + all_requirements.remove("{{ compiler('c') }}") + all_requirements.append("c-compiler") + all_requirements.remove("{{ compiler('cxx') }}") + all_requirements.append("cxx-compiler") + # all_requirements.remove("{{ compiler('fortran') }}") + all_requirements.append("fortran-compiler") + + # Correct pypi name for some packages + python_requirements = set(pyproject_metadata.get("install_requires", [])) + # Specify concrete packages for some packages not yet in grayskull + python_requirements.remove("pkg:generic/tachyon") + python_requirements.add("tachyon") + python_requirements.remove("pkg:generic/sagemath-elliptic-curves") + python_requirements.add("sagemath-db-elliptic-curves") + python_requirements.remove("pkg:generic/sagemath-polytopes-db") + python_requirements.add("sagemath-db-polytopes") + python_requirements.discard("pkg:generic/sagemath-graphs") + python_requirements.add("sagemath-db-graphs") + python_requirements.remove("memory_allocator") + python_requirements.add("memory-allocator") + # Following can be removed once https://github.com/regro/cf-scripts/pull/2176 is used in grayskull + python_requirements = { + req.replace("lrcalc", "python-lrcalc") for req in python_requirements + } + python_requirements = filter_requirements(python_requirements, python) + all_requirements += normalize_requirements_list( + python_requirements, grayskull_config + ) + all_requirements.remove("<{ pin_compatible('numpy') }}") + all_requirements.remove("memory_allocator") + # Needed to run configure/bootstrap, can be deleted once we fully migrated to meson + all_requirements.append("autoconf") + all_requirements.append("automake") + all_requirements.append("m4") + # Needed to fix a bug on Macos with broken pkg-config + all_requirements.append("expat") + return all_requirements + + +def get_dev_dependencies(pyproject_toml: Path) -> list[str]: + pyproject = tomllib.load(pyproject_toml) + dependency_groups = pyproject.get("dependency-groups", {}) + dev_dependencies = dependency_groups.get("test", []) + dependency_groups.get( + "docs", [] + ) + return dev_dependencies + + +update_conda(options.sourcedir) diff --git a/tools/update-meson.py b/tools/update-meson.py index 827b7d9b5a3..1a53ac21397 100755 --- a/tools/update-meson.py +++ b/tools/update-meson.py @@ -86,9 +86,6 @@ def update_python_sources(self: Rewriter, visitor: AstPython): to_append: list[StringNode] = [] for file in python_files: file_name = file.name - if file_name == "__init__.py": - # We don't want to add __init__.py files - continue if file_name in src_list: continue token = Token("string", target.filename, 0, 0, 0, None, file_name)