
Sage 9.6 Release Tour
 User interface, plotting and graphics
 Linear algebra
 Symbolics
 Polyhedral geometry and linear programming
 Manifolds
 Algebra
 Number theory
 Cryptography
 Package upgrades
 For developers: Refactoring and modularization
 New developer tools
 Availability of Sage 9.6 and installation help
 More details
Sage 9.6 Release Tour
Sage 9.6 was released on May 15, 2022.
A total of 83 people were involved as authors or reviewers of code contributions to Sage 9.6.
Here is an overview of some of the main changes in this version.
User interface, plotting and graphics
JupyterLab 3.3
JupyterLab, the latest webbased interactive development environment for notebooks, code, and data, is slated to replace the nowclassic Jupyter notebook interface. The version of JupyterLab in the Sage distribution has been upgraded to the major new version 3.3. #32069, #33607
After ./sage i jupyterlab_widgets
, you can run it using
./sage n jupyterlab
Also two new interface variants are provided:
./sage n nbclassic
and
./sage n retrolab
LaTeX displays in JupyterLab
Users of Sage in JupyterLab got used to expressions displayed at center in the LaTeX display mode. For compatibility with displays in classic Jupyter, we decided to change the behavior so that now expressions are displayed aligned left by default.
If you belong to the minority preferring centered displays, you can set your preference by
dm = get_display_manager() dm.preferences.align_latex = 'center' # or 'left'
in the ~/.sage/init.sage
script.
Interactive graph editing with phitigra
With the new optional package phitigra (use ./sage i phitigra
to install), graphs can be edited by interactively placing vertices, edges, etc. This works both in the classic Jupyter notebook and in JupyterLab. It can also be used to make animations (see the demo notebook at https://github.com/jfraymond/phitigra for examples). Done in #30540 and #33639.
Hyperbolic plots
 Added the ability to choose the hyperbolic model for hyperbolic plots. #22081
Graphics with TikZ
The TikzPicture
module which was developed in the slabbe package for more than 5 years is now in Sage. This was done in ticket #20343. The module is within the new file sage/misc/latex_standalone.py
and its documentation in the reference manual is available here: https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex_standalone.html. Below are some usage examples.
First example shows that it takes any tikz picture string as input:
sage: from sage.misc.latex_standalone import TikzPicture sage: s = '\\begin{tikzpicture}\n\\draw[>,green,very thick](0,0)  (1,1);\\end{tikzpicture}' sage: t = TikzPicture(s) sage: t # in Jupyter, rich representation will show the image instead \documentclass[tikz]{standalone} \begin{document} \begin{tikzpicture} \draw[>,green,very thick](0,0)  (1,1);\end{tikzpicture} \end{document} sage: path_to_file = t.pdf() # and opens the image in a viewer
Of course, conversion to pdf format necessitates pdflatex
or lualatex
. If lualatex
is available it uses it in preference to pdflatex
because it handles better the very big pictures in terms of memory limits.
One can provide a local filename to save to, or convert the image to other formats (using pdftocairo or imagemagick external packages):
sage: path_to_file = t.pdf('file.pdf') # when providing a filename, it just saves # the file locally, does not open in a viewer sage: path_to_file = t.png() # conversion to png sage: path_to_file = t.svg() # to svg sage: path_to_file = t.tex() # print the tex source to a file
Another example with graphs where additional usepackage are necessary to compile the image correctly:
sage: from sage.misc.latex_standalone import TikzPicture sage: g = graphs.PetersenGraph() sage: t = TikzPicture(latex(g), standalone_config=["border=4mm"], usepackage=['tkzgraph']) sage: t # in Jupyter, rich representation will show the image instead \documentclass[tikz]{standalone} \standaloneconfig{border=4mm} \usepackage{tkzgraph} \begin{document} \begin{tikzpicture} \definecolor{cv0}{rgb}{0.0,0.0,0.0} \definecolor{cfv0}{rgb}{1.0,1.0,1.0} \definecolor{clv0}{rgb}{0.0,0.0,0.0} \definecolor{cv1}{rgb}{0.0,0.0,0.0}  65 lines not printed (3695 characters in total). Use print to see the full content.  \Edge[lw=0.1cm,style={color=cv6v8,},](v6)(v8) \Edge[lw=0.1cm,style={color=cv6v9,},](v6)(v9) \Edge[lw=0.1cm,style={color=cv7v9,},](v7)(v9) % \end{tikzpicture} \end{document} sage: _ = t.pdf() # or t.png() or t.svg()
sage: from sage.misc.latex_standalone import TikzPicture sage: V = [[1,0,1],[1,0,0],[1,1,0],[0,0,1],[0,1,0],[1,0,0],[0,1,1],[0,0,1],[0,1,0]] sage: P = Polyhedron(vertices=V).polar() sage: s = P.projection().tikz([674,108,731],112) sage: t = TikzPicture(s) sage: _ = t.pdf() # or t.png() or t.svg()
The module also contains a class Standalone
, from which the class TikzPicture
inherits:
sage: from sage.misc.latex_standalone import Standalone sage: s = Standalone('Hello World', usepackage=['amsmath'], standalone_config=['beamer=true','border=1mm']) sage: s # in Jupyter, rich representation will show the image instead \documentclass{standalone} \standaloneconfig{beamer=true} \standaloneconfig{border=1mm} \usepackage{amsmath} \begin{document} Hello World \end{document} sage: _ = s.pdf() # or s.png() or s.svg()
Another example using Standalone
with a tableau:
sage: P = Permutations(10) sage: p = P.random_element() sage: p [3, 10, 1, 9, 5, 6, 7, 2, 8, 4] sage: t = p.to_tableau_by_shape([3,3,3,1]) sage: t [[2, 8, 4], [5, 6, 7], [10, 1, 9], [3]] sage: s = Standalone(latex(t), standalone_config=["border=1mm"]) sage: s \documentclass{standalone} \standaloneconfig{border=1mm} \begin{document} {\def\lr#1{\multicolumn{1}{@{\hspace{.6ex}}c@{\hspace{.6ex}}}{\raisebox{.3ex}{$#1$}} } \raisebox{.6ex}{$\begin{array}[b]{*{3}c}\cline{13} \lr{2}&\lr{8}&\lr{4}\\\cline{13} \lr{5}&\lr{6}&\lr{7}\\\cline{13} \lr{10}&\lr{1}&\lr{9}\\\cline{13} \lr{3}\\\cline{11} \end{array}$} } \end{document} sage: _ = s.pdf() # or s.png() or s.svg()
In a next step, a method tikz()
will be added to graphs, polytopes, posets, etc. to return an object of type TikzPicture
see #33002.
Complex plots
The complex plotting package phase_mag_plot has been incorporated into Sage. Now complex_plot
allows contouring, tiling, and matplotlib
compatible colormaps. This was added in ticket #33416.
To use a colormap, one can pass in a string as in
sage: complex_plot((x  5)*sqrt(x), (10, 10), (10, 10), cmap='twilight')
Contouring or tiling are enabled through keyword options. To look smooth, it's typically necessary to plot the function on additional points through the use of plot_points
. This looks like
sage: complex_plot((x  5)*sqrt(x), (10, 10), (10, 10), cmap='twilight', plot_points=500, contoured=True)
sage: complex_plot((x  5)*sqrt(x), (10, 10), (10, 10), cmap='twilight', plot_points=500, tiled=True)
Linear algebra
NumPy integration
The new classes Matrix_numpy_integer_dense
and Vector_numpy_integer_dense
implement matrices and vectors with 64bit integer entries backed by numpy
arrays. #32465.
As a first application, several methods of GenericGraph
that return matrices, such as adjacency_matrix
, now accept keyword arguments that can select the matrix implementation. #33377, #33387, #33388, #33389
sage: graphs.PathGraph(5).adjacency_matrix(sparse=False, implementation='numpy') [0 1 0 0 0] [1 0 1 0 0] [0 1 0 1 0] [0 0 1 0 1] [0 0 0 1 0] sage: type(_) <class 'sage.matrix.matrix_numpy_integer_dense.Matrix_numpy_integer_dense'>
CombinatorialFreeModule improvements
Performing sums and similar constructions for CombinatorialFreeModule
have been made faster. #33267
Symbolics
SymPy 1.10.1
SymPy has been upgraded to version 1.10.1 (release notes). #33398, #33547, #33584
ImageSet
Sage 9.6 defines a new class ImageSet
. #32121
sage: ImageSet(sin, RealSet.open(0, pi/4)) Image of (0, 1/4*pi) by The map sin from (0, 1/4*pi) sage: _.an_element() 1/2*sqrt(sqrt(2) + 2) sage: sos(x,y) = x^2 + y^2; sos (x, y) > x^2 + y^2 sage: ImageSet(sos, ZZ^2) Image of Ambient free module of rank 2 over the principal ideal domain Integer Ring by The map (x, y) > x^2 + y^2 from Vector space of dimension 2 over Symbolic Ring sage: _.an_element() 1 sage: ImageSet(sos, Set([(3, 4), (3, 4)])) Image of {...(3, 4)...} by The map (x, y) > x^2 + y^2 from Vector space of dimension 2 over Symbolic Ring sage: _.an_element() 25
The new class mirrors and translates to SymPy's ImageSet:
sage: from sage.sets.image_set import ImageSet sage: S = ImageSet(sin, RealSet.open(0, pi/4)); S Image of (0, 1/4*pi) by The map sin from (0, 1/4*pi) sage: S._sympy_() ImageSet(Lambda(x, sin(x)), Interval.open(0, pi/4))
Most methods of ImageSet
are actually provided by its base class, the new class ImageSubobject
.
For all morphisms in the Sets
category, there is now a default method image
, which constructs an instance of either ImageSubobject
or ImageSet
.
Orthogonal polynomials
Three classes of classical (discrete) orthogonal polynomials in the Askey scheme have been added: #33393
 Krawtchouk polynomials
 Hahn polynomials
 Meixner polynomials
Spherical harmonics
Various issues regarding spherical harmonics have been fixed (#33117, #33501). In particular, the CondonShortley phase has been added, so that Sage's spherical harmonics now agree with those of Wikipedia, SymPy, SciPy and Mathematica. For instance
sage: theta, phi = var('theta phi') sage: spherical_harmonic(1, 1, theta, phi) 1/4*sqrt(3)*sqrt(2)*e^(I*phi)*sin(theta)/sqrt(pi)
This clearly agrees with SymPy's spherical harmonics:
sage: from sympy import Ynm sage: Ynm(1, 1, theta, phi).expand(func=True) sqrt(6)*exp(I*phi)*sin(theta)/(4*sqrt(pi))
Polyhedral geometry and linear programming
polymake 4.6
polymake, a comprehensive system for computations in polyhedral geometry, tropical geometry, etc., has been upgraded to version 4.6 (release notes). #33251
CyLP
The new optional package CyLP (./sage i cylp
) provides a detailed interface to Clp, the COINOR linear programming solver, and Cbc, the COINOR branchandcut solver for mixedinteger linear programs. #33847
In a future version of Sage, CyLP is intended to provide a replacement for the Sagespecific backend interface to Clp and Cbc, sagenumericalbackendscoin; see Metaticket #26511.
Equivariant Ehrhart theory
Sage 9.6 allows for the calculation of the H*series (also known as the φseries) of a rational polytope which is invariant under the linear action of a finite group, as introduced by Alan Stapledon as part of equivariant Ehrhart theory #27637.
The computation is made with the method Hstar_function
of a rational polytope.
The fixed subset of a polytope under the action of a group element may also be computed via the methods fixed_subpolytope
or fixed_subpolytopes
.
As an example, consider the action of the symmetric group S3 on the 2dimensional permutahedron in 3dimensional space, given by permuting the three basis vectors. As shown by Ardila, Supina, and Vindas Meléndez, the corresponding H*series is polynomial and effective:
sage: p3 = polytopes.permutahedron(3, backend = 'normaliz') sage: G = p3.restricted_automorphism_group(output='permutation') sage: reflection12 = G([(0,2),(1,4),(3,5)]) sage: reflection23 = G([(0,1),(2,3),(4,5)]) sage: S3 = G.subgroup(gens=[reflection12, reflection23]) sage: S3.is_isomorphic(SymmetricGroup(3)) True sage: p3.Hstar_function(S3, output='complete') {'Hstar': chi_0*t^2 + (chi_0 + chi_1 + chi_2)*t + chi_0, 'Hstar_as_lin_comb': (t^2 + t + 1, t, t), 'conjugacy_class_reps': [(), (0,1)(2,3)(4,5), (0,3,4)(1,5,2)], 'character_table': [ 1 1 1] [ 1 1 1] [ 2 0 1], 'is_effective': True} sage: p3.fixed_subpolytope(reflection12) A 1dimensional polyhedron in QQ^3 defined as the convex hull of 2 vertices sage: p3.fixed_subpolytope(reflection12).vertices() (A vertex at (3/2, 3/2, 3), A vertex at (5/2, 5/2, 1))
Manifolds
Improved Manifold constructor
The structure
parameter of the Manifold
constructor has new, more convenient defaulting behavior. #33001
When parameters such as diff_degree
or metric_name
are given, the implied structure is selected:
sage: M = Manifold(3, 'M', diff_degree=0); M 3dimensional topological manifold M sage: M = Manifold(3, 'M', diff_degree=2); M 3dimensional differentiable manifold M sage: M = Manifold(3, 'M', metric_name='g'); M 3dimensional Riemannian manifold M
Symplectic manifolds
Symplectic structures have been added to Sage (#30362).
The standard symplectic vector space can be obtained as follows:
sage: M.<q, p> = manifolds.StandardSymplecticSpace(2, symplectic_name='omega') sage: omega = M.symplectic_form() saga: omega.display() omega = dq∧dp
To use an existing 2
form as a symplectic form use the new wrap
method.
sage: from sage.manifolds.differentiable.symplectic_form import SymplecticForm sage: M = manifolds.Sphere(2, coordinates='stereographic') sage: vol_form = M.induced_metric().volume_form() sage: omega = SymplecticForm.wrap(vol_form, 'omega', r'\omega') sage: omega.display() omega = 4/(y1^4 + y2^4 + 2*(y1^2 + 1)*y2^2 + 2*y1^2 + 1) dy1∧dy2
Currently, the following operations from symplectic geometry are supported:
 Musical isomorphism (flat/sharp) between vector fields and
1
forms.  Poisson tensor
 Liouville volume form
 Poisson bracket of functions
 Hamiltonion vector fields
 Symplectic Hodge dual of a differential form
Projective spaces
Real projective spaces have been added to the manifold catalog (#33221). For example, one can construct the real projective plane.
sage: RP2 = manifolds.RealProjectiveSpace(); RP2 2dimensional topological manifold RP2 sage: latex(RP2) \mathbb{RP}^{2}
There are three charts. Considering an immersion in threedimensional Euclidean space, the chart corresponds to a choice of one (out of three possible) coordinates to be always nonzero. The coordinates listed are the two other coordinates assuming that the nonzero coordinate is always one.
sage: C0, C1, C2 = RP2.top_charts() sage: p = RP2.point((2,0), chart = C0) sage: q = RP2.point((0,3), chart = C0) sage: p in C0.domain() True sage: p in C1.domain() True sage: C1(p) (1/2, 0) sage: p in C2.domain() False sage: q in C0.domain() True
The point q
looks like (1,0,3)
in ambient Euclidean space, so
it is not in the domain of the chart C1
. It also has the form
(1/3,0,1)
when considered in the chart C2
.
sage: q in C1.domain() False sage: q in C2.domain() True sage: C2(q) (1/3, 0)
If both coordinates in a local chart are nonzero then that point
is in the domain of all charts. The change of coordinates is found
by normalizing the appropriate chart. So for example, the point
(1, 2, 3)
is the same as the point (1/2, 1, 3/2)
is the same as the point
(1/3, 2/3, 1)
, which is reflected by defining r
to be a point in the
default chart C0
.
sage: r = RP2.point((2,3)) sage: r in C0.domain() and r in C1.domain() and r in C2.domain() True sage: C0(r) # corresponding to (1, 2, 3) (2, 3) sage: C1(r) # corresponding to (1/2, 1, 3/2) (1/2, 3/2) sage: C2(r) # corresponding to (1/3, 2/3, 1) (1/3, 2/3)
Internal code improvements and bug fixes
Some performance improvements have been implemented (#33110):
 use the first Bianchi identity in the computation of the Riemann tensor
 compute volume forms with contravariant indices only as needed
 no try to simplify trivial expressions consisting only of a single number or symbolic variable
Some bugs have been corrected: #32953, #33399, #33780.
Algebra
lrcalc 2.1
lrcalc, Anders Buch's LittlewoodRichardson Calculator, has been upgraded to the major new version 2.1 changelog. #31355
Finitely presented modules over graded algebras
Sage 9.6 allows the construction of finitely presented modules over graded algebras, even algebras which are infinite and/or noncommutative like the mod p Steenrod algebra. Some homological algebra is implemented in general, and more tools are implemented specifically for modules over the Steenrod algebra (#32505, #30680).
sage: from sage.modules.fp_graded.module import FPModule sage: E.<x,y> = ExteriorAlgebra(QQ) # M has one generator g in degree 0 and two relations, x*g and y*g. # That is, M is QQ as a trivial Emodule. sage: M = FPModule(E, [0], [[x], [y]]) # Free resolution: sage: M.resolution(3) [Module morphism: From: Free graded left module on 1 generator over The exterior algebra of rank 2 over Rational Field To: Finitely presented left module on 1 generator and 2 relations over The exterior algebra of rank 2 over Rational Field Defn: g[0] > g[0], Module morphism: From: Free graded left module on 2 generators over The exterior algebra of rank 2 over Rational Field To: Free graded left module on 1 generator over The exterior algebra of rank 2 over Rational Field Defn: g[1, 0] > x*g[0] g[1, 1] > y*g[0], Module morphism: From: Free graded left module on 3 generators over The exterior algebra of rank 2 over Rational Field To: Free graded left module on 2 generators over The exterior algebra of rank 2 over Rational Field Defn: g[2, 0] > x*g[1, 0] g[2, 1] > y*g[1, 0] + x*g[1, 1] g[2, 2] > y*g[1, 1], Module morphism: From: Free graded left module on 4 generators over The exterior algebra of rank 2 over Rational Field To: Free graded left module on 3 generators over The exterior algebra of rank 2 over Rational Field Defn: g[3, 0] > x*g[2, 0] g[3, 1] > y*g[2, 0] + x*g[2, 1] g[3, 2] > y*g[2, 1] + x*g[2, 2] g[3, 3] > y*g[2, 2]]
There is a new thematic tutorial providing many details and examples.
Miscellaneous improvements
 Ideal membership over quotient rings can now be decided (by reducing to ideal membership in the parent ring). #33237
 Iterating over (some) infinite modules (including ℤ^{n}) now enumerates the entire module, in a "natural" order. #33287
BinaryQF.solve_integer()
now also works for quadratic forms of square discriminant. #33026Quaternion fractional ideals
(including orders) now support the usual operations (e.g.,a*I
,I*a
,I+J
). #32264AdditiveAbelianGroupWrapper
now exposes.discrete_log()
for (multidimensional) logarithms in finite abelian groups. #32384 Graded submodules of graded modules now know they are graded (with respect to the ambient grading); similarly for filtered submodules. #33321
 Polynomials now evaluate faster on monomial inputs. #33165
 Implement specialized code for summing terms and monomials in
CombinatorialFreeModule
. #33267  Improvements and fixes to
skew_by()
in symmetric functions. #33313  Attempt to invert elements generically in a finite dimensional algebra. #33250
 Tensor products of finite dimensional modules know they are finite dimensional (Sage does not currently have any structure for infinite tensor products, which can have some subtleties). #30252
 Improved coercions and conversions with Laurent polynomials and their fraction field. #31320 #33477
 Faster evaluation of univariate polynomials with monomials. #33165
Number theory
Elliptic curves
 Ellipticcurve DLP and Weil pairings over finite fields are now much faster (thanks to PARI). #33121
 Scalar multiplication on elliptic curves over finite fields is now significantly faster (thanks to PARI). #33147
 Computing the Weierstraß ℘ function of an elliptic curve is now significantly faster (thanks to PARI). #33223
 Classes used by the MonskyWashnitzer curves now use the new coercion system. #33525 #33576
Cryptography
Optimizations to SBox
. #25633
Package upgrades
For a list of all packages and their versions, see
Python 3.10
Sage 9.6 continues to support system Python 3.7.x to 3.10.x. If no suitable version of Python is installed in the system, Sage will install its own copy of Python. Sage now ships Python 3.10.3 for this purpose. #30767, #33512
FLINT 2.8.x and arb 2.22.x
FLINT has been upgraded from 2.7.1 to 2.8.4.#32211
The FLINT 2.8 series brings major new algorithms and general speedups (release notes).
Note that Sage accepts system installations of FLINT >= 2.6.x. Users on older distributions who want to benefit from the speed ups in FLINT 2.8.x may want to use ./configure withoutsystemflint
.
Metaticket #31408 tracks the effort to make use of new features added in recent FLINT releases in the Sage library.
arb has been upgraded from 2.19.0 to 2.22.1. #32211, #33189
The 2.20, 2.21, and 2.22 series have brought major new algorithms and other improvements (changelog).
igraph 0.9.x
The igraph
library and its Python interface (now also just called igraph
) have been upgraded to versions 0.9.7/0.9.9. #32510, #33526
For developers: Refactoring and modularization
See also Metaticket #29705
sage.features.Executable.absolute_filename()
The Sage library interfaces to some external nonPython packages by running an executable program in a separate process. The package may either be available from a system installation, or the Sage distribution may have installed the package in the SAGE_LOCAL
prefix hierarchy. The main sage
script sets up various environment variables before starting the Python interpreter; in particular, it sets PATH
to include SAGE_LOCAL/bin
, which ensures that the installed executables are found.
In Sage 9.6, we have changed most calls to executables so that they no longer depend on the environment variable PATH
being set in this way. Every executable program is represented by an instance of sage.features.Executable
. Its method absolute_filename
explicitly searches inside SAGE_LOCAL/bin
(in installations with SAGE_LOCAL
) before it depends on PATH
.
#31292,
#31296,
#32645,
#32893,
#33440,
#33465,
#33467
Preparations for PEP 420 implicit namespace packages
The Sage doctester is now prepared for namespace packages. #33033
To reduce runtime dependencies, many imports from sage.graphs.all
, sage.interfaces.all
, sage.misc.all
, sage.libs.all
, sage.rings.all
have been replaced by more specific imports; and modulelevel imports from sage.plot
have been changed to either use lazy_import
or have been moved inside methods.
#30582,
#32847,
#32989,
#32999,
#33000,
#33007,
#33146,
#33199,
#33466,
#33468
Lazy imports of classes now support "isinstance"
No Python object is an instance of a class that cannot be imported from the module that defines it.
The new special method LazyImport.__instancecheck__
now just returns False
in this case. #33017
This provides a convenient pattern for writing modularized code when creating an abstract base class for "isinstance" testing is not justified.
sage: from sage.schemes.generic.scheme import Scheme sage: sZZ = Scheme(ZZ) sage: lazy_import('xxxx_does_not_exist', 'Pluffe') sage: isinstance(sZZ, (Scheme, Pluffe)) True sage: isinstance(ZZ, (Scheme, Pluffe)) False
Likewise, no class is a subclass of a class that cannot be imported from the module that defines it;
so the new special method LazyImport.__subclasscheck__
implements the same logic.
sage.geometry.polyhedron.base reorganized
The module sage.geometry.polyhedron.base
has been split into several modules, grouping the methods of class Polyhedron_base
according to their topic and runtime dependencies on other parts of Sage. #32651
New developer tools
Prebuilt Docker containers on ghcr.io
Our portability CI on GitHub Actions builds Docker images for all tested Linux platforms (and system package configurations) and makes them available on GitHub Packages (ghcr.io). #30933
Since 9.6.beta1, the image version corresponding to the latest development release receives the additional Docker tag dev
, see for example the Docker image for ubuntuimpishstandard. Thus, for example, the following command will work:
$ docker run it ghcr.io/sagemath/sage/sagedockerubuntuimpishstandardwithtargetsoptional:dev bash
Images whose names end with the suffix withtargetsoptional
are the results of full builds and a run of make ptest
. They also contain a copy of the source tree and the full logs of the build and test.
Smaller images corresponding to earlier build stages are also available:
withsystempackages
provides a system installation with system packages installed, no source tree,
configured
contains a partial source tree and has completed bootstrap and theconfigure
,
withtargetspre
contains the full source tree and a full installation of all nonPython packages,
withtargets
contains the full source tree and a full installation of Sage, including the HTML documentation, butmake ptest
has not been run yet.
Sage development in the cloud with Gitpod
Gitpod is a service that provides a development environment in the cloud based on VS Code. It is free to use for up to 50 hours per month. Sage now includes a configuration for Gitpod; see the new section Setting up your workspace in the Sage Developer's Guide. #33103, #33589
To launch Gitpod on a branch of a Trac ticket, you can use the new badge in the ticket box.
Alternatively, prepend any repository URL with https://gitpod.io/#
; for example, https://gitpod.io/#https://github.com/sagemath/sagetracmirror/tree/develop opens a development environment containing a prebuilt copy of Sage corresponding to the develop
branch.
Builds and checks of ticket branches on GitHub Actions
Next to the familiar patchbot badges, each ticket now has badges linking to tests that run on GitHub Actions.
Linting workflow (pycodestyle, relint)
A linting workflow on GitHub Actions runs on all pushes to a branch on Trac. It checks that the code of the current branch adheres to the style guidelines using pycodestyle (in the pycodestyleminimal
configuration) and relint.
In order to see details when it fails, you can click on the badge and then select the most recent workflow run.
Sage 9.6 includes again many improvements to the coding style checked by pycodestyle. #32978, #32979, #33095, #33102, ...
Consequently, the pycodestyleminimal
configuration has been extended to enforce E111
, E401
, E701
, E702
, E703
, W605
, E711
, E712
, E713
, E721
, E722
.
Incremental build and test
The build & test workflow on GitHub Actions builds Sage for the current branch (incrementally on top of the system packages of the develop branch) and runs the test.
Details are again available by clicking on the badge.
Note that in contrast to the patchbot, the ticket branch is not merged into the current beta version.
Documentation build
The build documentation workflow on GitHub Actions builds the HTML documentation for the current branch.
If you click on the badge, you get the HTML output of the successful run. The idea is to use this to easily inspect changes to the documentation without the need to locally rebuild the docs yourself. If the doc build fails, you can go to the Actions tab of sagemath/sagetracmirror repo and choose the particular branch to see what went wrong.
The idea is that these three status badges complement the existing patchbots (and maybe even replace them in the future). In particular, they are supposed to always be green.
Test coverage analysis with codecov
A detailed coverage analysis of the Sage library is now available at codecov.io. #33355
sage pytest
After the optional package pytest is installed (./sage i pytest
), a new command ./sage pytest
is available, which runs pytest on the Sage library sources. #33572
Also the Sage doctester (./sage t
or ./sage tox e doctest
) invokes pytest
. This functionality has been improved in Sage 9.6. #31924, #32975, #33560
sage t baselinestatspath
Sage patchbot on GitHub Actions
The Sage patchbot can now be run on GitHub Actions, on top of any of the Linux platforms for which we have prebuilt Docker images.#33253
New trac.sagemath.org front page
The front page of trac.sagemath.org has been reorganized. #33725
Availability of Sage 9.6 and installation help
Sage 9.6 was released on 20220515.
Please read the updated SageMath installation guide
 It now provides a decision tree that guides users and developers to a type of installation suitable for their system and their needs.
 The section on condaforge has been updated and now includes (still experimental) instructions for Sage development on top of condaforge.
Sources
The Sage source code is available in the sage git repository.
SageMath 9.6 supports all platforms that were supported by Sage 9.5 and adds support for building on distributions that use the GCC 12 series (fedora36
). #33187
 Linux 64bit (x86_64)  see CI runs
 ubuntu{trusty⁺,xenial,bionic,focal,hirsute,impish,jammy}
 debian{stretch, buster,bullseye,bookworm,sid}
 linuxmint{17⁺,18,19,19.3,20.1,20.2,20.3}
 fedora{26,27,28,29,30,31,32,33,34,35,36}
 centos{7⁺,stream8,stream9}
 gentoo
 archlinux
 opensuse{15,15.3,tumbleweed}
 slackware14.2
 Linux 32bit (i386/i686)
 ubuntubionic
 manylinux2_24
 debianbuster
 centos7⁺ (but docbuild is broken, #32768)
 macOS (Intel) (x86_64)  with Homebrew or without
 macOS 10.15 (Catalina)
 macOS 11.x (Big Sur)
 macOS 12.x (Monterey) #32855
 macOS (Apple Silicon, M1) #30592
 Building Sage 9.6 from source on Apple Silicon (M1) requires the use of Homebrew (recommended) or condaforge, which package versions of
gfortran
11 with necessary changes for this platform that are not in a released upstream version of GCC. (Thegfortran
package that comes with Sage is not suitable for the M1.)  Make sure that
/usr/local
does not contain an old copy of homebrew (or other software) for x86_64 that you may have copied from an old machine. Homebrew for the M1 is installed in/opt/homebrew
, not/usr/local
.  Be sure to follow the README and the instructions that the
./configure
command issues regarding the installation of system packages from Homebrew or conda.
 Building Sage 9.6 from source on Apple Silicon (M1) requires the use of Homebrew (recommended) or condaforge, which package versions of
 Cygwin (x86_64)  see notes from CI run
(On platforms marked with the superscript ⁺, installing optional packages is not supported in Sage 9.6; and support for these platforms will be removed in Sage 9.7; see #32074. Upgrade to a newer version of the distribution or at least upgrade the toolchain (gcc, binutils).)
Availability as binaries
 The easiest way to install Sage 9.6 on Linux is through a distribution that provides it, see repology.org: sagemath.
 Binary package for 9.6 on macOS from the 3manifolds project
 separate disk images for Intel (x86_64) and Apple Silicon (M1, arm64)
 also includes many optional Sage packages
 CoCalcDocker from the CoCalc project
 A large image that has Sage, Jupyter, Pluto.jl, VS Code, a webbased X11 server, LaTeX, SageTeX, a new collaborative Whiteboard with Sage code cells
 But it's big  6GB compressed (and 25GB uncompressed)  so may or may not be of use depending on what you're doing...
Help
See README.md in the source distribution for installation instructions.
 See sagedevel for development discussions and sagerelease for announcements of beta versions and release candidates.
More details
Attachments (3)

editor.png (70.3 KB)  added by 8 months ago.
phitigra graph editor widget
 ticket_badges.png (46.2 KB)  added by 7 months ago.
 gitpod_badge.png (8.4 KB)  added by 7 months ago.
Download all attachments as: .zip