Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge sage_brial into sagelib #30332

Closed
mkoeppe opened this issue Aug 11, 2020 · 72 comments
Closed

Merge sage_brial into sagelib #30332

mkoeppe opened this issue Aug 11, 2020 · 72 comments

Comments

@mkoeppe
Copy link
Contributor

mkoeppe commented Aug 11, 2020

As discussed in #29369 and #28918.

CC: @kiwifb @orlitzky @tscrim

Component: packages: standard

Author: François Bissey

Branch/Commit: 91fe5e1

Reviewer: Matthias Koeppe

Issue created by migration from https://trac.sagemath.org/ticket/30332

@mkoeppe mkoeppe added this to the sage-9.2 milestone Aug 11, 2020
@kiwifb
Copy link
Member

kiwifb commented Aug 11, 2020

comment:1

I propose to copy the current sage-brial code under sage/rings/polynomial. This is based on the fact all (but one) imports of brial happen there.

$ grep -r brial src/sage/*
src/sage/rings/polynomial/pbori.pyx:# distutils: libraries = brial brial_groebner M4RI_LIBRARIES LIBPNG_LIBRARIES
src/sage/rings/polynomial/pbori.pyx:    sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:        #from brial.interpolate import interpolate_smallest_lex
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import BooleanMonomialMonoid, BooleanMonomial
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid, BooleanMonomial
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleSet
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import BooleanPolynomial
src/sage/rings/polynomial/pbori.pyx:        from brial.parallel import _encode_polynomial
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleSet
src/sage/rings/polynomial/pbori.pyx:        from brial import red_tail
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:        from brial.gbcore import groebner_basis
src/sage/rings/polynomial/pbori.pyx:        from brial import red_tail
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import BooleSet
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleSet
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleSet
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import GroebnerStrategy
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import GroebnerStrategy
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import groebner_basis
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import GroebnerStrategy
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanPolynomialVector
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import GroebnerStrategy
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import groebner_basis
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import GroebnerStrategy
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import GroebnerStrategy
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import GroebnerStrategy
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleanMonomialMonoid
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import map_every_x_to_x_plus_one
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import zeros
src/sage/rings/polynomial/pbori.pyx:        sage: from brial.interpolate import *
src/sage/rings/polynomial/pbori.pyx:        sage: from brial.interpolate import *
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import ll_red_nf_redsb
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import ll_red_nf_noredsb
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import ll_red_nf_noredsb_single_recursive_call
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import if_then_else
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import top_index
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import substitute_variables
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import substitute_variables
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import random_set, set_random_seed
src/sage/rings/polynomial/pbori.pyx:        sage: from brial import random_set, set_random_seed
src/sage/rings/polynomial/pbori.pyx:# todo: merge with pickling from brial.parallel
src/sage/rings/polynomial/pbori.pyx:# todo: merge with pickling from brial.parallel
src/sage/rings/polynomial/pbori.pyx:    from brial.parallel import _decode_polynomial
src/sage/rings/polynomial/pbori.pyx:# todo: merge with pickling from brial.parallel
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import BooleConstant
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/pbori.pyx:            sage: from brial import *
src/sage/rings/polynomial/multi_polynomial_sequence.py:        from brial import gauss_on_polys
src/sage/rings/polynomial/multi_polynomial_sequence.py:        from brial.ll import eliminate,ll_encode,ll_red_nf_redsb
src/sage/rings/polynomial/multi_polynomial_sequence.py:            from brial.interred import interred as inter_red
src/sage/sat/converters/__init__.py:from brial.cnf import CNFEncoder as PolyBoRiCNFEncoder

but other suggestions based on best practices will be given the priority.

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 11, 2020

comment:2

So there's a Cython interface sage.libs.polybori, then a Python library brial, and also sage.rings.polynomial.pbori? What is depending on what?

@kiwifb
Copy link
Member

kiwifb commented Aug 11, 2020

comment:3

I thought that sage-brial depends on sage.libs.polybori but that may not be the case. It imports sage.all and specifically sage.rings.polynomial.pbori and that's the only sage specific bits it imports.

sage.rings.polynomial.pbori itself relies on sage.libs.polybori (through sage.libs.polybori.decl) and both need the C++ brial library.

Does that answer your question?

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 11, 2020

comment:4

Thanks. I agree that sage.rings.polynomial seems to be a good place for the Python code from sage-brial. Perhaps it would be best to create a package sage.rings.polynomial.brial and to move the current pbori.pyx inside it (leaving deprecated reimport behind). There are only a few places in Sage where things are imported from sage.rings.polynomial.pbori and they could be easily update. Or, if you don't mind keep the old name pbori, the same could be done with sage.rings.polynomial.pbori instead of ...brial.

One thing to keep in mind is the context of the planned modularization of sagelib.
In Sage 9.3 I would hope to be able to create a separate distribution (distutils package) sage-brial, which would then package sage.rings.polynomial.{brial,pbori}, sage.libs.polybori, sage.libs.fes, sage.crypto.boolean_function -- everything that has a compile-time dependency on libbrial. This will make it possible to separately compile sagelib on systems without brial.

@kiwifb
Copy link
Member

kiwifb commented Aug 11, 2020

comment:5

On the legal side, the code is GPL2.0 or later. Although I will need to fix the license on github. It seems I changed it from 2+ to 2 carelessly back in 2017 (probably by copying a template). I obviously had no rights to do that.

The only thing I may need guidance with is the deprecated re-import. Otherwise moving stuff, including pbori.{pyx,pxd}, in sage.rings.polynomial.pbori seems to be a good idea and hopefully will help with modularization.

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 11, 2020

comment:6

Replying to @kiwifb:

On the legal side, the code is GPL2.0 or later. Although I will need to fix the license on github. It seems I changed it from 2+ to 2 carelessly back in 2017 (probably by copying a template). I obviously had no rights to do that.

I think GitHub takes the position that there is no such thing as "GPL 2 only": That the license includes "... or any later version" no matter whether you write these words in the files or not.

@kiwifb
Copy link
Member

kiwifb commented Aug 11, 2020

comment:7

Replying to @mkoeppe:

Replying to @kiwifb:

On the legal side, the code is GPL2.0 or later. Although I will need to fix the license on github. It seems I changed it from 2+ to 2 carelessly back in 2017 (probably by copying a template). I obviously had no rights to do that.

I think GitHub takes the position that there is no such thing as "GPL 2 only": That the license includes "... or any later version" no matter whether you write these words in the files or not.

Very nice of them. But they are not lawyers and I think the "LICENSE" file should be explicit for people who look for these subtle clarification (distros). The GPL FAQ https://www.gnu.org/licenses/old-licenses/gpl-2.0-faq.html#VersionTwoOrLater seem to imply that you should explicitly state it.

@kiwifb
Copy link
Member

kiwifb commented Aug 12, 2020

comment:8

Tests included inside sage-brial will have to be moved to sage doctesting. More generally it will have to be documented properly as much as possible. This will be so much fun.

It looks like that will take much more than just drag and drop in place with a few cosmetic changes.

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 12, 2020

comment:9

I suppose you could prepare the change to using the sage doctester first, before merging into Sage.

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 12, 2020

comment:10

Given that sage_brial has no Cython bits, I think it could in fact be removed from the dependencies of sagelib, as it won't really be needed while installing sagelib, only later for docbuild and doctest.

@kiwifb
Copy link
Member

kiwifb commented Aug 12, 2020

comment:11

Replying to @mkoeppe:

Given that sage_brial has no Cython bits, I think it could in fact be removed from the dependencies of sagelib, as it won't really be needed while installing sagelib, only later for docbuild and doctest.

Technically correct.

@kiwifb
Copy link
Member

kiwifb commented Aug 12, 2020

comment:12

This is not ready for review. I am just pushing my work in progress so it is not just on my workstation, it is visible and open to others contribution.

There is a lot to do:

  1. update paths
  2. convert docstrings and tests to sage framework

This may take some time and I doubt it will be ready in time for 9.2 but we can only try.


New commits:

884ca66WIP: move sage-brial files and pbori.{pxd,pyx} in sage/rings/polynomial/pbori/

@kiwifb
Copy link
Member

kiwifb commented Aug 12, 2020

Commit: 884ca66

@kiwifb
Copy link
Member

kiwifb commented Aug 12, 2020

Branch: public/merge_sage_brial

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 13, 2020

Branch pushed to git repo; I updated commit sha1. New commits:

f947293replace "from sage.rings.polynomial.pbori" with "from sage.rings.polynomial.pbori.pbori"
e7653a3Replace "from brial" with "from sage.rings.polynomial.pbori.brial"

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 13, 2020

Changed commit from 884ca66 to e7653a3

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 13, 2020

Changed commit from e7653a3 to 2226097

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 13, 2020

Branch pushed to git repo; I updated commit sha1. New commits:

2226097src/sage/rings/polynomial/pbori/__init__.py: Draft of lazy_import call

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 18, 2020

Branch pushed to git repo; I updated commit sha1. New commits:

d0bc786transform python test into sage tests - step one.

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 18, 2020

Changed commit from 2226097 to d0bc786

@kiwifb
Copy link
Member

kiwifb commented Aug 18, 2020

comment:16

I am currently converting docstrings :( I am also doing some selective code deletion as I come along across it. There is a module for memory usage, it is imported once but never used and even less tested. So, I am removing it. It will be worth another look after that first pass.

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 19, 2020

Branch pushed to git repo; I updated commit sha1. New commits:

ae30cf3Basic conversion to sage doctrings/doctesting. Remove original copyright/license functions.
4c0d80fSome basic docstring in general_boolean_polynomial.py - remove memusage.py and its only import.
bdf1fecFirst pass in converting to docstring and doctests. It is quite likely a lot of doctests are broken at this stage.

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 19, 2020

Changed commit from d0bc786 to bdf1fec

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 19, 2020

Changed commit from bdf1fec to 2e94a77

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 19, 2020

Branch pushed to git repo; I updated commit sha1. New commits:

2e94a77Merge branch 'develop' into brial-merging

@kiwifb
Copy link
Member

kiwifb commented Aug 19, 2020

comment:19

I suspect the building of the html doc will break at this stage. If it doesn't the output may very well be useless. Once I figure that out, I'll do the doctesting to see what's broken. I am expecting a lot of breaking in the newly imported tests.

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 21, 2020

comment:37

Sure, just trying to figure out what the high level interface is intended to be.

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 21, 2020

comment:38

build/pkgs/sagelib/dependencies still has sage_brial

@kiwifb
Copy link
Member

kiwifb commented Aug 21, 2020

comment:39

Right. I remember thinking about that last night. Forgot to remove it. Will do in a few hours if no one beats me to it.

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 21, 2020

Branch pushed to git repo; I updated commit sha1. New commits:

02a5af1build/pkgs/sagelib/dependencies: Remove sage_brial

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 21, 2020

Changed commit from 878d941 to 02a5af1

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 21, 2020

Author: François Bissey

@tscrim
Copy link
Collaborator

tscrim commented Aug 27, 2020

comment:43

Replying to @kiwifb:

Replying to @mkoeppe:

BooleanPolynomialRing_constructor vs. BooleanPolynomialRing looks a bit confusing

Not my code, I am only the messenger. I certainly agree that this largely decade old code would need a good fleeing - apart from the trimming I already did on import. I assumed we could do it after merging it.

Indeed, this is a known problem that needs some attention: #21892, #24748, possibly #27019, #23310, #23312, possibly #23311, #15223.

My idea is to scrap BooleanPolynomialRing_constructor and just have BooleanPolynomialRing be a UniqueRepresentation object, possibly just being a subclass of the monoid algebra parent.

@kiwifb
Copy link
Member

kiwifb commented Aug 27, 2020

comment:44

My idea was to merge this in 9.2 and work on improving things in 9.3. However, if you know exactly what to do, we can work on this now.

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 27, 2020

Changed commit from 02a5af1 to 0c5fe64

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 27, 2020

Branch pushed to git repo; I updated commit sha1. New commits:

754dea9Properly format tests in gbcore
0c5fe64Merge branch 'public/merge_sage_brial' of trac.sagemath.org:sage into brial-merging

@tscrim
Copy link
Collaborator

tscrim commented Aug 27, 2020

comment:46

I think that is a better plan. I am too stretched for time right now to work on this.

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 27, 2020

Reviewer: Matthias Koeppe

@mkoeppe
Copy link
Contributor Author

mkoeppe commented Aug 27, 2020

comment:47

I agree with this plan - it will also be a good basis for modularization work in 9.3

@kiwifb
Copy link
Member

kiwifb commented Aug 27, 2020

comment:48

I am in the process of looking at adding some of the documentation from sage-brial to the sage documentation. At least to see how it looks like.

If you think that's not worth adding now, it is fine.

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 27, 2020

Branch pushed to git repo; I updated commit sha1 and set ticket back to needs_review. New commits:

91fe5e1Fix doctest and docstring formatting

@sagetrac-git
Copy link
Mannequin

sagetrac-git mannequin commented Aug 27, 2020

Changed commit from 0c5fe64 to 91fe5e1

@kiwifb
Copy link
Member

kiwifb commented Aug 27, 2020

comment:50

Just a touch up. One doctest was commented out so I decided to enable it. Building documentation revealed formatting issues in docstrings. All in the same file.

I built the doc with some added files from brial and we definitely should keep that for later work. Individual files need sensible title blocks for a start.

@vbraun
Copy link
Member

vbraun commented Sep 1, 2020

Changed branch from public/merge_sage_brial to 91fe5e1

@vbraun vbraun closed this as completed in d888029 Sep 1, 2020
mkoeppe added a commit to mkoeppe/sage that referenced this issue Sep 21, 2023
vbraun pushed a commit to vbraun/sage that referenced this issue Sep 23, 2023
, sagemath#24483, sagemath#24371, sagemath#24511, sagemath#25848, sagemath#26105, sagemath#28481, sagemath#29010, sagemath#29412, sagemath#30332, sagemath#30372, sagemath#31345, sagemath#32375, sagemath#32606, sagemath#32610, sagemath#32612, sagemath#32641, sagemath#32660, sagemath#32750, sagemath#32869, sagemath#33602

    
<!-- ^^^^^
Please provide a concise, informative and self-explanatory title.
Don't put issue numbers in there, do this in the PR body below.
For example, instead of "Fixes sagemath#1234" use "Introduce new method to
calculate 1+1"
-->
<!-- Describe your changes here in detail -->

<!-- Why is this change required? What problem does it solve? -->
<!-- If this PR resolves an open issue, please link to it here. For
example "Fixes sagemath#12345". -->
<!-- If your change requires a documentation PR, please link it
appropriately. -->

### 📝 Checklist

<!-- Put an `x` in all the boxes that apply. -->
<!-- If your change requires a documentation PR, please link it
appropriately -->
<!-- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
<!-- Feel free to remove irrelevant items. -->

- [x] The title is concise, informative, and self-explanatory.
- [ ] The description explains in detail what this PR is about.
- [x] I have linked a relevant issue or discussion.
- [ ] I have created tests covering the changes.
- [ ] I have updated the documentation accordingly.

### ⌛ Dependencies

<!-- List all open PRs that this PR logically depends on
- sagemath#12345: short description why this is a dependency
- sagemath#34567: ...
-->

<!-- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
    
URL: sagemath#36307
Reported by: Matthias Köppe
Reviewer(s):
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants