From 683a1dd1a5a23a7caa98a5c7cc30fdca3d036228 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Sun, 10 Oct 2021 15:14:21 +0200 Subject: [PATCH 001/169] Add documentation for following NEP 29 --- src/doc/en/developer/coding_basics.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/doc/en/developer/coding_basics.rst b/src/doc/en/developer/coding_basics.rst index f6413de91e8..5fab6832ca2 100644 --- a/src/doc/en/developer/coding_basics.rst +++ b/src/doc/en/developer/coding_basics.rst @@ -87,6 +87,16 @@ In particular, def SomeIdentityValue(x): return SomeValue(1) +.. _section-python-version: + +Python Version +================= + +Sage supports all minor versions of Python released 42 months prior to the next planned release date, and at minimum the two latest minor versions. +Accordingly, Python 3.7 and newer are supported at the moment. +On Dec 26, 2021 support for Python 3.7 is dropped (initially released on Jun 27, 2018). +This is to reduce the technical debt of maintaining the project. +The support policy follows Numpy's version support recommendations `NEP 29 `_. .. _chapter-directory-structure: From edf1711828659e3ac6914a9d9f021e9f38a27375 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 3 Jan 2022 13:52:13 +0100 Subject: [PATCH 002/169] Reformulate to emphasize the focus on old Python versions --- src/doc/en/developer/coding_basics.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/doc/en/developer/coding_basics.rst b/src/doc/en/developer/coding_basics.rst index bdc34d75476..be67ca12dbc 100644 --- a/src/doc/en/developer/coding_basics.rst +++ b/src/doc/en/developer/coding_basics.rst @@ -92,11 +92,13 @@ In particular, Python Version ================= -Sage supports all minor versions of Python released 42 months prior to the next planned release date, and at minimum the two latest minor versions. -Accordingly, Python 3.7 and newer are supported at the moment. -On Dec 26, 2021 support for Python 3.7 is dropped (initially released on Jun 27, 2018). -This is to reduce the technical debt of maintaining the project. -The support policy follows Numpy's version support recommendations `NEP 29 `_. +In order to reduce the technical debt of maintaining the project, Sage follows +Numpy's time window-based support policy +`NEP 29 `_ for Python versions. +Accordingly, minor versions of Python that are older than 42 months +at the next planned release date are no longer supported. +In December 2021 support for Python 3.7 (initially released in June 2018) is dropped and +in April 2023 support for Python 3.8 is dropped (initially released in October 2019). .. _chapter-directory-structure: From b3a120f83c5816737d605d1d3b2c3bfbb087d072 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Fri, 31 Mar 2023 13:46:58 +0800 Subject: [PATCH 003/169] For new python versions --- src/doc/en/developer/coding_basics.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/doc/en/developer/coding_basics.rst b/src/doc/en/developer/coding_basics.rst index 706f6af1538..b31af7bfce2 100644 --- a/src/doc/en/developer/coding_basics.rst +++ b/src/doc/en/developer/coding_basics.rst @@ -97,8 +97,8 @@ Numpy's time window-based support policy `NEP 29 `_ for Python versions. Accordingly, minor versions of Python that are older than 42 months at the next planned release date are no longer supported. -In December 2021 support for Python 3.7 (initially released in June 2018) is dropped and -in April 2023 support for Python 3.8 is dropped (initially released in October 2019). +Support for Python 3.9 (initially released in October 2020) is dropped in April 2024 and +support for Python 3.10 (initially released in October 2021) is dropped in April 2025. .. _chapter-directory-structure: From 2cecaaf78631bcadd608fce573f137f4ff6163bb Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Thu, 13 Jun 2024 01:10:56 +0100 Subject: [PATCH 004/169] rename PolynomialRing_general to PolynomialRing_generic --- src/sage/algebras/weyl_algebra.py | 4 +- src/sage/categories/drinfeld_modules.py | 4 +- src/sage/modular/drinfeld_modform/ring.py | 4 +- src/sage/rings/asymptotic/growth_group.py | 4 +- src/sage/rings/cfinite_sequence.py | 4 +- src/sage/rings/derivation.py | 6 +- .../drinfeld_modules/drinfeld_module.py | 4 +- src/sage/rings/lazy_series.py | 8 +-- src/sage/rings/polynomial/cyclotomic.pyx | 2 +- src/sage/rings/polynomial/pbori/pbori.pyx | 4 +- src/sage/rings/polynomial/polynomial_ring.py | 58 ++++++++++++++----- .../polynomial/polynomial_ring_constructor.py | 2 +- src/sage/rings/power_series_pari.pyx | 4 +- 13 files changed, 70 insertions(+), 38 deletions(-) diff --git a/src/sage/algebras/weyl_algebra.py b/src/sage/algebras/weyl_algebra.py index 247b6107e0f..78961b0ead9 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/categories/drinfeld_modules.py b/src/sage/categories/drinfeld_modules.py index c2ba86e9f2f..80cf7f7861e 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/modular/drinfeld_modform/ring.py b/src/sage/modular/drinfeld_modform/ring.py index bb638e339ab..23987968544 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 @@ -264,7 +264,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/rings/asymptotic/growth_group.py b/src/sage/rings/asymptotic/growth_group.py index 1d7d3049405..f1d7f0b68fc 100644 --- a/src/sage/rings/asymptotic/growth_group.py +++ b/src/sage/rings/asymptotic/growth_group.py @@ -3618,7 +3618,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 @@ -3628,7 +3628,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/cfinite_sequence.py b/src/sage/rings/cfinite_sequence.py index f34f4514186..815da72bd8b 100644 --- a/src/sage/rings/cfinite_sequence.py +++ b/src/sage/rings/cfinite_sequence.py @@ -94,7 +94,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 @@ -146,7 +146,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/derivation.py b/src/sage/rings/derivation.py index 2702f497d66..30beb62c483 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 @@ -332,9 +332,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/function_field/drinfeld_modules/drinfeld_module.py b/src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py index 958347113c0..f3d9bcfa1ef 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 @@ -565,7 +565,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/lazy_series.py b/src/sage/rings/lazy_series.py index 74744c311da..9b8b8ebc01e 100644 --- a/src/sage/rings/lazy_series.py +++ b/src/sage/rings/lazy_series.py @@ -4208,8 +4208,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)) @@ -5209,7 +5209,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 @@ -5217,7 +5217,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/polynomial/cyclotomic.pyx b/src/sage/rings/polynomial/cyclotomic.pyx index 84f85104cc3..09ba2657843 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/pbori/pbori.pyx b/src/sage/rings/polynomial/pbori/pbori.pyx index 3c06d1e390e..c94223e2172 100644 --- a/src/sage/rings/polynomial/pbori/pbori.pyx +++ b/src/sage/rings/polynomial/pbori/pbori.pyx @@ -195,7 +195,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 @@ -675,7 +675,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_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index bdcfb2de0ae..b7786239a1b 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 @@ -221,12 +222,12 @@ def is_PolynomialRing(x): sage: type(R) """ - return isinstance(x, PolynomialRing_general) + return isinstance(x, PolynomialRing_generic) ######################################################################################### -class PolynomialRing_general(Ring): +class PolynomialRing_generic(Ring): """ Univariate polynomial ring over a ring. """ @@ -510,12 +511,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 @@ -539,8 +540,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": @@ -1569,7 +1570,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. """ @@ -1648,7 +1649,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. @@ -1713,7 +1714,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. @@ -1776,7 +1777,38 @@ 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): +# Placeholder class for deprecation +class PolynomialRing_general(PolynomialRing_generic): + """ + Univariate polynomial ring over a ring. + + This class is deprecated. Please use :class:`PolynomialRing_generic`. + """ + + def __init__(self, *args, **kwds): + """ + This class is deprecated. Please use :class:`PolynomialRing_generic`. + + TESTS:: + + sage: from sage.rings.polynomial.polynomial_ring import PolynomialRing_general, PolynomialRing_generic + sage: PolynomialRing_general(QQ, name="a") + doctest:warning...DeprecationWarning: + The class PolynomialRing_general has been renamed to PolynomialRing_generic... + Univariate Polynomial Ring in a over Rational Field + + Check they provide the same functionalities for backward compatability:: + + sage: dir(PolynomialRing_general(QQ, name="a")) == dir(PolynomialRing_generic(QQ, name="a")) + True + """ + deprecation( + 38207, "The class PolynomialRing_general has been renamed to PolynomialRing_generic." + ) + super().__init__(*args, **kwds) + + +class PolynomialRing_commutative(PolynomialRing_generic): """ Univariate polynomial ring over a commutative ring. """ @@ -1790,7 +1822,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) diff --git a/src/sage/rings/polynomial/polynomial_ring_constructor.py b/src/sage/rings/polynomial/polynomial_ring_constructor.py index e417e8a6779..2347a6c7129 100644 --- a/src/sage/rings/polynomial/polynomial_ring_constructor.py +++ b/src/sage/rings/polynomial/polynomial_ring_constructor.py @@ -793,7 +793,7 @@ def _single_variate(base_ring, name, sparse=None, implementation=None, order=Non # Generic implementations if constructor is None: if 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/power_series_pari.pyx b/src/sage/rings/power_series_pari.pyx index c9ff9beeee7..5c627bc9666 100644 --- a/src/sage/rings/power_series_pari.pyx +++ b/src/sage/rings/power_series_pari.pyx @@ -425,7 +425,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): @@ -442,7 +442,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 From a169818e15f16d1e88b241594d100ede53510e16 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 5 Aug 2024 11:06:47 +0700 Subject: [PATCH 005/169] Changes related to lattice --- src/sage/schemes/elliptic_curves/ell_field.py | 49 ++++++++++++ .../schemes/elliptic_curves/period_lattice.py | 75 ++++++++++++------- 2 files changed, 97 insertions(+), 27 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index decf0a3d0b5..c71282da244 100755 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1528,6 +1528,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:: + + 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 'embeddings' + sage: EllipticCurve(GF(7), [1, 6]).period_lattice() + Traceback (most recent call last): + ... + AttributeError: 'FiniteField_prime_modn_with_category' object has no attribute 'embeddings' + """ + 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/period_lattice.py b/src/sage/schemes/elliptic_curves/period_lattice.py index 9db15a6eba7..2d7d9cb9114 100755 --- a/src/sage/schemes/elliptic_curves/period_lattice.py +++ b/src/sage/schemes/elliptic_curves/period_lattice.py @@ -111,11 +111,11 @@ 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.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 @@ -223,12 +223,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 +263,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 +341,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) @@ -630,6 +643,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 +690,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 +708,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 +777,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 +1125,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: @@ -1421,7 +1439,7 @@ def e_log_RC(self, xP, yP, prec=None, reduce=True): 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. @@ -1713,7 +1731,7 @@ def elliptic_logarithm(self, P, prec=None, reduce=True): 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) @@ -1926,7 +1944,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 From 63882f407ea6c84988794380314058099de31726 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 5 Aug 2024 16:58:39 +0700 Subject: [PATCH 006/169] More tests --- .../schemes/elliptic_curves/period_lattice.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/sage/schemes/elliptic_curves/period_lattice.py b/src/sage/schemes/elliptic_curves/period_lattice.py index 2d7d9cb9114..a16aee50375 100755 --- a/src/sage/schemes/elliptic_curves/period_lattice.py +++ b/src/sage/schemes/elliptic_curves/period_lattice.py @@ -1727,6 +1727,56 @@ 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(_) + (3.00000000000000 + 9.20856947066460e-16*I : -5.59022723358798 - 0.0894418024719718*I : 1.00000000000000) + sage: L.elliptic_logarithm(P, prec=100) + -3.4730631218714889933426781799 + 0.44627675553762761312098773197*I + sage: L.elliptic_exponential(_) + (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") From b41951159b7ad13283994069ba0b0f51f6ac3768 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 5 Aug 2024 17:02:18 +0700 Subject: [PATCH 007/169] Fix failing tests --- src/sage/schemes/elliptic_curves/period_lattice.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/period_lattice.py b/src/sage/schemes/elliptic_curves/period_lattice.py index a16aee50375..4209eca8aeb 100755 --- a/src/sage/schemes/elliptic_curves/period_lattice.py +++ b/src/sage/schemes/elliptic_curves/period_lattice.py @@ -114,6 +114,7 @@ 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, RealField_class, RealNumber from sage.schemes.elliptic_curves.constructor import EllipticCurve @@ -213,8 +214,6 @@ def __init__(self, E, embedding=None): sage: L == loads(dumps(L)) True """ - from sage.rings.qqbar import AA, QQbar - # First we cache the elliptic curve with this period lattice: self.E = E From 62b05ff59f1bee3dcfb0ba08b5420ec6bf26ed7b Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:19:51 +0700 Subject: [PATCH 008/169] Coverage test --- src/sage/schemes/elliptic_curves/period_lattice.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/sage/schemes/elliptic_curves/period_lattice.py b/src/sage/schemes/elliptic_curves/period_lattice.py index 4209eca8aeb..f3a565fdd7a 100755 --- a/src/sage/schemes/elliptic_curves/period_lattice.py +++ b/src/sage/schemes/elliptic_curves/period_lattice.py @@ -213,6 +213,15 @@ def __init__(self, E, embedding=None): sage: L = PeriodLattice_ell(E,emb) sage: L == loads(dumps(L)) True + + 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)) + -0.773376784700140 - 0.177736018028666*I + sage: L.elliptic_exponential(_) + (1.00000000000000 - 1.00000000000000*I : 2.00000000000000 - 1.00000000000000*I : 1.00000000000000) """ # First we cache the elliptic curve with this period lattice: From 836897c0b3809f268e4c21e32766997b351ad567 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Thu, 7 Nov 2024 18:45:46 +0100 Subject: [PATCH 009/169] use realloc in method OP_make_set --- .../perm_gps/partn_ref/data_structures.pxd | 33 +------------ .../perm_gps/partn_ref/data_structures.pyx | 48 ++++++++++++++++--- src/sage/sets/disjoint_set.pyx | 14 ++++-- 3 files changed, 53 insertions(+), 42 deletions(-) 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..54df1d8486e 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pxd +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pxd @@ -138,38 +138,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 919deebd0de..745afaa9827 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pyx +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pyx @@ -46,23 +46,31 @@ 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: + sig_free(OP) + 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): @@ -78,6 +86,32 @@ 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. diff --git a/src/sage/sets/disjoint_set.pyx b/src/sage/sets/disjoint_set.pyx index ddd9a95a310..7d92805800a 100644 --- a/src/sage/sets/disjoint_set.pyx +++ b/src/sage/sets/disjoint_set.pyx @@ -555,11 +555,12 @@ cdef class DisjointSet_of_integers(DisjointSet_class): r""" Add a new element into a new set containing only the new element. - According to :wikipedia:`Disjoint-set_data_structure#Making_new_sets` the - `make_set` operation adds a new element into a new set containing only - the new element. The new set is added at the end of `self`. + According to :wikipedia:`Disjoint-set_data_structure#Making_new_sets` + the `make_set` operation adds a new element into a new set containing + only 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) From 8a944d9721a33b81b441d2c6bfcf1794c2078697 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Fri, 8 Nov 2024 10:23:14 +0100 Subject: [PATCH 010/169] PR 38936: update method OP_copy --- src/sage/groups/perm_gps/partn_ref/data_structures.pxd | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 54df1d8486e..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: """ From afab190e12270c686c0e76eeff621b72f768db28 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sat, 9 Nov 2024 16:07:06 +0700 Subject: [PATCH 011/169] Some documentation improvement --- src/doc/en/developer/coding_in_cython.rst | 13 +++++++++---- src/doc/en/reference/repl/index.rst | 6 ++++-- src/doc/en/tutorial/index.rst | 2 -- src/sage/misc/cython.py | 6 ++++++ src/sage/misc/persist.pyx | 2 +- src/sage/repl/load.py | 13 ++++++++++--- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/doc/en/developer/coding_in_cython.rst b/src/doc/en/developer/coding_in_cython.rst index d0c7b0d521f..cb8f86e0fb7 100644 --- a/src/doc/en/developer/coding_in_cython.rst +++ b/src/doc/en/developer/coding_in_cython.rst @@ -60,14 +60,19 @@ There are several ways to create and build Cython code in Sage. %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). +#. Create an ``.spyx`` file and :ref:`attach or load it ` + from the :ref:`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). + +#. Use ``%%cython`` cell magic in the command line. + Refer to :meth:`sage.repl.ipython_extension.SageMagics.cython`. #. Create a ``.pyx`` file and add it to the Sage library. Then run ``sage -b`` to rebuild Sage. +.. _section-attach-or-load-spyx-files: Attaching or loading .spyx files ================================ diff --git a/src/doc/en/reference/repl/index.rst b/src/doc/en/reference/repl/index.rst index d12d8866dda..d74580db5af 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 :ref:`the Sage +tutorial <../../tutorial/index.html>`. Running Sage ------------ 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/misc/cython.py b/src/sage/misc/cython.py index 95491a5c623..c542e0d1919 100644 --- a/src/sage/misc/cython.py +++ b/src/sage/misc/cython.py @@ -578,6 +578,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 +624,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/persist.pyx b/src/sage/misc/persist.pyx index 55540dc27b7..61c00705f94 100644 --- a/src/sage/misc/persist.pyx +++ b/src/sage/misc/persist.pyx @@ -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``. diff --git a/src/sage/repl/load.py b/src/sage/repl/load.py index a1a1451f1c2..205d3559dcf 100644 --- a/src/sage/repl/load.py +++ b/src/sage/repl/load.py @@ -87,6 +87,11 @@ 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. + INPUT: - ``filename`` -- string (denoting a filename or URL) or a :class:`Path` object @@ -97,13 +102,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: From 8923ec94407c5f41546bc16785f1ca8e5c211a84 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 12 Nov 2024 12:46:11 +0700 Subject: [PATCH 012/169] Fix failing tests --- src/sage/schemes/elliptic_curves/ell_field.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 8e9a9f1134a..7e27efcb7ac 100755 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1559,7 +1559,7 @@ def period_lattice(self): 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:: + Unsupported cases (the exact error being raised may change in the future):: sage: EllipticCurve(ZZ, [1, 6]).period_lattice() Traceback (most recent call last): @@ -1569,11 +1569,11 @@ def period_lattice(self): sage: EllipticCurve(QQt.fraction_field(), [1, 6]).period_lattice() Traceback (most recent call last): ... - AttributeError: 'FractionField_1poly_field_with_category' object has no attribute 'embeddings' + AttributeError: 'FractionField_1poly_field_with_category' object has no attribute ... sage: EllipticCurve(GF(7), [1, 6]).period_lattice() Traceback (most recent call last): ... - AttributeError: 'FiniteField_prime_modn_with_category' object has no attribute 'embeddings' + IndexError: list index out of range """ from sage.schemes.elliptic_curves.period_lattice import PeriodLattice_ell return PeriodLattice_ell(self) From d550d38e5304769378144781add36debb50a6ca9 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:53:27 +0700 Subject: [PATCH 013/169] Apply suggested changes --- src/doc/en/developer/coding_in_cython.rst | 24 +++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/doc/en/developer/coding_in_cython.rst b/src/doc/en/developer/coding_in_cython.rst index cb8f86e0fb7..5543709b779 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 command-line, begin any cell with + a line containing ``%%cython``. When you evaluate that cell, #. It is saved to a file. @@ -53,27 +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 :ref:`attach or load it ` - from the :ref:`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). - -#. Use ``%%cython`` cell magic in the command line. 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. -.. _section-attach-or-load-spyx-files: - Attaching or loading .spyx files ================================ From cdb00c6ec306861be49f88e473dd3a7a23fa3ec9 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:58:38 +0700 Subject: [PATCH 014/169] Mention attach() from repl.load() documentation --- src/sage/repl/load.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sage/repl/load.py b/src/sage/repl/load.py index 205d3559dcf..24e4dbc4da1 100644 --- a/src/sage/repl/load.py +++ b/src/sage/repl/load.py @@ -166,7 +166,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: From aae58dab61bdafddd483a91c82b83d2c402ffa9b Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:05:57 +0700 Subject: [PATCH 015/169] Add some cross-linking between magic and function --- src/sage/repl/attach.py | 8 ++++++-- src/sage/repl/ipython_extension.py | 8 ++++++++ src/sage/repl/load.py | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) 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/ipython_extension.py b/src/sage/repl/ipython_extension.py index b6fc42bbb37..2fdc2f14669 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 diff --git a/src/sage/repl/load.py b/src/sage/repl/load.py index 24e4dbc4da1..6cd0c792c76 100644 --- a/src/sage/repl/load.py +++ b/src/sage/repl/load.py @@ -92,6 +92,9 @@ def load(filename, globals, attach=False): 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 From 6c188738572cfa3e8c358cc415a537c9a995d6d9 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 12 Nov 2024 20:07:04 +0700 Subject: [PATCH 016/169] Minor clarification --- src/doc/en/developer/coding_in_cython.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/doc/en/developer/coding_in_cython.rst b/src/doc/en/developer/coding_in_cython.rst index 5543709b779..0ab239be7bc 100644 --- a/src/doc/en/developer/coding_in_cython.rst +++ b/src/doc/en/developer/coding_in_cython.rst @@ -37,7 +37,7 @@ Writing Cython code in Sage There are several ways to create and build Cython code in Sage. -#. In the Sage Notebook or the command-line, begin any cell with +#. 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. From 96c29d7c6d3477cfbcce6d3ca949da91445037e2 Mon Sep 17 00:00:00 2001 From: Dave Witte Morris Date: Tue, 15 Oct 2024 12:00:30 -0400 Subject: [PATCH 017/169] fix is_t_design --- src/sage/combinat/designs/incidence_structures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/combinat/designs/incidence_structures.py b/src/sage/combinat/designs/incidence_structures.py index e9964af900c..e4875a231eb 100644 --- a/src/sage/combinat/designs/incidence_structures.py +++ b/src/sage/combinat/designs/incidence_structures.py @@ -1653,7 +1653,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 From f3d5c8dde3b605cdd1c66e9b73e7b3c02f865f6a Mon Sep 17 00:00:00 2001 From: Dave Witte Morris Date: Fri, 15 Nov 2024 21:20:54 -0500 Subject: [PATCH 018/169] add doctest --- src/sage/combinat/designs/incidence_structures.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/sage/combinat/designs/incidence_structures.py b/src/sage/combinat/designs/incidence_structures.py index e4875a231eb..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 From 493d3f74d455659231c5641101269797fda82b58 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:11:03 +0700 Subject: [PATCH 019/169] Document RealIntervalField default printing configuration --- src/sage/rings/real_mpfi.pyx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/sage/rings/real_mpfi.pyx b/src/sage/rings/real_mpfi.pyx index 11953a50ab5..cd2575142d4 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 (``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``) From c9e5c99a59a525d9edbe97de6d2e24660485e105 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:55:20 +0700 Subject: [PATCH 020/169] Allow construct RIF element from question-style string --- src/sage/libs/mpfi/__init__.pxd | 4 +- src/sage/libs/mpfr/__init__.pxd | 4 +- src/sage/rings/convert/mpfi.pyx | 247 ++++++++++++++++++++++++++++++++ 3 files changed, 251 insertions(+), 4 deletions(-) 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/rings/convert/mpfi.pyx b/src/sage/rings/convert/mpfi.pyx index 106a94c5aca..4007455bcfd 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?2e1000000000"); x + 1.12346?e1000000000 + sage: x.str(style="question", error_digits=3) + '1.12345600?201e1000000000' + + 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) From 747150dc525ee146fab2598dedd2f41c4faf2525 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Sat, 28 May 2022 14:21:41 +0800 Subject: [PATCH 021/169] move elliptic-curve point addition to superclass --- src/sage/schemes/elliptic_curves/ell_point.py | 88 ++++++++----------- 1 file changed, 35 insertions(+), 53 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 6aa63fc6370..bc48938aec9 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -179,6 +179,22 @@ 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. + """ + raise NotImplementedError + + def _sub_(self, other): + """ + Subtract another point on the same elliptic curve from this point. + + This method computes point subtractions for fairly general rings. + """ + return self + (-other) + class EllipticCurvePoint_field(EllipticCurvePoint, SchemeMorphism_point_abelian_variety_field): @@ -680,9 +696,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,8 +711,12 @@ def _add_(self, right): sage: P._add_(Q) == P + Q True + TESTS: + Example to show that bug :issue:`4820` is fixed:: + Example to show that bug :trac:`4820` is fixed:: + sage: [type(c) for c in 2*EllipticCurve('37a1').gen(0)] [<... 'sage.rings.rational.Rational'>, <... 'sage.rings.rational.Rational'>, @@ -727,16 +749,18 @@ 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 @@ -770,50 +794,8 @@ def _add_(self, right): # 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``. - - 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): - """ - Return the additive inverse of this point. - - EXAMPLES:: - - sage: E = EllipticCurve('389a') - sage: P = E([-1,1]) - sage: Q = -P; Q - (-1 : -2 : 1) - sage: Q + P - (0 : 1 : 0) - - Example to show that bug :issue:`4820` is fixed:: - - sage: [type(c) for c in -EllipticCurve('37a1').gen(0)] - [<... 'sage.rings.rational.Rational'>, - <... 'sage.rings.rational.Rational'>, - <... 'sage.rings.rational.Rational'>] - """ - if self.is_zero(): - return self - E, x, y = self.curve(), self[0], self[1] - # See trac #4820 for why we need to coerce 1 into the base ring here: - return E.point([x, -y - E.a1()*x - E.a3(), E.base_ring().one()], check=False) + _sub_ = EllipticCurvePoint._sub_ + _neg_ = EllipticCurvePoint._neg_ def xy(self): """ From d528724b4fe8078a8ccc084e6ab53b50c4667630 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Tue, 25 Jan 2022 11:48:04 +0800 Subject: [PATCH 022/169] undo ancient hack for elliptic-curve points modulo composites --- src/sage/schemes/elliptic_curves/ell_generic.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py index 6f2532e2b3b..c53910d6bbc 100755 --- 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,13 +173,6 @@ 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 _defining_params_(self): @@ -582,7 +573,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]) From 697f64225615dcad11d486ab001c5a371a3db439 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Thu, 22 Feb 2024 05:51:38 +0100 Subject: [PATCH 023/169] replace ancient hack by more flexible, modern hack --- .../schemes/elliptic_curves/ell_generic.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py index c53910d6bbc..a6e2a8222c3 100755 --- a/src/sage/schemes/elliptic_curves/ell_generic.py +++ b/src/sage/schemes/elliptic_curves/ell_generic.py @@ -175,6 +175,45 @@ def __init__(self, K, ainvs, category=None): _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. + + 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. + + EXAMPLES:: + + sage: E = EllipticCurve(Zmod(35), [1,1]) + sage: P = E(-5, 9) + sage: 4*P + (23 : 26 : 1) + sage: 9*P + (30 : 33 : 15) + sage: E.assume_base_ring_is_field() + sage: P = E(-5, 9) + sage: 4*P + (23 : 26 : 1) + sage: 9*P + (30 : 33 : 15) + Traceback (most recent call last): + ... + ZeroDivisionError: Inverse of 30 does not exist (modulus = 35 = 5*7) + + .. NOTE:: + + This method is a **hack** provided for educational purposes. + """ + 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 From a1142aecc980999275b95d19c3bc8a5e0021bb09 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Tue, 25 Jan 2022 11:52:26 +0800 Subject: [PATCH 024/169] update documentation to reflect this change --- src/sage/schemes/elliptic_curves/ell_point.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index bc48938aec9..e020be3d9f2 100755 --- 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 +somewhat generic addition formulas. (Not implemented yet.) + +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: From 152b8b7ccc60d2d988c1445d2d90e3bffc72f818 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 24 Aug 2022 11:00:58 +0800 Subject: [PATCH 025/169] implement Bosma-Lenstra formulas (corrected version from Best) --- src/doc/en/reference/references/index.rst | 7 ++ .../elliptic_curves/addition_formulas_ring.py | 48 +++++++++++++ src/sage/schemes/elliptic_curves/ell_point.py | 71 ++++++++++++++++++- 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 src/sage/schemes/elliptic_curves/addition_formulas_ring.py diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index 45f5fbc090f..dc3a714dbba 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -496,6 +496,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., @@ -970,6 +973,10 @@ REFERENCES: Anal. Appl. 15 (1994) 804-823. :doi:`10.1137/S0895479892230031` +.. [BL1995] W. Bosma, H.W. Lenstra: Complete Systems of 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). 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..21463e490d4 --- /dev/null +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -0,0 +1,48 @@ + +def add(E, P, Q): + r""" + Addition formulas for elliptic curves over general rings + with trivial Picard group. + + REFERENCES: + + These formulas were derived by Bosma and Lenstra [BL1995]_, + with corrections by Best [Best2021]_ (Appendix A). + """ + a1, a2, a3, a4, a6 = E.a_invariants() + b2, b4, b6, b8 = E.b_invariants() + + assert P in E + assert Q 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/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index e020be3d9f2..130d9289fa0 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -3,7 +3,7 @@ The base class :class:`EllipticCurvePoint` provides support for points on elliptic curves defined over general rings, including -somewhat generic addition formulas. (Not implemented yet.) +generic addition formulas. The derived classes :class:`EllipticCurvePoint_field` and its child classes :class:`EllipticCurvePoint_number_field` and @@ -186,8 +186,75 @@ def _add_(self, other): Add this point to another point on the same elliptic curve. This method computes point additions for fairly general rings. + + ALGORITHM: + + 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 + + Checks that :trac:`15964` is fixed:: + + sage: N = 1715761513 + sage: E = EllipticCurve(Integers(N),[3,-13]) + sage: P = E(2,1) + sage: LCM([2..60])*P + Traceback (most recent call last): + ... + ZeroDivisionError: Inverse of 1520944668 does not exist + (characteristic = 1715761513 = 26927*63719) + + sage: N = 35 + sage: E = EllipticCurve(Integers(N),[5,1]) + sage: P = E(0,1) + sage: LCM([2..6])*P + Traceback (most recent call last): + ... + ZeroDivisionError: Inverse of 28 does not exist + (characteristic = 35 = 7*5) """ - raise NotImplementedError + if self.is_zero(): + return other + if other.is_zero(): + return self + + E = self.curve() + R = E.base_ring() + + 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) + + assert False, 'bug: failed to compute elliptic-curve point addition' def _sub_(self, other): """ From c86dae9b8f23930e37902c9fa61085274d951a3b Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 24 Aug 2022 12:17:09 +0800 Subject: [PATCH 026/169] =?UTF-8?q?add=20random=20test=20for=20point=20add?= =?UTF-8?q?ition=20in=20=E2=84=A4/n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sage/schemes/elliptic_curves/ell_point.py | 48 ++++++++++++------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 130d9289fa0..001eefbae44 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -203,25 +203,37 @@ def _add_(self, other): sage: R1 + R2 == R3 True - Checks that :trac:`15964` is fixed:: - - sage: N = 1715761513 - sage: E = EllipticCurve(Integers(N),[3,-13]) - sage: P = E(2,1) - sage: LCM([2..60])*P - Traceback (most recent call last): - ... - ZeroDivisionError: Inverse of 1520944668 does not exist - (characteristic = 1715761513 = 26927*63719) + TESTS: - sage: N = 35 - sage: E = EllipticCurve(Integers(N),[5,1]) - sage: P = E(0,1) - sage: LCM([2..6])*P - Traceback (most recent call last): - ... - ZeroDivisionError: Inverse of 28 does not exist - (characteristic = 35 = 7*5) + 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 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 From b0523d2bb2873e6d6c5dc3fe785303f49ff1525c Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 24 Aug 2022 12:15:44 +0800 Subject: [PATCH 027/169] undo ancient hack for ECM examples --- .../schemes/elliptic_curves/ell_generic.py | 1 - src/sage/schemes/elliptic_curves/ell_point.py | 55 ++++++++++--------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py index a6e2a8222c3..5b05f2fd807 100755 --- a/src/sage/schemes/elliptic_curves/ell_generic.py +++ b/src/sage/schemes/elliptic_curves/ell_generic.py @@ -197,7 +197,6 @@ def assume_base_ring_is_field(self, flag=True): sage: 4*P (23 : 26 : 1) sage: 9*P - (30 : 33 : 15) Traceback (most recent call last): ... ZeroDivisionError: Inverse of 30 does not exist (modulus = 35 = 5*7) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 001eefbae44..18fba1d7f97 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -75,18 +75,27 @@ 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 `\ZZ/N\ZZ` 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 + (1048079621 : 789440415 : 1590093204) + +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 + ZeroDivisionError: Inverse of 1520944668 does not exist (characteristic = 1715761513 = 26927*63719) AUTHORS: @@ -845,30 +854,22 @@ def _add_(self, other): 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) From 20f5774b08f48c7d9eb2ea69b7820e94937d473d Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 24 Aug 2022 12:16:51 +0800 Subject: [PATCH 028/169] add changes to history --- src/sage/schemes/elliptic_curves/ell_point.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 18fba1d7f97..0e328e5ec12 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -115,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 """ # **************************************************************************** From e158814dc9bb0bdff631662cdb2529bf82c304a2 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Tue, 13 Sep 2022 16:24:29 +0800 Subject: [PATCH 029/169] add doctest for generic addition formulas --- .../elliptic_curves/addition_formulas_ring.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py index 21463e490d4..a1595e0748e 100644 --- a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -8,6 +8,23 @@ def add(E, P, Q): 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 """ a1, a2, a3, a4, a6 = E.a_invariants() b2, b4, b6, b8 = E.b_invariants() From f2dbd8d8d3fcb44718cd43d4de418caad163d9ee Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Mon, 12 Sep 2022 18:40:03 +0800 Subject: [PATCH 030/169] faster elliptic-curve addition formulas for quotients of Euclidean domains --- src/sage/schemes/elliptic_curves/ell_point.py | 79 ++++++++++++++++++- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 0e328e5ec12..0cf0d60332a 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -140,7 +140,17 @@ 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, @@ -200,8 +210,12 @@ def _add_(self, other): ALGORITHM: - Formulas due to Bosma and Lenstra [BL1995]_ with corrections - by Best [Best2021]_ (Appendix A). + 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:: @@ -254,6 +268,65 @@ def _add_(self, other): 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(pt, check=False) + from sage.schemes.elliptic_curves.addition_formulas_ring import add from sage.modules.free_module_element import vector @@ -275,7 +348,7 @@ def _add_(self, other): 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) + return E.point(result, check=False) assert False, 'bug: failed to compute elliptic-curve point addition' From dca53c3c193f7cd1c49f201374b0e2e66e20c982 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Sun, 24 Nov 2024 18:38:10 +0100 Subject: [PATCH 031/169] add missing methods for negation, scalar multiplication, etc.; update tests --- .../schemes/elliptic_curves/ell_generic.py | 4 +- src/sage/schemes/elliptic_curves/ell_point.py | 172 ++++++++++++++++-- .../schemes/projective/projective_homset.py | 19 ++ 3 files changed, 179 insertions(+), 16 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py index 5b05f2fd807..fdde95b416a 100755 --- a/src/sage/schemes/elliptic_curves/ell_generic.py +++ b/src/sage/schemes/elliptic_curves/ell_generic.py @@ -191,7 +191,7 @@ def assume_base_ring_is_field(self, flag=True): sage: 4*P (23 : 26 : 1) sage: 9*P - (30 : 33 : 15) + (10 : 11 : 5) sage: E.assume_base_ring_is_field() sage: P = E(-5, 9) sage: 4*P @@ -199,7 +199,7 @@ def assume_base_ring_is_field(self, flag=True): sage: 9*P Traceback (most recent call last): ... - ZeroDivisionError: Inverse of 30 does not exist (modulus = 35 = 5*7) + ZeroDivisionError: Inverse of 5 does not exist (characteristic = 35 = 5*7) .. NOTE:: diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 0cf0d60332a..b7645b57c85 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -81,7 +81,7 @@ sage: E = EllipticCurve(Integers(N), [3,-13]) sage: P = E(2,1) sage: LCM([2..60])*P - (1048079621 : 789440415 : 1590093204) + (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 @@ -95,7 +95,7 @@ sage: LCM([2..60])*P Traceback (most recent call last): ... - ZeroDivisionError: Inverse of 1520944668 does not exist + ZeroDivisionError: Inverse of 26927 does not exist (characteristic = 1715761513 = 26927*63719) AUTHORS: @@ -155,10 +155,6 @@ 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') @@ -174,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. @@ -251,7 +269,7 @@ def _add_(self, other): ....: 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 Ideal([x,y,z])] + ....: 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 @@ -325,7 +343,7 @@ def _add_(self, other): if not mod_2nd.is_one(): pt = CRT_vectors([pt, [x2.lift(), y2.lift(), z2.lift()]], [mod, mod_2nd]) - return E.point(pt, check=False) + 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 @@ -352,14 +370,109 @@ def _add_(self, other): 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 another point on the same elliptic curve from this point. + Subtract ``other`` from ``self``. + + ALGORITHM: :meth:`_add_` and :meth:`_neg_`. - This method computes point subtractions for fairly general rings. + 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): @@ -891,6 +1004,7 @@ def _add_(self, other): 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): @@ -900,6 +1014,7 @@ def _add_(self, other): 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): @@ -952,7 +1067,35 @@ def _add_(self, other): return E.point([x3, y3, E.base_ring().one()], check=False) _sub_ = EllipticCurvePoint._sub_ - _neg_ = EllipticCurvePoint._neg_ + + 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') + sage: P = E([-1,1]) + sage: Q = -P; Q + (-1 : -2 : 1) + sage: Q + P + (0 : 1 : 0) + + Example to show that bug :issue:`4820` is fixed:: + + sage: [type(c) for c in -EllipticCurve('37a1').gen(0)] + [<... 'sage.rings.rational.Rational'>, + <... 'sage.rings.rational.Rational'>, + <... 'sage.rings.rational.Rational'>] + """ + if self.is_zero(): + return self + E, x, y = self.curve(), self[0], self[1] + # See trac #4820 for why we need to coerce 1 into the base ring here: + return E.point([x, -y - E.a1()*x - E.a3(), E.base_ring().one()], check=False) def xy(self): """ @@ -2714,7 +2857,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) @@ -4131,8 +4274,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/projective/projective_homset.py b/src/sage/schemes/projective/projective_homset.py index 7f86f7ea0f6..da3f5b502cd 100755 --- 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', From ff6550653e5c4d27d6ea4a6fa1139179679d368f Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Tue, 26 Nov 2024 00:08:17 +0100 Subject: [PATCH 032/169] fix docstring markup --- src/sage/schemes/elliptic_curves/addition_formulas_ring.py | 2 +- src/sage/schemes/elliptic_curves/ell_point.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py index a1595e0748e..7ffabfbc3bd 100644 --- a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -9,7 +9,7 @@ def add(E, P, Q): These formulas were derived by Bosma and Lenstra [BL1995]_, with corrections by Best [Best2021]_ (Appendix A). - EXAMPLES: + EXAMPLES:: sage: from sage.schemes.elliptic_curves.addition_formulas_ring import add sage: M = Zmod(13*17*19) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index b7645b57c85..1bc1c8f9bd3 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -993,8 +993,6 @@ def _add_(self, other): Example to show that bug :issue:`4820` is fixed:: - Example to show that bug :trac:`4820` is fixed:: - sage: [type(c) for c in 2*EllipticCurve('37a1').gen(0)] [<... 'sage.rings.rational.Rational'>, <... 'sage.rings.rational.Rational'>, From 1b7ce043e92ce16cff4a0522d52f844fea966481 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Tue, 26 Nov 2024 00:08:44 +0100 Subject: [PATCH 033/169] make linter happier --- src/sage/schemes/elliptic_curves/addition_formulas_ring.py | 3 +-- src/sage/schemes/elliptic_curves/ell_point.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py index 7ffabfbc3bd..d507104b1f6 100644 --- a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -57,9 +57,8 @@ def add(E, P, Q): 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 + 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/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 1bc1c8f9bd3..b168ae85598 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -398,7 +398,7 @@ def _neg_(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) + return E.point([x, -y - a1*x - a3*z, z], check=False) def _sub_(self, other): """ From 0e5ad3f8742617e2b497bbf0bc9e74c2df485a6b Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Tue, 26 Nov 2024 16:06:57 +0100 Subject: [PATCH 034/169] graphs: implementation of linear-time algorithm for modular decomposition --- src/sage/graphs/graph.py | 228 ++++-- .../modular_decomposition.hpp | 744 ++++++++++++++++++ .../modular_decomposition.pxd | 23 + ...mposition.py => modular_decomposition.pyx} | 603 +++++++------- 4 files changed, 1259 insertions(+), 339 deletions(-) create mode 100644 src/sage/graphs/graph_decompositions/modular_decomposition.hpp create mode 100644 src/sage/graphs/graph_decompositions/modular_decomposition.pxd rename src/sage/graphs/graph_decompositions/{modular_decomposition.py => modular_decomposition.pyx} (75%) diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py index 4eced79fe9b..4c98901daad 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""" + Return 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) == 0 or 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:`xxxxx`. 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() def _gomory_hu_tree(self, vertices, algorithm=None): r""" 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..c5d822aea18 --- /dev/null +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.hpp @@ -0,0 +1,744 @@ +/* + * 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 + +enum class Label : uint8_t { + EMPTY = 0b00, + HOMOGENEOUS = 0b01, + BROKEN = 0b10, + DEAD = 0b11 +}; + +enum class Flag : uint8_t { + UNFLAGGED = 0b00, + FLAGGED = 0b01 +}; + +enum class Type_ : uint8_t { + PRIME = 0, + SERIES = 1, + PARALLEL = 2, + LEAF = 3 +}; + +struct SDData { + 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; + } + + 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; + } + + 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; + } + } + + 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; + } + } + + size_t first_slice_index() const { + return 1; + } + + size_t next_slice_index(size_t idx) const { + return idx + xslice_len[idx]; + } + + size_t size() const { + return xslice_len[0]; + } + + 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; +}; + +struct md_tree_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) { + } + + 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) { + } + + md_tree_node(Type_ type) + : md_tree_node(type, Label::EMPTY, Flag::UNFLAGGED) { + } + + bool is_leaf() const { + return type == Type_::LEAF; + } + + bool is_prime() const { + return type == Type_::PRIME; + } + + bool is_series() const { + return type == Type_::SERIES; + } + + bool is_parallel() const { + return type == Type_::PARALLEL; + } + + bool is_degenerate() const { + return type == Type_::SERIES || type == Type_::PARALLEL; + } + + 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; + } + + void prepend_new_child(md_tree_node *c) { + c->parent = this; + if (children.empty()) { + vertex = c->vertex; + } + children.push_front(c); + } + + void append_new_child(md_tree_node *c) { + c->parent = this; + if (children.empty()) { + vertex = c->vertex; + } + children.push_back(c); + } + + 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); + } + } + + 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; +}; + +using md_forest = std::list; + +struct ScratchData { + struct MDSequences { + std::unordered_map leaves; + std::unordered_set Marked; + std::unordered_set Full; + std::deque Explore; + }; + + 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; + }; + + md_tree_node *new_leaf(int vertex) { + return mdseq.leaves[vertex] = new md_tree_node(vertex); + } + + MDSequences mdseq; + Clusters clusters; +}; + + +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; +} + +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; + } +} + +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); + } + } +} + +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); + } +} + +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; + } + } + } + } +} + +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; + } + } + } + } +} + +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; + } +} + +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); + } + } + +} + + +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; +} + + +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; +} + +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..bc5e6c6c34d --- /dev/null +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pxd @@ -0,0 +1,23 @@ +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 + # For a leaf, the corresponding vertex, for a internal node, any vertex + # corresponding to a any leaf below 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 75% rename from src/sage/graphs/graph_decompositions/modular_decomposition.py rename to src/sage/graphs/graph_decompositions/modular_decomposition.pyx index 001f127d63d..571d44d489b 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,109 @@ # (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 compute 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. + + .. 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) + """ + 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): + cdef md_tree_node *c + if deref(n).is_leaf(): + return Node.create_leaf(Gb.vertex_label(deref(n).vertex)) + else: + 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): + if n == NULL: + return Node(NodeType.EMPTY) + else: + 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 +143,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 +151,32 @@ 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 +191,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""" + Return ``True`` if the node is a prime node, ``False`` otherwise. - ``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""" + Return ``True`` if the node is series, ``False`` otherwise. 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""" + Return ``True`` if the node is empty, ``False`` otherwise. 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""" + Return ``True`` if the node is a leaf, ``False`` otherwise. 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 +266,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 +289,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 +326,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 +431,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 +517,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 +542,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 +561,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,14 +578,72 @@ 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 +################################################################################ +# 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``. + + TESTS:: + + sage: from sage.graphs.graph_decompositions.modular_decomposition import * + + sage: modular_decomposition(Graph()) + EMPTY [] + + sage: modular_decomposition(Graph(1)) + NORMAL [0] + + 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... -modular_decomposition = habib_maurer_algorithm + 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) + elif G.order() == 1: + D = Node(NodeType.NORMAL) + D.children.append(next(G.vertex_iterator())) + return D + elif algorithm == "habib_maurer": + return habib_maurer_algorithm(G) + else: # algorithm == "corneil_habib_paul_tedder" + return corneil_habib_paul_tedder_algorithm(G) # ============================================================================ # Below functions are implemented to test the modular decomposition tree @@ -758,19 +756,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 +961,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 +1001,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 +1041,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 +1073,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 +1185,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 +1302,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 +1330,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,32 +1350,57 @@ 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) - vs, es = tree_to_vertices_and_edges(root) - return Graph([vs, es], format='vertices_and_edges') + if root.is_empty(): + return Graph() + else: + vs, es = tree_to_vertices_and_edges(root) + return Graph([vs, es], format='vertices_and_edges') @random_testing From cdda9d5ece2ae6faa8cb5656ae138435479a8d0b Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Tue, 26 Nov 2024 16:28:22 +0100 Subject: [PATCH 035/169] Update name of PR in comment --- src/sage/graphs/graph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py index 4c98901daad..05720b51951 100644 --- a/src/sage/graphs/graph.py +++ b/src/sage/graphs/graph.py @@ -7437,7 +7437,7 @@ def modular_decomposition(self, algorithm=None, style="tuple"): 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:`xxxxx`. + algorithm, see :issue:`39038`. TESTS: From b018722593d49c6a6b5f4f0d98ef3ece0b438bbe Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Tue, 26 Nov 2024 18:49:15 +0100 Subject: [PATCH 036/169] graphs.modular_decomposition: fix linter --- .../graphs/graph_decompositions/modular_decomposition.pyx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index 571d44d489b..051a7f068c6 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -169,6 +169,7 @@ class NodeType(IntEnum): __str__ = __repr__ + class Node: """ Node class stores information about the node type. @@ -583,6 +584,7 @@ def habib_maurer_algorithm(graph, g_classes=None): for sg in g_comp.connected_components(sort=False)] return root + ################################################################################ # Exported modular_decomposition function # ################################################################################ @@ -645,10 +647,10 @@ def modular_decomposition(G, algorithm=None): else: # algorithm == "corneil_habib_paul_tedder" 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): """ From d88cfd3fe2b0473ffae2f735debf1c6ea955ec76 Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Wed, 27 Nov 2024 11:07:24 +0100 Subject: [PATCH 037/169] graphs/modular_decomposition: trying to fix meson build --- src/sage/graphs/graph_decompositions/meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sage/graphs/graph_decompositions/meson.build b/src/sage/graphs/graph_decompositions/meson.build index 0d9778ae2ba..027998e078e 100644 --- a/src/sage/graphs/graph_decompositions/meson.build +++ b/src/sage/graphs/graph_decompositions/meson.build @@ -6,7 +6,7 @@ py.install_sources( 'all.py', 'all__sagemath_tdlib.py', 'fast_digraph.pxd', - 'modular_decomposition.py', + 'modular_decomposition.pxd', 'rankwidth.pxd', 'slice_decomposition.pxd', 'tree_decomposition.pxd', @@ -38,6 +38,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 From 8f37350fe6d5f1578ce984351b6922abe2962b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Wed, 27 Nov 2024 17:55:55 +0100 Subject: [PATCH 038/169] partial pep8 cleanup in plot and plot3d --- src/sage/plot/misc.py | 56 +++++++++++++---------- src/sage/plot/plot3d/parametric_plot3d.py | 8 ++-- src/sage/plot/plot3d/plot3d.py | 31 ++++++------- src/sage/plot/plot3d/plot_field3d.py | 13 +++--- src/sage/plot/plot3d/revolution_plot3d.py | 14 +++--- src/sage/plot/plot3d/shapes2.py | 28 ++++++------ src/sage/plot/plot3d/tachyon.py | 34 +++++++------- src/sage/plot/plot3d/texture.py | 14 +++--- src/sage/plot/plot3d/tri_plot.py | 26 +++++------ 9 files changed, 117 insertions(+), 107 deletions(-) diff --git a/src/sage/plot/misc.py b/src/sage/plot/misc.py index b86b52b05f6..110fdd75969 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/parametric_plot3d.py b/src/sage/plot/plot3d/parametric_plot3d.py index 6a3da2b830f..d14d98c7899 100644 --- a/src/sage/plot/plot3d/parametric_plot3d.py +++ b/src/sage/plot/plot3d/parametric_plot3d.py @@ -989,7 +989,7 @@ 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)): + 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: @@ -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..c2ddff1a578 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"]) @@ -191,7 +191,7 @@ def __init__(self, dep_var, indep_vars): """ 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])))) + 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])))) self.dep_var = dep_var self.indep_vars = indep_vars @@ -790,10 +790,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 +1080,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 +1092,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 +1170,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 +1194,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 +1205,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..61d8833adf3 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,13 +143,14 @@ 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: 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] From 7b67376dbd9da906e42788594b01286ce1b74772 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 27 Nov 2024 19:09:43 +0100 Subject: [PATCH 039/169] add a pairing heap data structure --- .../en/reference/data_structures/index.rst | 1 + src/doc/en/reference/references/index.rst | 5 + src/sage/data_structures/pairing_heap.h | 369 ++++ src/sage/data_structures/pairing_heap.pxd | 82 + src/sage/data_structures/pairing_heap.pyx | 1567 +++++++++++++++++ 5 files changed, 2024 insertions(+) create mode 100644 src/sage/data_structures/pairing_heap.h create mode 100644 src/sage/data_structures/pairing_heap.pxd create mode 100644 src/sage/data_structures/pairing_heap.pyx 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 45f5fbc090f..17accf462db 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -2762,6 +2762,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 (1986), 111-129. + :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/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h new file mode 100644 index 00000000000..dbcb99bc1fc --- /dev/null +++ b/src/sage/data_structures/pairing_heap.h @@ -0,0 +1,369 @@ +/* + * 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 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 +#include +#include + + +namespace pairing_heap { + + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + > + struct PairingHeapNode { + TI item; // item contained in the node + TV value; // value associated with the item + + PairingHeapNode * prev; // Previous sibling of the node or parent + PairingHeapNode * next; // Next sibling of the node + PairingHeapNode * child; // First child of the node + + explicit PairingHeapNode(const TI &some_item, const TV &some_value): + item(some_item), value(some_value), prev(nullptr), next(nullptr), child(nullptr) { + } + + bool operator<(PairingHeapNode const& other) const { + return value < other.value; + } + + bool operator<=(PairingHeapNode const& other) const { + return value <= other.value; + } + }; + + + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + > + class PairingHeap + { + public: + // Constructor + explicit PairingHeap(); + + // Copy constructor + PairingHeap(PairingHeap const *other); + + // Destructor + virtual ~PairingHeap(); + + // Return true if the heap is empty, else false + bool empty() { return root == nullptr; } + + // Return true if the heap is 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); + + // Return the top pair (item, value) of the heap + std::pair top(); + + // Return the top item of the heap + TI top_item(); + + // Return the top value of the heap + TV top_value(); + + // Remove the top element from the heap + void pop(); + + // Decrease the value of specified item + void decrease(const TI &some_item, const TV &new_value); + + // Check if specified item is in the heap + bool contains(TI const& some_item); + + // Return the value associated with the item + TV value(const TI &some_item); + + // Return the number of items in the heap + size_t size() { return nodes.size(); } + + private: + // Pointer to the top of the heap + PairingHeapNode *root; + + // Map used to access stored items + std::map *> nodes; + + // Pair list of heaps and return pointer to the top of resulting heap + PairingHeapNode *_pair(PairingHeapNode *p); + + // Merge 2 heaps and return pointer to the top of resulting heap + PairingHeapNode *_merge(PairingHeapNode *a, PairingHeapNode *b); + + // Make b a child of a + static void _link(PairingHeapNode *a, PairingHeapNode *b); + + // Remove p from its parent children list + static void _unlink(PairingHeapNode *p); + + }; + + // Constructor + template + PairingHeap::PairingHeap(): + root(nullptr) + { + nodes.clear(); + } + + // Copy constructor + template + PairingHeap::PairingHeap(PairingHeap const *other): + root(nullptr) + { + nodes.clear(); + for (auto const& it:other->nodes) + push(it.first, it.second->value); + } + + // Destructor + template + PairingHeap::~PairingHeap() + { + for (auto const& it: nodes) + delete it.second; + root = nullptr; + nodes.clear(); + } + + // Insert an item into the heap with specified value (priority) + template + void PairingHeap::push(const TI &some_item, const TV &some_value) + { + if (nodes.find(some_item) != nodes.end()) { + throw std::invalid_argument("item already in the heap"); + } + PairingHeapNode *p = new PairingHeapNode(some_item, some_value); + nodes[some_item] = p; + root = root == nullptr ? p : _merge(root, p); + } + + // Return the top pair (value, item) of the heap + template + inline std::pair PairingHeap::top() + { + if (root == nullptr) { + 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 + template + inline TI PairingHeap::top_item() + { + if (root == nullptr) { + throw std::domain_error("trying to access the top of an empty heap"); + } + return root->item; + } + + // Return the top value of the heap + template + inline TV PairingHeap::top_value() + { + if (root == nullptr) { + throw std::domain_error("trying to access the top of an empty heap"); + } + return root->value; + } + + // Remove the top element from the heap + template + void PairingHeap::pop() + { + if (root != nullptr) { + PairingHeapNode *p = root->child; + nodes.erase(root->item); + delete root; + root = _pair(p); + } + } + + // Decrease the value of specified item + // If the item is not in the heap, push it + template + void PairingHeap::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) { + _unlink(p); + root = _merge(root, p); + } + } else { + push(some_item, new_value); + } + } + + // Check if specified item is in the heap + template + inline bool PairingHeap::contains(TI const& some_item) + { + return nodes.find(some_item) != nodes.end(); + // return nodes.count(some_item) > 0; + } + + // Return the value associated with the item + template + inline TV PairingHeap::value(const TI &some_item) + { + if (nodes.find(some_item) == nodes.end()) { + throw std::invalid_argument("the specified item is not in the heap"); + } + return nodes[some_item]->value; + } + + // Pair list of heaps and return pointer to the top of resulting heap + template + inline PairingHeapNode *PairingHeap::_pair(PairingHeapNode *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; + PairingHeapNode *it = p; + while(it->next != nullptr) { + it = it->next; + children++; + } + + PairingHeapNode *result; + + if(children % 2 == 1) { + PairingHeapNode *a = it; + it = it->prev; + a->prev = a->next = nullptr; + result = a; + } else { + PairingHeapNode *a = it; + PairingHeapNode *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++) { + PairingHeapNode *a = it; + PairingHeapNode *b = it->prev; + it = it->prev->prev; + a->prev = a->next = b->prev = b->next = nullptr; + result = _merge(_merge(a, b), result); + } + + return result; + } + + // Merge 2 heaps and return pointer to the top of resulting heap + template + inline PairingHeapNode *PairingHeap::_merge(PairingHeapNode *a, PairingHeapNode *b) + { + if(*a <= *b) { // Use comparison method of PairingHeapNode + _link(a, b); + return a; + } else { + _link(b, a); + return b; + } + } + + // Make b a child of a + template + inline void PairingHeap::_link(PairingHeapNode *a, PairingHeapNode *b) + { + if(a->child != nullptr) { + b->next = a->child; + a->child->prev = b; + } + b->prev = a; + a->child = b; + } + + // Remove p from its parent children list + template + inline void PairingHeap::_unlink(PairingHeapNode *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 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..6e8a20cc3c3 --- /dev/null +++ b/src/sage/data_structures/pairing_heap.pxd @@ -0,0 +1,82 @@ +# ****************************************************************************** +# 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/ +# ****************************************************************************** + +# ============================================================================== +# Interface to pairing heap data structure from ./pairing_heap.h +# ============================================================================== + +from libcpp.pair cimport pair + +cdef extern from "./pairing_heap.h" namespace "pairing_heap": + cdef cppclass PairingHeap[TypeOfItem, TypeOfValue]: + PairingHeap() except + + PairingHeap(PairingHeap[TypeOfItem, TypeOfValue]) except + + bint empty() + void reset() + 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 + + +# ============================================================================== +# Pairing heap data structure with fixed capacity n +# ============================================================================== + +from sage.data_structures.bitset_base cimport bitset_t + +ctypedef struct PairingHeapNode: + void * value # value associated with the item + PairingHeapNode * prev # Previous sibling of the node or parent + PairingHeapNode * succ # Next sibling of the node + PairingHeapNode * child # First child of the node + + +cdef bint _compare(PairingHeapNode * a, PairingHeapNode * b) except * +cdef PairingHeapNode * _pair(PairingHeapNode * p) except * +cdef PairingHeapNode * _merge(PairingHeapNode * a, PairingHeapNode * b) except * +cdef _link(PairingHeapNode * a, PairingHeapNode * b) except * +cdef _unlink(PairingHeapNode * p) except * + + +cdef class PairingHeap_class: + cdef str name # name of the data structure + cdef size_t n # maximum number of items + cdef PairingHeapNode * root # pointer to the top of the heap + cdef PairingHeapNode * nodes # array of size n to store items + cdef bitset_t active # bitset to identify active items + cdef size_t number_of_items # number of active items + cpdef bint empty(self) noexcept + cpdef bint full(self) noexcept + + +cdef class PairingHeap_of_n_integers(PairingHeap_class): + cpdef void push(self, size_t item, object value) except * + cpdef tuple top(self) except * + cpdef size_t top_item(self) except * + cpdef object top_value(self) except * + cpdef void pop(self) noexcept + cpdef void decrease(self, size_t item, object new_value) except * + cpdef object value(self, size_t item) except * + + +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 + cpdef void push(self, object item, object value) except * + cpdef tuple top(self) except * + cpdef object top_item(self) except * + cpdef object top_value(self) except * + cpdef void pop(self) noexcept + cpdef void decrease(self, object item, object new_value) except * + cpdef object value(self, object item) except * diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx new file mode 100644 index 00000000000..e320138200f --- /dev/null +++ b/src/sage/data_structures/pairing_heap.pyx @@ -0,0 +1,1567 @@ +# 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; 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')) + +AUTHORS: + +- David Coudert (2024) - Initial version. + + +[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. +""" +# ****************************************************************************** +# 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_clear, bitset_add, + bitset_remove, bitset_in, + bitset_first_in_complement) +from sage.misc.prandom import shuffle + +# ============================================================================== +# Methods for PairingHeapNode +# ============================================================================== + +cdef inline bint _compare(PairingHeapNode * a, PairingHeapNode * b) except *: + r""" + Check whether ``a.value <= b.value``. + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers + sage: _test_PairingHeap_of_n_integers(5) + """ + return a.value <= b.value + + +cdef inline PairingHeapNode * _pair(PairingHeapNode * p) except *: + r""" + Pair a list of heaps and return the pointer to the top of the resulting heap. + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers + sage: _test_PairingHeap_of_n_integers(5) + """ + if p == NULL: + return NULL + + # 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 + cdef size_t children = 1 + cdef PairingHeapNode * it = p + while it.succ != NULL: + it = it.succ + children += 1 + + cdef PairingHeapNode * result + cdef PairingHeapNode * a + cdef PairingHeapNode * b + + if children % 2: + a = it + it = it.prev + a.prev = a.succ = NULL + result = a + else: + a = it + b = it.prev + it = it.prev.prev + a.prev = a.succ = b.prev = b.succ = NULL + result = _merge(a, b) + + for _ in range((children - 1) // 2): + a = it + b = it.prev + it = it.prev.prev + a.prev = a.succ = b.prev = b.succ = NULL + result = _merge(_merge(a, b), result) + + return result + + +cdef inline PairingHeapNode * _merge(PairingHeapNode * a, PairingHeapNode * b) except *: + r""" + Merge two heaps and return the pointer to the top of the resulting heap. + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers + sage: _test_PairingHeap_of_n_integers(5) + """ + if _compare(a, b): # True if a.value <= b.value + _link(a, b) + return a + _link(b, a) + return b + + +cdef inline _link(PairingHeapNode * a, PairingHeapNode * b) except *: + r""" + Make ``b`` a child of ``a``. + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers + sage: _test_PairingHeap_of_n_integers(5) + """ + if a.child != NULL: + b.succ = a.child + a.child.prev = b + b.prev = a + a.child = b + + +cdef inline _unlink(PairingHeapNode * p) except *: + r""" + Remove ``p`` from the list of children of its parent. + + TESTS:: + + sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers + sage: _test_PairingHeap_of_n_integers(5) + """ + if p.prev.child == p: + p.prev.child = p.succ + else: + p.prev.succ = p.succ + if p.succ != NULL: + p.succ.prev = p.prev + p.prev = p.succ = NULL + + +# ============================================================================== +# 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 __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) + + 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"{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 or not. + + 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 or not. + + 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 + + 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 + + size = __len__ + + +# ============================================================================== +# 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) + sage: P + PairingHeap_of_n_integers: capacity 5, size 1 + sage: P.push(2, 3) + sage: P + PairingHeap_of_n_integers: capacity 5, size 2 + sage: P.pop() + sage: 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: 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 + """ + if not n: + raise ValueError("the capacity of the heap must be strictly positive") + self.name = "PairingHeap_of_n_integers" + self.n = n + self.root = NULL + self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) + bitset_init(self.active, n) + bitset_clear(self.active) + self.number_of_items = 0 + + cpdef void push(self, size_t item, object value) except *: + r""" + Insert an item into the heap with specified value (priority). + + INPUT: + + - ``item`` -- non negative 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 + """ + 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 PairingHeapNode * p = self.nodes + item + Py_INCREF(value) + p.value = value + p.prev = p.succ = p.child = NULL + if self.root == NULL: + self.root = p + else: + self.root = _merge(self.root, p) + bitset_add(self.active, item) + self.number_of_items += 1 + + cpdef tuple top(self) except *: + 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 object top_value(self) except *: + 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.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 = _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`` -- non negative 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 + """ + cdef PairingHeapNode * 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: + _unlink(p) + self.root = _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`` -- non negative 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 + """ + return bitset_in(self.active, item) + + contains = __contains__ + + cpdef object value(self, size_t item) except *: + r""" + Return the value associated with the item. + + INPUT: + + - ``item`` -- non negative 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) + sage: 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 + """ + 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 + """ + if not n: + raise ValueError("the capacity of the heap must be strictly positive") + self.name = "PairingHeap_of_n_hashables" + self.n = n + self.root = NULL + self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) + bitset_init(self.active, n) + bitset_clear(self.active) + self.number_of_items = 0 + self._int_to_item = [None] * n + self._item_to_int = dict() + + cpdef void push(self, object item, object value) except *: + r""" + Insert an item into the heap with specified value (priority). + + INPUT: + + - ``item`` -- non negative integer; the item to consider + + - ``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 = bitset_first_in_complement(self.active) + self._int_to_item[idx] = item + self._item_to_int[item] = idx + cdef PairingHeapNode * p = self.nodes + idx + Py_INCREF(value) + p.value = value + p.prev = p.succ = p.child = NULL + if self.root == NULL: + self.root = p + else: + self.root = _merge(self.root, p) + bitset_add(self.active, idx) + self.number_of_items += 1 + + cpdef tuple top(self) except *: + 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) except *: + 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 object top_value(self) except *: + r""" + Return the value of 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_value() + 2 + + sage: P = PairingHeap_of_n_hashables(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_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) + bitset_remove(self.active, idx) + del self._item_to_int[item] + self.number_of_items -= 1 + self.root = _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 PairingHeapNode * 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: + _unlink(p) + self.root = _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) except *: + 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 = new 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 origianl 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') + + sig_on() + sig_free(PH) + sig_off() + + sig_on() + cdef PairingHeap[pair[size_t, size_t], size_t] *Q = new PairingHeap[pair[size_t, size_t], size_t]() + sig_off() + + # Initialize a list of tuples (value, item) randomly ordered + items = [(i, i + 1) for i in range(n)] + values = list(range(n)) + shuffle(items) + shuffle(values) + Lref = list(zip(values, items)) + + for value, item in Lref: + Q.push(item, value) + sig_check() + + L = [] + while not Q.empty(): + item, value = Q.top() + L.append((value, item)) + Q.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 origianl 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: + Q.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() + Q.decrease(item, Q.value(item) - d) + sig_check() + + L = [] + while not Q.empty(): + item, value = Q.top() + L.append((value, item)) + Q.pop() + sig_check() + + if L != sorted(Lref): + raise ValueError('the order is not good') + + sig_on() + sig_free(Q) + sig_off() + + # Different cost function + from sage.functions.trig import sin, cos + sig_on() + cdef PairingHeap[pair[size_t, size_t], pair[size_t, size_t]] HH = PairingHeap[pair[size_t, size_t], pair[size_t, size_t]]() + sig_off() + + for i in range(n): + HH.push((i, i + 1), (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, msg: + # The error has been properly handled + pass + + try: + _ = HH.top_item() + print("something goes wrong, the error has not been raised") + except ValueError, msg: + # The error has been properly handled + pass + + try: + _ = HH.top_value() + print("something goes wrong, the error has not been raised") + except ValueError, 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, 456)) + print("something goes wrong, the error has not been raised") + except ValueError, 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 origianl 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, msg: + # The error has been properly handled + pass + + try: + _ = P.top_item() + print("something goes wrong, the error has not been raised") + except ValueError, msg: + # The error has been properly handled + pass + + try: + _ = P.top_value() + print("something goes wrong, the error has not been raised") + except ValueError, 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, 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 origianl 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: + # The error has been properly handled + pass + + try: + _ = P.top_item() + print("something goes wrong, the error has not been raised") + except ValueError, msg: + # The error has been properly handled + pass + + try: + _ = P.top_value() + print("something goes wrong, the error has not been raised") + except ValueError, 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, 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.300000000043383e-05 + PairingHeap_of_n_hashables: 9.70000000037885e-05 + PairingHeap (C++): 9.599999999920783e-05 + sage: compare_heaps(1000000, verbose=True) # not tested (long time), random + PairingHeap_of_n_integers: 1.5988719999999996 + PairingHeap_of_n_hashables: 5.039089999999998 + PairingHeap (C++): 3.3256689999999995 + """ + 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') From aaf0502f23f189d55d60bd0225ccf6c6a890b137 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 27 Nov 2024 20:14:01 +0100 Subject: [PATCH 040/169] fix lint errors --- src/sage/data_structures/pairing_heap.pyx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index e320138200f..2ec378e4041 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -138,7 +138,7 @@ cdef inline PairingHeapNode * _pair(PairingHeapNode * p) except *: """ if p == NULL: return NULL - + # 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 @@ -148,7 +148,7 @@ cdef inline PairingHeapNode * _pair(PairingHeapNode * p) except *: while it.succ != NULL: it = it.succ children += 1 - + cdef PairingHeapNode * result cdef PairingHeapNode * a cdef PairingHeapNode * b @@ -164,7 +164,7 @@ cdef inline PairingHeapNode * _pair(PairingHeapNode * p) except *: it = it.prev.prev a.prev = a.succ = b.prev = b.succ = NULL result = _merge(a, b) - + for _ in range((children - 1) // 2): a = it b = it.prev @@ -647,7 +647,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): return bitset_in(self.active, item) contains = __contains__ - + cpdef object value(self, size_t item) except *: r""" Return the value associated with the item. @@ -1025,7 +1025,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): return item in self._item_to_int contains = __contains__ - + cpdef object value(self, object item) except *: r""" Return the value associated with the item. @@ -1211,7 +1211,7 @@ def _test_PairingHeap_from_C(n=100): 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) @@ -1248,7 +1248,6 @@ def _test_PairingHeap_from_C(n=100): pass - def _test_PairingHeap_of_n_integers(n=100): r""" Test :class:`~sage.data_structures.pairing_heap.PairingHeap_of_n_integers`. @@ -1435,7 +1434,7 @@ def _test_PairingHeap_of_n_hashables(n=100): try: _ = P.top() print("something goes wrong, the error has not been raised") - except: + except ValueError, msg: # The error has been properly handled pass From 747cc75d80a43b7974bcc2803cb9aba29ae269bc Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 27 Nov 2024 20:20:06 +0100 Subject: [PATCH 041/169] fix error in src/doc/en/reference/references/index.rst --- src/doc/en/reference/references/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index 17accf462db..8d59326604d 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -2762,9 +2762,9 @@ 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 (1986), 111-129. +.. [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 From f3a88f5bcb74075675ddbb5512b9dd3727dd8d30 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 27 Nov 2024 20:36:28 +0100 Subject: [PATCH 042/169] remove some trailing whitespaces --- src/sage/data_structures/pairing_heap.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 2ec378e4041..becef12d572 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -186,7 +186,7 @@ cdef inline PairingHeapNode * _merge(PairingHeapNode * a, PairingHeapNode * b) e """ if _compare(a, b): # True if a.value <= b.value _link(a, b) - return a + return a _link(b, a) return b @@ -206,7 +206,7 @@ cdef inline _link(PairingHeapNode * a, PairingHeapNode * b) except *: b.prev = a a.child = b - + cdef inline _unlink(PairingHeapNode * p) except *: r""" Remove ``p`` from the list of children of its parent. From ac0ef3e044ed1550f0efd94696fe081dbbcb80e6 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 27 Nov 2024 22:21:17 +0100 Subject: [PATCH 043/169] try to fix references --- src/doc/en/reference/references/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index 8d59326604d..17c91611b68 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -2765,7 +2765,7 @@ REFERENCES: .. [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` + :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) From bd63d91fbc9bac20e1cd26527318073ffdacd51a Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 27 Nov 2024 23:55:54 +0100 Subject: [PATCH 044/169] meson build --- src/sage/data_structures/meson.build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sage/data_structures/meson.build b/src/sage/data_structures/meson.build index 8a94548917b..124a209dbbe 100644 --- a/src/sage/data_structures/meson.build +++ b/src/sage/data_structures/meson.build @@ -9,6 +9,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', @@ -21,6 +23,7 @@ extension_data = { 'blas_dict' : files('blas_dict.pyx'), 'bounded_integer_sequences' : files('bounded_integer_sequences.pyx'), 'list_of_pairs' : files('list_of_pairs.pyx'), + 'pairing_heap' : files('pairing_heap.pyx'), } foreach name, pyx : extension_data From 7d2982e769399e2e717591fa59d735c35862b8ac Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 27 Nov 2024 23:58:10 +0100 Subject: [PATCH 045/169] remove useless reference --- src/sage/data_structures/pairing_heap.pyx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index becef12d572..b5480a89c1e 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -85,10 +85,6 @@ AUTHORS: - David Coudert (2024) - Initial version. - -[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. """ # ****************************************************************************** # Copyright (C) 2024 David Coudert From f0d2c3ae31b12e7aa239dc3bbb0ad19b05499658 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Thu, 28 Nov 2024 10:40:08 +0100 Subject: [PATCH 046/169] detail in pairing_heap.pyx --- src/sage/data_structures/pairing_heap.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index b5480a89c1e..4f6234236e6 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -1069,7 +1069,7 @@ def _test_PairingHeap_from_C(n=100): """ from sage.misc.prandom import randint, shuffle sig_on() - cdef PairingHeap[size_t, size_t] *PH = new PairingHeap[size_t, size_t]() + cdef PairingHeap[size_t, size_t] * PH = new PairingHeap[size_t, size_t]() sig_off() # Initialize a list of tuples (value, item) randomly ordered @@ -1131,7 +1131,7 @@ def _test_PairingHeap_from_C(n=100): sig_off() sig_on() - cdef PairingHeap[pair[size_t, size_t], size_t] *Q = new PairingHeap[pair[size_t, size_t], size_t]() + cdef PairingHeap[pair[size_t, size_t], size_t] * Q = new PairingHeap[pair[size_t, size_t], size_t]() sig_off() # Initialize a list of tuples (value, item) randomly ordered @@ -1195,7 +1195,7 @@ def _test_PairingHeap_from_C(n=100): # Different cost function from sage.functions.trig import sin, cos sig_on() - cdef PairingHeap[pair[size_t, size_t], pair[size_t, size_t]] HH = PairingHeap[pair[size_t, size_t], pair[size_t, size_t]]() + cdef PairingHeap[pair[size_t, size_t], pair[size_t, size_t]] * HH = new PairingHeap[pair[size_t, size_t], pair[size_t, size_t]]() sig_off() for i in range(n): From fe3751dc7ac1b976a49a3a3c2b0f4881064557cb Mon Sep 17 00:00:00 2001 From: dcoudert Date: Thu, 28 Nov 2024 14:54:54 +0100 Subject: [PATCH 047/169] use unordered_map --- src/sage/data_structures/pairing_heap.h | 13 ++-- src/sage/data_structures/pairing_heap.pyx | 83 +++-------------------- 2 files changed, 18 insertions(+), 78 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h index dbcb99bc1fc..1dd30e54144 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -5,9 +5,11 @@ * 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 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: + * 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. * @@ -53,9 +55,8 @@ #define PAIRING_HEAP_H #include -#include +#include #include -#include namespace pairing_heap { @@ -140,7 +141,7 @@ namespace pairing_heap { PairingHeapNode *root; // Map used to access stored items - std::map *> nodes; + std::unordered_map *> nodes; // Pair list of heaps and return pointer to the top of resulting heap PairingHeapNode *_pair(PairingHeapNode *p); diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 4f6234236e6..0364b049b78 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -16,7 +16,8 @@ min-heap data structure. - ``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; values can be of any specified type + 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. @@ -1130,76 +1131,14 @@ def _test_PairingHeap_from_C(n=100): sig_free(PH) sig_off() - sig_on() - cdef PairingHeap[pair[size_t, size_t], size_t] * Q = new PairingHeap[pair[size_t, size_t], size_t]() - sig_off() - - # Initialize a list of tuples (value, item) randomly ordered - items = [(i, i + 1) for i in range(n)] - values = list(range(n)) - shuffle(items) - shuffle(values) - Lref = list(zip(values, items)) - - for value, item in Lref: - Q.push(item, value) - sig_check() - - L = [] - while not Q.empty(): - item, value = Q.top() - L.append((value, item)) - Q.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 origianl 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: - Q.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() - Q.decrease(item, Q.value(item) - d) - sig_check() - - L = [] - while not Q.empty(): - item, value = Q.top() - L.append((value, item)) - Q.pop() - sig_check() - - if L != sorted(Lref): - raise ValueError('the order is not good') - - sig_on() - sig_free(Q) - sig_off() - # Different cost function from sage.functions.trig import sin, cos sig_on() - cdef PairingHeap[pair[size_t, size_t], pair[size_t, size_t]] * HH = new PairingHeap[pair[size_t, size_t], pair[size_t, size_t]]() + cdef PairingHeap[size_t, pair[size_t, size_t]] * HH = new PairingHeap[size_t, pair[size_t, size_t]]() sig_off() for i in range(n): - HH.push((i, i + 1), (sin(i), cos(i))) + HH.push(i, (sin(i), cos(i))) sig_check() L = [] @@ -1237,7 +1176,7 @@ def _test_PairingHeap_from_C(n=100): # Or to get the value associated to an item that is not in the heap try: - _ = HH.value((123, 456)) + _ = HH.value(123) print("something goes wrong, the error has not been raised") except ValueError, msg: # The error has been properly handled @@ -1481,13 +1420,13 @@ def compare_heaps(n=100, verbose=False): 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.300000000043383e-05 - PairingHeap_of_n_hashables: 9.70000000037885e-05 - PairingHeap (C++): 9.599999999920783e-05 + 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.5988719999999996 - PairingHeap_of_n_hashables: 5.039089999999998 - PairingHeap (C++): 3.3256689999999995 + 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 From 151d10f61fe403824b5f5f830faa031250f8f705 Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Thu, 28 Nov 2024 16:14:47 +0100 Subject: [PATCH 048/169] graphs/modular_decomposition: fix docstrings and syntax style --- src/sage/graphs/graph.py | 6 +++--- .../modular_decomposition.pyx | 20 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py index 9852b024677..d2a2601f1d8 100644 --- a/src/sage/graphs/graph.py +++ b/src/sage/graphs/graph.py @@ -7186,7 +7186,7 @@ def cores(self, k=None, with_labels=False): @doc_index("Modules") def is_module(self, vertices): r""" - Return whether ``vertices`` is a module of ``self``. + 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 @@ -7267,11 +7267,11 @@ def is_module(self, vertices): if len(M) == 0 or len(M) == 1 or len(M) == self.order(): return True - N = None # will contains the neighborhood of M + 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 } + 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 diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index 051a7f068c6..2c363b69ab8 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -196,7 +196,7 @@ class Node: def is_prime(self): r""" - Return ``True`` if the node is a prime node, ``False`` otherwise. + Check whether ``self`` is a prime node. EXAMPLES:: @@ -213,7 +213,7 @@ class Node: def is_series(self): r""" - Return ``True`` if the node is series, ``False`` otherwise. + Check whether ``self`` is a series node. EXAMPLES:: @@ -230,7 +230,7 @@ class Node: def is_empty(self): r""" - Return ``True`` if the node is empty, ``False`` otherwise. + Check whether ``self`` is an empty node. EXAMPLES:: @@ -244,7 +244,7 @@ class Node: def is_leaf(self): r""" - Return ``True`` if the node is a leaf, ``False`` otherwise. + Check whether ``self`` is a leaf. EXAMPLES:: @@ -638,14 +638,13 @@ def modular_decomposition(G, algorithm=None): if not G.order(): return Node(NodeType.EMPTY) - elif G.order() == 1: + if G.order() == 1: D = Node(NodeType.NORMAL) D.children.append(next(G.vertex_iterator())) return D - elif algorithm == "habib_maurer": + if algorithm == "habib_maurer": return habib_maurer_algorithm(G) - else: # algorithm == "corneil_habib_paul_tedder" - return corneil_habib_paul_tedder_algorithm(G) + return corneil_habib_paul_tedder_algorithm(G) # ============================================================================ @@ -1400,9 +1399,8 @@ def md_tree_to_graph(root, prime_node_generator=None): if root.is_empty(): return Graph() - else: - vs, es = tree_to_vertices_and_edges(root) - return Graph([vs, es], format='vertices_and_edges') + vs, es = tree_to_vertices_and_edges(root) + return Graph([vs, es], format='vertices_and_edges') @random_testing From a4f9c4c627a7b371341d6c1b802e25f05ab3121b Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Thu, 28 Nov 2024 16:16:05 +0100 Subject: [PATCH 049/169] graphs/modular_decomposition: add docstrings and indirect doctests for internal functions --- .../modular_decomposition.pyx | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index 2c363b69ab8..aa007f9dca4 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -106,6 +106,9 @@ def corneil_habib_paul_tedder_algorithm(G): 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)) @@ -123,6 +126,29 @@ cdef object _md_tree_node_to_md_tree_inner_rec(const md_tree_node *n, 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) else: From 5cc82ccc4681b38f2fb6cbf725208c409da66ac5 Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Thu, 28 Nov 2024 16:43:11 +0100 Subject: [PATCH 050/169] graphs/modular_decomposition: add missing colon after TESTS --- src/sage/graphs/graph_decompositions/modular_decomposition.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index aa007f9dca4..026ccb23a38 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -137,7 +137,7 @@ cdef object md_tree_node_to_md_tree(const md_tree_node *n, CGraphBackend Gb): 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 + TESTS: Indirect doctests:: From a7252a642e1e07d216f187407c80b5493f314810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Thu, 28 Nov 2024 19:48:03 +0100 Subject: [PATCH 051/169] suggested details --- src/sage/plot/plot3d/parametric_plot3d.py | 2 +- src/sage/plot/plot3d/plot3d.py | 8 ++++++-- src/sage/plot/plot3d/plot_field3d.py | 6 ++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/sage/plot/plot3d/parametric_plot3d.py b/src/sage/plot/plot3d/parametric_plot3d.py index d14d98c7899..c0eebb5a160 100644 --- a/src/sage/plot/plot3d/parametric_plot3d.py +++ b/src/sage/plot/plot3d/parametric_plot3d.py @@ -990,7 +990,7 @@ def g(x, y): return x, y+sin(y), x**2 + y**2 f = tuple(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]) + 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") diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py index c2ddff1a578..f3fd2078d64 100644 --- a/src/sage/plot/plot3d/plot3d.py +++ b/src/sage/plot/plot3d/plot3d.py @@ -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 diff --git a/src/sage/plot/plot3d/plot_field3d.py b/src/sage/plot/plot3d/plot_field3d.py index 61d8833adf3..a4f415935d2 100644 --- a/src/sage/plot/plot3d/plot_field3d.py +++ b/src/sage/plot/plot3d/plot_field3d.py @@ -150,10 +150,12 @@ def cm(x): 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 From 0fd4827917f005ee682e9fb3d1bbc771050d2cf6 Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Fri, 29 Nov 2024 16:26:34 +0100 Subject: [PATCH 052/169] graphs/modular_decomposition: add tests to check equivalence of both algos --- .../modular_decomposition.pyx | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index 026ccb23a38..9e5c47d958b 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -631,6 +631,11 @@ def modular_decomposition(G, algorithm=None): 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): ... @@ -1459,3 +1464,30 @@ 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. + + EXAMPLES:: + + sage: from sage.graphs.graph_decompositions.modular_decomposition import * + sage: check_algos_are_equivalent(3, lambda : graphs.RandomGNP(10, 0.5)) + """ + 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!") From 90c6e2094a0c86f93512973791f4785dde77491b Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Fri, 29 Nov 2024 16:41:36 +0100 Subject: [PATCH 053/169] graphs/modular_decomposition: fix linter --- src/sage/graphs/graph_decompositions/modular_decomposition.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index 9e5c47d958b..f341281bb43 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -1465,6 +1465,7 @@ def recreate_decomposition(trials, algorithm, max_depth, max_fan_out, if verbose: print("Passes!") + @random_testing def check_algos_are_equivalent(trials, graph_gen, verbose=False): r""" From 2804a777b61fc049c16a687deb29e8a33a9c8743 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Fri, 29 Nov 2024 18:43:16 +0100 Subject: [PATCH 054/169] #39046: improvements in pairing_heap.h --- src/sage/data_structures/pairing_heap.h | 32 +++++++++---------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h index 1dd30e54144..29845894650 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -104,7 +104,7 @@ namespace pairing_heap { virtual ~PairingHeap(); // Return true if the heap is empty, else false - bool empty() { return root == nullptr; } + bool empty() const { return root == nullptr; } // Return true if the heap is empty, else false explicit operator bool() const { return root != nullptr; } @@ -113,13 +113,13 @@ namespace pairing_heap { void push(const TI &some_item, const TV &some_value); // Return the top pair (item, value) of the heap - std::pair top(); + std::pair top() const; // Return the top item of the heap - TI top_item(); + TI top_item() const; // Return the top value of the heap - TV top_value(); + TV top_value() const; // Remove the top element from the heap void pop(); @@ -128,13 +128,15 @@ namespace pairing_heap { void decrease(const TI &some_item, const TV &new_value); // Check if specified item is in the heap - bool contains(TI const& some_item); + 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); // Return the number of items in the heap - size_t size() { return nodes.size(); } + size_t size() const { return nodes.size(); } private: // Pointer to the top of the heap @@ -162,7 +164,6 @@ namespace pairing_heap { PairingHeap::PairingHeap(): root(nullptr) { - nodes.clear(); } // Copy constructor @@ -170,7 +171,6 @@ namespace pairing_heap { PairingHeap::PairingHeap(PairingHeap const *other): root(nullptr) { - nodes.clear(); for (auto const& it:other->nodes) push(it.first, it.second->value); } @@ -181,8 +181,6 @@ namespace pairing_heap { { for (auto const& it: nodes) delete it.second; - root = nullptr; - nodes.clear(); } // Insert an item into the heap with specified value (priority) @@ -199,7 +197,7 @@ namespace pairing_heap { // Return the top pair (value, item) of the heap template - inline std::pair PairingHeap::top() + inline std::pair PairingHeap::top() const { if (root == nullptr) { throw std::domain_error("trying to access the top of an empty heap"); @@ -209,7 +207,7 @@ namespace pairing_heap { // Return the top item of the heap template - inline TI PairingHeap::top_item() + inline TI PairingHeap::top_item() const { if (root == nullptr) { throw std::domain_error("trying to access the top of an empty heap"); @@ -219,7 +217,7 @@ namespace pairing_heap { // Return the top value of the heap template - inline TV PairingHeap::top_value() + inline TV PairingHeap::top_value() const { if (root == nullptr) { throw std::domain_error("trying to access the top of an empty heap"); @@ -259,14 +257,6 @@ namespace pairing_heap { } } - // Check if specified item is in the heap - template - inline bool PairingHeap::contains(TI const& some_item) - { - return nodes.find(some_item) != nodes.end(); - // return nodes.count(some_item) > 0; - } - // Return the value associated with the item template inline TV PairingHeap::value(const TI &some_item) From 780dc3333a921844d068edaca17be312055fab3c Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 30 Nov 2024 11:57:11 +0100 Subject: [PATCH 055/169] #39046: improve pairing_heap.h --- src/sage/data_structures/pairing_heap.h | 376 ++++++++++-------------- 1 file changed, 162 insertions(+), 214 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h index 29845894650..f14cbdd81e6 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -73,8 +73,9 @@ namespace pairing_heap { PairingHeapNode * next; // Next sibling of the node PairingHeapNode * child; // First child of the node - explicit PairingHeapNode(const TI &some_item, const TV &some_value): - item(some_item), value(some_value), prev(nullptr), next(nullptr), child(nullptr) { + explicit PairingHeapNode(const TI &some_item, const TV &some_value) + : item(some_item), value(some_value), + prev(nullptr), next(nullptr), child(nullptr) { } bool operator<(PairingHeapNode const& other) const { @@ -84,7 +85,7 @@ namespace pairing_heap { bool operator<=(PairingHeapNode const& other) const { return value <= other.value; } - }; + }; // end struct PairingHeapNode template< @@ -94,38 +95,98 @@ namespace pairing_heap { class PairingHeap { public: + // Constructor - explicit PairingHeap(); + explicit PairingHeap() + : root(nullptr) { + } // Copy constructor - PairingHeap(PairingHeap const *other); + PairingHeap(PairingHeap const *other) + : root(nullptr) { + for (auto const& it: other->nodes) { + push(it.first, it.second->value); + } + } // Destructor - virtual ~PairingHeap(); + 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; } + bool empty() const { + return root == nullptr; + } - // Return true if the heap is empty, else false - explicit operator bool() 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); + void push(const TI &some_item, const TV &some_value) { + if (nodes.find(some_item) != nodes.end()) { + throw std::invalid_argument("item already in the heap"); + } + PairingHeapNode *p = new PairingHeapNode(some_item, some_value); + nodes[some_item] = p; + root = root == nullptr ? p : _merge(root, p); + } // Return the top pair (item, value) of the heap - std::pair top() const; + std::pair top() const { + if (root == nullptr) { + 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; + TI top_item() const { + if (root == nullptr) { + 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; + TV top_value() const { + if (root == nullptr) { + throw std::domain_error("trying to access the top of an empty heap"); + } + return root->value; + } - // Remove the top element from the heap - void pop(); + // Remove the top element from the heap. Do nothing if empty + void pop() { + if (root != nullptr) { + PairingHeapNode *p = root->child; + nodes.erase(root->item); + delete root; + root = _pair(p); + } + } // Decrease the value of specified item - void decrease(const TI &some_item, const TV &new_value); + // 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) { + _unlink(p); + root = _merge(root, p); + } + } else { + push(some_item, new_value); + } + } // Check if specified item is in the heap bool contains(TI const& some_item) const { @@ -133,227 +194,114 @@ namespace pairing_heap { } // Return the value associated with the item - TV value(const TI &some_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(); } + 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; - // Pair list of heaps and return pointer to the top of resulting heap - PairingHeapNode *_pair(PairingHeapNode *p); - - // Merge 2 heaps and return pointer to the top of resulting heap - PairingHeapNode *_merge(PairingHeapNode *a, PairingHeapNode *b); - - // Make b a child of a - static void _link(PairingHeapNode *a, PairingHeapNode *b); - // Remove p from its parent children list - static void _unlink(PairingHeapNode *p); - - }; - - // Constructor - template - PairingHeap::PairingHeap(): - root(nullptr) - { - } - - // Copy constructor - template - PairingHeap::PairingHeap(PairingHeap const *other): - root(nullptr) - { - for (auto const& it:other->nodes) - push(it.first, it.second->value); - } - - // Destructor - template - PairingHeap::~PairingHeap() - { - for (auto const& it: nodes) - delete it.second; - } - - // Insert an item into the heap with specified value (priority) - template - void PairingHeap::push(const TI &some_item, const TV &some_value) - { - if (nodes.find(some_item) != nodes.end()) { - throw std::invalid_argument("item already in the heap"); - } - PairingHeapNode *p = new PairingHeapNode(some_item, some_value); - nodes[some_item] = p; - root = root == nullptr ? p : _merge(root, p); - } - - // Return the top pair (value, item) of the heap - template - inline std::pair PairingHeap::top() const - { - if (root == nullptr) { - 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 - template - inline TI PairingHeap::top_item() const - { - if (root == nullptr) { - throw std::domain_error("trying to access the top of an empty heap"); - } - return root->item; - } + // Pair list of heaps and return pointer to the top of resulting heap + static PairingHeapNode *_pair(PairingHeapNode *p) { + if (p == nullptr) { + return nullptr; + } - // Return the top value of the heap - template - inline TV PairingHeap::top_value() const - { - if (root == nullptr) { - throw std::domain_error("trying to access the top of an empty heap"); - } - return root->value; - } + /* + * 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; + PairingHeapNode *it = p; + while (it->next != nullptr) { + it = it->next; + children++; + } - // Remove the top element from the heap - template - void PairingHeap::pop() - { - if (root != nullptr) { - PairingHeapNode *p = root->child; - nodes.erase(root->item); - delete root; - root = _pair(p); - } - } + PairingHeapNode *result; + + if (children % 2 == 1) { + PairingHeapNode *a = it; + it = it->prev; + a->prev = a->next = nullptr; + result = a; + } else { + PairingHeapNode *a = it; + PairingHeapNode *b = it->prev; + it = it->prev->prev; + a->prev = a->next = b->prev = b->next = nullptr; + result = _merge(a, b); + } - // Decrease the value of specified item - // If the item is not in the heap, push it - template - void PairingHeap::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"); + for (size_t i = 0; i < (children - 1) / 2; i++) { + PairingHeapNode *a = it; + PairingHeapNode *b = it->prev; + it = it->prev->prev; + a->prev = a->next = b->prev = b->next = nullptr; + result = _merge(_merge(a, b), result); } - p->value = new_value; - if(p->prev != nullptr) { - _unlink(p); - root = _merge(root, p); - } - } else { - push(some_item, new_value); - } - } - // Return the value associated with the item - template - inline TV PairingHeap::value(const TI &some_item) - { - if (nodes.find(some_item) == nodes.end()) { - throw std::invalid_argument("the specified item is not in the heap"); - } - return nodes[some_item]->value; - } + return result; + } // end _pair - // Pair list of heaps and return pointer to the top of resulting heap - template - inline PairingHeapNode *PairingHeap::_pair(PairingHeapNode *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; - PairingHeapNode *it = p; - while(it->next != nullptr) { - it = it->next; - children++; - } - PairingHeapNode *result; - - if(children % 2 == 1) { - PairingHeapNode *a = it; - it = it->prev; - a->prev = a->next = nullptr; - result = a; - } else { - PairingHeapNode *a = it; - PairingHeapNode *b = it->prev; - it = it->prev->prev; - a->prev = a->next = b->prev = b->next = nullptr; - result = _merge(a, b); - } + // Merge 2 heaps and return pointer to the top of resulting heap + static PairingHeapNode *_merge(PairingHeapNode *a, + PairingHeapNode *b) { + if (*a <= *b) { // Use comparison method of PairingHeapNode + _link(a, b); + return a; + } else { + _link(b, a); + return b; + } + } // end _merge - for(size_t i = 0; i < (children - 1) / 2; i++) { - PairingHeapNode *a = it; - PairingHeapNode *b = it->prev; - it = it->prev->prev; - a->prev = a->next = b->prev = b->next = nullptr; - result = _merge(_merge(a, b), result); - } - return result; - } + // Make b a child of a + static void _link(PairingHeapNode *a, + PairingHeapNode *b) { + if (a->child != nullptr) { + b->next = a->child; + a->child->prev = b; + } + b->prev = a; + a->child = b; + } // end _link - // Merge 2 heaps and return pointer to the top of resulting heap - template - inline PairingHeapNode *PairingHeap::_merge(PairingHeapNode *a, PairingHeapNode *b) - { - if(*a <= *b) { // Use comparison method of PairingHeapNode - _link(a, b); - return a; - } else { - _link(b, a); - return b; - } - } - // Make b a child of a - template - inline void PairingHeap::_link(PairingHeapNode *a, PairingHeapNode *b) - { - if(a->child != nullptr) { - b->next = a->child; - a->child->prev = b; - } - b->prev = a; - a->child = b; - } + // Remove p from its parent children list + static void _unlink(PairingHeapNode *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 - // Remove p from its parent children list - template - inline void PairingHeap::_unlink(PairingHeapNode *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 class PairingHeap } // end namespace pairing_heap From 451b3256ac2cbbb00d2ff24ecc80339fe73d5e40 Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Mon, 2 Dec 2024 14:32:41 +0100 Subject: [PATCH 056/169] graphs/modular_decomposition: improve docstrings and fix coding style --- src/sage/graphs/graph.py | 2 +- .../modular_decomposition.hpp | 8 +-- .../modular_decomposition.pxd | 7 ++- .../modular_decomposition.pyx | 57 ++++++++++++++----- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py index d2a2601f1d8..1e3025117df 100644 --- a/src/sage/graphs/graph.py +++ b/src/sage/graphs/graph.py @@ -7264,7 +7264,7 @@ def is_module(self, vertices): if v not in self: raise LookupError(f"vertex ({v}) is not a vertex of the graph") - if len(M) == 0 or len(M) == 1 or len(M) == self.order(): + if len(M) <= 1 or len(M) == self.order(): return True N = None # will contains the neighborhood of M diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.hpp b/src/sage/graphs/graph_decompositions/modular_decomposition.hpp index c5d822aea18..0ac83788558 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.hpp +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.hpp @@ -1,10 +1,10 @@ /* * 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. + * 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/ */ diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pxd b/src/sage/graphs/graph_decompositions/modular_decomposition.pxd index bc5e6c6c34d..f8807be6266 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pxd +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pxd @@ -14,8 +14,11 @@ cdef extern from "modular_decomposition.hpp": bool is_parallel() const bool is_series() const cpplist[md_tree_node *] children - # For a leaf, the corresponding vertex, for a internal node, any vertex - # corresponding to a any leaf below the node + # 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 *) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index f341281bb43..e56d6059514 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -55,7 +55,7 @@ def corneil_habib_paul_tedder_algorithm(G): OUTPUT: an object of type Node representing the modular decomposition tree of the graph G - This function compute the modular decomposition of the given graph by the + 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 @@ -112,17 +112,16 @@ cdef object _md_tree_node_to_md_tree_inner_rec(const md_tree_node *n, cdef md_tree_node *c if deref(n).is_leaf(): return Node.create_leaf(Gb.vertex_label(deref(n).vertex)) - else: - 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 + + 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): @@ -151,8 +150,7 @@ cdef object md_tree_node_to_md_tree(const md_tree_node *n, CGraphBackend Gb): """ if n == NULL: return Node(NodeType.EMPTY) - else: - return _md_tree_node_to_md_tree_inner_rec(n, Gb) + return _md_tree_node_to_md_tree_inner_rec(n, Gb) ################################################################################ @@ -321,7 +319,7 @@ class Node: @classmethod def create_leaf(cls, v): """ - Return Node object that is a leaf corresponding to the vertex ``v`` + Return Node object that is a leaf corresponding to the vertex ``v``. INPUT: @@ -621,6 +619,21 @@ def modular_decomposition(G, algorithm=None): 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 * @@ -1472,10 +1485,24 @@ def check_algos_are_equivalent(trials, graph_gen, verbose=False): 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() From 68a3b643acbf7fe5cabbb129883a7d9a27a2ff13 Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Mon, 2 Dec 2024 14:44:06 +0100 Subject: [PATCH 057/169] graphs/modular_decomposition: add ref to AP2024 + doctests to show error is fixed --- src/doc/en/reference/references/index.rst | 4 ++++ .../graph_decompositions/modular_decomposition.pyx | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index 45f5fbc090f..d9366e0f80a 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -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. diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx index e56d6059514..3616f63259b 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.pyx +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.pyx @@ -62,6 +62,10 @@ def corneil_habib_paul_tedder_algorithm(G): 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` -- @@ -83,6 +87,13 @@ def corneil_habib_paul_tedder_algorithm(G): ....: 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() From b3a3a245f656e7f02e98969d9bfb02cbbfc51c3c Mon Sep 17 00:00:00 2001 From: Cyril Bouvier Date: Mon, 2 Dec 2024 16:30:11 +0100 Subject: [PATCH 058/169] graphs/modular_decomposition: more comments in the header file --- .../modular_decomposition.hpp | 169 +++++++++++++++--- 1 file changed, 141 insertions(+), 28 deletions(-) diff --git a/src/sage/graphs/graph_decompositions/modular_decomposition.hpp b/src/sage/graphs/graph_decompositions/modular_decomposition.hpp index 0ac83788558..4b14b03c1bf 100644 --- a/src/sage/graphs/graph_decompositions/modular_decomposition.hpp +++ b/src/sage/graphs/graph_decompositions/modular_decomposition.hpp @@ -27,6 +27,9 @@ #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, @@ -34,19 +37,36 @@ enum class Label : uint8_t { 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 }; -enum class Type_ : uint8_t { +/* + * 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, @@ -57,6 +77,10 @@ struct SDData { 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; @@ -64,6 +88,10 @@ struct SDData { 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; @@ -72,6 +100,10 @@ struct SDData { } } + /* + * 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; @@ -80,18 +112,25 @@ struct SDData { } } + /* 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; } @@ -102,43 +141,66 @@ struct SDData { 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 { - md_tree_node(Type_ type, Label label, Flag flag) + /* 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), + : parent(nullptr), vertex(vertex), type(Type::LEAF), label(Label::EMPTY), flag(Flag::UNFLAGGED), slice(SIZE_MAX), cc_tag(SIZE_MAX) { } - md_tree_node(Type_ type) + /* 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; + return type == Type::LEAF; } + /* check whether the node is prime. */ bool is_prime() const { - return type == Type_::PRIME; + return type == Type::PRIME; } + /* check whether the node is series. */ bool is_series() const { - return type == Type_::SERIES; + return type == Type::SERIES; } + /* check whether the node is parallel. */ bool is_parallel() const { - return type == Type_::PARALLEL; + 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; + 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; } @@ -163,6 +225,7 @@ struct md_tree_node { 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()) { @@ -171,6 +234,7 @@ struct md_tree_node { 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()) { @@ -179,6 +243,11 @@ struct md_tree_node { 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) { @@ -191,6 +260,7 @@ struct md_tree_node { } } + /* 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; @@ -202,16 +272,28 @@ struct md_tree_node { md_tree_node *parent; std::list children; int vertex; - Type_ type; + 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; @@ -219,6 +301,10 @@ struct ScratchData { 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 { @@ -250,6 +336,7 @@ struct ScratchData { 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); } @@ -258,7 +345,11 @@ struct ScratchData { 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); @@ -266,13 +357,17 @@ void dealloc_md_tree_nodes_recursively(md_tree_node *n) { 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 */ + 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) { + if (md->type == Type::PRIME || md->type == one_cc_type) { md->cc_tag = 0; } else { md->cc_tag = SIZE_MAX; @@ -282,11 +377,16 @@ void md_forest_preprocess(md_forest &MDi) { i++; } } - one_cc_type = Type_::SERIES; + 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 */ @@ -323,6 +423,7 @@ void mark_partitive_forest_finish_inner_rec(md_tree_node *r) { } } +/* 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(); @@ -369,7 +470,7 @@ void md_forest_mark_partitive_forest(md_forest &MDi, const SDData &sd, * (needed only if there is >= 2 such children). */ if (n->is_degenerate() && n->children.size() > 2) { - Type_ t = n->type; + 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) @@ -406,6 +507,7 @@ void md_forest_mark_partitive_forest(md_forest &MDi, const SDData &sd, } } +/* 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()) { @@ -434,6 +536,7 @@ void sort_broken_nodes_recursively(md_tree_node *n, } } +/* 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 @@ -459,6 +562,7 @@ void sort_dead_nodes_recursively(md_tree_node *n, bool flagged_first) { } } +/* 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(); @@ -494,6 +598,12 @@ void md_forest_extract_and_sort(md_forest &MDi) { } } +/* + * 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(); @@ -584,15 +694,14 @@ void md_forest_clusters_computation(const md_forest &MDi, const SDData &sd, } - -md_tree_node *md_forest_parse_and_assemble(md_tree_node *root, - size_t p, - const ScratchData::Clusters &scratch) { +/* 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; + Type t; size_t i; size_t lp, old_l = l; size_t rp, old_r = r; @@ -600,11 +709,11 @@ md_tree_node *md_forest_parse_and_assemble(md_tree_node *root, if (r+1 == q || (l>0 && scratch.are_clusters_non_adjacent(l-1, r+1))) { lp = l-1; rp = r; - t = Type_::SERIES; + t = Type::SERIES; } else { lp = l; rp = r+1; - t = Type_::PARALLEL; + t = Type::PARALLEL; } while (lp < l || r < rp) { @@ -617,7 +726,7 @@ md_tree_node *md_forest_parse_and_assemble(md_tree_node *root, rp = std::max(rp, scratch.Right[i]); } - t = (r-l)-(old_r-old_l) > 1 ? Type_::PRIME : t; + t = (r-l)-(old_r-old_l) > 1 ? Type::PRIME : t; md_tree_node *old_root = root; root = new md_tree_node(t); @@ -627,7 +736,7 @@ md_tree_node *md_forest_parse_and_assemble(md_tree_node *root, i = old_r; } else { for (md_tree_node *m: scratch.clusters[i]) { - if (t != Type_::PRIME && m->type == t) { + if (t != Type::PRIME && m->type == t) { root->append_stolen_children_from(m); delete m; } else { @@ -640,7 +749,7 @@ md_tree_node *md_forest_parse_and_assemble(md_tree_node *root, 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 */ @@ -659,7 +768,7 @@ md_tree_node *corneil_habib_paul_tedder_inner_rec(const SDData &sd, } 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; + 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)); @@ -680,10 +789,10 @@ md_tree_node *corneil_habib_paul_tedder_inner_rec(const SDData &sd, 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) { + if (md->type == Type::PARALLEL) { root = md; } else { - root = new md_tree_node(Type_::PARALLEL); + root = new md_tree_node(Type::PARALLEL); root->append_new_child(md); } root->prepend_new_child(scratch.mdseq.leaves[x]); @@ -738,6 +847,10 @@ md_tree_node *corneil_habib_paul_tedder_inner_rec(const SDData &sd, 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); From a113ff96a974c739a10894194475581c11c7b4e0 Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Tue, 3 Dec 2024 04:20:11 +0000 Subject: [PATCH 059/169] remove placeholder class and follow Sage deprecation guidelines --- src/sage/rings/polynomial/polynomial_ring.py | 31 ++------------------ 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index b7786239a1b..9a5cd40de54 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -1777,35 +1777,8 @@ def monics(self, of_degree=None, max_degree=None): raise ValueError("you should pass exactly one of of_degree and max_degree") -# Placeholder class for deprecation -class PolynomialRing_general(PolynomialRing_generic): - """ - Univariate polynomial ring over a ring. - - This class is deprecated. Please use :class:`PolynomialRing_generic`. - """ - - def __init__(self, *args, **kwds): - """ - This class is deprecated. Please use :class:`PolynomialRing_generic`. - - TESTS:: - - sage: from sage.rings.polynomial.polynomial_ring import PolynomialRing_general, PolynomialRing_generic - sage: PolynomialRing_general(QQ, name="a") - doctest:warning...DeprecationWarning: - The class PolynomialRing_general has been renamed to PolynomialRing_generic... - Univariate Polynomial Ring in a over Rational Field - - Check they provide the same functionalities for backward compatability:: - - sage: dir(PolynomialRing_general(QQ, name="a")) == dir(PolynomialRing_generic(QQ, name="a")) - True - """ - deprecation( - 38207, "The class PolynomialRing_general has been renamed to PolynomialRing_generic." - ) - super().__init__(*args, **kwds) +# PolynomialRing_general is deprecated since 2024-12-03. See Issue 38207. +PolynomialRing_general = PolynomialRing_generic class PolynomialRing_commutative(PolynomialRing_generic): From c5ec021d88159a12025b00b569697e80ad32a8a2 Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Tue, 3 Dec 2024 04:27:56 +0000 Subject: [PATCH 060/169] replace more occurrences of PolynomialRing_general with PolynomialRing_generic --- src/sage/crypto/lattice.py | 4 ++-- .../arithmetic_dynamics/projective_ds.py | 16 ++++++++-------- src/sage/ext/fast_callable.pyx | 4 ++-- src/sage/interfaces/singular.py | 4 ++-- src/sage/matrix/matrix_space.py | 2 +- .../modform_hecketriangle/abstract_space.py | 8 ++++---- .../modular/modform_hecketriangle/functors.py | 4 ++-- src/sage/rings/asymptotic/asymptotic_ring.py | 4 ++-- ...mptotics_multivariate_generating_functions.py | 12 ++++++------ src/sage/rings/asymptotic/growth_group.py | 4 ++-- src/sage/rings/asymptotic/misc.py | 4 ++-- src/sage/rings/finite_rings/residue_field.pyx | 10 +++++----- src/sage/rings/laurent_series_ring.py | 4 ++-- src/sage/rings/morphism.pyx | 10 +++++----- src/sage/rings/multi_power_series_ring.py | 6 +++--- .../rings/multi_power_series_ring_element.py | 4 ++-- src/sage/rings/padics/padic_valuation.py | 8 ++++---- src/sage/rings/polynomial/flatten.py | 16 ++++++++-------- src/sage/rings/polynomial/laurent_polynomial.pyx | 4 ++-- .../rings/polynomial/laurent_polynomial_ring.py | 4 ++-- .../rings/polynomial/multi_polynomial_ideal.py | 4 ++-- .../polynomial/multi_polynomial_libsingular.pyx | 4 ++-- .../polynomial/multi_polynomial_ring_base.pyx | 4 ++-- src/sage/rings/polynomial/polynomial_element.pyx | 4 ++-- src/sage/rings/polynomial/polynomial_ring.py | 6 +++--- src/sage/rings/power_series_ring.py | 4 ++-- src/sage/rings/semirings/tropical_polynomial.py | 2 +- src/sage/rings/valuation/augmented_valuation.py | 12 ++++++------ src/sage/rings/valuation/developing_valuation.py | 4 ++-- src/sage/rings/valuation/gauss_valuation.py | 16 ++++++++-------- src/sage/rings/valuation/limit_valuation.py | 8 ++++---- src/sage/rings/valuation/valuation_space.py | 4 ++-- src/sage/schemes/affine/affine_space.py | 4 ++-- src/sage/schemes/plane_conics/constructor.py | 4 ++-- src/sage/schemes/projective/projective_space.py | 4 ++-- src/sage/schemes/toric/fano_variety.py | 4 ++-- src/sage/symbolic/ring.pyx | 4 ++-- 37 files changed, 112 insertions(+), 112 deletions(-) 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/dynamics/arithmetic_dynamics/projective_ds.py b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py index 2fab95104f1..01a3236a3d9 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) or isinstance(x, MPolynomialRing_base) + test = lambda x: isinstance(x, PolynomialRing_generic) or isinstance(x, 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) and not isinstance(aff_CR, 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)) @@ -3530,7 +3530,7 @@ def affine_preperiodic_model(self, m, n, return_conjugation=False): if hyperplane_found: break else: - if isinstance(R, PolynomialRing_general) or isinstance(R, MPolynomialRing_base) or isinstance(R, FractionField_generic): + if isinstance(R, PolynomialRing_generic) or isinstance(R, MPolynomialRing_base) or isinstance(R, FractionField_generic): # for polynomial rings, we can get an infinite family of hyperplanes # by increasing the degree var = R.gen() @@ -4592,7 +4592,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) or isinstance(R, MPolynomialRing_base)): + if (isinstance(R, PolynomialRing_generic) or isinstance(R, MPolynomialRing_base)): phi = FlatteningMorphism(CR) flatCR = phi.codomain() Ik = flatCR.ideal(1) @@ -4948,7 +4948,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) or isinstance(R, MPolynomialRing_base)): + if (isinstance(R, PolynomialRing_generic) or isinstance(R, MPolynomialRing_base)): phi = FlatteningMorphism(CR) flatCR = phi.codomain() Ik = flatCR.ideal(1) @@ -5780,7 +5780,7 @@ def sigma_invariants(self, n, formal=False, embedding=None, type='point', else: F = base_ring if isinstance(base_ring, FractionField_generic): - if isinstance(base_ring.ring(), MPolynomialRing_base) or isinstance(base_ring.ring(), PolynomialRing_general): + if isinstance(base_ring.ring(), MPolynomialRing_base) or isinstance(base_ring.ring(), 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) @@ -5883,7 +5883,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) or isinstance(base_ring, MPolynomialRing_base)): + if (isinstance(base_ring, PolynomialRing_generic) or isinstance(base_ring, MPolynomialRing_base)): base_ring = base_ring.base_ring() elif base_ring in FunctionFields(): base_ring = base_ring.constant_base_field() diff --git a/src/sage/ext/fast_callable.pyx b/src/sage/ext/fast_callable.pyx index 89c34b1f0fc..320783d8f4a 100644 --- a/src/sage/ext/fast_callable.pyx +++ b/src/sage/ext/fast_callable.pyx @@ -475,9 +475,9 @@ 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): + if isinstance(x.parent(), PolynomialRing_generic) or isinstance(x.parent(), MPolynomialRing_base): vars = x.parent().variable_names() else: # constant diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py index d02ae43149f..5922d67e0c6 100644 --- a/src/sage/interfaces/singular.py +++ b/src/sage/interfaces/singular.py @@ -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/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/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/rings/asymptotic/asymptotic_ring.py b/src/sage/rings/asymptotic/asymptotic_ring.py index 48caffa1b6a..4b80679379e 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 9eaf85376ca..eaf9f5b3507 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) or isinstance(R, MPolynomialRing_base): + if isinstance(R, PolynomialRing_generic) or isinstance(R, 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) or isinstance(R, MPolynomialRing_base): + if isinstance(R, PolynomialRing_generic) or isinstance(R, MPolynomialRing_base): if not R(q).is_unit(): # Factor denominator try: @@ -3233,9 +3233,9 @@ 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) or isinstance(B, MPolynomialRing_base): + if isinstance(B, PolynomialRing_generic) or isinstance(B, MPolynomialRing_base): if self.base().has_coerce_map_from(B): return True diff --git a/src/sage/rings/asymptotic/growth_group.py b/src/sage/rings/asymptotic/growth_group.py index d55981f07ac..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: 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/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/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/morphism.pyx b/src/sage/rings/morphism.pyx index 3079bfa3974..90f96bc395e 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) or isinstance(A, 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) or isinstance(A, 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 9c27ba678bb..faecdea115e 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/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/polynomial/flatten.py b/src/sage/rings/polynomial/flatten.py index 6354bbcd382..079c97a02fc 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) and not isinstance(domain, MPolynomialRing_base): raise ValueError("domain should be a polynomial ring") ring = domain variables = [] intermediate_rings = [] - while isinstance(ring, PolynomialRing_general) or isinstance(ring, MPolynomialRing_base): + while isinstance(ring, PolynomialRing_generic) or isinstance(ring, 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) and not isinstance(codomain, 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) and not isinstance(domain, 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) or isinstance(R, MPolynomialRing_base) or isinstance(R, FractionField_generic): + while isinstance(R, PolynomialRing_generic) or isinstance(R, MPolynomialRing_base) or isinstance(R, FractionField_generic): if isinstance(R, FractionField_generic): # We've hit base_ring, so set _sub_specialization and exit the loop field_over = R.base() 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/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py index d06f07d722e..990e5e90393 100644 --- a/src/sage/rings/polynomial/multi_polynomial_ideal.py +++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py @@ -600,10 +600,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 diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 72b4aea43ce..200a93adc94 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -218,7 +218,7 @@ from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRi 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 @@ -508,7 +508,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 diff --git a/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx b/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx index ac5e445908d..55fdc42750e 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) or isinstance(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/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx index feb0ef1b03b..c1a87fbd392 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 28226c3b560..163cfed61ca 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -643,7 +643,7 @@ def flattening_morphism(self): """ from .multi_polynomial_ring import MPolynomialRing_base base = self.base_ring() - if isinstance(base, PolynomialRing_general) or isinstance(base, MPolynomialRing_base): + if isinstance(base, PolynomialRing_generic) or isinstance(base, MPolynomialRing_base): from .flatten import FlatteningMorphism return FlatteningMorphism(self) else: @@ -828,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 @@ -1618,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 diff --git a/src/sage/rings/power_series_ring.py b/src/sage/rings/power_series_ring.py index e6c932aadff..1851f05506a 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 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/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 24e5f598624..fe3afc91df8 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/schemes/affine/affine_space.py b/src/sage/schemes/affine/affine_space.py index 42aeae0e2f9..702381f6ea4 100755 --- 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/plane_conics/constructor.py b/src/sage/schemes/plane_conics/constructor.py index a08089522c2..49e3f77e28e 100755 --- 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/projective/projective_space.py b/src/sage/schemes/projective/projective_space.py index 89d4f28f48b..9073faa9706 100755 --- 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/toric/fano_variety.py b/src/sage/schemes/toric/fano_variety.py index fcf5d03d476..fb8265818bd 100755 --- 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/symbolic/ring.pyx b/src/sage/symbolic/ring.pyx index 65fccee5324..f8b52c4d11e 100644 --- a/src/sage/symbolic/ring.pyx +++ b/src/sage/symbolic/ring.pyx @@ -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) or isinstance(R, MPolynomialRing_base) or isinstance(R, FractionField_generic) or isinstance(R, 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 From c7ad2946199f4bc7dfd18140f859fb052b80ecc1 Mon Sep 17 00:00:00 2001 From: Gareth Ma Date: Tue, 3 Dec 2024 04:39:37 +0000 Subject: [PATCH 061/169] add # --- src/sage/rings/polynomial/polynomial_ring.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index 163cfed61ca..ecdb380e726 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -1795,7 +1795,7 @@ def monics(self, of_degree=None, max_degree=None): raise ValueError("you should pass exactly one of of_degree and max_degree") -# PolynomialRing_general is deprecated since 2024-12-03. See Issue 38207. +# PolynomialRing_general is deprecated since 2024-12-03. See Issue #38207. PolynomialRing_general = PolynomialRing_generic From 2e88a318efb9803e27b8ab253b9b4a4f3f6ee611 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 3 Dec 2024 23:51:46 +0700 Subject: [PATCH 062/169] Allow more rings to be used with libsingular --- src/sage/libs/singular/ring.pyx | 223 +++++++++++++++++++++----------- 1 file changed, 144 insertions(+), 79 deletions(-) diff --git a/src/sage/libs/singular/ring.pyx b/src/sage/libs/singular/ring.pyx index f770cc483a5..f87f1b097ec 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,118 @@ 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 + + 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)^1) + // 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 +284,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,21 +479,45 @@ 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: + assert isinstance(base_ring, FiniteField_generic) 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: + _cf = nInitChar(n_Z2m, cexponent) - _ring = rDefault(characteristic, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) + elif modbase.is_prime(): + _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() @@ -399,17 +525,10 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: 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 +541,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") From 88bb9957bfcf450f6cc0f23ec45c5be6ccd66355 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 00:57:58 +0700 Subject: [PATCH 063/169] Fix overflow in conversion int to singular number --- src/sage/libs/singular/singular.pyx | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index 9c7b4078583..e3996a711b8 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -886,7 +886,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 +916,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 +984,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 +1049,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 +1075,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 +1118,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 +1268,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 +1368,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 +1460,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 +1491,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:: @@ -1534,6 +1537,9 @@ 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) return nr2mMapZp(_d, currRing.cf, _ring.cf) @@ -1628,7 +1634,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 +1656,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): From 67084194ed376369935eb48801b3f2dfc8751078 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 01:09:37 +0700 Subject: [PATCH 064/169] Fix a wrong assertion --- src/sage/libs/singular/ring.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/libs/singular/ring.pyx b/src/sage/libs/singular/ring.pyx index f87f1b097ec..a60fb08ec47 100644 --- a/src/sage/libs/singular/ring.pyx +++ b/src/sage/libs/singular/ring.pyx @@ -488,7 +488,7 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: isprime = ch.is_prime() if isprime and ch <= 2147483647: - assert isinstance(base_ring, FiniteField_generic) + # base_ring might be an instance of FiniteField_generic (but Zmod(5) is not) characteristic = base_ring.characteristic() # example for simpler ring creation interface without monomial orderings: From 0764f2941a14af721a31119ff79895634393f177 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 01:24:37 +0700 Subject: [PATCH 065/169] Use different Singular type for Zmod versus FiniteField --- src/sage/libs/singular/ring.pyx | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/sage/libs/singular/ring.pyx b/src/sage/libs/singular/ring.pyx index a60fb08ec47..b24d93eaea6 100644 --- a/src/sage/libs/singular/ring.pyx +++ b/src/sage/libs/singular/ring.pyx @@ -205,11 +205,29 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: // : 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)^1) + // coefficients: ZZ/bigint(340282366920938463463374607431768211507) // number of vars : 2 // block 1 : ordering dp // : names a b @@ -487,8 +505,8 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: isprime = ch.is_prime() - if isprime and ch <= 2147483647: - # base_ring might be an instance of FiniteField_generic (but Zmod(5) is not) + 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: @@ -499,10 +517,10 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: else: modbase, cexponent = ch.perfect_power() - if modbase == 2: + if modbase == 2 and cexponent > 1: _cf = nInitChar(n_Z2m, cexponent) - elif modbase.is_prime(): + 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 From 3aeab0ec01076d6fb8e0c502c9e01e249d7d2fe4 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 01:40:53 +0700 Subject: [PATCH 066/169] Fix (mostly) innocuous test failures --- src/sage/libs/singular/singular.pyx | 2 +- src/sage/rings/polynomial/multi_polynomial_element.py | 6 +++--- src/sage/rings/polynomial/multi_polynomial_ideal.py | 3 +-- src/sage/rings/polynomial/multi_polynomial_libsingular.pyx | 6 +++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index e3996a711b8..4d59795b347 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -1515,7 +1515,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 diff --git a/src/sage/rings/polynomial/multi_polynomial_element.py b/src/sage/rings/polynomial/multi_polynomial_element.py index 3e00ef62991..793b63c059b 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): ``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 d06f07d722e..f716563b22f 100644 --- a/src/sage/rings/polynomial/multi_polynomial_ideal.py +++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py @@ -4527,8 +4527,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 72b4aea43ce..0b8b25f0c4d 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}`:: @@ -340,11 +340,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: From f85e29146dc758269ca6e71a01aee63d589960c9 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 02:10:29 +0700 Subject: [PATCH 067/169] Fix another overflow by modifying si2sa_* accordingly --- src/sage/libs/singular/singular.pyx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index 4d59795b347..417efe71e4f 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -302,6 +302,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): @@ -1583,7 +1586,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): @@ -1611,8 +1614,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: From 75a21e60bd0b1f100b17a58fee46d25456a38ace Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 08:37:07 +0700 Subject: [PATCH 068/169] Fix affected functions and some cleanup --- src/sage/libs/singular/function.pyx | 14 +- src/sage/libs/singular/singular.pxd | 7 + src/sage/libs/singular/singular.pyx | 56 +++- .../multi_polynomial_libsingular.pyx | 266 ++++++++++++++---- src/sage/rings/quotient_ring.py | 2 +- 5 files changed, 287 insertions(+), 58 deletions(-) diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx index 7bf2afafbe8..753427621c5 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 @@ -1453,7 +1453,6 @@ cdef inline call_function(SingularFunction self, tuple args, object R, bint sign global errorreported global currentVoice global myynest - global error_messages cdef ring *si_ring if isinstance(R, MPolynomialRing_libsingular): @@ -1474,10 +1473,7 @@ 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: @@ -1493,10 +1489,10 @@ cdef inline call_function(SingularFunction self, tuple args, object R, bint sign if currentVoice: currentVoice = NULL - if errorreported: - errorreported = 0 + s = check_error() + 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/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 417efe71e4f..77f39d77d47 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 * @@ -1812,10 +1813,63 @@ 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. + """ + global errorreported, catching_error, error_messages + if catching_error: + raise RuntimeError("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: + raise RuntimeError("check_error must be preceded with start_catch_error") + catching_error = False + + if errorreported: + result = tuple(error_messages) + assert result + errorreported = False + error_messages.clear() + return result + else: + assert not error_messages + return None def get_resource(id): """ diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 0b8b25f0c4d..6ccfedf34ab 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -198,7 +198,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,6 +212,8 @@ 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 @@ -4151,6 +4153,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,6 +4494,35 @@ 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. """ cdef ring *_ring = self._parent_ring cdef poly *ptemp @@ -4485,31 +4547,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) + start_catch_error() + sig_on() + I = singclap_factorize(p_Copy(self._poly, _ring), &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)) + try: + if check_error(): + raise NotImplementedError("Factorization of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") - F = Factorization(v, unit) - F.sort() + 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)) - del iv - id_Delete(&I, _ring) + F = Factorization(v, unit) + F.sort() + return F + finally: + del iv + id_Delete(&I, _ring) - return F def lift(self, I): """ @@ -4731,7 +4793,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 +4826,19 @@ 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) + rem = kNF(_I, NULL, other._poly, 0, 1) sig_off() 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 +4913,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 +4957,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 +4974,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 +5029,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 +5142,35 @@ 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. """ cdef poly *quo cdef poly *rem @@ -5041,14 +5186,14 @@ 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 sig_on() if r!=currRing: rChangeCurrRing(r) # singclap_pdivide + start_catch_error() quo = singclap_pdivide( self._poly, right._poly, r ) + 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) if count >= 15: sig_off() @@ -5424,6 +5569,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,31 +5625,50 @@ 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. """ 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) + start_catch_error() if count >= 20: sig_on() if _ring != currRing: rChangeCurrRing(_ring) # singclap_resultant @@ -5513,6 +5678,13 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): _ring) if count >= 20: sig_off() + + 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.") + else: + 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/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: From abf390e8360ca55880fdb651d708872ed96c8a69 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 11:09:16 +0700 Subject: [PATCH 069/169] Fix lint --- src/sage/libs/singular/singular.pyx | 1 + src/sage/rings/polynomial/multi_polynomial_libsingular.pyx | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index 77f39d77d47..9bc4d012102 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -1871,6 +1871,7 @@ cdef object check_error(): assert not error_messages return None + def get_resource(id): """ Return a Singular "resource". diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 6ccfedf34ab..9fea9c93a94 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -4572,7 +4572,6 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): del iv id_Delete(&I, _ring) - def lift(self, I): """ Given an ideal ``I = (f_1,...,f_r)`` and some ``g (== self)`` in ``I``, From f17d29680d36a80ee142106456fb2c84f0c01d0e Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:21:50 +0700 Subject: [PATCH 070/169] Modify existing error detection code as needed --- .../polynomial/multi_polynomial_libsingular.pyx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 9fea9c93a94..0edfa009867 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -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, @@ -4635,8 +4636,6 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): sage: foo[0][0] Ideal (x1 + 1, x2^2 - 3) of Multivariate Polynomial Ring in x1, x2 over Rational Field """ - global errorreported - cdef ideal *fI = idInit(1, 1) cdef ideal *_I cdef MPolynomialRing_libsingular parent = self._parent @@ -4667,15 +4666,15 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): if r != currRing: rChangeCurrRing(r) # idLift + start_catch_error() sig_on() res = idLift(_I, fI, NULL, 0, 0, 0) sig_off() - if errorreported != 0: - errorcode = errorreported - errorreported = 0 - if errorcode == 1: - raise ValueError("polynomial is not in the ideal") - raise RuntimeError + 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") l = [] for i from 0 <= i < IDELEMS(res): From 640ce0b115a9575e79ae1aba553889b807e77fea Mon Sep 17 00:00:00 2001 From: Lorenz Panny <84067835+yyyyx4@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:51:08 +0100 Subject: [PATCH 071/169] whitespace fix (from review) Co-authored-by: Vincent Macri --- src/sage/schemes/elliptic_curves/addition_formulas_ring.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py index d507104b1f6..b961f9ccd27 100644 --- a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -34,7 +34,7 @@ def add(E, P, Q): X1, Y1, Z1 = P X2, Y2, Z2 = Q - #TODO: I've made a half-hearted attempt at simplifying the formulas + # 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. From 05183c490591bc8b38d41692b7331ca716ef45ea Mon Sep 17 00:00:00 2001 From: Lorenz Panny <84067835+yyyyx4@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:51:24 +0100 Subject: [PATCH 072/169] turn comment into warning (from review) Co-authored-by: Vincent Macri --- src/sage/schemes/elliptic_curves/ell_generic.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py index fdde95b416a..30587c4ec9b 100755 --- a/src/sage/schemes/elliptic_curves/ell_generic.py +++ b/src/sage/schemes/elliptic_curves/ell_generic.py @@ -180,9 +180,12 @@ def assume_base_ring_is_field(self, flag=True): Set a flag to pretend that this elliptic curve is defined over a field while doing arithmetic, which is useful in some algorithms. - 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. + + .. 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. EXAMPLES:: From 9441524bb388f84ad5899f2bde3e4c50d90b3df2 Mon Sep 17 00:00:00 2001 From: Lorenz Panny <84067835+yyyyx4@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:54:24 +0100 Subject: [PATCH 073/169] use \Zmod instead of \ZZ/...\ZZ (from review) Co-authored-by: Vincent Macri --- src/sage/schemes/elliptic_curves/ell_point.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index b168ae85598..48a2672187a 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -75,7 +75,7 @@ sage: P*(n+1)-P*n == P True -Arithmetic over `\ZZ/N\ZZ` with composite `N` is supported:: +Arithmetic over `\Zmod{N}` with composite `N` is supported:: sage: N = 1715761513 sage: E = EllipticCurve(Integers(N), [3,-13]) From 65b05f41209f3dd9047c206f463f49f3dca8941d Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 4 Dec 2024 14:57:05 +0100 Subject: [PATCH 074/169] move warning before examples (from review) Co-authored-by: Vincent Macri --- src/sage/schemes/elliptic_curves/ell_generic.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py index 30587c4ec9b..7d7c78d546d 100755 --- a/src/sage/schemes/elliptic_curves/ell_generic.py +++ b/src/sage/schemes/elliptic_curves/ell_generic.py @@ -187,6 +187,10 @@ def assume_base_ring_is_field(self, flag=True): 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]) @@ -203,10 +207,6 @@ def assume_base_ring_is_field(self, flag=True): Traceback (most recent call last): ... ZeroDivisionError: Inverse of 5 does not exist (characteristic = 35 = 5*7) - - .. NOTE:: - - This method is a **hack** provided for educational purposes. """ if flag: if self.__base_ring.is_finite(): From d20ef7ad5ca5d05279ac81d9370a243d409b0a1b Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 4 Dec 2024 15:02:15 +0100 Subject: [PATCH 075/169] adjust some doctests --- src/sage/structure/parent.pyx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) 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 From 22183e776ef95b0d22b0095c6f771a0088f1b959 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 4 Dec 2024 15:45:00 +0100 Subject: [PATCH 076/169] fix normalization of projective points in (say) p-adic fields --- .../schemes/projective/projective_point.py | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/sage/schemes/projective/projective_point.py b/src/sage/schemes/projective/projective_point.py index c5d6b02c05a..88ab4eadcfc 100755 --- 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): From 8df661c0f57aef33c1cf37aeb6d49c2a48327a72 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Wed, 4 Dec 2024 16:39:35 +0100 Subject: [PATCH 077/169] whitespace fix (make linter happy) --- src/sage/schemes/elliptic_curves/ell_generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/schemes/elliptic_curves/ell_generic.py b/src/sage/schemes/elliptic_curves/ell_generic.py index 7d7c78d546d..44f552ae4af 100755 --- a/src/sage/schemes/elliptic_curves/ell_generic.py +++ b/src/sage/schemes/elliptic_curves/ell_generic.py @@ -182,7 +182,7 @@ def assume_base_ring_is_field(self, flag=True): .. 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. From fabaea20979ad9f1ddeb0cf61d12dc47640c43c4 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Thu, 5 Dec 2024 07:52:45 +0700 Subject: [PATCH 078/169] Fix alarms --- src/sage/libs/singular/singular.pyx | 41 +++- .../multi_polynomial_libsingular.pyx | 193 +++++++++++++----- 2 files changed, 178 insertions(+), 56 deletions(-) diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index 9bc4d012102..4a7a5d29d91 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -1838,10 +1838,47 @@ cdef int start_catch_error() except -1: 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: - raise RuntimeError("internal error: previous start_catch_error not ended with check_error") + warn("internal error: previous start_catch_error not ended with check_error") catching_error = True if errorreported: @@ -1858,7 +1895,7 @@ cdef object check_error(): """ global errorreported, catching_error, error_messages if not catching_error: - raise RuntimeError("check_error must be preceded with start_catch_error") + warn("internal error: check_error not preceded with start_catch_error") catching_error = False if errorreported: diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 0edfa009867..c17ed18a405 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -4524,12 +4524,29 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 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 @@ -4552,13 +4569,14 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): if _ring != currRing: rChangeCurrRing(_ring) # singclap_factorize start_catch_error() - sig_on() - I = singclap_factorize(p_Copy(self._poly, _ring), &iv, 0, _ring) - sig_off() - try: - if check_error(): - raise NotImplementedError("Factorization of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") + 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]) @@ -4621,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:: @@ -4635,6 +4652,24 @@ 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 + + Ensure interrupt does not make the internal state inconsistent:: + + sage: R. = QQ[] + sage: n = 15 # 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 256 Polynomials in 2 Variables """ cdef ideal *fI = idInit(1, 1) cdef ideal *_I @@ -4642,7 +4677,7 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 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() @@ -4666,24 +4701,27 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): if r != currRing: rChangeCurrRing(r) # idLift - start_catch_error() - sig_on() - res = idLift(_I, fI, NULL, 0, 0, 0) - sig_off() - 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") - - 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) + 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") + + 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)) ) + finally: + id_Delete(&fI, r) + id_Delete(&_I, r) + id_Delete(&res, r) return Sequence(l, check=False, immutable=True) def reduce(self, I): @@ -4828,10 +4866,12 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 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 @@ -5169,6 +5209,27 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 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 = 250 # 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: h = f.quo_rem(g) + sage: len(dict(h)) + Traceback (most recent call last): + ... + ValueError: dictionary update sequence element #0 has length 658875; 2 is required """ cdef poly *quo cdef poly *rem @@ -5184,17 +5245,16 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): py_rem = self - right*py_quo return py_quo, py_rem - 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 - sig_on() if r!=currRing: rChangeCurrRing(r) # singclap_pdivide start_catch_error() - quo = singclap_pdivide( self._poly, right._poly, r ) - 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) - if count >= 15: + try: + sig_on() + 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): @@ -5650,6 +5710,34 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 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 = 21 # 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)) + 1308 + + As such we test the computation is interruptible (previously it wasn't):: + + sage: alarm(1); 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)) + 1308 """ cdef ring *_ring = self._parent_ring cdef poly *rt @@ -5664,24 +5752,21 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): variable.change_ring(QQ)) return ret.change_ring(ZZ) - cdef int count = singular_polynomial_length_bounded(self._poly, 20) \ - + singular_polynomial_length_bounded(other._poly,20) start_catch_error() - if count >= 20: + 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() - - 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.") - else: - raise NotImplementedError("Resultants require base fields or integer base ring.") + 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.") + else: + raise NotImplementedError("Resultants require base fields or integer base ring.") return new_MP(self._parent, rt) From 287cb943005ebf66bf5452a6b223889c8c0e6938 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Thu, 5 Dec 2024 08:02:49 +0700 Subject: [PATCH 079/169] Fix interruption of singular call_function --- src/sage/libs/singular/function.pyx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx index 753427621c5..2e35e86e99e 100644 --- a/src/sage/libs/singular/function.pyx +++ b/src/sage/libs/singular/function.pyx @@ -1477,11 +1477,15 @@ cdef inline call_function(SingularFunction self, tuple args, object R, bint sign 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 @@ -1489,7 +1493,6 @@ cdef inline call_function(SingularFunction self, tuple args, object R, bint sign if currentVoice: currentVoice = NULL - s = check_error() if s: raise RuntimeError("error in Singular function call %r:\n%s" % (self._name, "\n".join(s))) From 23654283885203d074162fec0645330521e4e4d0 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Thu, 5 Dec 2024 08:58:40 +0700 Subject: [PATCH 080/169] Increase n to make test pass --- .../rings/polynomial/multi_polynomial_libsingular.pyx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index c17ed18a405..08f94b1caf5 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -5714,17 +5714,17 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Sometimes simple-looking computations can take a long time:: sage: R. = QQ[] - sage: n = 21 # chosen so that the computation takes > 1 second but not excessively long. + 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)) - 1308 + 89 As such we test the computation is interruptible (previously it wasn't):: - sage: alarm(1); h = f.resultant(g, x) + sage: alarm(0.5); h = f.resultant(g, x) Traceback (most recent call last): ... AlarmInterrupt @@ -5737,7 +5737,7 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): AlarmInterrupt sage: h = f.resultant(g, x) sage: len(dict(h)) - 1308 + 89 """ cdef ring *_ring = self._parent_ring cdef poly *rt From a41b09c3b07cde69ca3dbbd2d28992c6f16ce5f4 Mon Sep 17 00:00:00 2001 From: Lorenz Panny <84067835+yyyyx4@users.noreply.github.com> Date: Thu, 5 Dec 2024 19:19:26 +0100 Subject: [PATCH 081/169] fix paper title in reference (from review) Co-authored-by: Vincent Macri --- src/doc/en/reference/references/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index dc3a714dbba..b75bdbaa606 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -973,7 +973,7 @@ REFERENCES: Anal. Appl. 15 (1994) 804-823. :doi:`10.1137/S0895479892230031` -.. [BL1995] W. Bosma, H.W. Lenstra: Complete Systems of Addition Laws for +.. [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. From bc38798235e2c0f29fcc01ae638c2df26650e30a Mon Sep 17 00:00:00 2001 From: Lorenz Panny <84067835+yyyyx4@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:12:13 +0100 Subject: [PATCH 082/169] ValueError instead of assertion failure (from review) Co-authored-by: Vincent Macri --- src/sage/schemes/elliptic_curves/addition_formulas_ring.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py index b961f9ccd27..44c423a5d6a 100644 --- a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -29,8 +29,10 @@ def add(E, P, Q): a1, a2, a3, a4, a6 = E.a_invariants() b2, b4, b6, b8 = E.b_invariants() - assert P in E - assert Q in E + 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 From cfa10195df2c5ef9fe3c84dac72169f95657db8a Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Thu, 5 Dec 2024 22:55:32 +0100 Subject: [PATCH 083/169] add comment & test for addition formulas --- .../elliptic_curves/addition_formulas_ring.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py index 44c423a5d6a..510dccc20d1 100644 --- a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -4,6 +4,15 @@ def add(E, P, Q): 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]_, @@ -25,6 +34,20 @@ def add(E, P, Q): (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() From 1f5c0a5076d03a09b47be2e227284f92e086cbb4 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 7 Dec 2024 11:04:19 +0100 Subject: [PATCH 084/169] #39046: fix coding style --- src/sage/data_structures/pairing_heap.pxd | 1 - src/sage/data_structures/pairing_heap.pyx | 24 +++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd index 6e8a20cc3c3..2764db14139 100644 --- a/src/sage/data_structures/pairing_heap.pxd +++ b/src/sage/data_structures/pairing_heap.pxd @@ -19,7 +19,6 @@ cdef extern from "./pairing_heap.h" namespace "pairing_heap": PairingHeap() except + PairingHeap(PairingHeap[TypeOfItem, TypeOfValue]) except + bint empty() - void reset() void push(TypeOfItem, TypeOfValue) except + pair[TypeOfItem, TypeOfValue] top() except + TypeOfItem top_item() except + diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 0364b049b78..6cd52430f01 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -1156,21 +1156,21 @@ def _test_PairingHeap_from_C(n=100): try: _ = HH.top() print("something goes wrong, the error has not been raised") - except ValueError, msg: + 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, msg: + 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, msg: + except ValueError as msg: # The error has been properly handled pass @@ -1178,7 +1178,7 @@ def _test_PairingHeap_from_C(n=100): try: _ = HH.value(123) print("something goes wrong, the error has not been raised") - except ValueError, msg: + except ValueError as msg: # The error has been properly handled pass @@ -1263,21 +1263,21 @@ def _test_PairingHeap_of_n_integers(n=100): try: _ = P.top() print("something goes wrong, the error has not been raised") - except ValueError, msg: + 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, msg: + 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, msg: + except ValueError as msg: # The error has been properly handled pass @@ -1285,7 +1285,7 @@ def _test_PairingHeap_of_n_integers(n=100): try: _ = P.value(123) print("something goes wrong, the error has not been raised") - except ValueError, msg: + except ValueError as msg: # The error has been properly handled pass @@ -1369,21 +1369,21 @@ def _test_PairingHeap_of_n_hashables(n=100): try: _ = P.top() print("something goes wrong, the error has not been raised") - except ValueError, msg: + 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, msg: + 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, msg: + except ValueError as msg: # The error has been properly handled pass @@ -1391,7 +1391,7 @@ def _test_PairingHeap_of_n_hashables(n=100): try: _ = P.value(123) print("something goes wrong, the error has not been raised") - except ValueError, msg: + except ValueError as msg: # The error has been properly handled pass From e6f609555e1c8ec79f1f297cb73cc3ff43fd25ef Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 7 Dec 2024 11:23:36 +0100 Subject: [PATCH 085/169] #39046: mode method top_value to parent class --- src/sage/data_structures/pairing_heap.pxd | 3 +- src/sage/data_structures/pairing_heap.pyx | 72 ++++++++--------------- 2 files changed, 25 insertions(+), 50 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd index 2764db14139..9fc9befcbd3 100644 --- a/src/sage/data_structures/pairing_heap.pxd +++ b/src/sage/data_structures/pairing_heap.pxd @@ -57,13 +57,13 @@ cdef class PairingHeap_class: cdef size_t number_of_items # number of active items cpdef bint empty(self) noexcept cpdef bint full(self) noexcept + cpdef object top_value(self) except * cdef class PairingHeap_of_n_integers(PairingHeap_class): cpdef void push(self, size_t item, object value) except * cpdef tuple top(self) except * cpdef size_t top_item(self) except * - cpdef object top_value(self) except * cpdef void pop(self) noexcept cpdef void decrease(self, size_t item, object new_value) except * cpdef object value(self, size_t item) except * @@ -75,7 +75,6 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): cpdef void push(self, object item, object value) except * cpdef tuple top(self) except * cpdef object top_item(self) except * - cpdef object top_value(self) except * cpdef void pop(self) noexcept cpdef void decrease(self, object item, object new_value) except * cpdef object value(self, object item) except * diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 6cd52430f01..7dbb4358748 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -326,6 +326,30 @@ cdef class PairingHeap_class: size = __len__ + cpdef object top_value(self) except *: + 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 + # ============================================================================== # Class PairingHeap_of_n_integers @@ -512,30 +536,6 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): raise ValueError("trying to access the top of an empty heap") return self.root - self.nodes - cpdef object top_value(self) except *: - 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. @@ -886,30 +886,6 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): cdef size_t idx = self.root - self.nodes return self._int_to_item[idx] - cpdef object top_value(self) except *: - r""" - Return the value of 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_value() - 2 - - sage: P = PairingHeap_of_n_hashables(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. From a229754f372d0479d55a0225c8c8d3953ca75caa Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 7 Dec 2024 11:46:26 +0100 Subject: [PATCH 086/169] #39046: avoid storing the name of the class --- src/sage/data_structures/pairing_heap.pxd | 1 - src/sage/data_structures/pairing_heap.pyx | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd index 9fc9befcbd3..0ca3b428856 100644 --- a/src/sage/data_structures/pairing_heap.pxd +++ b/src/sage/data_structures/pairing_heap.pxd @@ -49,7 +49,6 @@ cdef _unlink(PairingHeapNode * p) except * cdef class PairingHeap_class: - cdef str name # name of the data structure cdef size_t n # maximum number of items cdef PairingHeapNode * root # pointer to the top of the heap cdef PairingHeapNode * nodes # array of size n to store items diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 7dbb4358748..46fcc8772f4 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -257,7 +257,9 @@ cdef class PairingHeap_class: sage: P PairingHeap_of_n_integers: capacity 5, size 1 """ - return f"{self.name}: capacity {self.n}, size {len(self)}" + if isinstance(self, PairingHeap_of_n_integers): + return f"PairingHeap_of_n_integers: capacity {self.n}, size {len(self)}" + return f"PairingHeap_of_n_hashables: capacity {self.n}, size {len(self)}" def __bool__(self): r""" @@ -428,7 +430,6 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): """ if not n: raise ValueError("the capacity of the heap must be strictly positive") - self.name = "PairingHeap_of_n_integers" self.n = n self.root = NULL self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) @@ -770,7 +771,6 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): """ if not n: raise ValueError("the capacity of the heap must be strictly positive") - self.name = "PairingHeap_of_n_hashables" self.n = n self.root = NULL self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) From 7627405a8d5049af3264dc45e6dfd2bb097f2135 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 7 Dec 2024 11:51:53 +0100 Subject: [PATCH 087/169] #39046: avoid calling bitset_clear --- src/sage/data_structures/pairing_heap.pyx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 46fcc8772f4..e5c6ea85c5d 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -103,8 +103,8 @@ 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_clear, bitset_add, - bitset_remove, bitset_in, + bitset_add, bitset_remove, + bitset_in, bitset_first_in_complement) from sage.misc.prandom import shuffle @@ -434,7 +434,6 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): self.root = NULL self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) bitset_init(self.active, n) - bitset_clear(self.active) self.number_of_items = 0 cpdef void push(self, size_t item, object value) except *: @@ -775,7 +774,6 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): self.root = NULL self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) bitset_init(self.active, n) - bitset_clear(self.active) self.number_of_items = 0 self._int_to_item = [None] * n self._item_to_int = dict() From 4f08a264296d07a2c869c6b358ec750db83790c8 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 7 Dec 2024 12:11:25 +0100 Subject: [PATCH 088/169] #39046: avoid th use of new for PairingHeap in _test_PairingHeap_from_C --- src/sage/data_structures/pairing_heap.pyx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index e5c6ea85c5d..641546d45a4 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -1044,7 +1044,7 @@ def _test_PairingHeap_from_C(n=100): """ from sage.misc.prandom import randint, shuffle sig_on() - cdef PairingHeap[size_t, size_t] * PH = new PairingHeap[size_t, size_t]() + cdef PairingHeap[size_t, size_t] PH = PairingHeap[size_t, size_t]() sig_off() # Initialize a list of tuples (value, item) randomly ordered @@ -1101,14 +1101,10 @@ def _test_PairingHeap_from_C(n=100): if L != sorted(Lref): raise ValueError('the order is not good') - sig_on() - sig_free(PH) - sig_off() - # Different cost function from sage.functions.trig import sin, cos sig_on() - cdef PairingHeap[size_t, pair[size_t, size_t]] * HH = new PairingHeap[size_t, pair[size_t, size_t]]() + 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): From eaa5fe5996311bfab60f924ed0f227f0f102847f Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 7 Dec 2024 12:26:43 +0100 Subject: [PATCH 089/169] #39046: mode declaration of top and pop to parent class --- src/sage/data_structures/pairing_heap.pxd | 6 ++-- src/sage/data_structures/pairing_heap.pyx | 42 +++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd index 0ca3b428856..bc447e1dc79 100644 --- a/src/sage/data_structures/pairing_heap.pxd +++ b/src/sage/data_structures/pairing_heap.pxd @@ -56,14 +56,14 @@ cdef class PairingHeap_class: cdef size_t number_of_items # number of active items cpdef bint empty(self) noexcept cpdef bint full(self) noexcept + cpdef tuple top(self) except * cpdef object top_value(self) except * + cpdef void pop(self) noexcept cdef class PairingHeap_of_n_integers(PairingHeap_class): cpdef void push(self, size_t item, object value) except * - cpdef tuple top(self) except * cpdef size_t top_item(self) except * - cpdef void pop(self) noexcept cpdef void decrease(self, size_t item, object new_value) except * cpdef object value(self, size_t item) except * @@ -72,8 +72,6 @@ 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 cpdef void push(self, object item, object value) except * - cpdef tuple top(self) except * cpdef object top_item(self) except * - cpdef void pop(self) noexcept cpdef void decrease(self, object item, object new_value) except * cpdef object value(self, object item) except * diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 641546d45a4..bd8ca1418f8 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -328,6 +328,29 @@ cdef class PairingHeap_class: size = __len__ + cpdef tuple top(self) except *: + 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) except *: r""" Return the value of the top item of the heap. @@ -352,6 +375,25 @@ cdef class PairingHeap_class: 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 From 982e53e49112c7ee88ddad31c0fac1aa81029782 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sat, 7 Dec 2024 13:06:00 +0100 Subject: [PATCH 090/169] #39046: minor changes in pairing_heap.h --- src/sage/data_structures/pairing_heap.h | 187 +++++++++++++----------- 1 file changed, 101 insertions(+), 86 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h index f14cbdd81e6..966cec3e71c 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -88,6 +88,107 @@ namespace pairing_heap { }; // end struct PairingHeapNode + // Remove p from its parent children list + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + > + static void _unlink(PairingHeapNode *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 + + // Pair list of heaps and return pointer to the top of resulting heap + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + > + static PairingHeapNode *_pair(PairingHeapNode *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; + PairingHeapNode *it = p; + while (it->next != nullptr) { + it = it->next; + children++; + } + + PairingHeapNode *result; + + if (children % 2 == 1) { + PairingHeapNode *a = it; + it = it->prev; + a->prev = a->next = nullptr; + result = a; + } else { + PairingHeapNode *a = it; + PairingHeapNode *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++) { + PairingHeapNode *a = it; + PairingHeapNode *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 + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + > + static PairingHeapNode *_merge(PairingHeapNode *a, + PairingHeapNode *b) { + if (*a <= *b) { // Use comparison method of PairingHeapNode + _link(a, b); + return a; + } else { + _link(b, a); + return b; + } + } // end _merge + + + // Make b a child of a + template< + typename TI, // type of items stored in the node + typename TV // type of values associated with the stored item + > + static void _link(PairingHeapNode *a, + PairingHeapNode *b) { + if (a->child != nullptr) { + b->next = a->child; + a->child->prev = b; + } + b->prev = a; + a->child = b; + } // end _link + + template< typename TI, // type of items stored in the node typename TV // type of values associated with the stored item @@ -215,92 +316,6 @@ namespace pairing_heap { // Map used to access stored items std::unordered_map *> nodes; - - // Pair list of heaps and return pointer to the top of resulting heap - static PairingHeapNode *_pair(PairingHeapNode *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; - PairingHeapNode *it = p; - while (it->next != nullptr) { - it = it->next; - children++; - } - - PairingHeapNode *result; - - if (children % 2 == 1) { - PairingHeapNode *a = it; - it = it->prev; - a->prev = a->next = nullptr; - result = a; - } else { - PairingHeapNode *a = it; - PairingHeapNode *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++) { - PairingHeapNode *a = it; - PairingHeapNode *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 PairingHeapNode *_merge(PairingHeapNode *a, - PairingHeapNode *b) { - if (*a <= *b) { // Use comparison method of PairingHeapNode - _link(a, b); - return a; - } else { - _link(b, a); - return b; - } - } // end _merge - - - // Make b a child of a - static void _link(PairingHeapNode *a, - PairingHeapNode *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(PairingHeapNode *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 - }; // end class PairingHeap } // end namespace pairing_heap From 282d52e8161b5c44888a3c072c9a4adef3daf481 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sat, 7 Dec 2024 23:26:04 +0700 Subject: [PATCH 091/169] Apply suggestions from code review Co-authored-by: Martin Rubey --- src/sage/libs/singular/function.pyx | 6 +- src/sage/libs/singular/ring.pyx | 13 ++- src/sage/libs/singular/singular.pyx | 7 +- .../multi_polynomial_libsingular.pyx | 106 +++++++++--------- 4 files changed, 64 insertions(+), 68 deletions(-) diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx index 2e35e86e99e..766eb8826e1 100644 --- a/src/sage/libs/singular/function.pyx +++ b/src/sage/libs/singular/function.pyx @@ -1450,7 +1450,6 @@ 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 @@ -1487,15 +1486,14 @@ cdef inline call_function(SingularFunction self, tuple args, object R, bint sign _res = self.call_handler.handle_call(argument_list, si_ring) s = check_error() - if myynest: - myynest = 0 + myynest = 0 if currentVoice: currentVoice = NULL if s: raise RuntimeError("error in Singular function call %r:\n%s" % - (self._name, "\n".join(s))) + (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 b24d93eaea6..fa7343f8dca 100644 --- a/src/sage/libs/singular/ring.pyx +++ b/src/sage/libs/singular/ring.pyx @@ -521,16 +521,16 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: _cf = nInitChar(n_Z2m, cexponent) elif modbase.is_prime() and cexponent > 1: - _info.base = <__mpz_struct*>omAlloc(sizeof(__mpz_struct)) + _info.base = <__mpz_struct *>omAlloc(sizeof(__mpz_struct)) mpz_init_set(_info.base, modbase.value) _info.exp = cexponent - _cf = nInitChar( n_Znm, &_info ) + _cf = nInitChar(n_Znm, &_info) else: - _info.base = <__mpz_struct*>omAlloc(sizeof(__mpz_struct)) + _info.base = <__mpz_struct *>omAlloc(sizeof(__mpz_struct)) mpz_init_set(_info.base, ch.value) _info.exp = 1 - _cf = nInitChar( n_Zn, &_info ) + _cf = nInitChar(n_Zn, &_info) _ring = rDefault(_cf, nvars, _names, nblcks, _order, _block0, _block1, _wvhdl) elif isinstance(base_ring, FiniteField_generic): @@ -540,13 +540,14 @@ cdef ring *singular_ring_new(base_ring, n, names, term_order) except NULL: # 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()) _ext_names = omAlloc0(sizeof(char*)) _name = str_to_bytes(k._names[0]) _ext_names[0] = omStrDup(_name) - _cfr = rDefault( base_ring.characteristic(), 1, _ext_names ) + _cfr = rDefault(base_ring.characteristic(), 1, _ext_names) _cfr.qideal = idInit(1,1) rComplete(_cfr, 1) diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index 4a7a5d29d91..9e665e481be 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -1542,7 +1542,7 @@ 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) + return n_Init(int(d), _ring.cf) if _ring.cf.type == n_Z2m: _d = long(d) @@ -1904,9 +1904,8 @@ cdef object check_error(): errorreported = False error_messages.clear() return result - else: - assert not error_messages - return None + assert not error_messages + return None def get_resource(id): diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 08f94b1caf5..fddb8234e11 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -4157,30 +4157,30 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Test many base rings:: - sage: R.=GF(2^32+15)[] + 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: 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: 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: 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: 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: R. = Zmod(7^2)[] sage: ((x+y)^3+x+z)//(x+y) Traceback (most recent call last): ... @@ -4498,28 +4498,28 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Test many base rings:: - sage: R.=GF(2^32+15)[] + 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: 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: 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: 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: 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: R. = Zmod(7^2)[] sage: ((x+y)^2*(x+z)^3).factor() Traceback (most recent call last): ... @@ -4579,9 +4579,8 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 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 + v = [(f, ivv[i]) for i in range(1, I.ncols) + if (f := new_MP(parent, p_Copy(I.m[i], _ring)))] unit = new_MP(parent, p_Copy(I.m[0], _ring)) F = Factorization(v, unit) @@ -4714,10 +4713,8 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): warn(f'unexpected error from singular: {s}') raise ValueError("polynomial is not in the ideal") - 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)) ) + 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) @@ -4954,30 +4951,30 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Test many base rings:: - sage: R.=GF(2^32+15)[] + 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: 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: 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: 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: 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: R. = Zmod(7^2)[] sage: ((x+y)^2*(x+z)^3).gcd((x+y)^3*(y+z)^5) Traceback (most recent call last): ... @@ -5012,10 +5009,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() @@ -5070,30 +5067,30 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Test many base rings:: - sage: R.=GF(2^32+15)[] + 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: 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: 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: 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: 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: R. = Zmod(7^2)[] sage: ((x+y)^2*(x+z)^3).lcm((x+y)^3*(y+z)^5) Traceback (most recent call last): ... @@ -5183,28 +5180,28 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Test many base rings:: - sage: R.=GF(2^32+15)[] + 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: 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: 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: 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: 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: R. = Zmod(7^2)[] sage: ((x+y)^3+x+z).quo_rem(x+y) Traceback (most recent call last): ... @@ -5245,11 +5242,12 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): py_rem = self - right*py_quo return py_quo, py_rem - if r!=currRing: rChangeCurrRing(r) # singclap_pdivide + if r != currRing: + rChangeCurrRing(r) # singclap_pdivide start_catch_error() try: sig_on() - quo = singclap_pdivide( self._poly, right._poly, r ) + quo = singclap_pdivide(self._poly, right._poly, r) sig_off() finally: if check_error(): @@ -5684,28 +5682,28 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): sage: f.resultant(g,y) x^2 + x - sage: R.=GF(2^32+15)[] + 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: R. = Zmod(2^29-3)[] sage: (x-z).resultant(y-z,z) x + 536870908*y - sage: R.=GF(2^29+11)[] + 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: 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: R. = GF((2^29-3)^2)[] sage: (x-z).resultant(y-z,z) x - y - sage: R.=Zmod(7^2)[] + sage: R. = Zmod(7^2)[] sage: (x-z).resultant(y-z,z) Traceback (most recent call last): ... @@ -5755,18 +5753,18 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): 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 _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.") - else: - raise NotImplementedError("Resultants require base fields or integer base ring.") + raise NotImplementedError("Resultants require base fields or integer base ring.") return new_MP(self._parent, rt) From 55b698f511cd1cd943a955c8d1f7172a053cd3f8 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sun, 8 Dec 2024 02:15:19 +0700 Subject: [PATCH 092/169] Fix a test failure Co-authored-by: Martin Rubey --- src/sage/rings/polynomial/multi_polynomial_libsingular.pyx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index fddb8234e11..adc8f503f6c 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -4579,8 +4579,9 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): raise NotImplementedError("Factorization of multivariate polynomials over prime fields with characteristic > 2^29 is not implemented.") ivv = iv.ivGetVec() - v = [(f, ivv[i]) for i in range(1, I.ncols) - if (f := new_MP(parent, p_Copy(I.m[i], _ring)))] + 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) From f6c5a149238e50d9cb4a25e23c52d9808f070ab5 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sun, 8 Dec 2024 10:52:19 +0700 Subject: [PATCH 093/169] Fix a doctest --- .../rings/polynomial/multi_polynomial_libsingular.pyx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index adc8f503f6c..faf1cf0c0fd 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -5223,11 +5223,11 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Traceback (most recent call last): ... AlarmInterrupt - sage: h = f.quo_rem(g) - sage: len(dict(h)) - Traceback (most recent call last): - ... - ValueError: dictionary update sequence element #0 has length 658875; 2 is required + sage: q, r = f.quo_rem(g) + sage: len(dict(q)) + 178748 + sage: len(dict(r)) + 7993 """ cdef poly *quo cdef poly *rem From 2bfc2a8a810a06e06cdf8caeaac11b811dd9e370 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sun, 8 Dec 2024 14:09:51 +0100 Subject: [PATCH 094/169] #38936: coding style --- src/sage/groups/perm_gps/partn_ref/data_structures.pyx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 2e9e2fae745..7d23651089a 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pyx +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pyx @@ -47,7 +47,6 @@ cdef inline OrbitPartition *OP_new(int n) noexcept: cdef OrbitPartition *OP = \ sig_malloc(sizeof(OrbitPartition)) if OP is NULL: - sig_free(OP) return NULL OP.parent = sig_malloc(n * sizeof(int)) OP.rank = sig_malloc(n * sizeof(int)) @@ -94,8 +93,8 @@ cdef inline void OP_make_set(OrbitPartition *OP) noexcept: 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.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) From 995a18efba1a7025a4015e7a9b47bc91dfbd269a Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:17:29 +0700 Subject: [PATCH 095/169] Add a lot of # abs tol comments to doctests --- .../schemes/elliptic_curves/period_lattice.py | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/period_lattice.py b/src/sage/schemes/elliptic_curves/period_lattice.py index 02fa7ce62ca..54cd135dea9 100755 --- a/src/sage/schemes/elliptic_curves/period_lattice.py +++ b/src/sage/schemes/elliptic_curves/period_lattice.py @@ -218,9 +218,9 @@ def __init__(self, E, embedding=None): sage: E = EllipticCurve(QQ[I], [5, -3*I]) sage: L = PeriodLattice_ell(E, embedding=None) - sage: L.elliptic_logarithm(E(I+1, I+2)) + sage: L.elliptic_logarithm(E(I+1, I+2)) # abs tol 1e-15 -0.773376784700140 - 0.177736018028666*I - sage: L.elliptic_exponential(_) + 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: @@ -385,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 @@ -1237,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) @@ -1302,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() @@ -1392,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:: @@ -1409,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 @@ -1422,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 @@ -1436,14 +1436,14 @@ 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: @@ -1743,11 +1743,11 @@ def elliptic_logarithm(self, P, prec=None, reduce=True): sage: P = E.lift_x(3) sage: L.elliptic_logarithm(P) -1.97657221097437 - 1.05021415535949*I - sage: L.elliptic_exponential(_) + 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) + sage: L.elliptic_logarithm(P, prec=100) # abs tol 1e-15 -3.4730631218714889933426781799 + 0.44627675553762761312098773197*I - sage: L.elliptic_exponential(_) + 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:: @@ -1902,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, From 5ca39a3ea50b603a2b2eceaceeb8b7c30b1920a5 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:27:36 +0700 Subject: [PATCH 096/169] Reduce the exponent to make test work on 32-bit mpfi --- src/sage/rings/convert/mpfi.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/rings/convert/mpfi.pyx b/src/sage/rings/convert/mpfi.pyx index 4007455bcfd..0c95ff6af94 100644 --- a/src/sage/rings/convert/mpfi.pyx +++ b/src/sage/rings/convert/mpfi.pyx @@ -130,10 +130,10 @@ cdef int _from_str_question_style(mpfi_ptr x, bytes s, int base) except -1: Large exponent (ensure precision is not lost):: - sage: x = RIF("1.123456?2e1000000000"); x - 1.12346?e1000000000 + sage: x = RIF("1.123456?2e100000000"); x + 1.12346?e100000000 sage: x.str(style="question", error_digits=3) - '1.12345600?201e1000000000' + '1.12345600?201e100000000' Large precision:: From 8aa716d51feccfabe659d6e8bd3c70e1196a3fb0 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sun, 8 Dec 2024 18:02:49 +0100 Subject: [PATCH 097/169] #39046: alternative to bitset_first_in_complement --- src/sage/data_structures/pairing_heap.pxd | 3 ++- src/sage/data_structures/pairing_heap.pyx | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd index bc447e1dc79..bbf424baad6 100644 --- a/src/sage/data_structures/pairing_heap.pxd +++ b/src/sage/data_structures/pairing_heap.pxd @@ -52,7 +52,6 @@ cdef class PairingHeap_class: cdef size_t n # maximum number of items cdef PairingHeapNode * root # pointer to the top of the heap cdef PairingHeapNode * nodes # array of size n to store items - cdef bitset_t active # bitset to identify active items cdef size_t number_of_items # number of active items cpdef bint empty(self) noexcept cpdef bint full(self) noexcept @@ -62,6 +61,7 @@ cdef class PairingHeap_class: 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 * @@ -71,6 +71,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): 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) except * cpdef void decrease(self, object item, object new_value) except * diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index bd8ca1418f8..a8652101433 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -815,10 +815,10 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): self.n = n self.root = NULL self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) - bitset_init(self.active, n) self.number_of_items = 0 self._int_to_item = [None] * n self._item_to_int = dict() + self.free_idx = list(range(n)) cpdef void push(self, object item, object value) except *: r""" @@ -861,7 +861,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): if self.full(): raise ValueError("the heap is full") - cdef size_t idx = bitset_first_in_complement(self.active) + cdef size_t idx = self.free_idx.pop() self._int_to_item[idx] = item self._item_to_int[item] = idx cdef PairingHeapNode * p = self.nodes + idx @@ -872,7 +872,6 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): self.root = p else: self.root = _merge(self.root, p) - bitset_add(self.active, idx) self.number_of_items += 1 cpdef tuple top(self) except *: @@ -953,7 +952,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): cdef object item = self.top_item() cdef size_t idx = self._item_to_int[item] Py_XDECREF(self.nodes[idx].value) - bitset_remove(self.active, idx) + self.free_idx.append(idx) del self._item_to_int[item] self.number_of_items -= 1 self.root = _pair(self.root.child) From f077c1a57bdb9f15f34b0d70e7bc94deead13bbe Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Sun, 8 Dec 2024 18:07:45 +0100 Subject: [PATCH 098/169] =?UTF-8?q?rename=20add()=20=E2=86=92=20=5Fadd()?= =?UTF-8?q?=20since=20it=20is=20internal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schemes/elliptic_curves/addition_formulas_ring.py | 10 +++++----- src/sage/schemes/elliptic_curves/ell_point.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py index 510dccc20d1..3846f9f0c7d 100644 --- a/src/sage/schemes/elliptic_curves/addition_formulas_ring.py +++ b/src/sage/schemes/elliptic_curves/addition_formulas_ring.py @@ -1,5 +1,5 @@ -def add(E, P, Q): +def _add(E, P, Q): r""" Addition formulas for elliptic curves over general rings with trivial Picard group. @@ -20,14 +20,14 @@ def add(E, P, Q): EXAMPLES:: - sage: from sage.schemes.elliptic_curves.addition_formulas_ring import add + 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, PQ2 = _add(E, P, Q) sage: PQ1 (1188, 1674, 540) sage: PQ2 @@ -39,13 +39,13 @@ def add(E, P, Q): 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: 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: PQ1, PQ2 = _add(E, P, Q) sage: assert E(*PQ1) == P + Q sage: assert E(*PQ2) == P + Q """ diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 48a2672187a..d05196240a1 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -345,11 +345,11 @@ def _add_(self, other): return E.point(Sequence(pt, E.base_ring()), check=False) - from sage.schemes.elliptic_curves.addition_formulas_ring import add + 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)): + for pt in filter(any, _add(E, self, other)): if R.one() in R.ideal(pt): return E.point(pt) pts.append(pt) From b17bd70a999352c9358b4656711ddd891dc1be40 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Sun, 8 Dec 2024 18:20:22 +0100 Subject: [PATCH 099/169] #39046: missing commit --- src/sage/data_structures/pairing_heap.pyx | 41 ++++++++++++++--------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index a8652101433..0b0e2b96fb4 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -104,8 +104,7 @@ 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, - bitset_first_in_complement) + bitset_in) from sage.misc.prandom import shuffle # ============================================================================== @@ -231,19 +230,6 @@ cdef class PairingHeap_class: Common class and methods for :class:`PairingHeap_of_n_integers` and :class:`PairingHeap_of_n_hashables`. """ - 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) - def __repr__(self): r""" Return a string representing ``self``. @@ -478,6 +464,19 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): 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). @@ -820,6 +819,18 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): 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). From 2b08102230c1586e55abb4480fa30a8b5fcc164b Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 9 Dec 2024 01:15:06 +0700 Subject: [PATCH 100/169] Replace Python 2 'long' with Python 3 'int' --- src/sage/libs/mpmath/ext_main.pyx | 8 ++++---- src/sage/libs/singular/singular.pyx | 2 +- src/sage/misc/randstate.pyx | 18 +++++++++--------- .../rings/finite_rings/finite_field_base.pyx | 2 +- src/sage/rings/finite_rings/integer_mod.pyx | 12 ++++++++++-- src/sage/rings/integer.pyx | 4 ++-- src/sage/rings/padics/relaxed_template.pxi | 2 +- src/sage/rings/puiseux_series_ring_element.pyx | 2 +- src/sage/rings/rational.pyx | 4 ++-- src/sage/rings/real_lazy.pyx | 2 +- src/sage/rings/real_mpfi.pyx | 2 +- src/sage/rings/real_mpfr.pyx | 2 -- src/sage/symbolic/ring.pyx | 2 +- 13 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/sage/libs/mpmath/ext_main.pyx b/src/sage/libs/mpmath/ext_main.pyx index 96111f7b942..f1a406598f2 100644 --- a/src/sage/libs/mpmath/ext_main.pyx +++ b/src/sage/libs/mpmath/ext_main.pyx @@ -580,7 +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) \ + if isinstance(x, (int, Integer)) \ or isinstance(x, rationallib.mpq): return False typ = MPF_set_any(&tmp_opx_re, &tmp_opx_im, x, global_opts, 0) @@ -622,7 +622,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) \ + if isinstance(x, (int, Integer)) \ or isinstance(x, rationallib.mpq): return False typ = MPF_set_any(&tmp_opx_re, &tmp_opx_im, x, global_opts, 0) @@ -671,7 +671,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) \ + if isinstance(x, (int, Integer)) \ or isinstance(x, rationallib.mpq): return bool(x) x = ctx.convert(x) @@ -708,7 +708,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/singular.pyx b/src/sage/libs/singular/singular.pyx index 9c7b4078583..e2ca2b02e75 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -1535,7 +1535,7 @@ cdef inline number *sa2si_ZZmod(IntegerMod_abstract d, ring *_ring) noexcept: cdef nMapFunc nMapFuncPtr = NULL 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() diff --git a/src/sage/misc/randstate.pyx b/src/sage/misc/randstate.pyx index 79435da9ce7..e6cc5be246b 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 diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index c1d0c58a4d3..256be4e6bf5 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 in 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/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/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/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/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..f99f8ab2a54 100644 --- a/src/sage/rings/real_mpfi.pyx +++ b/src/sage/rings/real_mpfi.pyx @@ -818,7 +818,7 @@ cdef class RealIntervalField_class(sage.rings.abc.RealIntervalField): # 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 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 7e1ab748b55..4994db28704 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/symbolic/ring.pyx b/src/sage/symbolic/ring.pyx index 65fccee5324..96f3a445e9c 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): From f398a0fae315f826eeea2cfb2861c1a537d6c8c1 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 9 Dec 2024 01:48:11 +0700 Subject: [PATCH 101/169] Apply suggested changes --- src/sage/libs/mpmath/ext_main.pyx | 9 +++------ src/sage/rings/finite_rings/finite_field_base.pyx | 2 +- src/sage/rings/real_mpfi.pyx | 4 +--- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/sage/libs/mpmath/ext_main.pyx b/src/sage/libs/mpmath/ext_main.pyx index f1a406598f2..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 isinstance(x, (int, 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 isinstance(x, (int, 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 isinstance(x, (int, 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_'): diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index 256be4e6bf5..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 in int 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/real_mpfi.pyx b/src/sage/rings/real_mpfi.pyx index f99f8ab2a54..f3de6a7ca6d 100644 --- a/src/sage/rings/real_mpfi.pyx +++ b/src/sage/rings/real_mpfi.pyx @@ -816,9 +816,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: + if S is ZZ or S is QQ or S is int: return True if isinstance(S, RealIntervalField_class): return (S)._prec >= prec From 5b612f1d00b9470cfa47af7cbf920e2fd51a0930 Mon Sep 17 00:00:00 2001 From: Dave Witte Morris Date: Sun, 8 Dec 2024 19:33:06 -0500 Subject: [PATCH 102/169] #39088 fix numerical_integral with parameters --- src/sage/calculus/integration.pyx | 35 ++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/sage/calculus/integration.pyx b/src/sage/calculus/integration.pyx index 179e5751894..d60f9dc76ce 100644 --- a/src/sage/calculus/integration.pyx +++ b/src/sage/calculus/integration.pyx @@ -56,7 +56,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 @@ -141,17 +147,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): @@ -320,6 +328,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() From 1b9415c20d4faa893ab4c8e071cf7067d2f174c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 01:14:31 +0000 Subject: [PATCH 103/169] :arrow_up: Bump codecov/codecov-action from 4 to 5 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d17c9e85456..535c2948c39 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -589,6 +589,6 @@ jobs: - name: Upload coverage to codecov if: (success() || failure()) && steps.container.outcome == 'success' - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: directory: .coverage/coverage-report From a4c3a084f9a8e8a28d354160a1c4e0221597b5de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Mon, 9 Dec 2024 07:32:27 +0100 Subject: [PATCH 104/169] hot-fix for the linter --- src/sage/features/info.py | 2 ++ src/sage/matroids/chow_ring_ideal.py | 4 +++- src/sage/rings/semirings/tropical_variety.py | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) 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/matroids/chow_ring_ideal.py b/src/sage/matroids/chow_ring_ideal.py index d0ac04a23ee..f2a6c6cf477 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""" @@ -55,6 +56,7 @@ def _lattice_flats(self): chains = lattice_flats.chains() #Only chains return (ranks, chains) + class ChowRingIdeal_nonaug(ChowRingIdeal): r""" The Chow ring ideal of a matroid `M`. @@ -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/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`. From 6b151f19a6eb3ca5f329d11e03fb1180bd999bf9 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Mon, 9 Dec 2024 10:22:52 +0100 Subject: [PATCH 105/169] #38936: fix reviewer suggestions --- src/sage/groups/perm_gps/partn_ref/data_structures.pxd | 2 +- src/sage/groups/perm_gps/partn_ref/data_structures.pyx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 af6da5d606f..3d9ab0f74d9 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pxd +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pxd @@ -141,7 +141,7 @@ cdef inline void OP_join(OrbitPartition *OP, int m, int n) noexcept: if m_root != n_root: OP.num_cells -= 1 -cdef void OP_make_set(OrbitPartition *OP) noexcept +cdef inline 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 7d23651089a..7296f65d14c 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pyx +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pyx @@ -88,6 +88,7 @@ cdef OP_string(OrbitPartition *OP): 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 From 6b2345ec282958be4940b5c0fc0415c943363538 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Mon, 9 Dec 2024 10:27:23 +0100 Subject: [PATCH 106/169] #38936: some coding style improvements --- .../perm_gps/partn_ref/data_structures.pyx | 62 ++++++++++++++----- 1 file changed, 47 insertions(+), 15 deletions(-) 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 7296f65d14c..214e5fda627 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pyx +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pyx @@ -64,6 +64,7 @@ cdef inline OrbitPartition *OP_new(int n) noexcept: OP_clear(OP) return OP + cdef inline void OP_dealloc(OrbitPartition *OP) noexcept: if OP is not NULL: sig_free(OP.parent) @@ -72,6 +73,7 @@ cdef inline void OP_dealloc(OrbitPartition *OP) noexcept: sig_free(OP.size) sig_free(OP) + cdef OP_string(OrbitPartition *OP): """ Return a string representation of the OrbitPartition. @@ -232,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. @@ -244,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 @@ -263,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 @@ -293,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. @@ -301,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. @@ -315,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, @@ -379,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") @@ -391,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 @@ -414,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``. @@ -583,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 @@ -653,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`. @@ -675,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: @@ -683,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}. @@ -724,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}. @@ -767,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 @@ -775,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 @@ -804,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. @@ -834,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])): @@ -851,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: @@ -890,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 @@ -900,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 @@ -934,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 @@ -961,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) @@ -973,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: @@ -1014,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 @@ -1035,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) @@ -1060,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 @@ -1109,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 @@ -1121,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 @@ -1132,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 @@ -1167,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., @@ -1692,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 @@ -1732,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: """ From 6267b0ddf766f8ee44f15e817efbd42f21cee679 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:34:23 +0700 Subject: [PATCH 107/169] Make references to the Sage notebook lowercase (not proper name) --- src/doc/en/developer/coding_in_cython.rst | 2 +- src/sage/interacts/library.py | 2 +- src/sage/plot/animate.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/doc/en/developer/coding_in_cython.rst b/src/doc/en/developer/coding_in_cython.rst index 0ab239be7bc..a912a75c544 100644 --- a/src/doc/en/developer/coding_in_cython.rst +++ b/src/doc/en/developer/coding_in_cython.rst @@ -37,7 +37,7 @@ Writing Cython code in Sage There are several ways to create and build Cython code in Sage. -#. In the Sage Notebook or the Sage command line, begin any cell with +#. 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. 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/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') From c1f8dbc247b47f542d724579a789f70d8e1aa8f5 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 9 Dec 2024 18:43:24 +0800 Subject: [PATCH 108/169] Replace bootstrap-conda by grayskull and update conda lock files --- .ci/write-dockerfile.sh | 2 +- .devcontainer/onCreate-conda.sh | 2 +- .github/workflows/ci-conda.yml | 2 +- .github/workflows/ci-meson.yml | 2 +- .github/workflows/conda-lock-update.py | 56 --- .gitignore | 4 +- .gitpod.yml | 2 +- Makefile | 2 +- bootstrap | 4 +- bootstrap-conda | 125 ------ environment-3.10-linux-aarch64.yml | 527 ++++++++++------------- environment-3.10-linux.yml | 560 +++++++++---------------- environment-3.10-macos-x86_64.yml | 474 ++++++++------------- environment-3.10-macos.yml | 472 ++++++++------------- environment-3.11-linux-aarch64.yml | 526 ++++++++++------------- environment-3.11-linux.yml | 559 +++++++++--------------- environment-3.11-macos-x86_64.yml | 473 ++++++++------------- environment-3.11-macos.yml | 471 ++++++++------------- environment-3.9-linux-aarch64.yml | 523 ++++++++++------------- environment-3.9-linux.yml | 556 +++++++++--------------- environment-3.9-macos-x86_64.yml | 470 ++++++++------------- environment-3.9-macos.yml | 468 ++++++++------------- environment-dev-3.10-linux-aarch64.yml | 489 --------------------- environment-dev-3.10-linux.yml | 536 ----------------------- environment-dev-3.10-macos-x86_64.yml | 470 --------------------- environment-dev-3.10-macos.yml | 472 --------------------- environment-dev-3.11-linux-aarch64.yml | 488 --------------------- environment-dev-3.11-linux.yml | 535 ----------------------- environment-dev-3.11-macos-x86_64.yml | 469 --------------------- environment-dev-3.11-macos.yml | 471 --------------------- environment-dev-3.9-linux-aarch64.yml | 489 --------------------- environment-dev-3.9-linux.yml | 536 ----------------------- environment-dev-3.9-macos-x86_64.yml | 470 --------------------- environment-dev-3.9-macos.yml | 472 --------------------- pkgs/sage-conf_conda/MANIFEST.in | 1 - pyproject.toml | 7 +- src/doc/en/installation/conda.rst | 8 +- src/doc/en/installation/meson.rst | 3 +- subprojects/factory | 1 + tools/README.md | 18 +- tools/update-conda.py | 181 ++++++++ 41 files changed, 2487 insertions(+), 9909 deletions(-) delete mode 100755 .github/workflows/conda-lock-update.py delete mode 100755 bootstrap-conda delete mode 100644 environment-dev-3.10-linux-aarch64.yml delete mode 100644 environment-dev-3.10-linux.yml delete mode 100644 environment-dev-3.10-macos-x86_64.yml delete mode 100644 environment-dev-3.10-macos.yml delete mode 100644 environment-dev-3.11-linux-aarch64.yml delete mode 100644 environment-dev-3.11-linux.yml delete mode 100644 environment-dev-3.11-macos-x86_64.yml delete mode 100644 environment-dev-3.11-macos.yml delete mode 100644 environment-dev-3.9-linux-aarch64.yml delete mode 100644 environment-dev-3.9-linux.yml delete mode 100644 environment-dev-3.9-macos-x86_64.yml delete mode 100644 environment-dev-3.9-macos.yml create mode 160000 subprojects/factory create mode 100644 tools/update-conda.py 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/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/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/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_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/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/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..a5f9c49d69e 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 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) From 52f8ec8b2d8646b959b6842bec1b0194c8f8b598 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Mon, 9 Dec 2024 12:57:16 +0100 Subject: [PATCH 109/169] #38936: revert addition of inline statement --- src/sage/groups/perm_gps/partn_ref/data_structures.pxd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3d9ab0f74d9..af6da5d606f 100644 --- a/src/sage/groups/perm_gps/partn_ref/data_structures.pxd +++ b/src/sage/groups/perm_gps/partn_ref/data_structures.pxd @@ -141,7 +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 void OP_make_set(OrbitPartition *OP) noexcept cdef inline int OP_merge_list_perm(OrbitPartition *OP, int *gamma) noexcept: """ From 0ac343a6f3e62f5aea5c2d885bee951bd7ed5bab Mon Sep 17 00:00:00 2001 From: Dima Pasechnik Date: Wed, 23 Oct 2024 21:28:27 +0100 Subject: [PATCH 110/169] remove a spurrous adding of the same constraint twice --- src/sage/coding/delsarte_bounds.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sage/coding/delsarte_bounds.py b/src/sage/coding/delsarte_bounds.py index a7cc35e058d..1bae93e5500 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) ... @@ -220,7 +219,6 @@ def _delsarte_LP_building(n, d, d_star, q, isinteger, solver, maxc=0): for j in range(1, n + 1): rhs = 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 From a1242d53fde6ade68b1165643c24ffe239e71c00 Mon Sep 17 00:00:00 2001 From: Dima Pasechnik Date: Mon, 9 Dec 2024 09:25:06 -0600 Subject: [PATCH 111/169] use p.sum() instead of sum() --- src/sage/coding/delsarte_bounds.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/sage/coding/delsarte_bounds.py b/src/sage/coding/delsarte_bounds.py index 1bae93e5500..f3dedb7a720 100644 --- a/src/sage/coding/delsarte_bounds.py +++ b/src/sage/coding/delsarte_bounds.py @@ -212,12 +212,12 @@ 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)]) if j >= d_star: p.add_constraint(0 <= rhs) @@ -225,7 +225,7 @@ def _delsarte_LP_building(n, d, d_star, q, isinteger, solver, maxc=0): 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 @@ -273,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 @@ -281,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 @@ -620,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) @@ -632,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 From a30c4f65524adb17b2ce920407f18c7358ce240d Mon Sep 17 00:00:00 2001 From: Julien Lavauzelle Date: Mon, 9 Dec 2024 18:06:05 +0100 Subject: [PATCH 112/169] Bugfix for erasure decoder --- src/sage/coding/grs_code.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/coding/grs_code.py b/src/sage/coding/grs_code.py index 2fada75c4a9..ec3536a76c4 100644 --- a/src/sage/coding/grs_code.py +++ b/src/sage/coding/grs_code.py @@ -1958,14 +1958,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): From 4e5bb7f60ff4a0aaaa0a235afeec095ec9b54348 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 10 Dec 2024 00:10:41 +0700 Subject: [PATCH 113/169] Add cython.binding(True) to occurrences of sage_wraps --- src/sage/misc/decorators.py | 12 ++++++++++++ src/sage/structure/element.pyx | 1 + src/sage/structure/mutability.pyx | 3 +++ src/sage/symbolic/expression.pyx | 2 ++ 4 files changed, 18 insertions(+) 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/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/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) From 7506855d6371715aeb38daea2d7b0fb0f9f5cea5 Mon Sep 17 00:00:00 2001 From: Julien Lavauzelle Date: Mon, 9 Dec 2024 18:41:28 +0100 Subject: [PATCH 114/169] Added doctest and fixed assumption for computing the decoding radius --- src/sage/coding/grs_code.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sage/coding/grs_code.py b/src/sage/coding/grs_code.py index ec3536a76c4..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: @@ -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 From a89a3ca8698cd17145ed7974c32210620b60623a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Mon, 9 Dec 2024 21:43:17 +0100 Subject: [PATCH 115/169] two more ruff checks activated --- .../combinat/cluster_algebra_quiver/quiver_mutation_type.py | 2 +- src/sage/combinat/finite_state_machine.py | 4 ++-- src/sage/groups/misc_gps/argument_groups.py | 4 ++-- src/sage/modular/arithgroup/congroup_generic.py | 2 +- src/sage/repl/ipython_kernel/widgets.py | 2 +- src/tox.ini | 3 +-- 6 files changed, 8 insertions(+), 9 deletions(-) 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/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/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/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/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/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 = From bdc3ed6bbc55f9146e0d4d53e09c9d66db185417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Tue, 10 Dec 2024 11:59:46 +0100 Subject: [PATCH 116/169] cython-lint cleanup in matroids --- src/sage/matroids/basis_exchange_matroid.pyx | 46 +++--- src/sage/matroids/basis_matroid.pyx | 2 +- .../matroids/circuit_closures_matroid.pyx | 3 +- src/sage/matroids/circuits_matroid.pyx | 1 - src/sage/matroids/graphic_matroid.pyx | 2 +- src/sage/matroids/lean_matrix.pyx | 44 +++--- src/sage/matroids/linear_matroid.pyx | 64 ++++---- src/sage/matroids/matroid.pyx | 138 +++++++++--------- src/sage/matroids/union_matroid.pyx | 8 +- 9 files changed, 156 insertions(+), 152 deletions(-) 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/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..cedf6805a3e 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 + 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])))): + (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/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): From cc81a9f029248444f6fa0e5ae49369742f9b46f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Tue, 10 Dec 2024 13:51:58 +0100 Subject: [PATCH 117/169] cython-lint fixes in misc/ --- src/sage/misc/binary_tree.pxd | 32 ++++---- src/sage/misc/binary_tree.pyx | 2 +- src/sage/misc/c3.pyx | 7 +- src/sage/misc/c3_controlled.pyx | 48 +++++------ src/sage/misc/cachefunc.pyx | 114 +++++++++++++------------- src/sage/misc/citation.pyx | 6 +- src/sage/misc/classcall_metaclass.pxd | 6 +- src/sage/misc/constant_function.pyx | 6 +- src/sage/misc/derivative.pyx | 6 +- src/sage/misc/fast_methods.pyx | 6 +- src/sage/misc/function_mangling.pyx | 8 +- src/sage/misc/inherit_comparison.pyx | 4 +- src/sage/misc/instancedoc.pyx | 4 +- src/sage/misc/lazy_attribute.pyx | 8 +- src/sage/misc/lazy_import.pyx | 3 +- src/sage/misc/lazy_list.pyx | 6 +- src/sage/misc/lazy_string.pyx | 32 ++++---- src/sage/misc/nested_class.pyx | 4 +- src/sage/misc/persist.pyx | 27 +++--- src/sage/misc/randstate.pyx | 5 +- src/sage/misc/search.pxd | 2 +- src/sage/misc/stopgap.pyx | 4 +- src/sage/misc/weak_dict.pyx | 4 +- 23 files changed, 173 insertions(+), 171 deletions(-) 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..3aa71cc73da 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,13 +896,13 @@ 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 + # 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: @@ -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/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/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/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..7ffa3eb63ae 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): @@ -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..f6b70595f78 100644 --- a/src/sage/misc/randstate.pyx +++ b/src/sage/misc/randstate.pyx @@ -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): @@ -1005,7 +1005,6 @@ def benchmark_libc(): 125 loops, best of 3: 2.12 ms per loop """ cdef int i - cdef randstate rstate = _current_randstate for i from 0 <= i < 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') From d80131792cf04295e8e1e013f56e010b433c6d97 Mon Sep 17 00:00:00 2001 From: Julien Lavauzelle Date: Tue, 10 Dec 2024 14:22:31 +0100 Subject: [PATCH 118/169] Fix crash when trying to build very large Reed-Muller codes --- src/sage/coding/linear_code_no_metric.py | 2 +- src/sage/coding/reed_muller_code.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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/reed_muller_code.py b/src/sage/coding/reed_muller_code.py index e690534c5e3..d46c5403eef 100644 --- a/src/sage/coding/reed_muller_code.py +++ b/src/sage/coding/reed_muller_code.py @@ -401,6 +401,14 @@ class directly, as :meth:`ReedMullerCode` creates either a binary or a 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. + + 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 = {} From ea0f811340c28b3a81598307071170eb121ce53d Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Tue, 10 Dec 2024 09:41:36 -0500 Subject: [PATCH 119/169] build/pkgs/planarity/spkg-configure.m4: update header check In the ./configure test for libplanarity, we should be testing for planarity/graph.h instead of planarity/planarity.h: 1. graph.h is what we actually use in src/sage/graphs/planarity.pyx, 2. planarity.h is going away in a future version. cf. https://github.com/graph-algorithms/edge-addition-planarity-suite/pull/125 --- build/pkgs/planarity/spkg-configure.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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( From 7e426cbcc5534dd7aad02a05751ababa3aba2ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Tue, 10 Dec 2024 16:13:49 +0100 Subject: [PATCH 120/169] cython-lint cleanup for one pxi file in matrix --- .../matrix/matrix_modn_dense_template.pxi | 185 +++++++++--------- 1 file changed, 95 insertions(+), 90 deletions(-) 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 From bc9beeceb8a13412d16f8126985afe294d45e78e Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 10 Dec 2024 22:17:47 +0700 Subject: [PATCH 121/169] Remove unnecessary dummy lines in doctests --- src/sage/repl/interpreter.py | 3 +-- src/sage/repl/ipython_extension.py | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) 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..46caf9e40c5 100644 --- a/src/sage/repl/ipython_extension.py +++ b/src/sage/repl/ipython_extension.py @@ -395,14 +395,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) ... From e57c2f69749ac8750f798a80f32b2c59d11f0f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Tue, 10 Dec 2024 18:19:26 +0100 Subject: [PATCH 122/169] first step towards removal of IntegralDomain --- src/sage/categories/integral_domains.py | 32 ++++++++++++++ src/sage/categories/rings.py | 16 +++++++ src/sage/rings/abc.pyx | 5 +-- src/sage/rings/localization.py | 19 ++++----- .../rings/number_field/number_field_base.pyx | 2 +- src/sage/rings/power_series_ring.py | 4 +- src/sage/rings/ring.pyx | 42 ------------------- 7 files changed, 61 insertions(+), 59 deletions(-) diff --git a/src/sage/categories/integral_domains.py b/src/sage/categories/integral_domains.py index 4dd66a9277b..27983661520 100644 --- a/src/sage/categories/integral_domains.py +++ b/src/sage/categories/integral_domains.py @@ -143,6 +143,38 @@ 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("unable to determine whether or not is a field.") + else: + 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/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/rings/abc.pyx b/src/sage/rings/abc.pyx index e8078f97743..cc8c3ec9a10 100644 --- a/src/sage/rings/abc.pyx +++ b/src/sage/rings/abc.pyx @@ -1,9 +1,6 @@ """ Abstract base classes for rings """ -from sage.rings.ring import IntegralDomain - - class NumberField_quadratic(Field): r""" Abstract base class for :class:`~sage.rings.number_field.number_field.NumberField_quadratic`. @@ -419,7 +416,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/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/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/power_series_ring.py b/src/sage/rings/power_series_ring.py index e6c932aadff..512ab8d6e20 100644 --- a/src/sage/rings/power_series_ring.py +++ b/src/sage/rings/power_series_ring.py @@ -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/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() From 94bf13eaed58fcfbb98db034aae38c8ea5122ed8 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Tue, 10 Dec 2024 19:29:11 +0100 Subject: [PATCH 123/169] #39046: all suggested improvements --- src/sage/data_structures/pairing_heap.h | 441 ++++++++++++---------- src/sage/data_structures/pairing_heap.pxd | 49 +-- src/sage/data_structures/pairing_heap.pyx | 176 ++------- 3 files changed, 295 insertions(+), 371 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h index 966cec3e71c..0f5f082480d 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -62,261 +62,284 @@ namespace pairing_heap { template< - typename TI, // type of items stored in the node - typename TV // type of values associated with the stored item + typename TV, // type of values + typename T // type of the child class > - struct PairingHeapNode { - TI item; // item contained in the node - TV value; // value associated with the item - - PairingHeapNode * prev; // Previous sibling of the node or parent - PairingHeapNode * next; // Next sibling of the node - PairingHeapNode * child; // First child of the node + struct PairingHeapNodeBase { + public: - explicit PairingHeapNode(const TI &some_item, const TV &some_value) - : item(some_item), value(some_value), - prev(nullptr), next(nullptr), child(nullptr) { + bool operator<=(PairingHeapNodeBase const& other) const { + return static_cast(this)->le_implem(static_cast(other)); } - bool operator<(PairingHeapNode const& other) const { - return value < other.value; - } + // Pair list of heaps and return pointer to the top of resulting heap + static T *_pair(T *p) { + if (p == nullptr) { + return nullptr; + } - bool operator<=(PairingHeapNode const& other) const { - return value <= other.value; - } - }; // end struct PairingHeapNode + /* + * 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; - // Remove p from its parent children list - template< - typename TI, // type of items stored in the node - typename TV // type of values associated with the stored item - > - static void _unlink(PairingHeapNode *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 + 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); + } - // Pair list of heaps and return pointer to the top of resulting heap - template< - typename TI, // type of items stored in the node - typename TV // type of values associated with the stored item - > - static PairingHeapNode *_pair(PairingHeapNode *p) { - if (p == nullptr) { - return nullptr; - } + 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); + } - /* - * 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; - PairingHeapNode *it = p; - while (it->next != nullptr) { - it = it->next; - children++; - } + return result; + } // end _pair - PairingHeapNode *result; - if (children % 2 == 1) { - PairingHeapNode *a = it; - it = it->prev; - a->prev = a->next = nullptr; - result = a; - } else { - PairingHeapNode *a = it; - PairingHeapNode *b = it->prev; - it = it->prev->prev; - a->prev = a->next = b->prev = b->next = nullptr; - result = _merge(a, b); - } + // 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 - for (size_t i = 0; i < (children - 1) / 2; i++) { - PairingHeapNode *a = it; - PairingHeapNode *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 + // 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 - // Merge 2 heaps and return pointer to the top of resulting heap - template< - typename TI, // type of items stored in the node - typename TV // type of values associated with the stored item - > - static PairingHeapNode *_merge(PairingHeapNode *a, - PairingHeapNode *b) { - if (*a <= *b) { // Use comparison method of PairingHeapNode - _link(a, b); - return a; - } else { - _link(b, a); - return b; - } - } // end _merge + // 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 - // Make b a child of a - template< - typename TI, // type of items stored in the node - typename TV // type of values associated with the stored item - > - static void _link(PairingHeapNode *a, - PairingHeapNode *b) { - if (a->child != nullptr) { - b->next = a->child; - a->child->prev = b; - } - b->prev = a; - a->child = b; - } // end _link + 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 PairingHeap - { - public: + class PairingHeapNode + : public PairingHeapNodeBase> { - // Constructor - explicit PairingHeap() - : root(nullptr) { - } + public: + PairingHeapNode(TI const& some_item, TV const& some_value) + : Base_(some_value), item(some_item) { + } - // Copy constructor - PairingHeap(PairingHeap const *other) - : root(nullptr) { - for (auto const& it: other->nodes) { - push(it.first, it.second->value); - } - } + bool le_implem(PairingHeapNode const& other) const { + return this->value <= other.value; + } - // Destructor - virtual ~PairingHeap() { - for (auto const& it: nodes) { - delete it.second; - } - } + TI item; // item contained in the node - // Return true if the heap is empty, else false - bool empty() const { - return root == nullptr; - } + private: + using Base_ = PairingHeapNodeBase>; + }; - // 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 (nodes.find(some_item) != nodes.end()) { - throw std::invalid_argument("item already in the heap"); - } - PairingHeapNode *p = new PairingHeapNode(some_item, some_value); - nodes[some_item] = p; - root = root == nullptr ? p : _merge(root, p); - } + class PairingHeapNodePy + : public PairingHeapNodeBase { + public: + PairingHeapNodePy(PyObject *some_value) + : Base_(some_value) { + } - // Return the top pair (item, value) of the heap - std::pair top() const { - if (root == nullptr) { - throw std::domain_error("trying to access the top of an empty heap"); - } - return std::make_pair(root->item, root->value); - } + bool le_implem(PairingHeapNodePy const& other) const { + return PyObject_RichCompareBool(this->value, other.value, Py_LE); + } - // Return the top item of the heap - TI top_item() const { - if (root == nullptr) { - throw std::domain_error("trying to access the top of an empty heap"); - } - return root->item; - } + private: + using Base_ = PairingHeapNodeBase; + }; - // Return the top value of the heap - TV top_value() const { - if (root == nullptr) { - 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 (root != nullptr) { - PairingHeapNode *p = root->child; - nodes.erase(root->item); - delete root; - root = _pair(p); - } + + 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); } + } - // 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) { - _unlink(p); - root = _merge(root, p); - } - } else { - push(some_item, new_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 (nodes.find(some_item) != nodes.end()) { + throw std::invalid_argument("item already in the heap"); + } + PairingHeapNode *p = new PairingHeapNode(some_item, some_value); + nodes[some_item] = p; + root = root == nullptr ? p : HeapNodeType::_merge(root, p); + } + + // Return the top pair (item, value) of the heap + std::pair top() const { + if (root == nullptr) { + throw std::domain_error("trying to access the top of an empty heap"); } + return std::make_pair(root->item, root->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 top item of the heap + TI top_item() const { + if (root == nullptr) { + throw std::domain_error("trying to access the top of an empty heap"); } + return root->item; + } - // 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 the top value of the heap + TV top_value() const { + if (root == nullptr) { + 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 (root != nullptr) { + 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"); } - return it->second->value; + p->value = new_value; + if (p->prev != nullptr) { + HeapNodeType::_unlink(p); + root = HeapNodeType::_merge(root, p); + } + } else { + push(some_item, new_value); } - - // Return the number of items in the heap - size_t size() const { - return nodes.size(); + } + + // 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: + private: - // Pointer to the top of the heap - PairingHeapNode *root; + // Pointer to the top of the heap + PairingHeapNode *root; - // Map used to access stored items - std::unordered_map *> nodes; + // Map used to access stored items + std::unordered_map *> nodes; - }; // end class PairingHeap + }; // end class PairingHeap } // end namespace pairing_heap diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd index bbf424baad6..06e70ad2c0f 100644 --- a/src/sage/data_structures/pairing_heap.pxd +++ b/src/sage/data_structures/pairing_heap.pxd @@ -13,6 +13,7 @@ # ============================================================================== from libcpp.pair cimport pair +from cpython cimport PyObject cdef extern from "./pairing_heap.h" namespace "pairing_heap": cdef cppclass PairingHeap[TypeOfItem, TypeOfValue]: @@ -28,35 +29,37 @@ cdef extern from "./pairing_heap.h" namespace "pairing_heap": 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 # ============================================================================== from sage.data_structures.bitset_base cimport bitset_t -ctypedef struct PairingHeapNode: - void * value # value associated with the item - PairingHeapNode * prev # Previous sibling of the node or parent - PairingHeapNode * succ # Next sibling of the node - PairingHeapNode * child # First child of the node - - -cdef bint _compare(PairingHeapNode * a, PairingHeapNode * b) except * -cdef PairingHeapNode * _pair(PairingHeapNode * p) except * -cdef PairingHeapNode * _merge(PairingHeapNode * a, PairingHeapNode * b) except * -cdef _link(PairingHeapNode * a, PairingHeapNode * b) except * -cdef _unlink(PairingHeapNode * p) except * - - cdef class PairingHeap_class: - cdef size_t n # maximum number of items - cdef PairingHeapNode * root # pointer to the top of the heap - cdef PairingHeapNode * nodes # array of size n to store items - cdef size_t number_of_items # number of active items + 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 tuple top(self) except * - cpdef object top_value(self) except * + cpdef tuple top(self) + cpdef object top_value(self) cpdef void pop(self) noexcept @@ -65,7 +68,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): 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) except * + cpdef object value(self, size_t item) cdef class PairingHeap_of_n_hashables(PairingHeap_class): @@ -73,6 +76,6 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): 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) except * + cpdef object top_item(self) cpdef void decrease(self, object item, object new_value) except * - cpdef object value(self, object item) 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 index 0b0e2b96fb4..e182b7a23c2 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -107,119 +107,6 @@ from sage.data_structures.bitset_base cimport (bitset_init, bitset_free, bitset_in) from sage.misc.prandom import shuffle -# ============================================================================== -# Methods for PairingHeapNode -# ============================================================================== - -cdef inline bint _compare(PairingHeapNode * a, PairingHeapNode * b) except *: - r""" - Check whether ``a.value <= b.value``. - - TESTS:: - - sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers - sage: _test_PairingHeap_of_n_integers(5) - """ - return a.value <= b.value - - -cdef inline PairingHeapNode * _pair(PairingHeapNode * p) except *: - r""" - Pair a list of heaps and return the pointer to the top of the resulting heap. - - TESTS:: - - sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers - sage: _test_PairingHeap_of_n_integers(5) - """ - if p == NULL: - return NULL - - # 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 - cdef size_t children = 1 - cdef PairingHeapNode * it = p - while it.succ != NULL: - it = it.succ - children += 1 - - cdef PairingHeapNode * result - cdef PairingHeapNode * a - cdef PairingHeapNode * b - - if children % 2: - a = it - it = it.prev - a.prev = a.succ = NULL - result = a - else: - a = it - b = it.prev - it = it.prev.prev - a.prev = a.succ = b.prev = b.succ = NULL - result = _merge(a, b) - - for _ in range((children - 1) // 2): - a = it - b = it.prev - it = it.prev.prev - a.prev = a.succ = b.prev = b.succ = NULL - result = _merge(_merge(a, b), result) - - return result - - -cdef inline PairingHeapNode * _merge(PairingHeapNode * a, PairingHeapNode * b) except *: - r""" - Merge two heaps and return the pointer to the top of the resulting heap. - - TESTS:: - - sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers - sage: _test_PairingHeap_of_n_integers(5) - """ - if _compare(a, b): # True if a.value <= b.value - _link(a, b) - return a - _link(b, a) - return b - - -cdef inline _link(PairingHeapNode * a, PairingHeapNode * b) except *: - r""" - Make ``b`` a child of ``a``. - - TESTS:: - - sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers - sage: _test_PairingHeap_of_n_integers(5) - """ - if a.child != NULL: - b.succ = a.child - a.child.prev = b - b.prev = a - a.child = b - - -cdef inline _unlink(PairingHeapNode * p) except *: - r""" - Remove ``p`` from the list of children of its parent. - - TESTS:: - - sage: from sage.data_structures.pairing_heap import _test_PairingHeap_of_n_integers - sage: _test_PairingHeap_of_n_integers(5) - """ - if p.prev.child == p: - p.prev.child = p.succ - else: - p.prev.succ = p.succ - if p.succ != NULL: - p.succ.prev = p.prev - p.prev = p.succ = NULL - # ============================================================================== # Class PairingHeap_class @@ -314,7 +201,7 @@ cdef class PairingHeap_class: size = __len__ - cpdef tuple top(self) except *: + cpdef tuple top(self): r""" Return the top pair (item, value) of the heap. @@ -337,7 +224,7 @@ cdef class PairingHeap_class: """ raise NotImplementedError() - cpdef object top_value(self) except *: + cpdef object top_value(self): r""" Return the value of the top item of the heap. @@ -460,7 +347,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): raise ValueError("the capacity of the heap must be strictly positive") self.n = n self.root = NULL - self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) + self.nodes = check_allocarray(n, sizeof(PairingHeapNodePy)) bitset_init(self.active, n) self.number_of_items = 0 @@ -517,18 +404,18 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): if item in self: raise ValueError(f"{item} is already in the heap") - cdef PairingHeapNode * p = self.nodes + item + cdef PairingHeapNodePy * p = self.nodes + item Py_INCREF(value) - p.value = value - p.prev = p.succ = p.child = NULL + p.value = value + p.prev = p.next = p.child = NULL if self.root == NULL: self.root = p else: - self.root = _merge(self.root, p) + self.root = PairingHeapNodePy._merge(self.root, p) bitset_add(self.active, item) self.number_of_items += 1 - cpdef tuple top(self) except *: + cpdef tuple top(self): r""" Return the top pair (item, value) of the heap. @@ -605,7 +492,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): Py_XDECREF(self.nodes[item].value) bitset_remove(self.active, item) self.number_of_items -= 1 - self.root = _pair(self.root.child) + self.root = PairingHeapNodePy._pair(self.root.child) cpdef void decrease(self, size_t item, object new_value) except *: r""" @@ -648,17 +535,19 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): ... ValueError: the new value must be less than the current value """ - cdef PairingHeapNode * p + 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 + p.value = new_value if p.prev != NULL: - _unlink(p) - self.root = _merge(self.root, p) + PairingHeapNodePy._unlink(p) + self.root = PairingHeapNodePy._merge(self.root, p) else: self.push(item, new_value) @@ -682,11 +571,13 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): 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) except *: + cpdef object value(self, size_t item): r""" Return the value associated with the item. @@ -766,6 +657,13 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): 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""" @@ -813,7 +711,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): raise ValueError("the capacity of the heap must be strictly positive") self.n = n self.root = NULL - self.nodes = check_allocarray(n, sizeof(PairingHeapNode)) + self.nodes = check_allocarray(n, sizeof(PairingHeapNodePy)) self.number_of_items = 0 self._int_to_item = [None] * n self._item_to_int = dict() @@ -875,17 +773,17 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): cdef size_t idx = self.free_idx.pop() self._int_to_item[idx] = item self._item_to_int[item] = idx - cdef PairingHeapNode * p = self.nodes + idx + cdef PairingHeapNodePy * p = self.nodes + idx Py_INCREF(value) - p.value = value - p.prev = p.succ = p.child = NULL + p.value = value + p.prev = p.next = p.child = NULL if self.root == NULL: self.root = p else: - self.root = _merge(self.root, p) + self.root = PairingHeapNodePy._merge(self.root, p) self.number_of_items += 1 - cpdef tuple top(self) except *: + cpdef tuple top(self): r""" Return the top pair (item, value) of the heap. @@ -911,7 +809,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): cdef size_t idx = self.root - self.nodes return self._int_to_item[idx], self.root.value - cpdef object top_item(self) except *: + cpdef object top_item(self): r""" Return the top item of the heap. @@ -966,7 +864,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): self.free_idx.append(idx) del self._item_to_int[item] self.number_of_items -= 1 - self.root = _pair(self.root.child) + self.root = PairingHeapNodePy._pair(self.root.child) cpdef void decrease(self, object item, object new_value) except *: r""" @@ -1009,7 +907,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): ... ValueError: the new value must be less than the current value """ - cdef PairingHeapNode * p + cdef PairingHeapNodePy * p cdef size_t idx if item in self: idx = self._item_to_int[item] @@ -1018,10 +916,10 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): raise ValueError("the new value must be less than the current value") Py_XDECREF(p.value) Py_INCREF(new_value) - p.value = new_value + p.value = new_value if p.prev != NULL: - _unlink(p) - self.root = _merge(self.root, p) + PairingHeapNodePy._unlink(p) + self.root = PairingHeapNodePy._merge(self.root, p) else: self.push(item, new_value) From b57db7671b48eface8e6fd64e9bc25085d8dc9e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Tue, 10 Dec 2024 19:47:15 +0100 Subject: [PATCH 124/169] fix linter --- src/sage/rings/abc.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sage/rings/abc.pyx b/src/sage/rings/abc.pyx index cc8c3ec9a10..ef74bf34d4a 100644 --- a/src/sage/rings/abc.pyx +++ b/src/sage/rings/abc.pyx @@ -1,6 +1,8 @@ """ Abstract base classes for rings """ + + class NumberField_quadratic(Field): r""" Abstract base class for :class:`~sage.rings.number_field.number_field.NumberField_quadratic`. From 6ded2a3121b08816d2117d8e6b3c67a76522a803 Mon Sep 17 00:00:00 2001 From: Giorgos Mousa Date: Wed, 11 Dec 2024 08:47:01 +0200 Subject: [PATCH 125/169] Update ccache to 4.10.2 --- build/bin/sage-dist-helpers | 13 +++++----- build/pkgs/bliss/spkg-install.in | 2 +- build/pkgs/ccache/checksums.ini | 7 +++--- build/pkgs/ccache/dependencies | 2 +- build/pkgs/ccache/distros/arch.txt | 1 + build/pkgs/ccache/package-version.txt | 2 +- .../pkgs/ccache/patches/01-apple-gcc-id.patch | 15 ------------ build/pkgs/ccache/spkg-install.in | 14 +++++------ build/pkgs/dsdp/spkg-install.in | 3 ++- build/pkgs/primecount/spkg-install.in | 1 + build/pkgs/primesieve/spkg-install.in | 3 ++- build/pkgs/qhull/spkg-install.in | 3 ++- build/pkgs/scip/spkg-install.in | 22 ++++++++--------- build/pkgs/scip_sdp/spkg-install.in | 18 +++++++------- build/pkgs/suitesparse/spkg-install.in | 5 ++-- build/pkgs/symengine/spkg-install.in | 24 +++++++++---------- src/doc/en/developer/packaging.rst | 9 ++++--- 17 files changed, 67 insertions(+), 77 deletions(-) create mode 100644 build/pkgs/ccache/distros/arch.txt delete mode 100644 build/pkgs/ccache/patches/01-apple-gcc-id.patch 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/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/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/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/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/src/doc/en/developer/packaging.rst b/src/doc/en/developer/packaging.rst index 2b6903ca466..6f8d41c30d3 100644 --- a/src/doc/en/developer/packaging.rst +++ b/src/doc/en/developer/packaging.rst @@ -497,11 +497,10 @@ 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 - correctly. +- ``sdh_cmake [...]``: Runs ``cmake`` in the current directory 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 platforms.) Check shared libraries loaded by ``EXECUTABLE`` (may be a From 2d110bdf49161a45e30204cf76d4ed99c9a4377d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Wed, 11 Dec 2024 08:39:21 +0100 Subject: [PATCH 126/169] detail in is_field Co-authored-by: Martin Rubey --- src/sage/categories/integral_domains.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/sage/categories/integral_domains.py b/src/sage/categories/integral_domains.py index 27983661520..c66b609a5e3 100644 --- a/src/sage/categories/integral_domains.py +++ b/src/sage/categories/integral_domains.py @@ -155,9 +155,8 @@ def is_field(self, proof=True): if self.is_finite(): return True if proof: - raise NotImplementedError("unable to determine whether or not is a field.") - else: - return False + 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): """ From d5d4af9ee0e469cd6ae95bf0b9656df40d3b5e54 Mon Sep 17 00:00:00 2001 From: Giorgos Mousa Date: Wed, 11 Dec 2024 09:44:33 +0200 Subject: [PATCH 127/169] `build/pkgs/cmake`: Update to 3.31.2 --- build/pkgs/cmake/checksums.ini | 4 ++-- build/pkgs/cmake/package-version.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 From 52bb268e699ab22ef4cac53f4923a643bb55314d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Wed, 11 Dec 2024 10:29:52 +0100 Subject: [PATCH 128/169] fix doctest in src/doc --- src/doc/en/thematic_tutorials/coercion_and_categories.rst | 1 - 1 file changed, 1 deletion(-) 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', From aa016b7acfaa7420f5912436adb6323772a0b372 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 11 Dec 2024 13:08:50 +0100 Subject: [PATCH 129/169] #39046: simplify __repr__ --- src/sage/data_structures/pairing_heap.pyx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index e182b7a23c2..fda1d718c2b 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -130,9 +130,7 @@ cdef class PairingHeap_class: sage: P PairingHeap_of_n_integers: capacity 5, size 1 """ - if isinstance(self, PairingHeap_of_n_integers): - return f"PairingHeap_of_n_integers: capacity {self.n}, size {len(self)}" - return f"PairingHeap_of_n_hashables: capacity {self.n}, size {len(self)}" + return f"{type(self).__name__}: capacity {self.n}, size {len(self)}" def __bool__(self): r""" @@ -947,7 +945,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): contains = __contains__ - cpdef object value(self, object item) except *: + cpdef object value(self, object item): r""" Return the value associated with the item. From 47ec705f2f66720c517983650a5426f7f8670bf1 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Wed, 11 Dec 2024 16:58:31 +0100 Subject: [PATCH 130/169] #39046: try to make meson / conda happy --- src/sage/data_structures/meson.build | 16 +++++++++++++++- src/sage/data_structures/pairing_heap.h | 1 - 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/sage/data_structures/meson.build b/src/sage/data_structures/meson.build index 124a209dbbe..16694b083da 100644 --- a/src/sage/data_structures/meson.build +++ b/src/sage/data_structures/meson.build @@ -23,7 +23,6 @@ extension_data = { 'blas_dict' : files('blas_dict.pyx'), 'bounded_integer_sequences' : files('bounded_integer_sequences.pyx'), 'list_of_pairs' : files('list_of_pairs.pyx'), - 'pairing_heap' : files('pairing_heap.pyx'), } foreach name, pyx : extension_data @@ -42,3 +41,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 index 0f5f082480d..7e93c1e8d1b 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -54,7 +54,6 @@ #ifndef PAIRING_HEAP_H #define PAIRING_HEAP_H -#include #include #include From e8afa7c1d0b52d3234ddcd5d2d2a53ada842cc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Wed, 11 Dec 2024 18:01:37 +0100 Subject: [PATCH 131/169] suggested details --- src/sage/misc/cachefunc.pyx | 4 ++-- src/sage/misc/randstate.pyx | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sage/misc/cachefunc.pyx b/src/sage/misc/cachefunc.pyx index 3aa71cc73da..df4fa8d4457 100644 --- a/src/sage/misc/cachefunc.pyx +++ b/src/sage/misc/cachefunc.pyx @@ -902,9 +902,9 @@ cdef class CachedFunction(): # 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 + file_info = "File: {} (starting at line {})".format(filename, sourcelines[1]) + os.linesep - doc = file_info+doc + doc = file_info + doc except IOError: pass return doc diff --git a/src/sage/misc/randstate.pyx b/src/sage/misc/randstate.pyx index f6b70595f78..e67a3b9e54b 100644 --- a/src/sage/misc/randstate.pyx +++ b/src/sage/misc/randstate.pyx @@ -1004,8 +1004,7 @@ def benchmark_libc(): sage: timeit('benchmark_mt()') # random 125 loops, best of 3: 2.12 ms per loop """ - cdef int i - for i from 0 <= i < 100000: + for _ in range(100000): c_libc_random() From 969a5c903a67551497cfccc9579a8a5334dbd6bc Mon Sep 17 00:00:00 2001 From: Dima Pasechnik Date: Wed, 11 Dec 2024 12:23:04 -0600 Subject: [PATCH 132/169] more spkg-config.m4 and metadata for python packages --- build/pkgs/execnet/distros/arch.txt | 1 + build/pkgs/execnet/distros/debian.txt | 1 + build/pkgs/execnet/distros/fedora.txt | 1 + build/pkgs/execnet/distros/gentoo.txt | 1 + build/pkgs/execnet/distros/void.txt | 1 + build/pkgs/execnet/spkg-configure.m4 | 1 + build/pkgs/iniconfig/distros/arch.txt | 1 + build/pkgs/iniconfig/distros/debian.txt | 1 + build/pkgs/iniconfig/distros/fedora.txt | 1 + build/pkgs/iniconfig/distros/gentoo.txt | 1 + build/pkgs/iniconfig/distros/void.txt | 1 + build/pkgs/iniconfig/spkg-configure.m4 | 1 + build/pkgs/pyproject_api/distros/arch.txt | 1 + build/pkgs/pyproject_api/distros/debian.txt | 1 + build/pkgs/pyproject_api/distros/fedora.txt | 1 + build/pkgs/pyproject_api/distros/gentoo.txt | 1 + build/pkgs/pyproject_api/distros/void.txt | 1 + build/pkgs/pyproject_hooks/distros/arch.txt | 1 + build/pkgs/pyproject_hooks/distros/debian.txt | 1 + build/pkgs/pyproject_hooks/distros/fedora.txt | 1 + build/pkgs/pyproject_hooks/distros/gentoo.txt | 1 + build/pkgs/pyproject_hooks/distros/void.txt | 1 + build/pkgs/pyproject_hooks/spkg-configure.m4 | 1 + build/pkgs/pyproject_metadata/distros/arch.txt | 1 + build/pkgs/pyproject_metadata/distros/debian.txt | 1 + build/pkgs/pyproject_metadata/distros/void.txt | 1 + 26 files changed, 26 insertions(+) create mode 100644 build/pkgs/execnet/distros/arch.txt create mode 100644 build/pkgs/execnet/distros/debian.txt create mode 100644 build/pkgs/execnet/distros/fedora.txt create mode 100644 build/pkgs/execnet/distros/gentoo.txt create mode 100644 build/pkgs/execnet/distros/void.txt create mode 100644 build/pkgs/execnet/spkg-configure.m4 create mode 100644 build/pkgs/iniconfig/distros/arch.txt create mode 100644 build/pkgs/iniconfig/distros/debian.txt create mode 100644 build/pkgs/iniconfig/distros/fedora.txt create mode 100644 build/pkgs/iniconfig/distros/gentoo.txt create mode 100644 build/pkgs/iniconfig/distros/void.txt create mode 100644 build/pkgs/iniconfig/spkg-configure.m4 create mode 100644 build/pkgs/pyproject_api/distros/arch.txt create mode 100644 build/pkgs/pyproject_api/distros/debian.txt create mode 100644 build/pkgs/pyproject_api/distros/fedora.txt create mode 100644 build/pkgs/pyproject_api/distros/gentoo.txt create mode 100644 build/pkgs/pyproject_api/distros/void.txt create mode 100644 build/pkgs/pyproject_hooks/distros/arch.txt create mode 100644 build/pkgs/pyproject_hooks/distros/debian.txt create mode 100644 build/pkgs/pyproject_hooks/distros/fedora.txt create mode 100644 build/pkgs/pyproject_hooks/distros/gentoo.txt create mode 100644 build/pkgs/pyproject_hooks/distros/void.txt create mode 100644 build/pkgs/pyproject_hooks/spkg-configure.m4 create mode 100644 build/pkgs/pyproject_metadata/distros/arch.txt create mode 100644 build/pkgs/pyproject_metadata/distros/debian.txt create mode 100644 build/pkgs/pyproject_metadata/distros/void.txt 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..242410655f3 --- /dev/null +++ b/build/pkgs/iniconfig/distros/debian.txt @@ -0,0 +1 @@ +python3-execnet diff --git a/build/pkgs/iniconfig/distros/fedora.txt b/build/pkgs/iniconfig/distros/fedora.txt new file mode 100644 index 00000000000..242410655f3 --- /dev/null +++ b/build/pkgs/iniconfig/distros/fedora.txt @@ -0,0 +1 @@ +python3-execnet 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..242410655f3 --- /dev/null +++ b/build/pkgs/iniconfig/distros/void.txt @@ -0,0 +1 @@ +python3-execnet 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/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..242410655f3 --- /dev/null +++ b/build/pkgs/pyproject_api/distros/debian.txt @@ -0,0 +1 @@ +python3-execnet diff --git a/build/pkgs/pyproject_api/distros/fedora.txt b/build/pkgs/pyproject_api/distros/fedora.txt new file mode 100644 index 00000000000..242410655f3 --- /dev/null +++ b/build/pkgs/pyproject_api/distros/fedora.txt @@ -0,0 +1 @@ +python3-execnet 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 From 287d6ede7f453b5699cc1fd9b8fba15149d2b918 Mon Sep 17 00:00:00 2001 From: Dima Pasechnik Date: Wed, 11 Dec 2024 22:06:57 -0600 Subject: [PATCH 133/169] fix copypasta errors --- build/pkgs/iniconfig/distros/debian.txt | 2 +- build/pkgs/iniconfig/distros/fedora.txt | 2 +- build/pkgs/iniconfig/distros/void.txt | 2 +- build/pkgs/pyproject_api/distros/debian.txt | 2 +- build/pkgs/pyproject_api/distros/fedora.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/pkgs/iniconfig/distros/debian.txt b/build/pkgs/iniconfig/distros/debian.txt index 242410655f3..db703500b14 100644 --- a/build/pkgs/iniconfig/distros/debian.txt +++ b/build/pkgs/iniconfig/distros/debian.txt @@ -1 +1 @@ -python3-execnet +python3-iniconfig diff --git a/build/pkgs/iniconfig/distros/fedora.txt b/build/pkgs/iniconfig/distros/fedora.txt index 242410655f3..db703500b14 100644 --- a/build/pkgs/iniconfig/distros/fedora.txt +++ b/build/pkgs/iniconfig/distros/fedora.txt @@ -1 +1 @@ -python3-execnet +python3-iniconfig diff --git a/build/pkgs/iniconfig/distros/void.txt b/build/pkgs/iniconfig/distros/void.txt index 242410655f3..db703500b14 100644 --- a/build/pkgs/iniconfig/distros/void.txt +++ b/build/pkgs/iniconfig/distros/void.txt @@ -1 +1 @@ -python3-execnet +python3-iniconfig diff --git a/build/pkgs/pyproject_api/distros/debian.txt b/build/pkgs/pyproject_api/distros/debian.txt index 242410655f3..0d2d5b563c5 100644 --- a/build/pkgs/pyproject_api/distros/debian.txt +++ b/build/pkgs/pyproject_api/distros/debian.txt @@ -1 +1 @@ -python3-execnet +python3-pyproject-api diff --git a/build/pkgs/pyproject_api/distros/fedora.txt b/build/pkgs/pyproject_api/distros/fedora.txt index 242410655f3..0d2d5b563c5 100644 --- a/build/pkgs/pyproject_api/distros/fedora.txt +++ b/build/pkgs/pyproject_api/distros/fedora.txt @@ -1 +1 @@ -python3-execnet +python3-pyproject-api From 6dfd7ab753702c7dd8d803592664b73d5affed38 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Thu, 12 Dec 2024 14:38:25 +0100 Subject: [PATCH 134/169] #39046: suggested improvements --- src/sage/data_structures/pairing_heap.h | 3 +- src/sage/data_structures/pairing_heap.pxd | 15 ++-- src/sage/data_structures/pairing_heap.pyx | 102 ++++++++++++++-------- 3 files changed, 79 insertions(+), 41 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h index 7e93c1e8d1b..81ac55779f6 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -54,9 +54,8 @@ #ifndef PAIRING_HEAP_H #define PAIRING_HEAP_H -#include #include - +#include namespace pairing_heap { diff --git a/src/sage/data_structures/pairing_heap.pxd b/src/sage/data_structures/pairing_heap.pxd index 06e70ad2c0f..d749cc7ec31 100644 --- a/src/sage/data_structures/pairing_heap.pxd +++ b/src/sage/data_structures/pairing_heap.pxd @@ -8,13 +8,15 @@ # 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 # ============================================================================== -from libcpp.pair cimport pair -from cpython cimport PyObject - cdef extern from "./pairing_heap.h" namespace "pairing_heap": cdef cppclass PairingHeap[TypeOfItem, TypeOfValue]: PairingHeap() except + @@ -37,10 +39,13 @@ cdef extern from "./pairing_heap.h" namespace "pairing_heap": @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) @@ -49,8 +54,6 @@ cdef extern from "./pairing_heap.h" namespace "pairing_heap": # Pairing heap data structure with fixed capacity n # ============================================================================== -from sage.data_structures.bitset_base cimport bitset_t - cdef class PairingHeap_class: cdef size_t n # maximum number of items cdef PairingHeapNodePy * root # pointer to the top of the heap @@ -58,6 +61,8 @@ cdef class PairingHeap_class: 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 diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index fda1d718c2b..6a6e61e1c5e 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -7,7 +7,7 @@ This module proposes several implementations of the pairing heap data structure 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 + 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 @@ -23,7 +23,7 @@ min-heap data structure. EXAMPLES: -Pairing heap of `n` integers in the range `0..n-1`:: +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 @@ -81,11 +81,6 @@ Pairing heap of `n` hashables:: (Graph on 2 vertices, (1, 'z')) (2, (2, 'a')) (('a', 1), (2, 'b')) - -AUTHORS: - -- David Coudert (2024) - Initial version. - """ # ****************************************************************************** # Copyright (C) 2024 David Coudert @@ -117,6 +112,7 @@ cdef class PairingHeap_class: 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``. @@ -150,7 +146,7 @@ cdef class PairingHeap_class: cpdef bint empty(self) noexcept: r""" - Check whether the heap is empty or not. + Check whether the heap is empty. EXAMPLES:: @@ -166,7 +162,7 @@ cdef class PairingHeap_class: cpdef bint full(self) noexcept: r""" - Check whether the heap is full or not. + Check whether the heap is full. EXAMPLES:: @@ -181,6 +177,43 @@ cdef class PairingHeap_class: """ 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. @@ -197,8 +230,6 @@ cdef class PairingHeap_class: """ return self.number_of_items - size = __len__ - cpdef tuple top(self): r""" Return the top pair (item, value) of the heap. @@ -266,13 +297,14 @@ cdef class PairingHeap_class: """ 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]. + Pairing Heap for items in range `[0, n - 1]`. EXAMPLES:: @@ -305,12 +337,13 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): sage: P.push(11, 3) Traceback (most recent call last): ... - ValueError: item must be in range 0..4 + 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``. + from `0` to `n-1`. INPUT: @@ -321,24 +354,21 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): 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 + sage: P.push(1, 2); P PairingHeap_of_n_integers: capacity 5, size 1 - sage: P.push(2, 3) - sage: P + sage: P.push(2, 3); P PairingHeap_of_n_integers: capacity 5, size 2 - sage: P.pop() - sage: P + 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: P = PairingHeap_of_n_integers(0) + ValueError: item must be in range [0, 4] + 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(1); P + sage: PairingHeap_of_n_integers(1) PairingHeap_of_n_integers: capacity 1, size 0 """ if not n: @@ -368,7 +398,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): INPUT: - - ``item`` -- non negative integer; the item to consider + - ``item`` -- nonnegative integer; the item to consider - ``value`` -- the value associated with ``item`` @@ -395,10 +425,14 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): sage: P.push(11, 2) Traceback (most recent call last): ... - ValueError: item must be in range 0..4 + 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}") + 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") @@ -501,7 +535,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): INPUT: - - ``item`` -- non negative integer; the item to consider + - ``item`` -- nonnegative integer; the item to consider - ``new_value`` -- the new value for ``item`` @@ -534,7 +568,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): 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}") + 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 @@ -555,7 +589,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): INPUT: - - ``item`` -- non negative integer; the item to consider + - ``item`` -- nonnegative integer; the item to consider EXAMPLES:: @@ -581,7 +615,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): INPUT: - - ``item`` -- non negative integer; the item to consider + - ``item`` -- nonnegative integer; the item to consider EXAMPLES:: @@ -607,7 +641,7 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): cdef class PairingHeap_of_n_hashables(PairingHeap_class): r""" - Pairing Heap for ``n`` hashable items. + Pairing Heap for `n` hashable items. EXAMPLES:: @@ -615,8 +649,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): 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) - sage: P + sage: P.push('abc', 2); P PairingHeap_of_n_hashables: capacity 5, size 2 sage: P.top() ('abc', 2) @@ -663,6 +696,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): ... TypeError: unsupported operand parent(s) for >=: 'Integer Ring' and '' """ + def __init__(self, size_t n): r""" Construct the ``PairingHeap_of_n_hashables``. @@ -733,7 +767,7 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): INPUT: - - ``item`` -- non negative integer; the item to consider + - ``item`` -- a hashable object; the item to add - ``value`` -- the value associated with ``item`` From 82f6648713ac60de9bf2e2cae2e81706850f4c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Thu, 12 Dec 2024 17:35:45 +0100 Subject: [PATCH 135/169] minor detail --- src/sage/matroids/matroid.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/matroids/matroid.pyx b/src/sage/matroids/matroid.pyx index cedf6805a3e..fab7b9008bf 100644 --- a/src/sage/matroids/matroid.pyx +++ b/src/sage/matroids/matroid.pyx @@ -7709,12 +7709,12 @@ cdef class Matroid(SageObject): # 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|{v}) - {u}))): + (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|{u})) and - (other.is_independent((Y|{u}) - {v}))): + (other.is_independent((Y|{u}) - {v}))): exist = True if exist: stack.append(v) From 7682e5b9aba11ea0a61ec7fcfc4ced6c97b5204a Mon Sep 17 00:00:00 2001 From: dcoudert Date: Thu, 12 Dec 2024 17:49:09 +0100 Subject: [PATCH 136/169] #39046: suggested changes --- src/sage/data_structures/pairing_heap.pyx | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 6a6e61e1c5e..59cd73ddfde 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -207,7 +207,7 @@ cdef class PairingHeap_class: sage: P.size() 1 - One may also use Python's `__len__`:: + One may also use Python's ``__len__``:: sage: len(P) 1 @@ -364,12 +364,18 @@ cdef class PairingHeap_of_n_integers(PairingHeap_class): 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: PairingHeap_of_n_integers(1) - PairingHeap_of_n_integers: capacity 1, size 0 + 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") @@ -738,6 +744,9 @@ cdef class PairingHeap_of_n_hashables(PairingHeap_class): 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") @@ -1348,7 +1357,7 @@ def _test_PairingHeap_of_n_hashables(n=100): pass -def compare_heaps(n=100, verbose=False): +def _compare_heaps(n=100, verbose=False): r""" Check that the heaps behave the same. @@ -1369,13 +1378,13 @@ def compare_heaps(n=100, verbose=False): EXAMPLES:: - sage: from sage.data_structures.pairing_heap import compare_heaps - sage: compare_heaps(n=100) - sage: compare_heaps(n=100, verbose=True) # random + 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 + 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 abafad9a4769760fce0e5105fbb2f28f01ef7b96 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Fri, 13 Dec 2024 13:24:42 +0100 Subject: [PATCH 137/169] #39046: review comments --- src/sage/data_structures/pairing_heap.h | 14 +++++++------- src/sage/data_structures/pairing_heap.pyx | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.h b/src/sage/data_structures/pairing_heap.h index 81ac55779f6..3c6cbbf4216 100644 --- a/src/sage/data_structures/pairing_heap.h +++ b/src/sage/data_structures/pairing_heap.h @@ -25,7 +25,7 @@ * - 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)) + * - 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 @@ -250,17 +250,17 @@ namespace pairing_heap { // Insert an item into the heap with specified value (priority) void push(const TI &some_item, const TV &some_value) { - if (nodes.find(some_item) != nodes.end()) { + 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 = root == nullptr ? p : HeapNodeType::_merge(root, p); + root = empty() ? p : HeapNodeType::_merge(root, p); } // Return the top pair (item, value) of the heap std::pair top() const { - if (root == nullptr) { + if (empty()) { throw std::domain_error("trying to access the top of an empty heap"); } return std::make_pair(root->item, root->value); @@ -268,7 +268,7 @@ namespace pairing_heap { // Return the top item of the heap TI top_item() const { - if (root == nullptr) { + if (empty()) { throw std::domain_error("trying to access the top of an empty heap"); } return root->item; @@ -276,7 +276,7 @@ namespace pairing_heap { // Return the top value of the heap TV top_value() const { - if (root == nullptr) { + if (empty()) { throw std::domain_error("trying to access the top of an empty heap"); } return root->value; @@ -284,7 +284,7 @@ namespace pairing_heap { // Remove the top element from the heap. Do nothing if empty void pop() { - if (root != nullptr) { + if (not empty()) { PairingHeapNode *p = root->child; nodes.erase(root->item); delete root; diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 59cd73ddfde..8d92e714483 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -1061,7 +1061,7 @@ def _test_PairingHeap_from_C(n=100): # 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 origianl values. We finally check the + # 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} From fc81b147a77cdf9cfb8fac9e7c6a93ffcdc5dc05 Mon Sep 17 00:00:00 2001 From: dcoudert Date: Fri, 13 Dec 2024 13:59:54 +0100 Subject: [PATCH 138/169] #39046: typos --- src/sage/data_structures/pairing_heap.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/data_structures/pairing_heap.pyx b/src/sage/data_structures/pairing_heap.pyx index 8d92e714483..ec08be43652 100644 --- a/src/sage/data_structures/pairing_heap.pyx +++ b/src/sage/data_structures/pairing_heap.pyx @@ -1188,7 +1188,7 @@ def _test_PairingHeap_of_n_integers(n=100): # 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 origianl values. We finally check the + # 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 @@ -1294,7 +1294,7 @@ def _test_PairingHeap_of_n_hashables(n=100): # 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 origianl values. We finally check the + # 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} From e1a6ffae7b9c8b49b4d7fcbe0de57989afc98f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Sat, 14 Dec 2024 15:07:34 +0100 Subject: [PATCH 139/169] some care for pep8 E262 (comments) --- src/sage/categories/category_with_axiom.py | 2 +- src/sage/categories/groupoid.py | 6 ++-- src/sage/categories/unital_algebras.py | 2 +- .../coding/guruswami_sudan/interpolation.py | 6 ++-- src/sage/combinat/diagram_algebras.py | 32 +++++++++---------- src/sage/combinat/growth.py | 4 +-- src/sage/combinat/k_tableau.py | 20 ++++++------ src/sage/combinat/partition_kleshchev.py | 16 +++++----- src/sage/combinat/root_system/cartan_type.py | 4 ++- src/sage/combinat/sf/sfa.py | 28 ++++++++-------- src/sage/combinat/six_vertex_model.py | 6 ++-- src/sage/databases/db_class_polynomials.py | 6 ++-- src/sage/features/ffmpeg.py | 12 +++---- .../hyperbolic_space/hyperbolic_isometry.py | 28 ++++++++-------- .../modules/formal_polyhedra_module.py | 2 +- .../differentiable/automorphismfield.py | 4 +-- .../differentiable/integrated_curve.py | 29 +++++++++-------- .../differentiable/tensorfield_paral.py | 2 +- .../manifolds/differentiable/vectorframe.py | 2 +- src/sage/matroids/chow_ring_ideal.py | 19 +++++------ .../numerical/backends/logging_backend.py | 16 +++++----- .../numerical/interactive_simplex_method.py | 4 +-- src/sage/plot/hyperbolic_regular_polygon.py | 6 ++-- .../rings/number_field/number_field_ideal.py | 7 ++-- src/sage/rings/padics/factory.py | 2 +- src/sage/rings/padics/generic_nodes.py | 8 +++-- .../rings/padics/relative_extension_leaves.py | 4 +-- src/sage/tensor/modules/comp.py | 2 +- 28 files changed, 144 insertions(+), 135 deletions(-) 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/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/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/guruswami_sudan/interpolation.py b/src/sage/coding/guruswami_sudan/interpolation.py index b1334307e79..ae667c5dae1 100644 --- a/src/sage/coding/guruswami_sudan/interpolation.py +++ b/src/sage/coding/guruswami_sudan/interpolation.py @@ -284,10 +284,10 @@ 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**monomials[i][0] * y**monomials[i][1] * sol[i] + for i in range(len(monomials))]) ####################### Lee-O'Sullivan's method ############################### 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/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/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/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/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/sf/sfa.py b/src/sage/combinat/sf/sfa.py index 92a068e4c8c..60fc4b65c53 100644 --- a/src/sage/combinat/sf/sfa.py +++ b/src/sage/combinat/sf/sfa.py @@ -2284,28 +2284,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/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/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/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/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/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/matroids/chow_ring_ideal.py b/src/sage/matroids/chow_ring_ideal.py index d0ac04a23ee..85913786c74 100644 --- a/src/sage/matroids/chow_ring_ideal.py +++ b/src/sage/matroids/chow_ring_ideal.py @@ -52,9 +52,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 +117,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 +393,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 +527,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 +644,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 +798,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/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/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/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/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/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/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): From 234ac9afaa630ff8f65debf3dfd1bbb5fca17aa8 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:24:28 +0700 Subject: [PATCH 140/169] More information on build from source using meson --- src/doc/en/installation/meson.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/doc/en/installation/meson.rst b/src/doc/en/installation/meson.rst index b8e44bc12fc..057cf288d4a 100644 --- a/src/doc/en/installation/meson.rst +++ b/src/doc/en/installation/meson.rst @@ -65,11 +65,23 @@ 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, ``ninja`` 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``, + which will pass ``-jN`` to ``ninja``. + + ``--verbose`` can be passed to ``pip install``, then the meson commands + internally used by pip will be printed out. + Background information ====================== Under the hood, pip invokes meson to configure and build the project. We can also use meson directly as follows. +``meson compile`` is much faster than ``pip install``, +because ``pip install`` reruns ``meson setup --reconfigure`` each time. To configure the project, we need to run the following command: @@ -79,6 +91,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 +117,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 From 5518497049d5b038c74de95e9d166f90fe22b5e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Sat, 14 Dec 2024 18:11:27 +0100 Subject: [PATCH 141/169] suggested detail + clean that file --- .../coding/guruswami_sudan/interpolation.py | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/sage/coding/guruswami_sudan/interpolation.py b/src/sage/coding/guruswami_sudan/interpolation.py index ae667c5dae1..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 @@ -286,10 +286,10 @@ def gs_interpolation_linalg(points, tau, parameters, wy): # Construct the Q polynomial PF = M.base_ring()['x', 'y'] # make that ring a ring in x, y = PF.gens() - return sum([x**monomials[i][0] * y**monomials[i][1] * sol[i] - for i in range(len(monomials))]) + 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)) From 02273ef0d811dfc48dd93ec4bf63da2d71f7b4f3 Mon Sep 17 00:00:00 2001 From: Giorgos Mousa Date: Sun, 15 Dec 2024 08:03:40 +0200 Subject: [PATCH 142/169] `sdh_cmake`: not necessarily in current directory --- src/doc/en/developer/packaging.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/doc/en/developer/packaging.rst b/src/doc/en/developer/packaging.rst index 6f8d41c30d3..cfa6fec89d3 100644 --- a/src/doc/en/developer/packaging.rst +++ b/src/doc/en/developer/packaging.rst @@ -497,10 +497,10 @@ 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 (assuming packages are using the - GNUInstallDirs module) so that ``CMAKE_INSTALL_PREFIX`` and - ``CMAKE_INSTALL_LIBDIR`` are set correctly. +- ``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 platforms.) Check shared libraries loaded by ``EXECUTABLE`` (may be a From e7477f887968f0f133e15618ad5444473aa8fb4b Mon Sep 17 00:00:00 2001 From: Release Manager Date: Sun, 15 Dec 2024 12:58:31 +0100 Subject: [PATCH 143/169] Updated SageMath version to 10.6.beta1 --- CITATION.cff | 4 ++-- VERSION.txt | 2 +- build/pkgs/configure/checksums.ini | 4 ++-- build/pkgs/configure/package-version.txt | 2 +- build/pkgs/sage_conf/version_requirements.txt | 2 +- build/pkgs/sage_docbuild/version_requirements.txt | 2 +- build/pkgs/sage_setup/version_requirements.txt | 2 +- build/pkgs/sage_sws2rst/version_requirements.txt | 2 +- build/pkgs/sagelib/version_requirements.txt | 2 +- build/pkgs/sagemath_bliss/version_requirements.txt | 2 +- build/pkgs/sagemath_categories/version_requirements.txt | 2 +- build/pkgs/sagemath_coxeter3/version_requirements.txt | 2 +- build/pkgs/sagemath_environment/version_requirements.txt | 2 +- build/pkgs/sagemath_mcqd/version_requirements.txt | 2 +- build/pkgs/sagemath_meataxe/version_requirements.txt | 2 +- build/pkgs/sagemath_objects/version_requirements.txt | 2 +- build/pkgs/sagemath_repl/version_requirements.txt | 2 +- build/pkgs/sagemath_sirocco/version_requirements.txt | 2 +- build/pkgs/sagemath_tdlib/version_requirements.txt | 2 +- pkgs/sage-conf/VERSION.txt | 2 +- pkgs/sage-conf_conda/VERSION.txt | 2 +- pkgs/sage-conf_pypi/VERSION.txt | 2 +- pkgs/sage-docbuild/VERSION.txt | 2 +- pkgs/sage-setup/VERSION.txt | 2 +- pkgs/sage-sws2rst/VERSION.txt | 2 +- pkgs/sagemath-bliss/VERSION.txt | 2 +- pkgs/sagemath-categories/VERSION.txt | 2 +- pkgs/sagemath-coxeter3/VERSION.txt | 2 +- pkgs/sagemath-environment/VERSION.txt | 2 +- pkgs/sagemath-mcqd/VERSION.txt | 2 +- pkgs/sagemath-meataxe/VERSION.txt | 2 +- pkgs/sagemath-objects/VERSION.txt | 2 +- pkgs/sagemath-repl/VERSION.txt | 2 +- pkgs/sagemath-sirocco/VERSION.txt | 2 +- pkgs/sagemath-tdlib/VERSION.txt | 2 +- src/VERSION.txt | 2 +- src/bin/sage-version.sh | 6 +++--- src/sage/version.py | 6 +++--- 38 files changed, 44 insertions(+), 44 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index b3774971e4a..7f17ed5c0d8 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.beta1 doi: 10.5281/zenodo.8042260 -date-released: 2024-12-08 +date-released: 2024-12-15 repository-code: "https://github.com/sagemath/sage" url: "https://www.sagemath.org/" diff --git a/VERSION.txt b/VERSION.txt index 75a4802e431..6af82e4b429 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -SageMath version 10.6.beta0, Release Date: 2024-12-08 +SageMath version 10.6.beta1, Release Date: 2024-12-15 diff --git a/build/pkgs/configure/checksums.ini b/build/pkgs/configure/checksums.ini index ad8ba13d958..f2f6667ba09 100644 --- a/build/pkgs/configure/checksums.ini +++ b/build/pkgs/configure/checksums.ini @@ -1,3 +1,3 @@ tarball=configure-VERSION.tar.gz -sha1=2da24db56e3f4227ca56a6b339264b82a196422e -sha256=e0609bcf48249d7232a0921b08d1da6edc9803f73111aaf4ea480eac46d4ffed +sha1=ebc4bd50c332f06ad5b2a4ce6217ec65790655ab +sha256=a2fa7623b406a7937ebfbe3cc6d9e17bcf0c219dec2646320b7266326d789b56 diff --git a/build/pkgs/configure/package-version.txt b/build/pkgs/configure/package-version.txt index e37bce69be3..2ae68fc2cca 100644 --- a/build/pkgs/configure/package-version.txt +++ b/build/pkgs/configure/package-version.txt @@ -1 +1 @@ -5f0e77ee69fb564d430084122fe3728b4d1acdef +a72ae6d615ddfd3e49b36c200aaf14c24a265916 diff --git a/build/pkgs/sage_conf/version_requirements.txt b/build/pkgs/sage_conf/version_requirements.txt index 1528604151d..5fe4d966040 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.6b1 diff --git a/build/pkgs/sage_docbuild/version_requirements.txt b/build/pkgs/sage_docbuild/version_requirements.txt index 64078134018..8c3a08af6ba 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.6b1 diff --git a/build/pkgs/sage_setup/version_requirements.txt b/build/pkgs/sage_setup/version_requirements.txt index e5b0998d572..20373e5b24b 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.6b1 diff --git a/build/pkgs/sage_sws2rst/version_requirements.txt b/build/pkgs/sage_sws2rst/version_requirements.txt index 1aec16d1739..75d2dea8555 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.6b1 diff --git a/build/pkgs/sagelib/version_requirements.txt b/build/pkgs/sagelib/version_requirements.txt index a01ffdf92ed..b9b66b303ce 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.6b1 diff --git a/build/pkgs/sagemath_bliss/version_requirements.txt b/build/pkgs/sagemath_bliss/version_requirements.txt index 637c4611451..66cfe981b11 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.6b1 diff --git a/build/pkgs/sagemath_categories/version_requirements.txt b/build/pkgs/sagemath_categories/version_requirements.txt index 8e37771c3f9..012ced666ae 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.6b1 diff --git a/build/pkgs/sagemath_coxeter3/version_requirements.txt b/build/pkgs/sagemath_coxeter3/version_requirements.txt index 06dc600cfd7..d0efaa88af2 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.6b1 diff --git a/build/pkgs/sagemath_environment/version_requirements.txt b/build/pkgs/sagemath_environment/version_requirements.txt index 7e0f787af06..6cae42add68 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.6b1 diff --git a/build/pkgs/sagemath_mcqd/version_requirements.txt b/build/pkgs/sagemath_mcqd/version_requirements.txt index 3a2722024c4..17c1fefc2b9 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.6b1 diff --git a/build/pkgs/sagemath_meataxe/version_requirements.txt b/build/pkgs/sagemath_meataxe/version_requirements.txt index 3cb0d050fa5..2dc47f93620 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.6b1 diff --git a/build/pkgs/sagemath_objects/version_requirements.txt b/build/pkgs/sagemath_objects/version_requirements.txt index e8c44e2142e..aa457cf9337 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.6b1 diff --git a/build/pkgs/sagemath_repl/version_requirements.txt b/build/pkgs/sagemath_repl/version_requirements.txt index 3df75b7c62a..d89f0a710d3 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.6b1 diff --git a/build/pkgs/sagemath_sirocco/version_requirements.txt b/build/pkgs/sagemath_sirocco/version_requirements.txt index 2c8db8e59f7..3b31a56b658 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.6b1 diff --git a/build/pkgs/sagemath_tdlib/version_requirements.txt b/build/pkgs/sagemath_tdlib/version_requirements.txt index 1732fe39010..a1de5923196 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.6b1 diff --git a/pkgs/sage-conf/VERSION.txt b/pkgs/sage-conf/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sage-conf/VERSION.txt +++ b/pkgs/sage-conf/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sage-conf_conda/VERSION.txt b/pkgs/sage-conf_conda/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sage-conf_conda/VERSION.txt +++ b/pkgs/sage-conf_conda/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sage-conf_pypi/VERSION.txt b/pkgs/sage-conf_pypi/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sage-conf_pypi/VERSION.txt +++ b/pkgs/sage-conf_pypi/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sage-docbuild/VERSION.txt b/pkgs/sage-docbuild/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sage-docbuild/VERSION.txt +++ b/pkgs/sage-docbuild/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sage-setup/VERSION.txt b/pkgs/sage-setup/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sage-setup/VERSION.txt +++ b/pkgs/sage-setup/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sage-sws2rst/VERSION.txt b/pkgs/sage-sws2rst/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sage-sws2rst/VERSION.txt +++ b/pkgs/sage-sws2rst/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-bliss/VERSION.txt b/pkgs/sagemath-bliss/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-bliss/VERSION.txt +++ b/pkgs/sagemath-bliss/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-categories/VERSION.txt b/pkgs/sagemath-categories/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-categories/VERSION.txt +++ b/pkgs/sagemath-categories/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-coxeter3/VERSION.txt b/pkgs/sagemath-coxeter3/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-coxeter3/VERSION.txt +++ b/pkgs/sagemath-coxeter3/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-environment/VERSION.txt b/pkgs/sagemath-environment/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-environment/VERSION.txt +++ b/pkgs/sagemath-environment/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-mcqd/VERSION.txt b/pkgs/sagemath-mcqd/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-mcqd/VERSION.txt +++ b/pkgs/sagemath-mcqd/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-meataxe/VERSION.txt b/pkgs/sagemath-meataxe/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-meataxe/VERSION.txt +++ b/pkgs/sagemath-meataxe/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-objects/VERSION.txt b/pkgs/sagemath-objects/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-objects/VERSION.txt +++ b/pkgs/sagemath-objects/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-repl/VERSION.txt b/pkgs/sagemath-repl/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-repl/VERSION.txt +++ b/pkgs/sagemath-repl/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-sirocco/VERSION.txt b/pkgs/sagemath-sirocco/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-sirocco/VERSION.txt +++ b/pkgs/sagemath-sirocco/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/pkgs/sagemath-tdlib/VERSION.txt b/pkgs/sagemath-tdlib/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/pkgs/sagemath-tdlib/VERSION.txt +++ b/pkgs/sagemath-tdlib/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/src/VERSION.txt b/src/VERSION.txt index bf89b51e25f..6e3a857d06e 100644 --- a/src/VERSION.txt +++ b/src/VERSION.txt @@ -1 +1 @@ -10.6.beta0 +10.6.beta1 diff --git a/src/bin/sage-version.sh b/src/bin/sage-version.sh index 8f940ae430b..6877ac8ce0a 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.beta1' +SAGE_RELEASE_DATE='2024-12-15' +SAGE_VERSION_BANNER='SageMath version 10.6.beta1, Release Date: 2024-12-15' diff --git a/src/sage/version.py b/src/sage/version.py index 37c771ba0f2..1740a25851c 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.beta1' +date = '2024-12-15' +banner = 'SageMath version 10.6.beta1, Release Date: 2024-12-15' From c8cdf31187c36bdf2e44ae38fb6e75aa20d00025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Sun, 15 Dec 2024 13:33:52 +0100 Subject: [PATCH 144/169] avoid some imports of rings.Ring --- src/sage/graphs/chrompoly.pyx | 4 ++-- .../modular/pollack_stevens/distributions.py | 17 ++++++++++------- src/sage/rings/number_field/number_field.py | 19 +++++++++---------- 3 files changed, 21 insertions(+), 19 deletions(-) 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/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/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 2559771ae62..c8eaab6ddef 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 From b9f42415b73c1834ba0d11ccafb4bdb92f4b0b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Sun, 15 Dec 2024 14:43:05 +0100 Subject: [PATCH 145/169] fixing pep8 E203 in pyx files --- src/sage/graphs/strongly_regular_db.pyx | 46 ++++---- src/sage/numerical/backends/glpk_backend.pyx | 108 +++++++++---------- src/sage/stats/time_series.pyx | 2 +- 3 files changed, 78 insertions(+), 78 deletions(-) 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/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/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): From ff83c5528d0d1493eb324c822bc47f5de1b63e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Sun, 15 Dec 2024 18:27:52 +0100 Subject: [PATCH 146/169] Update number_field.py --- src/sage/rings/number_field/number_field.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index c8eaab6ddef..dbd8e7e2edf 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -414,7 +414,7 @@ def NumberField(polynomial, name=None, check=True, names=None, embedding=None, -1.25992104989487 If no embedding is specified or is complex, the comparison is not - returning something meaningful.:: + returning something meaningful. :: sage: N. = NumberField(x^3 + 2) sage: 1 < g From 348ebfbc698587a17cda806adc7d06f5319e0412 Mon Sep 17 00:00:00 2001 From: Dave Witte Morris Date: Sun, 15 Dec 2024 14:49:32 -0500 Subject: [PATCH 147/169] #37794 log(0,2) shouldn't hang --- src/sage/misc/functional.py | 7 +++++++ src/sage/symbolic/ginac/numeric.cpp | 3 +++ 2 files changed, 10 insertions(+) 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/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp index e973390ffa2..e5914c99263 100644 --- a/src/sage/symbolic/ginac/numeric.cpp +++ b/src/sage/symbolic/ginac/numeric.cpp @@ -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; From 6f78d09c2a95a265f9e1f591396f06487f959317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Sun, 15 Dec 2024 20:49:46 +0100 Subject: [PATCH 148/169] a few details in master reference file --- src/doc/en/reference/references/index.rst | 56 ++++++++++++----------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index 3ebb8fbe2f1..f2029823f99 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. @@ -444,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` @@ -540,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` @@ -713,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, @@ -800,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*, @@ -1115,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. @@ -1595,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] Chapoton, Fomin, 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*. @@ -1648,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*. From d5463b20a491e2c020af5895ccb908956b18f1f4 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 16 Dec 2024 04:04:32 +0000 Subject: [PATCH 149/169] Meson: install `__init__` files --- src/sage/algebras/finite_dimensional_algebras/meson.build | 1 + src/sage/algebras/fusion_rings/meson.build | 1 + src/sage/algebras/letterplace/meson.build | 1 + src/sage/algebras/lie_algebras/meson.build | 1 + src/sage/algebras/meson.build | 1 + src/sage/algebras/quatalg/meson.build | 1 + src/sage/arith/meson.build | 1 + src/sage/calculus/meson.build | 1 + src/sage/calculus/transforms/meson.build | 1 + src/sage/categories/examples/meson.build | 1 + src/sage/categories/meson.build | 1 + src/sage/coding/codecan/meson.build | 7 ++++++- src/sage/coding/meson.build | 1 + src/sage/combinat/crystals/meson.build | 1 + src/sage/combinat/designs/meson.build | 1 + src/sage/combinat/matrices/meson.build | 1 + src/sage/combinat/meson.build | 1 + src/sage/combinat/posets/meson.build | 1 + src/sage/combinat/rigged_configurations/meson.build | 1 + src/sage/combinat/root_system/meson.build | 1 + src/sage/combinat/words/meson.build | 1 + src/sage/data_structures/meson.build | 1 + src/sage/dynamics/arithmetic_dynamics/meson.build | 1 + src/sage/dynamics/complex_dynamics/meson.build | 1 + src/sage/dynamics/meson.build | 1 + src/sage/ext/meson.build | 1 + src/sage/functions/meson.build | 1 + src/sage/games/meson.build | 1 + src/sage/geometry/meson.build | 1 + .../polyhedron/combinatorial_polyhedron/meson.build | 1 + src/sage/geometry/polyhedron/meson.build | 1 + src/sage/geometry/triangulation/meson.build | 1 + src/sage/graphs/base/meson.build | 1 + src/sage/graphs/generators/meson.build | 1 + src/sage/graphs/graph_decompositions/meson.build | 1 + src/sage/graphs/meson.build | 1 + src/sage/groups/matrix_gps/meson.build | 1 + src/sage/groups/meson.build | 1 + src/sage/groups/perm_gps/meson.build | 1 + src/sage/groups/perm_gps/partn_ref/meson.build | 1 + src/sage/groups/perm_gps/partn_ref2/meson.build | 1 + src/sage/groups/semimonomial_transformations/meson.build | 1 + src/sage/interacts/meson.build | 1 + src/sage/interfaces/meson.build | 1 + src/sage/lfunctions/meson.build | 1 + src/sage/libs/gap/meson.build | 1 + src/sage/libs/meson.build | 1 + src/sage/matrix/meson.build | 1 + src/sage/matroids/meson.build | 1 + src/sage/meson.build | 1 + src/sage/misc/meson.build | 1 + src/sage/modular/arithgroup/meson.build | 1 + src/sage/modular/meson.build | 1 + src/sage/modular/modform/meson.build | 1 + src/sage/modular/modsym/meson.build | 1 + src/sage/modular/pollack_stevens/meson.build | 1 + src/sage/modules/meson.build | 2 ++ src/sage/modules/with_basis/meson.build | 1 + src/sage/monoids/meson.build | 1 + src/sage/numerical/backends/meson.build | 1 + src/sage/numerical/meson.build | 1 + src/sage/plot/meson.build | 1 + src/sage/plot/plot3d/meson.build | 1 + src/sage/probability/meson.build | 7 ++++++- src/sage/quadratic_forms/meson.build | 1 + src/sage/quivers/meson.build | 1 + src/sage/rings/convert/meson.build | 7 ++++++- src/sage/rings/finite_rings/meson.build | 1 + src/sage/rings/function_field/meson.build | 1 + src/sage/rings/meson.build | 1 + src/sage/rings/number_field/meson.build | 1 + src/sage/rings/padics/meson.build | 1 + src/sage/rings/polynomial/meson.build | 1 + src/sage/rings/polynomial/weil/meson.build | 1 + src/sage/rings/semirings/meson.build | 1 + src/sage/sat/meson.build | 7 ++++++- src/sage/schemes/elliptic_curves/meson.build | 2 ++ src/sage/schemes/hyperelliptic_curves/meson.build | 1 + src/sage/schemes/meson.build | 7 ++++++- src/sage/schemes/toric/meson.build | 1 + src/sage/sets/meson.build | 1 + src/sage/stats/distributions/meson.build | 1 + src/sage/stats/hmm/meson.build | 1 + src/sage/stats/meson.build | 1 + src/sage/symbolic/meson.build | 1 + tools/update-meson.py | 3 --- 86 files changed, 112 insertions(+), 8 deletions(-) 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/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/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/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/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/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/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/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/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/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/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/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/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/data_structures/meson.build b/src/sage/data_structures/meson.build index 8a94548917b..de25b78721d 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', 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/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/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/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/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/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/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/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_decompositions/meson.build b/src/sage/graphs/graph_decompositions/meson.build index 041f8824fbd..913c682ebac 100644 --- a/src/sage/graphs/graph_decompositions/meson.build +++ b/src/sage/graphs/graph_decompositions/meson.build @@ -8,6 +8,7 @@ endif rw = cc.find_library('rw') py.install_sources( + '__init__.py', 'all.py', 'all__sagemath_tdlib.py', 'fast_digraph.pxd', 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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) From be598bfdfa8aa344ad721ee0b2d22444cc194bb2 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 16 Dec 2024 04:15:26 +0000 Subject: [PATCH 150/169] Fix meson github check --- .github/workflows/ci-meson.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-meson.yml b/.github/workflows/ci-meson.yml index 41e5f7f5ff8..e777386fcfe 100644 --- a/.github/workflows/ci-meson.yml +++ b/.github/workflows/ci-meson.yml @@ -47,7 +47,7 @@ jobs: key: ${{ runner.os }}-meson-${{ matrix.python }} - name: Setup Conda environment - uses: conda-incubator/setup-miniconda@v2 + uses: conda-incubator/setup-miniconda@v3 with: python-version: ${{ matrix.python }} miniforge-version: latest From f9a3b436908ae3019362b013b6e9eeffdac5d4a2 Mon Sep 17 00:00:00 2001 From: Dave Witte Morris Date: Sun, 15 Dec 2024 23:50:12 -0500 Subject: [PATCH 151/169] minor fix to comment --- src/sage/symbolic/ginac/numeric.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp index e5914c99263..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()) { From 23d5360104c2521305a714988957305db7ce63d3 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 16 Dec 2024 06:30:07 +0000 Subject: [PATCH 152/169] update to spec 0 --- src/doc/en/developer/coding_basics.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/doc/en/developer/coding_basics.rst b/src/doc/en/developer/coding_basics.rst index 8f0da057fd2..02936d3e423 100644 --- a/src/doc/en/developer/coding_basics.rst +++ b/src/doc/en/developer/coding_basics.rst @@ -88,12 +88,13 @@ Python Version ================= In order to reduce the technical debt of maintaining the project, Sage follows -Numpy's time window-based support policy -`NEP 29 `_ for Python versions. -Accordingly, minor versions of Python that are older than 42 months -at the next planned release date are no longer supported. -Support for Python 3.9 (initially released in October 2020) is dropped in April 2024 and -support for Python 3.10 (initially released in October 2021) is dropped in April 2025. +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: From 4568979281cf64948ce35c96e5d183471e5c995f Mon Sep 17 00:00:00 2001 From: Dima Pasechnik Date: Fri, 13 Dec 2024 09:47:45 -0600 Subject: [PATCH 153/169] remove no longer relevant test Co-authored-by: Dima Pasechnik --- src/sage/misc/cython.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/sage/misc/cython.py b/src/sage/misc/cython.py index c542e0d1919..087d3069f88 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) From 1b074d926ee86421950c92a78898a776798d9e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Mon, 16 Dec 2024 08:34:02 +0100 Subject: [PATCH 154/169] fixes in ref file --- src/doc/en/reference/references/index.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index f2029823f99..c038ce16d40 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -1127,7 +1127,7 @@ REFERENCES: .. [BMSS2006] Alin Bostan, Bruno Salvy, François Morain, Éric Schost. *Fast algorithms for computing isogenies between elliptic curves*. [Research Report] 2006, pp.28. - `arxiv:`cs/0609020` + :arxiv:`cs/0609020` .. [BN2010] \D. Bump and M. Nakasuji. Integration on `p`-adic groups and crystal bases. @@ -1600,7 +1600,7 @@ REFERENCES: Arnoux-Rauzy sequences*, Ann. Inst. Fourier (Grenoble) 50 (2000) 1265--1276. -.. [CFZ2002] Chapoton, Fomin, Zelevinsky - *Polytopal realizations of +.. [CFZ2002] \F. Chapoton, S. Fomin, A. Zelevinsky - *Polytopal realizations of generalized associahedra*, :arxiv:`math/0202004`, :doi:`10.4153/CMB-2002-054-1` @@ -1792,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 From f1c9349e00758e3b23db61ef516db389c04cf52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Mon, 16 Dec 2024 08:51:57 +0100 Subject: [PATCH 155/169] fix linter warnings in sage_setup and sage_docbuild --- src/sage_docbuild/conf.py | 6 ++++++ src/sage_docbuild/ext/sage_autodoc.py | 16 ++++++++++------ .../interpreters/internal/instructions.py | 2 ++ .../autogen/interpreters/internal/memory.py | 2 +- .../autogen/interpreters/internal/specs/cc.py | 1 + .../autogen/interpreters/internal/storage.py | 1 + src/sage_setup/command/sage_build_cython.py | 1 + src/sage_setup/command/sage_build_ext.py | 1 + src/sage_setup/excepthook.py | 1 + src/sage_setup/find.py | 3 +++ src/sage_setup/run_parallel.py | 9 +++++++-- src/sage_setup/setenv.py | 2 ++ 12 files changed, 36 insertions(+), 9 deletions(-) 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 From 677ccdb0de51ef45d4bbfdb5e230fc81c1969582 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 16 Dec 2024 20:52:24 +0700 Subject: [PATCH 156/169] Apply suggested changes Co-authored-by: Tobias Diez --- src/doc/en/installation/meson.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/doc/en/installation/meson.rst b/src/doc/en/installation/meson.rst index 057cf288d4a..93f56f6022f 100644 --- a/src/doc/en/installation/meson.rst +++ b/src/doc/en/installation/meson.rst @@ -67,10 +67,9 @@ or run the tests with ``./sage -t``. .. NOTE:: - By default, ``ninja`` will automatically determine the number of jobs to + 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``, - which will pass ``-jN`` to ``ninja``. + 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. From c89d67a779984d44949511568c2b8a9d9420bd46 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:16:17 +0700 Subject: [PATCH 157/169] Apply more suggested changes --- src/doc/en/installation/meson.rst | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/doc/en/installation/meson.rst b/src/doc/en/installation/meson.rst index 93f56f6022f..4ba3e44b26e 100644 --- a/src/doc/en/installation/meson.rst +++ b/src/doc/en/installation/meson.rst @@ -56,8 +56,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:: @@ -79,8 +80,6 @@ Background information Under the hood, pip invokes meson to configure and build the project. We can also use meson directly as follows. -``meson compile`` is much faster than ``pip install``, -because ``pip install`` reruns ``meson setup --reconfigure`` each time. To configure the project, we need to run the following command: @@ -139,3 +138,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: [...]``. From 57a3d6ac377276b5e7cad9f972e9da8330fef4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Sun, 15 Dec 2024 15:20:36 +0100 Subject: [PATCH 158/169] work on removing IntegralDomain --- .../rings/polynomial/multi_polynomial_ring.py | 18 ++++++------------ src/sage/rings/polynomial/polynomial_ring.py | 5 ++--- 2 files changed, 8 insertions(+), 15 deletions(-) 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/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index 8391d791e92..d1ebfbd87b4 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -149,7 +149,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 @@ -1923,8 +1923,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): """ From b0d24195647d01814637e383f6683629bdfd34ce Mon Sep 17 00:00:00 2001 From: grhkm21 <83517584+grhkm21@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:12:29 +0000 Subject: [PATCH 159/169] Apply suggestions from code review Replace `isinstance(X, A) or isinstance(X, B)` with `isinstance(X, (A, B))` Co-authored-by: Martin Rubey --- src/sage/dynamics/arithmetic_dynamics/projective_ds.py | 2 +- src/sage/ext/fast_callable.pyx | 5 +++-- src/sage/rings/morphism.pyx | 4 ++-- src/sage/rings/polynomial/flatten.py | 6 +++--- src/sage/rings/polynomial/multi_polynomial_ring_base.pyx | 2 +- src/sage/symbolic/ring.pyx | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py index c8887cb3112..591693e5af8 100644 --- a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py +++ b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py @@ -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_generic) 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)) diff --git a/src/sage/ext/fast_callable.pyx b/src/sage/ext/fast_callable.pyx index 320783d8f4a..477f8608ef7 100644 --- a/src/sage/ext/fast_callable.pyx +++ b/src/sage/ext/fast_callable.pyx @@ -477,8 +477,9 @@ def fast_callable(x, domain=None, vars=None, if vars is None: from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_base - if isinstance(x.parent(), PolynomialRing_generic) 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/rings/morphism.pyx b/src/sage/rings/morphism.pyx index 90f96bc395e..791e8b70b93 100644 --- a/src/sage/rings/morphism.pyx +++ b/src/sage/rings/morphism.pyx @@ -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_generic) 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_generic): + 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/polynomial/flatten.py b/src/sage/rings/polynomial/flatten.py index 74a7c24c8f6..174c1d7b1bd 100644 --- a/src/sage/rings/polynomial/flatten.py +++ b/src/sage/rings/polynomial/flatten.py @@ -160,7 +160,7 @@ def __init__(self, domain): sage: fl.section()(fl(p)) == p True """ - if not isinstance(domain, PolynomialRing_generic) and not isinstance(domain, MPolynomialRing_base): + if not isinstance(domain, (PolynomialRing_generic, MPolynomialRing_base)): raise ValueError("domain should be a polynomial ring") ring = domain @@ -347,7 +347,7 @@ 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_generic) and not isinstance(codomain, MPolynomialRing_base): + if not isinstance(codomain, (PolynomialRing_generic, MPolynomialRing_base)): raise ValueError("codomain should be a polynomial ring") ring = codomain @@ -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_generic) 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, diff --git a/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx b/src/sage/rings/polynomial/multi_polynomial_ring_base.pyx index 55fdc42750e..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_generic): + if isinstance(base, (MPolynomialRing_base, polynomial_ring.PolynomialRing_generic)): from sage.rings.polynomial.flatten import FlatteningMorphism return FlatteningMorphism(self) else: diff --git a/src/sage/symbolic/ring.pyx b/src/sage/symbolic/ring.pyx index 902fd3d6314..eaaa5cbdc15 100644 --- a/src/sage/symbolic/ring.pyx +++ b/src/sage/symbolic/ring.pyx @@ -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_generic) 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 From 291c3d6fb80634290e50c6786b81d1a6da23cc52 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Mon, 16 Dec 2024 20:07:06 +0100 Subject: [PATCH 160/169] Don't use count as a positional argument in re.sub This is deprecated in Python 3.13 and the warnings break tests --- src/sage/interfaces/singular.py | 2 +- src/sage/misc/cython.py | 2 +- src/sage/rings/ring_extension_morphism.pyx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py index d02ae43149f..83600eefa38 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, count=0, flags=re.MULTILINE) return s def __copy__(self): diff --git a/src/sage/misc/cython.py b/src/sage/misc/cython.py index c542e0d1919..bb9e917672f 100644 --- a/src/sage/misc/cython.py +++ b/src/sage/misc/cython.py @@ -380,7 +380,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, count=0, flags=re.MULTILINE) sys.stderr.write(cython_messages) sys.stderr.flush() diff --git a/src/sage/rings/ring_extension_morphism.pyx b/src/sage/rings/ring_extension_morphism.pyx index d4aad7f8253..4ffa8fc56e3 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, count=0, flags=re.MULTILINE) if ss != "": s += ":\n" + ss if s != "" and s[-1] == "\n": s = s[:-1] From 9829c71056f2550b703f0b9069b28fe2574a5173 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Mon, 16 Dec 2024 20:38:24 +0100 Subject: [PATCH 161/169] Actually remove count parameter, 0 is the default --- src/sage/interfaces/singular.py | 2 +- src/sage/misc/cython.py | 2 +- src/sage/rings/ring_extension_morphism.pyx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py index 83600eefa38..447b548c1b8 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, count=0, flags=re.MULTILINE) + s, flags=re.MULTILINE) return s def __copy__(self): diff --git a/src/sage/misc/cython.py b/src/sage/misc/cython.py index bb9e917672f..241078d5f2c 100644 --- a/src/sage/misc/cython.py +++ b/src/sage/misc/cython.py @@ -380,7 +380,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, count=0, flags=re.MULTILINE) + "", cython_messages, flags=re.MULTILINE) sys.stderr.write(cython_messages) sys.stderr.flush() diff --git a/src/sage/rings/ring_extension_morphism.pyx b/src/sage/rings/ring_extension_morphism.pyx index 4ffa8fc56e3..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, count=0, flags=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] From f39717328ddaaa8169a2eca7bc4ed38b08c0bfca Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 17 Dec 2024 13:09:08 +0700 Subject: [PATCH 162/169] Remove executable flags from many Python files --- src/sage/combinat/multiset_partition_into_sets_ordered.py | 0 src/sage/dynamics/finite_dynamical_system_catalog.py | 0 src/sage/graphs/centrality.pyx | 0 src/sage/modules/fp_graded/all.py | 0 src/sage/modules/fp_graded/element.py | 0 src/sage/modules/fp_graded/free_element.py | 0 src/sage/modules/fp_graded/free_homspace.py | 0 src/sage/modules/fp_graded/free_module.py | 0 src/sage/modules/fp_graded/free_morphism.py | 0 src/sage/modules/fp_graded/homspace.py | 0 src/sage/modules/fp_graded/module.py | 0 src/sage/modules/fp_graded/morphism.py | 0 src/sage/modules/fp_graded/steenrod/all.py | 0 src/sage/modules/fp_graded/steenrod/homspace.py | 0 src/sage/modules/fp_graded/steenrod/module.py | 0 src/sage/modules/fp_graded/steenrod/morphism.py | 0 src/sage/modules/fp_graded/steenrod/profile.py | 0 src/sage/quadratic_forms/binary_qf.py | 0 src/sage/rings/finite_rings/element_base.pyx | 0 src/sage/rings/polynomial/weil/weil_polynomials.pyx | 0 src/sage/schemes/affine/affine_homset.py | 0 src/sage/schemes/affine/affine_morphism.py | 0 src/sage/schemes/affine/affine_point.py | 0 src/sage/schemes/affine/affine_rational_point.py | 0 src/sage/schemes/affine/affine_space.py | 0 src/sage/schemes/affine/affine_subscheme.py | 0 src/sage/schemes/berkovich/berkovich_cp_element.py | 0 src/sage/schemes/berkovich/berkovich_space.py | 0 src/sage/schemes/curves/affine_curve.py | 0 src/sage/schemes/curves/closed_point.py | 0 src/sage/schemes/curves/constructor.py | 0 src/sage/schemes/curves/curve.py | 0 src/sage/schemes/curves/plane_curve_arrangement.py | 0 src/sage/schemes/curves/point.py | 0 src/sage/schemes/curves/projective_curve.py | 0 src/sage/schemes/curves/zariski_vankampen.py | 0 src/sage/schemes/cyclic_covers/charpoly_frobenius.py | 0 src/sage/schemes/cyclic_covers/constructor.py | 0 src/sage/schemes/cyclic_covers/cycliccover_finite_field.py | 0 src/sage/schemes/cyclic_covers/cycliccover_generic.py | 0 src/sage/schemes/elliptic_curves/BSD.py | 0 src/sage/schemes/elliptic_curves/Qcurves.py | 0 src/sage/schemes/elliptic_curves/cm.py | 0 src/sage/schemes/elliptic_curves/constructor.py | 0 src/sage/schemes/elliptic_curves/descent_two_isogeny.pyx | 0 src/sage/schemes/elliptic_curves/ec_database.py | 0 src/sage/schemes/elliptic_curves/ell_curve_isogeny.py | 0 src/sage/schemes/elliptic_curves/ell_egros.py | 0 src/sage/schemes/elliptic_curves/ell_field.py | 0 src/sage/schemes/elliptic_curves/ell_finite_field.py | 0 src/sage/schemes/elliptic_curves/ell_generic.py | 0 src/sage/schemes/elliptic_curves/ell_local_data.py | 0 src/sage/schemes/elliptic_curves/ell_modular_symbols.py | 0 src/sage/schemes/elliptic_curves/ell_number_field.py | 0 src/sage/schemes/elliptic_curves/ell_padic_field.py | 0 src/sage/schemes/elliptic_curves/ell_point.py | 0 src/sage/schemes/elliptic_curves/ell_rational_field.py | 0 src/sage/schemes/elliptic_curves/ell_tate_curve.py | 0 src/sage/schemes/elliptic_curves/ell_torsion.py | 0 src/sage/schemes/elliptic_curves/ell_wp.py | 0 src/sage/schemes/elliptic_curves/formal_group.py | 0 src/sage/schemes/elliptic_curves/gal_reps.py | 0 src/sage/schemes/elliptic_curves/gal_reps_number_field.py | 0 src/sage/schemes/elliptic_curves/heegner.py | 0 src/sage/schemes/elliptic_curves/height.py | 0 src/sage/schemes/elliptic_curves/hom.py | 0 src/sage/schemes/elliptic_curves/hom_composite.py | 0 src/sage/schemes/elliptic_curves/hom_sum.py | 0 src/sage/schemes/elliptic_curves/hom_velusqrt.py | 0 src/sage/schemes/elliptic_curves/isogeny_class.py | 0 src/sage/schemes/elliptic_curves/isogeny_small_degree.py | 0 src/sage/schemes/elliptic_curves/jacobian.py | 0 src/sage/schemes/elliptic_curves/kodaira_symbol.py | 0 src/sage/schemes/elliptic_curves/kraus.py | 0 src/sage/schemes/elliptic_curves/lseries_ell.py | 0 src/sage/schemes/elliptic_curves/mod_poly.py | 0 src/sage/schemes/elliptic_curves/mod_sym_num.pyx | 0 src/sage/schemes/elliptic_curves/modular_parametrization.py | 0 src/sage/schemes/elliptic_curves/padic_lseries.py | 0 src/sage/schemes/elliptic_curves/padics.py | 0 src/sage/schemes/elliptic_curves/period_lattice.py | 0 src/sage/schemes/elliptic_curves/period_lattice_region.pyx | 0 src/sage/schemes/elliptic_curves/saturation.py | 0 src/sage/schemes/elliptic_curves/sha_tate.py | 0 src/sage/schemes/elliptic_curves/weierstrass_morphism.py | 0 src/sage/schemes/elliptic_curves/weierstrass_transform.py | 0 src/sage/schemes/generic/algebraic_scheme.py | 0 src/sage/schemes/generic/ambient_space.py | 0 src/sage/schemes/generic/divisor.py | 0 src/sage/schemes/generic/divisor_group.py | 0 src/sage/schemes/generic/glue.py | 0 src/sage/schemes/generic/homset.py | 0 src/sage/schemes/generic/hypersurface.py | 0 src/sage/schemes/generic/morphism.py | 0 src/sage/schemes/generic/point.py | 0 src/sage/schemes/generic/scheme.py | 0 src/sage/schemes/generic/spec.py | 0 src/sage/schemes/hyperelliptic_curves/constructor.py | 0 src/sage/schemes/hyperelliptic_curves/hypellfrob.pyx | 0 .../schemes/hyperelliptic_curves/hyperelliptic_finite_field.py | 0 src/sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py | 0 .../schemes/hyperelliptic_curves/hyperelliptic_padic_field.py | 0 .../schemes/hyperelliptic_curves/hyperelliptic_rational_field.py | 0 src/sage/schemes/hyperelliptic_curves/invariants.py | 0 .../schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py | 0 src/sage/schemes/hyperelliptic_curves/jacobian_generic.py | 0 src/sage/schemes/hyperelliptic_curves/jacobian_morphism.py | 0 src/sage/schemes/hyperelliptic_curves/mestre.py | 0 src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py | 0 src/sage/schemes/jacobians/abstract_jacobian.py | 0 src/sage/schemes/plane_conics/con_field.py | 0 src/sage/schemes/plane_conics/con_finite_field.py | 0 src/sage/schemes/plane_conics/con_number_field.py | 0 src/sage/schemes/plane_conics/con_rational_field.py | 0 src/sage/schemes/plane_conics/con_rational_function_field.py | 0 src/sage/schemes/plane_conics/constructor.py | 0 src/sage/schemes/plane_quartics/quartic_constructor.py | 0 src/sage/schemes/plane_quartics/quartic_generic.py | 0 src/sage/schemes/product_projective/homset.py | 0 src/sage/schemes/product_projective/morphism.py | 0 src/sage/schemes/product_projective/point.py | 0 src/sage/schemes/product_projective/rational_point.py | 0 src/sage/schemes/product_projective/space.py | 0 src/sage/schemes/product_projective/subscheme.py | 0 src/sage/schemes/projective/proj_bdd_height.py | 0 src/sage/schemes/projective/projective_homset.py | 0 src/sage/schemes/projective/projective_morphism.py | 0 src/sage/schemes/projective/projective_point.py | 0 src/sage/schemes/projective/projective_rational_point.py | 0 src/sage/schemes/projective/projective_space.py | 0 src/sage/schemes/projective/projective_subscheme.py | 0 src/sage/schemes/riemann_surfaces/riemann_surface.py | 0 src/sage/schemes/toric/chow_group.py | 0 src/sage/schemes/toric/divisor.py | 0 src/sage/schemes/toric/divisor_class.pyx | 0 src/sage/schemes/toric/fano_variety.py | 0 src/sage/schemes/toric/homset.py | 0 src/sage/schemes/toric/ideal.py | 0 src/sage/schemes/toric/library.py | 0 src/sage/schemes/toric/morphism.py | 0 src/sage/schemes/toric/points.py | 0 src/sage/schemes/toric/sheaf/constructor.py | 0 src/sage/schemes/toric/sheaf/klyachko.py | 0 src/sage/schemes/toric/toric_subscheme.py | 0 src/sage/schemes/toric/variety.py | 0 src/sage/schemes/toric/weierstrass.py | 0 src/sage/schemes/toric/weierstrass_covering.py | 0 src/sage/schemes/toric/weierstrass_higher.py | 0 148 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/sage/combinat/multiset_partition_into_sets_ordered.py mode change 100755 => 100644 src/sage/dynamics/finite_dynamical_system_catalog.py mode change 100755 => 100644 src/sage/graphs/centrality.pyx mode change 100755 => 100644 src/sage/modules/fp_graded/all.py mode change 100755 => 100644 src/sage/modules/fp_graded/element.py mode change 100755 => 100644 src/sage/modules/fp_graded/free_element.py mode change 100755 => 100644 src/sage/modules/fp_graded/free_homspace.py mode change 100755 => 100644 src/sage/modules/fp_graded/free_module.py mode change 100755 => 100644 src/sage/modules/fp_graded/free_morphism.py mode change 100755 => 100644 src/sage/modules/fp_graded/homspace.py mode change 100755 => 100644 src/sage/modules/fp_graded/module.py mode change 100755 => 100644 src/sage/modules/fp_graded/morphism.py mode change 100755 => 100644 src/sage/modules/fp_graded/steenrod/all.py mode change 100755 => 100644 src/sage/modules/fp_graded/steenrod/homspace.py mode change 100755 => 100644 src/sage/modules/fp_graded/steenrod/module.py mode change 100755 => 100644 src/sage/modules/fp_graded/steenrod/morphism.py mode change 100755 => 100644 src/sage/modules/fp_graded/steenrod/profile.py mode change 100755 => 100644 src/sage/quadratic_forms/binary_qf.py mode change 100755 => 100644 src/sage/rings/finite_rings/element_base.pyx mode change 100755 => 100644 src/sage/rings/polynomial/weil/weil_polynomials.pyx mode change 100755 => 100644 src/sage/schemes/affine/affine_homset.py mode change 100755 => 100644 src/sage/schemes/affine/affine_morphism.py mode change 100755 => 100644 src/sage/schemes/affine/affine_point.py mode change 100755 => 100644 src/sage/schemes/affine/affine_rational_point.py mode change 100755 => 100644 src/sage/schemes/affine/affine_space.py mode change 100755 => 100644 src/sage/schemes/affine/affine_subscheme.py mode change 100755 => 100644 src/sage/schemes/berkovich/berkovich_cp_element.py mode change 100755 => 100644 src/sage/schemes/berkovich/berkovich_space.py mode change 100755 => 100644 src/sage/schemes/curves/affine_curve.py mode change 100755 => 100644 src/sage/schemes/curves/closed_point.py mode change 100755 => 100644 src/sage/schemes/curves/constructor.py mode change 100755 => 100644 src/sage/schemes/curves/curve.py mode change 100755 => 100644 src/sage/schemes/curves/plane_curve_arrangement.py mode change 100755 => 100644 src/sage/schemes/curves/point.py mode change 100755 => 100644 src/sage/schemes/curves/projective_curve.py mode change 100755 => 100644 src/sage/schemes/curves/zariski_vankampen.py mode change 100755 => 100644 src/sage/schemes/cyclic_covers/charpoly_frobenius.py mode change 100755 => 100644 src/sage/schemes/cyclic_covers/constructor.py mode change 100755 => 100644 src/sage/schemes/cyclic_covers/cycliccover_finite_field.py mode change 100755 => 100644 src/sage/schemes/cyclic_covers/cycliccover_generic.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/BSD.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/Qcurves.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/cm.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/constructor.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/descent_two_isogeny.pyx mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ec_database.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_curve_isogeny.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_egros.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_field.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_finite_field.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_generic.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_local_data.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_modular_symbols.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_number_field.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_padic_field.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_point.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_rational_field.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_tate_curve.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_torsion.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/ell_wp.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/formal_group.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/gal_reps.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/gal_reps_number_field.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/heegner.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/height.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/hom.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/hom_composite.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/hom_sum.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/hom_velusqrt.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/isogeny_class.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/isogeny_small_degree.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/jacobian.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/kodaira_symbol.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/kraus.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/lseries_ell.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/mod_poly.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/mod_sym_num.pyx mode change 100755 => 100644 src/sage/schemes/elliptic_curves/modular_parametrization.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/padic_lseries.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/padics.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/period_lattice.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/period_lattice_region.pyx mode change 100755 => 100644 src/sage/schemes/elliptic_curves/saturation.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/sha_tate.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/weierstrass_morphism.py mode change 100755 => 100644 src/sage/schemes/elliptic_curves/weierstrass_transform.py mode change 100755 => 100644 src/sage/schemes/generic/algebraic_scheme.py mode change 100755 => 100644 src/sage/schemes/generic/ambient_space.py mode change 100755 => 100644 src/sage/schemes/generic/divisor.py mode change 100755 => 100644 src/sage/schemes/generic/divisor_group.py mode change 100755 => 100644 src/sage/schemes/generic/glue.py mode change 100755 => 100644 src/sage/schemes/generic/homset.py mode change 100755 => 100644 src/sage/schemes/generic/hypersurface.py mode change 100755 => 100644 src/sage/schemes/generic/morphism.py mode change 100755 => 100644 src/sage/schemes/generic/point.py mode change 100755 => 100644 src/sage/schemes/generic/scheme.py mode change 100755 => 100644 src/sage/schemes/generic/spec.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/constructor.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/hypellfrob.pyx mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/invariants.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/jacobian_generic.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/jacobian_morphism.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/mestre.py mode change 100755 => 100644 src/sage/schemes/hyperelliptic_curves/monsky_washnitzer.py mode change 100755 => 100644 src/sage/schemes/jacobians/abstract_jacobian.py mode change 100755 => 100644 src/sage/schemes/plane_conics/con_field.py mode change 100755 => 100644 src/sage/schemes/plane_conics/con_finite_field.py mode change 100755 => 100644 src/sage/schemes/plane_conics/con_number_field.py mode change 100755 => 100644 src/sage/schemes/plane_conics/con_rational_field.py mode change 100755 => 100644 src/sage/schemes/plane_conics/con_rational_function_field.py mode change 100755 => 100644 src/sage/schemes/plane_conics/constructor.py mode change 100755 => 100644 src/sage/schemes/plane_quartics/quartic_constructor.py mode change 100755 => 100644 src/sage/schemes/plane_quartics/quartic_generic.py mode change 100755 => 100644 src/sage/schemes/product_projective/homset.py mode change 100755 => 100644 src/sage/schemes/product_projective/morphism.py mode change 100755 => 100644 src/sage/schemes/product_projective/point.py mode change 100755 => 100644 src/sage/schemes/product_projective/rational_point.py mode change 100755 => 100644 src/sage/schemes/product_projective/space.py mode change 100755 => 100644 src/sage/schemes/product_projective/subscheme.py mode change 100755 => 100644 src/sage/schemes/projective/proj_bdd_height.py mode change 100755 => 100644 src/sage/schemes/projective/projective_homset.py mode change 100755 => 100644 src/sage/schemes/projective/projective_morphism.py mode change 100755 => 100644 src/sage/schemes/projective/projective_point.py mode change 100755 => 100644 src/sage/schemes/projective/projective_rational_point.py mode change 100755 => 100644 src/sage/schemes/projective/projective_space.py mode change 100755 => 100644 src/sage/schemes/projective/projective_subscheme.py mode change 100755 => 100644 src/sage/schemes/riemann_surfaces/riemann_surface.py mode change 100755 => 100644 src/sage/schemes/toric/chow_group.py mode change 100755 => 100644 src/sage/schemes/toric/divisor.py mode change 100755 => 100644 src/sage/schemes/toric/divisor_class.pyx mode change 100755 => 100644 src/sage/schemes/toric/fano_variety.py mode change 100755 => 100644 src/sage/schemes/toric/homset.py mode change 100755 => 100644 src/sage/schemes/toric/ideal.py mode change 100755 => 100644 src/sage/schemes/toric/library.py mode change 100755 => 100644 src/sage/schemes/toric/morphism.py mode change 100755 => 100644 src/sage/schemes/toric/points.py mode change 100755 => 100644 src/sage/schemes/toric/sheaf/constructor.py mode change 100755 => 100644 src/sage/schemes/toric/sheaf/klyachko.py mode change 100755 => 100644 src/sage/schemes/toric/toric_subscheme.py mode change 100755 => 100644 src/sage/schemes/toric/variety.py mode change 100755 => 100644 src/sage/schemes/toric/weierstrass.py mode change 100755 => 100644 src/sage/schemes/toric/weierstrass_covering.py mode change 100755 => 100644 src/sage/schemes/toric/weierstrass_higher.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/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/graphs/centrality.pyx b/src/sage/graphs/centrality.pyx old mode 100755 new mode 100644 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/quadratic_forms/binary_qf.py b/src/sage/quadratic_forms/binary_qf.py old mode 100755 new mode 100644 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/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/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 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/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 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 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 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/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 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/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/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 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 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 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 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 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/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 From ecaa89be6e2a34ebfbf179cbe51bd07be715a1e2 Mon Sep 17 00:00:00 2001 From: Kwankyu Lee Date: Tue, 17 Dec 2024 17:13:27 +0900 Subject: [PATCH 163/169] Remove expected_codim argument --- .../rings/function_field/khuri_makdisi.pyx | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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) From 10b31b3de29abfe8775802a4dae58307fed144d1 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Thu, 19 Dec 2024 07:55:14 +0700 Subject: [PATCH 164/169] Increase n in several places to make tests pass on faster computer --- .../rings/polynomial/multi_polynomial_libsingular.pyx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 7834e4d93c0..6b7a519cf9b 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -4656,7 +4656,7 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Ensure interrupt does not make the internal state inconsistent:: sage: R. = QQ[] - sage: n = 15 # chosen so that the computation takes > 1 second but not excessively long. + 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)) @@ -5211,7 +5211,7 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): Ensure interrupt does not make the internal state inconsistent:: sage: R. = PolynomialRing(QQ, order="lex") - sage: n = 250 # chosen so that the computation takes > 1 second but not excessively long. + 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 @@ -5225,9 +5225,9 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): AlarmInterrupt sage: q, r = f.quo_rem(g) sage: len(dict(q)) - 178748 + 307638 sage: len(dict(r)) - 7993 + 11409 """ cdef poly *quo cdef poly *rem From 963dde640e4f630ea135c05ac1ab20a78c1e866d Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Thu, 19 Dec 2024 09:01:18 +0700 Subject: [PATCH 165/169] Fix tests --- src/sage/rings/polynomial/multi_polynomial_libsingular.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx index 6b7a519cf9b..0d2cf86deeb 100644 --- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx +++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx @@ -4669,7 +4669,7 @@ cdef class MPolynomial_libsingular(MPolynomial_libsingular_base): ... AlarmInterrupt sage: f.lift(I) - Polynomial Sequence with 256 Polynomials in 2 Variables + Polynomial Sequence with 324 Polynomials in 2 Variables """ cdef ideal *fI = idInit(1, 1) cdef ideal *_I From 06f9834087f7dabebf51afca97c0962bc8a5a221 Mon Sep 17 00:00:00 2001 From: Julien Lavauzelle Date: Thu, 19 Dec 2024 22:17:51 +0100 Subject: [PATCH 166/169] Fix an add issue number to the doc --- src/sage/coding/reed_muller_code.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/sage/coding/reed_muller_code.py b/src/sage/coding/reed_muller_code.py index d46c5403eef..4f7759440ab 100644 --- a/src/sage/coding/reed_muller_code.py +++ b/src/sage/coding/reed_muller_code.py @@ -396,13 +396,16 @@ 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. + 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 From d99d0346f1dcdc3b8ad8bd1bfa70aa9eaf23b9f0 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Fri, 20 Dec 2024 08:41:29 +0700 Subject: [PATCH 167/169] Return True instead of None to avoid cachefunc being useless --- src/sage/combinat/integer_lists/invlex.pyx | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/sage/combinat/integer_lists/invlex.pyx b/src/sage/combinat/integer_lists/invlex.pyx index 6bef85031ce..466089f335e 100644 --- a/src/sage/combinat/integer_lists/invlex.pyx +++ b/src/sage/combinat/integer_lists/invlex.pyx @@ -860,10 +860,13 @@ 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) @@ -1002,20 +1005,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 +1031,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 +1042,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") From 91cf51de95a5ff241d148d93f2a1e76c74e05e3e Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:31:53 +0700 Subject: [PATCH 168/169] Fix tests --- src/sage/combinat/integer_lists/invlex.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sage/combinat/integer_lists/invlex.pyx b/src/sage/combinat/integer_lists/invlex.pyx index 466089f335e..bfb4c8dc3d7 100644 --- a/src/sage/combinat/integer_lists/invlex.pyx +++ b/src/sage/combinat/integer_lists/invlex.pyx @@ -871,6 +871,7 @@ If you know what you are doing, you can set check=False to skip this warning.""" sage: L = IntegerListsLex(4, max_length=4) sage: L._check_finiteness() + True The following example is infinite:: From c9dd1e85118c875d12bd7bc66d0817f907cf4e33 Mon Sep 17 00:00:00 2001 From: Release Manager Date: Sun, 22 Dec 2024 17:43:13 +0100 Subject: [PATCH 169/169] Updated SageMath version to 10.6.beta2 --- CITATION.cff | 4 ++-- VERSION.txt | 2 +- build/pkgs/configure/checksums.ini | 4 ++-- build/pkgs/configure/package-version.txt | 2 +- build/pkgs/sage_conf/version_requirements.txt | 2 +- build/pkgs/sage_docbuild/version_requirements.txt | 2 +- build/pkgs/sage_setup/version_requirements.txt | 2 +- build/pkgs/sage_sws2rst/version_requirements.txt | 2 +- build/pkgs/sagelib/version_requirements.txt | 2 +- build/pkgs/sagemath_bliss/version_requirements.txt | 2 +- build/pkgs/sagemath_categories/version_requirements.txt | 2 +- build/pkgs/sagemath_coxeter3/version_requirements.txt | 2 +- build/pkgs/sagemath_environment/version_requirements.txt | 2 +- build/pkgs/sagemath_mcqd/version_requirements.txt | 2 +- build/pkgs/sagemath_meataxe/version_requirements.txt | 2 +- build/pkgs/sagemath_objects/version_requirements.txt | 2 +- build/pkgs/sagemath_repl/version_requirements.txt | 2 +- build/pkgs/sagemath_sirocco/version_requirements.txt | 2 +- build/pkgs/sagemath_tdlib/version_requirements.txt | 2 +- pkgs/sage-conf/VERSION.txt | 2 +- pkgs/sage-conf_conda/VERSION.txt | 2 +- pkgs/sage-conf_pypi/VERSION.txt | 2 +- pkgs/sage-docbuild/VERSION.txt | 2 +- pkgs/sage-setup/VERSION.txt | 2 +- pkgs/sage-sws2rst/VERSION.txt | 2 +- pkgs/sagemath-bliss/VERSION.txt | 2 +- pkgs/sagemath-categories/VERSION.txt | 2 +- pkgs/sagemath-coxeter3/VERSION.txt | 2 +- pkgs/sagemath-environment/VERSION.txt | 2 +- pkgs/sagemath-mcqd/VERSION.txt | 2 +- pkgs/sagemath-meataxe/VERSION.txt | 2 +- pkgs/sagemath-objects/VERSION.txt | 2 +- pkgs/sagemath-repl/VERSION.txt | 2 +- pkgs/sagemath-sirocco/VERSION.txt | 2 +- pkgs/sagemath-tdlib/VERSION.txt | 2 +- src/VERSION.txt | 2 +- src/bin/sage-version.sh | 6 +++--- src/sage/version.py | 6 +++--- 38 files changed, 44 insertions(+), 44 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 7f17ed5c0d8..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.beta1 +version: 10.6.beta2 doi: 10.5281/zenodo.8042260 -date-released: 2024-12-15 +date-released: 2024-12-22 repository-code: "https://github.com/sagemath/sage" url: "https://www.sagemath.org/" diff --git a/VERSION.txt b/VERSION.txt index 6af82e4b429..a5da045ce22 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -SageMath version 10.6.beta1, Release Date: 2024-12-15 +SageMath version 10.6.beta2, Release Date: 2024-12-22 diff --git a/build/pkgs/configure/checksums.ini b/build/pkgs/configure/checksums.ini index fc8ca4e5e07..e337163151d 100644 --- a/build/pkgs/configure/checksums.ini +++ b/build/pkgs/configure/checksums.ini @@ -1,3 +1,3 @@ tarball=configure-VERSION.tar.gz -sha1=688c89dcc85f95d4637109c80decb8c7a66b8481 -sha256=3d46f808d4569dfcabb8c92dfb9ac8687f6fb0d1cf67cda71de79f9dc0c65b0f +sha1=a03b8a505678cba0d652514d739bd32eb30bb925 +sha256=6525b44fea6b9d0238ca4790e8be5168e8d08c350787704a59ada9b6075a1f0f diff --git a/build/pkgs/configure/package-version.txt b/build/pkgs/configure/package-version.txt index ad34f5cf68a..84217b4b61b 100644 --- a/build/pkgs/configure/package-version.txt +++ b/build/pkgs/configure/package-version.txt @@ -1 +1 @@ -dc6e5545e0443748153c913364b47cca95feefa4 +291e54bf234b1753909f22a043e91a4a639693c1 diff --git a/build/pkgs/sage_conf/version_requirements.txt b/build/pkgs/sage_conf/version_requirements.txt index 5fe4d966040..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.6b1 +sage-conf ~= 10.6b2 diff --git a/build/pkgs/sage_docbuild/version_requirements.txt b/build/pkgs/sage_docbuild/version_requirements.txt index 8c3a08af6ba..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.6b1 +sage-docbuild ~= 10.6b2 diff --git a/build/pkgs/sage_setup/version_requirements.txt b/build/pkgs/sage_setup/version_requirements.txt index 20373e5b24b..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.6b1 +sage-setup ~= 10.6b2 diff --git a/build/pkgs/sage_sws2rst/version_requirements.txt b/build/pkgs/sage_sws2rst/version_requirements.txt index 75d2dea8555..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.6b1 +sage-sws2rst ~= 10.6b2 diff --git a/build/pkgs/sagelib/version_requirements.txt b/build/pkgs/sagelib/version_requirements.txt index b9b66b303ce..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.6b1 +sagemath-standard ~= 10.6b2 diff --git a/build/pkgs/sagemath_bliss/version_requirements.txt b/build/pkgs/sagemath_bliss/version_requirements.txt index 66cfe981b11..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.6b1 +sagemath-bliss ~= 10.6b2 diff --git a/build/pkgs/sagemath_categories/version_requirements.txt b/build/pkgs/sagemath_categories/version_requirements.txt index 012ced666ae..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.6b1 +sagemath-categories ~= 10.6b2 diff --git a/build/pkgs/sagemath_coxeter3/version_requirements.txt b/build/pkgs/sagemath_coxeter3/version_requirements.txt index d0efaa88af2..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.6b1 +sagemath-coxeter3 ~= 10.6b2 diff --git a/build/pkgs/sagemath_environment/version_requirements.txt b/build/pkgs/sagemath_environment/version_requirements.txt index 6cae42add68..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.6b1 +sagemath-environment ~= 10.6b2 diff --git a/build/pkgs/sagemath_mcqd/version_requirements.txt b/build/pkgs/sagemath_mcqd/version_requirements.txt index 17c1fefc2b9..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.6b1 +sagemath-mcqd ~= 10.6b2 diff --git a/build/pkgs/sagemath_meataxe/version_requirements.txt b/build/pkgs/sagemath_meataxe/version_requirements.txt index 2dc47f93620..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.6b1 +sagemath-meataxe ~= 10.6b2 diff --git a/build/pkgs/sagemath_objects/version_requirements.txt b/build/pkgs/sagemath_objects/version_requirements.txt index aa457cf9337..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.6b1 +sagemath-objects ~= 10.6b2 diff --git a/build/pkgs/sagemath_repl/version_requirements.txt b/build/pkgs/sagemath_repl/version_requirements.txt index d89f0a710d3..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.6b1 +sagemath-repl ~= 10.6b2 diff --git a/build/pkgs/sagemath_sirocco/version_requirements.txt b/build/pkgs/sagemath_sirocco/version_requirements.txt index 3b31a56b658..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.6b1 +sagemath-sirocco ~= 10.6b2 diff --git a/build/pkgs/sagemath_tdlib/version_requirements.txt b/build/pkgs/sagemath_tdlib/version_requirements.txt index a1de5923196..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.6b1 +sagemath-tdlib ~= 10.6b2 diff --git a/pkgs/sage-conf/VERSION.txt b/pkgs/sage-conf/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sage-conf/VERSION.txt +++ b/pkgs/sage-conf/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sage-conf_conda/VERSION.txt b/pkgs/sage-conf_conda/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sage-conf_conda/VERSION.txt +++ b/pkgs/sage-conf_conda/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sage-conf_pypi/VERSION.txt b/pkgs/sage-conf_pypi/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sage-conf_pypi/VERSION.txt +++ b/pkgs/sage-conf_pypi/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sage-docbuild/VERSION.txt b/pkgs/sage-docbuild/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sage-docbuild/VERSION.txt +++ b/pkgs/sage-docbuild/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sage-setup/VERSION.txt b/pkgs/sage-setup/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sage-setup/VERSION.txt +++ b/pkgs/sage-setup/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sage-sws2rst/VERSION.txt b/pkgs/sage-sws2rst/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sage-sws2rst/VERSION.txt +++ b/pkgs/sage-sws2rst/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-bliss/VERSION.txt b/pkgs/sagemath-bliss/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-bliss/VERSION.txt +++ b/pkgs/sagemath-bliss/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-categories/VERSION.txt b/pkgs/sagemath-categories/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-categories/VERSION.txt +++ b/pkgs/sagemath-categories/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-coxeter3/VERSION.txt b/pkgs/sagemath-coxeter3/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-coxeter3/VERSION.txt +++ b/pkgs/sagemath-coxeter3/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-environment/VERSION.txt b/pkgs/sagemath-environment/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-environment/VERSION.txt +++ b/pkgs/sagemath-environment/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-mcqd/VERSION.txt b/pkgs/sagemath-mcqd/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-mcqd/VERSION.txt +++ b/pkgs/sagemath-mcqd/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-meataxe/VERSION.txt b/pkgs/sagemath-meataxe/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-meataxe/VERSION.txt +++ b/pkgs/sagemath-meataxe/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-objects/VERSION.txt b/pkgs/sagemath-objects/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-objects/VERSION.txt +++ b/pkgs/sagemath-objects/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-repl/VERSION.txt b/pkgs/sagemath-repl/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-repl/VERSION.txt +++ b/pkgs/sagemath-repl/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-sirocco/VERSION.txt b/pkgs/sagemath-sirocco/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-sirocco/VERSION.txt +++ b/pkgs/sagemath-sirocco/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/pkgs/sagemath-tdlib/VERSION.txt b/pkgs/sagemath-tdlib/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/pkgs/sagemath-tdlib/VERSION.txt +++ b/pkgs/sagemath-tdlib/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/src/VERSION.txt b/src/VERSION.txt index 6e3a857d06e..61117e46f91 100644 --- a/src/VERSION.txt +++ b/src/VERSION.txt @@ -1 +1 @@ -10.6.beta1 +10.6.beta2 diff --git a/src/bin/sage-version.sh b/src/bin/sage-version.sh index 6877ac8ce0a..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.beta1' -SAGE_RELEASE_DATE='2024-12-15' -SAGE_VERSION_BANNER='SageMath version 10.6.beta1, Release Date: 2024-12-15' +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/sage/version.py b/src/sage/version.py index 1740a25851c..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.beta1' -date = '2024-12-15' -banner = 'SageMath version 10.6.beta1, Release Date: 2024-12-15' +version = '10.6.beta2' +date = '2024-12-22' +banner = 'SageMath version 10.6.beta2, Release Date: 2024-12-22'