1236
Comment: Start 9.2
|
32606
linear algebra
|
Deletions are marked like this. | Additions are marked like this. |
Line 3: | Line 3: |
in planning (2020) | in progress (2020) |
Line 7: | Line 7: |
== Python 3 transition == SageMath 9.0 was the first version of Sage running on Python 3 by default. Sage 9.1 continues to support Python 2. Sage 9.2 will remove support for Python 2. |
== Python 3 transition completed == [[ReleaseTours/sage-9.0|SageMath 9.0]] was the first version of Sage running on Python 3 by default. [[ReleaseTours/sage-9.1|SageMath 9.1]] continued to support Python 2. '''Sage 9.2 has removed support for Python 2.''' * [[https://trac.sagemath.org/query?keywords=~python3&milestone=sage-9.2&or&component=python3&milestone=sage-9.2&or&keywords=~py3&milestone=sage-9.2&groupdesc=1&group=status&max=1500&col=id&col=summary&col=keywords&col=component&col=time&col=changetime&col=author&col=reviewer&order=component|Trac tickets with keyword/component python3 in milestone 9.2]] |
Line 15: | Line 17: |
=== Support for system Python 3.6 added === This allows Sage to use the system Python on some older Linux distributions that are still in widespread use in scientific computing, including `centos-8` and `fedora-{26,27,28}` (although Python 3.7.x packages are also available for these). See [[https://trac.sagemath.org/ticket/29033|#29033]] for more details. === Unicode identifiers === Python 3 made much improved support for Unicode available, and Sage 9.2 has merged several Unicode improvements. Note that Python does not allow ''arbitrary'' Unicode characters in identifiers but only [[https://docs.python.org/3/reference/lexical_analysis.html#identifiers|word constituents]]. So before you get excited about using emojis... note that they cannot be used: {{{ #!python sage: K.<🍎,🥝> = QQ[] SyntaxError: invalid character in identifier }}} However, we can use letters from various alphabets. The updated IPython allows us to type them using [[https://ipython.readthedocs.io/en/stable/api/generated/IPython.core.completer.html|latex and unicode tab completion]]: {{{ #!python sage: μ, ν, ξ = 1, 2, 3 # type \mu<TAB>, # \nu<TAB>, ... sage: SR('λ + 2λ') 3*λ sage: var('α', domain='real') α sage: Ш = EllipticCurve('389a').sha() # type \CYR<TAB> CAP<TAB> # LET<TAB> SHA<TAB><ENTER> sage: Ш Tate-Shafarevich group for the Elliptic Curve defined by y^2 + y = x^3 + x^2 - 2*x over Rational Field sage: GelʹfandT͡setlinPattern = GelfandTsetlinPattern # type \MODIFIER LETTER # PRIME<TAB><ENTER> # for the romanized soft mark sage: ГельфандЦетлинPattern = GelʹfandT͡setlinPattern sage: ГельфандЦетлинPattern([[3, 2, 1], [2, 1], [1]]).pp() 3 2 1 2 1 1 sage: 四次方(x) = x^4 sage: 四次方(3) 81 }}} We can use math accents... {{{ #!python sage: a = 1 sage: â = 2 # type a\hat<TAB><ENTER> sage: ā = 3 # type a\bar<TAB><ENTER> sage: a, â, ā (1, 2, 3) sage: s(t) = t^3; s t |--> t^3 sage: ṡ = diff(s, t); ṡ # type s\dot<TAB><ENTER> t |--> 3*t^2 sage: s̈ = diff(ṡ, t); s̈ # type s\ddot<TAB><ENTER> t |--> 6*t }}} ... and have fun with modifier letters: {{{ #!python sage: ℚ̄ = QQbar # type \bbQ<TAB>\bar<TAB> sage: %display unicode_art sage: A = matrix(ℚ̄, [[1, 2*I], [3*I, 4]]); A ⎛ 1 2*I⎞ ⎝3*I 4⎠ sage: Aᵀ = A.transpose() # type A\^T<TAB><ENTER> sage: Aᵀ ⎛ 1 3*I⎞ ⎝2*I 4⎠ sage: Aᴴ = A.conjugate_transpose() # type A\^H<TAB><ENTER> sage: Aᴴ ⎛ 1 -3*I⎞ ⎝-2*I 4⎠ sage: C = Cone([[1, 1], [0, 1]]) sage: Cᵒ = C.dual(); Cᵒ # type C\^o<TAB><ENTER> 2-d cone in 2-d lattice M }}} But note that Python normalizes identifiers, so the following variants are ''not'' distinguished: {{{ #!python sage: AT == Aᵀ, AH == Aᴴ, Co == Cᵒ (True, True, True) sage: ℚ = QQ # type \bbQ<TAB><ENTER> sage: ℚ Rational Field sage: Q = 42 sage: ℚ 42 sage: F = 1 sage: 𝐹, 𝐅, 𝓕, 𝕱, 𝗙, 𝘍, 𝙁, 𝙵 # type \itF<TAB>, \bfF<TAB>, # \scrF<TAB>, \frakF<TAB>, # \sansF<TAB>, ... (1, 1, 1, 1, 1, 1, 1, 1) }}} We have also added a few Unicode aliases for global constants and functions. {{{ #!python sage: π pi sage: _.n() 3.14159265358979 sage: Γ(5/2) 3/4*sqrt(pi) sage: ζ(-1) -1/12 }}} See [[https://trac.sagemath.org/ticket/30111|Meta-ticket #30111: Unicode support]] for more information. === For developers: Using Python 3.6+ features in sagelib === [[https://trac.sagemath.org/ticket/29756|Meta-ticket #29756]] provides a starting point for a discussion of new features of the Python language and standard library to bring them to systematic use in sagelib. == Package upgrades == The removal of support for Python 2 has enabled major package upgrades. Major user-visible package upgrades below... === matplotlib === Dropping Python 2 support allowed us to make a major jump from matplotlib 2.2.5 to 3.2.1. See matplotlib's [[https://matplotlib.org/3.3.0/users/prev_whats_new/whats_new_3.0.html|release notes for 3.0]], [[https://matplotlib.org/3.3.0/users/prev_whats_new/whats_new_3.1.0.html|3.1]], [[https://matplotlib.org/3.3.0/users/prev_whats_new/whats_new_3.2.0.html|3.2]]. In addition to improved output, this update will likely enable Sage developers to implement new features for plotting and graphics. === rpy2 and R === The [[https://pypi.org/project/rpy2/|rpy2 Python package]] is the foundation for [[https://doc.sagemath.org/html/en/reference/interfaces/sage/interfaces/r.html|SageMath's interface]] to [[https://www.r-project.org/|R]]. Dropping Python 2 support allowed us to make the major upgrade from 2.8.2 to 3.3.5 in [[https://trac.sagemath.org/ticket/29441|Trac #29441]]; see the [[https://rpy2.github.io/doc/latest/html/changes.html#release-3-3-1|release notes]] for details. We only did a minor upgrade of R itself in the Sage distribution, to 3.6.3, the latest in the 3.6.x series. Of course, if R 4.0.x is installed in the system, Sage will use it instead of building its own copy. The SageMath developers are eager to learn from users how they use the SageMath-R interface, and what needs to be added to it to become more powerful. Let us know at [[https://groups.google.com/d/msg/sage-devel|sage-devel]]. === sphinx === 1.8.5 -> 3.1.2 === IPython and Jupyter notebook === Dropping support for Python 2 allowed us to upgrade IPython from 5.8.0 to 7.13.0 in [[https://trac.sagemath.org/ticket/28197|Trac #28197]]. See the [[https://ipython.readthedocs.io/en/stable/whatsnew/version6.html|release notes for the 6.x]] and [[https://ipython.readthedocs.io/en/stable/whatsnew/version7.html|7.x series]]. We have also upgraded the Jupyter notebook from 5.7.6 to 6.1.1 in [[https://trac.sagemath.org/ticket/26919|Trac #26919]]; see the [[https://jupyter-notebook.readthedocs.io/en/stable/changelog.html|notebook changelog]] for more information. === Other package updates === * [[https://trac.sagemath.org/ticket/29141|Meta-ticket #29141: Upgrades and other changes that require dropping py2 support]] * [[https://trac.sagemath.org/query?summary=~update&milestone=sage-9.2&or&milestone=sage-9.2&summary=~upgrade&groupdesc=1&group=status&max=1500&col=id&col=summary&col=component&col=time&col=changetime&col=author&col=reviewer&col=keywords&order=component|Upgrade tickets, milestone 9.2]] === For developers: Upgrading packages === Upgrading Python packages in the Sage distribution from PyPI has again become easier, thanks to [[https://trac.sagemath.org/ticket/20104|Trac #20104]]. You can now do: {{{ $ sage --package update-latest matplotlib Updating matplotlib: 3.3.0 -> 3.3.1 Downloading tarball to ...matplotlib-3.3.1.tar.bz2 [......................................................................] }}} When you do this, please remember to check that the `checksums.ini` file has an `upstream_url` in the format `upstream_url=https://pypi.io/packages/source/m/matplotlib/matplotlib-VERSION.tar.gz`. (This is not needed for `updated-latest` to work, but helps with automated tests of the upgrade ticket -- see [[https://wiki.sagemath.org/ReleaseTours/sage-9.1#For_developers-1|Sage 9.1 release tour]] on this topic.) == Graphics == === New features === * Specify the rectangle in which to draw a matrix using the new `xrange` and `yrange` options of `matrix_plot`. For example, to draw a matrix in [0,1]×[0,1] instead of the default [-0.5,4.5]×[-0.5,4.5]: `matrix_plot(identity_matrix(5), xrange=(0, 1), yrange=(0, 1))`. [[https://trac.sagemath.org/ticket/27895|27895]] (Markus Wageringel) * Set the initial camera orientation in Three.js plots using the new `viewpoint` option. Pass it a list/tuple of the form `[[x,y,z],angle]`, such as that provided by the existing `Get Viewpoint` option accessible from the menu button in the lower-right corner of a Three.js plot. [[https://trac.sagemath.org/ticket/29192|29192]] (Paul Masson) * Save a 3D graphics object directly to an HTML file that uses the Three.js viewer, similar to how you would save a PNG image: `G.save('plot.html')`. [[https://trac.sagemath.org/ticket/29194|29194]] (Joshua Campbell) * Produce an interactive 3D animation that you can pan, rotate, and zoom while the animation is playing using the Three.js viewer. A slider and buttons for controlling playback are included on the page by default. To use this new feature construct an animation as you normally would, passing a list of still frames to the `animate` function, then call the `interactive` method. For example: {{{ #!python def build_frame(t): """Build a single frame of animation at time t.""" e = parametric_plot3d([sin(x-t), 0, x], (x, 0, 2*pi), color='red') b = parametric_plot3d([0, -sin(x-t), x], (x, 0, 2*pi), color='green') return e + b frames = [build_frame(t) for t in (0, pi/32, pi/16, .., 2*pi)] animate(frames, delay=5).interactive( projection='orthographic') }}} [[https://trac.sagemath.org/ticket/29194|29194]] (Joshua Campbell) === Implementation improvements === * Points are now sampled exponentially when `scale='semilogx'` or `scale='loglog'` is specified. This decreases the number of points necessary for an accurate plot (and also increases the chance that the default number of points will produce an acceptable plot). [[https://trac.sagemath.org/ticket/29523|29523]] (Blair Mason) * Points and lines are now ignored in STL 3D export. Moreover disjoint union of surfaces can be saved. [[https://trac.sagemath.org/ticket/29732|29732]] (Frédéric Chapoton) * Three.js has been upgraded to version r117. [[https://trac.sagemath.org/ticket/29809|29809]] (Paul Masson) * Long text is no longer clipped in Three.js plots. Multi-line text is not yet supported but is in the works. [[https://trac.sagemath.org/ticket/29758|29758]] (Joshua Campbell) * JSmol's telemetry functionality has been disabled. It will no longer phone home when, for example, using `viewer='jmol'` in a Jupyter notebook. [[https://trac.sagemath.org/ticket/30030|30030]] (Joshua Campbell) * SVG export has been added to the javascript graph display tool: {{{G.show(method='js')}}} [[https://trac.sagemath.org/ticket/29807|29807]] === For developers === * Clarified that example Three.js plots in the documentation should use the `online=True` viewing option. [[https://trac.sagemath.org/ticket/30136|30136]] (Paul Masson) == Linear and multilinear algebra == Sage has several specialized implementation classes for free modules and vector spaces. In Sage 9.2, the existing factory functions `FreeModule` and `VectorSpace` have been extended so that they cover two more cases. == Polyhedral geometry == === New features === It is now possible to choose which backend to use to compute regions of hyperplane arrangements [[https://trac.sagemath.org/ticket/29506|29506]]: {{{ #!python sage: R.<sqrt5> = QuadraticField(5) sage: H = HyperplaneArrangements(R, names='xyz') sage: x,y,z = H.gens() sage: A = H(sqrt5*x+2*y+3*z, backend='normaliz') sage: A.backend() 'normaliz' sage: A.regions()[0].backend() # optional - pynormaliz 'normaliz' }}} It is now possible to compute the slack matrix of a polyhedron [[https://trac.sagemath.org/ticket/29838|29838]]: {{{ #!python sage: P = polytopes.cube(intervals='zero_one') sage: P.slack_matrix() [0 1 1 1 0 0] [0 0 1 1 0 1] [0 0 0 1 1 1] [0 1 0 1 1 0] [1 1 0 0 1 0] [1 1 1 0 0 0] [1 0 1 0 0 1] [1 0 0 0 1 1] }}} It is now possible to apply an affine transformation on a polyhedron [[https://trac.sagemath.org/ticket/30327|30327]]: {{{ #!python sage: M = random_matrix(QQ,3,3) sage: v = vector(QQ,(1,2,3)) sage: F = AffineGroup(3, QQ) sage: f = F(M, v); f [ 0 0 -2] [1] x |-> [ 0 1 0] x + [2] [ -1 -1 1/2] [3] sage: cube = polytopes.cube() sage: f * cube A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 8 vertices sage: f(cube) # also works A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 8 vertices }}} === Implementation improvements === * It is now possible to set up polyhedra with both Vrep and Hrep in the following constructions: * Linear transformation [[https://trac.sagemath.org/ticket/29843|29843]] * Polar [[https://trac.sagemath.org/ticket/29569|29569]] * Product [[https://trac.sagemath.org/ticket/29583|29583]] * The generation of regions of hyperplane arrangement has been improved [[https://trac.sagemath.org/ticket/29661|29661]] * Ehrhart related functions are now cached [[https://trac.sagemath.org/ticket/29196|29196]] * Obtaining incidence matrix and combinatorial polyhedron is much faster for integer and rational polyhedra [[https://trac.sagemath.org/ticket/29837|29837]], [[https://trac.sagemath.org/ticket/29841|29841]] * The testing framework using TestSuites is getting improved. See the Task [[https://trac.sagemath.org/ticket/29842|29842: Meta-ticket: Run a more stable test suite on polyhedra]] There are also some bug fixes and other improvements. For more details see the [[https://trac.sagemath.org/wiki/SagePolyhedralGeometry#release_9.2|release notes for optimization and polyhedral geometry software interactions in Sage]]. == Combinatorics == === Reduction from Dancing links to SAT or MILP === It is now possible to solve an instance of an [[https://en.wikipedia.org/wiki/Exact_cover|exact cover problem]] using a reduction from a dancing links instance to SAT [[https://trac.sagemath.org/ticket/29338|29338]] or MILP [[https://trac.sagemath.org/ticket/29955|29955]]: {{{ #!python sage: from sage.combinat.matrices.dancing_links import dlx_solver sage: rows = [[0,1,2], [3,4,5], [0,1], [2,3,4,5], [0], [1,2,3,4,5]] sage: d = dlx_solver(rows) sage: d.one_solution() [1, 0] sage: d.one_solution_using_sat_solver('cryptominisat') [2, 3] sage: d.one_solution_using_sat_solver('glucose') [2, 3] sage: d.one_solution_using_sat_solver('glucose-syrup') [2, 3] sage: d.one_solution_using_sat_solver('picosat') [4, 5] sage: d.one_solution_using_milp_solver() [0, 1] sage: d.one_solution_using_milp_solver('Gurobi') [0, 1] }}} === Polyomino tilings === It is now possible to find a surrounding of a polyomino with copies of itself, see [[https://trac.sagemath.org/ticket/29160|29160]]. This is based on the dancing links solver in Sage. This is motivated by the [[https://en.wikipedia.org/wiki/Heesch%27s_problem|Heesch's problem]]. An example is below: {{{ sage: from sage.combinat.tiling import Polyomino sage: H = Polyomino([(-1, 1), (-1, 4), (-1, 7), (0, 0), (0, 1), (0, 2), ....: (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (1, 1), (1, 2), ....: (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (2, 0), (2, 2), ....: (2, 3), (2, 5), (2, 6), (2, 8)]) sage: H.show2d() }}} {{attachment:H.png}} {{{ sage: %time solution = H.self_surrounding(10, ncpus=8) CPU times: user 1.69 s, sys: 1.08 s, total: 2.77 s Wall time: 3.85 s sage: G = sum([p.show2d() for p in solution], Graphics()) sage: G }}} {{attachment:G.png}} == Commutative algebra == === Laurent polynomials === Rings of Laurent polynomials now support ideal creation and manipulation [[https://trac.sagemath.org/ticket/29512|29512]]: {{{ sage: L.<x,y,z> = LaurentPolynomialRing(QQ, 3) sage: I = L.ideal([(x+y+z)^3+x*y, x^2+y^2+z^2]) sage: I.groebner_basis() (y^4 + 4*x*y*z^2 + y^2*z^2 + 2*x*z^3 + 2*y*z^3 - z^4 + 3/2*x*y*z + 1/4*x*z^2 + 1/4*y*z^2 - 1/4*z^3 + 1/8*x*y, x*y^2 - y^3 + 3*x*y*z + x*z^2 - z^3 + 1/2*x*y, x^2 + y^2 + z^2) sage: (x^3+y^3+z^3) in I False sage: x + x^-1*y^2 + x^-1*z^2 in I True }}} === Motivic multiple zetas === The ring of motivic multiple zeta values has been implemented, using algorithms of Francis Brown. It allows to compute at least up to weight 12 [[https://trac.sagemath.org/ticket/22713|22713]]. {{{ sage: Multizeta(1,2)**2 12*ζ(1,1,1,3) + 6*ζ(1,1,2,2) + 2*ζ(1,2,1,2) sage: Multizeta(1,2)==Multizeta(3) True sage: Multizeta(2,3,4).n(100) 0.0029375850405618494701189454256 }}} The numerical evaluation is based on PARI implementation. === Power series === There is new method to compute the coefficients in the Jacobi continued fraction expansion of a power series [[https://trac.sagemath.org/ticket/29789|29789]]. {{{ sage: t = QQ[['t']].0 sage: f = sum(factorial(n)*t**n for n in range(20)).O(20) sage: f.jacobi_continued_fraction() ((-1, -1), (-3, -4), (-5, -9), (-7, -16), (-9, -25), (-11, -36), (-13, -49), (-15, -64), (-17, -81)) }}} == Manifolds == === diff function for exterior derivatives === It is now possible to invoke '''diff''' to compute the differential (exterior derivative) of a differentiable form ([[https://trac.sagemath.org/ticket/29953|#29953]]). For instance, for a scalar field: {{{ sage: M = Manifold(2, 'M') sage: X.<x,y> = M.chart() sage: f = M.scalar_field(x^2*y, name='f') sage: diff(f) 1-form df on the 2-dimensional differentiable manifold M sage: diff(f).display() df = 2*x*y dx + x^2 dy }}} and for a 1-form: {{{ sage: a = M.one_form(-y, x, name='a'); a.display() a = -y dx + x dy sage: diff(a) 2-form da on the 2-dimensional differentiable manifold M sage: diff(a).display() da = 2 dx/\dy }}} === Unicode characters allowed in index notations === Greek letters (and more generally any Unicode non-digit word-constituent character) are now allowed in index notation for tensors ([[https://trac.sagemath.org/ticket/29248|#29248]]). For instance, taking the trace of a type-(1,1) tensor field: {{{ sage: E.<x,y> = EuclideanSpace() sage: t = E.tensor_field(1, 1, [[x, 1], [0, y]]) sage: t['^μ_μ'] Scalar field on the Euclidean plane E^2 sage: t['^μ_μ'] == t.trace() True }}} === Dot and cross products of vector fields along a curve === The methods '''dot_product()''', '''cross_product()''' and '''norm()''' can be now be used for vector fields defined along a differentiable map, the codomain of which is a Riemannian manifold ([[https://trac.sagemath.org/ticket/30318|#30318]]). Previously, these methods worked only for vector fields ''on'' a Riemannian manifold, i.e. along the identity map. An important subcase is of course that of a curve in a Riemannian manifold. For instance, let us consider a helix ''C'' in the Euclidean space E^3^ parametrized by its arc length ''s'': {{{ sage: E.<x,y,z> = EuclideanSpace() sage: R.<s> = RealLine() sage: C = E.curve((2*cos(s/3), 2*sin(s/3), sqrt(5)*s/3), (s, -oo, +oo), ....: name='C') sage: C.display() C: R --> E^3 s |--> (x, y, z) = (2*cos(1/3*s), 2*sin(1/3*s), 1/3*sqrt(5)*s) }}} The tangent vector field ''T=C' '' has a unit norm since the parameter ''s'' is the arc length: {{{ sage: T = C.tangent_vector_field() sage: T.display() C' = -2/3*sin(1/3*s) e_x + 2/3*cos(1/3*s) e_y + 1/3*sqrt(5) e_z sage: norm(T) Scalar field |C'| on the Real interval (0, 6*pi) sage: norm(T).expr() 1 }}} We introduce the unit normal vector ''N'' via the derivative of ''T'': {{{ sage: T_prime = R.vector_field([diff(T[i], s) for i in E.irange()], dest_map=C, ....: name="T'") sage: N = T_prime / norm(T_prime) sage: N.display() -cos(1/3*s) e_x - sin(1/3*s) e_y }}} and we get the binormal vector ''B'' as the cross product of ''T'' and ''N'': {{{ sage: B = T.cross_product(N) sage: B Vector field along the Real number line R with values on the Euclidean space E^3 sage: B.display() 1/3*sqrt(5)*sin(1/3*s) e_x - 1/3*sqrt(5)*cos(1/3*s) e_y + 2/3 e_z }}} We can then form the '''Frenet-Serret''' frame: {{{ sage: FS = R.vector_frame(('T', 'N', 'B'), (T, N, B), ....: symbol_dual=('t', 'n', 'b')) sage: FS Vector frame (R, (T,N,B)) with values on the Euclidean space E^3 }}} and check that it is orthonormal: {{{ sage: matrix([[u.dot(v).expr() for v in FS] for u in FS]) [1 0 0] [0 1 0] [0 0 1] }}} The Frenet-Serret formulas, expressing the '''curvature''' and '''torsion''' of ''C'', are obtained as: {{{ sage: N_prime = R.vector_field([diff(N[i], s) for i in E.irange()], ....: dest_map=C, name="N'") sage: B_prime = R.vector_field([diff(B[i], s) for i in E.irange()], ....: dest_map=C, name="B'") sage: for v in (T_prime, N_prime, B_prime): ....: v.display(FS) ....: T' = 2/9 N N' = -2/9 T + 1/9*sqrt(5) B B' = -1/9*sqrt(5) N }}} === Orientability of manifolds and vector bundles === It is now possible to define an orientation [[https://doc.sagemath.org/html/en/reference/manifolds/sage/manifolds/differentiable/manifold.html#sage.manifolds.differentiable.manifold.DifferentiableManifold.orientation|on a differentiable manifold]] and [[https://doc.sagemath.org/html/en/reference/manifolds/sage/manifolds/vector_bundle.html#sage.manifolds.vector_bundle.TopologicalVectorBundle.orientation|on a vector bundle]] ([[https://trac.sagemath.org/ticket/30178|#30178]]). [[https://doc.sagemath.org/html/en/reference/manifolds/sage/manifolds/manifold.html#sage.manifolds.manifold.TopologicalManifold.orientation|Orientations of topological manifolds]] have also been introduced, according to [[http://www.map.mpim-bonn.mpg.de/Orientation_of_manifolds|this definition]]. === Euclidean spaces as metric spaces === Euclidean spaces have been endowed with a distance function and have been set in the category of complete metric spaces ([[https://trac.sagemath.org/ticket/30062|#30062]]): {{{ sage: E.<x,y> = EuclideanSpace() sage: p = E((1,0)) # the point of coordinates (1,0) sage: q = E((0,2)) # the point of coordinates (0,2) sage: d = E.dist # the distance function sage: d(p,q) sqrt(5) sage: p.dist(q) sqrt(5) sage: E.category() Join of Category of smooth manifolds over Real Field with 53 bits of precision and Category of complete metric spaces }}} === Bundle connections === Bundle connections have been improved ([[https://trac.sagemath.org/ticket/30208|#30208]]) and their action on vector fields and sections has been implemented ([[https://trac.sagemath.org/ticket/30209|#30209]]). === Internal code improvements and bug fixes === Many improvements/refactoring of the code have been performed in this release: * [[https://doc.sagemath.org/html/en/reference/tensor_free_modules/|algebraic part]]: [[https://trac.sagemath.org/ticket/30094|#30094]], [[https://trac.sagemath.org/ticket/30169|#30169]], [[https://trac.sagemath.org/ticket/30179|#30179]], [[https://trac.sagemath.org/ticket/30181|#30181]], [[https://trac.sagemath.org/ticket/30194|#30194]], [[https://trac.sagemath.org/ticket/30250|#30250]], [[https://trac.sagemath.org/ticket/30251|#30251]], [[https://trac.sagemath.org/ticket/30254|#30254]], [[https://trac.sagemath.org/ticket/30255|#30255]], [[https://trac.sagemath.org/ticket/30287|#30287]] * [[https://doc.sagemath.org/html/en/reference/manifolds/manifold.html|topological part]]: [[https://trac.sagemath.org/ticket/30266|#30266]], [[https://trac.sagemath.org/ticket/30267|#30267]], [[https://trac.sagemath.org/ticket/30291|#30291]] * [[https://doc.sagemath.org/html/en/reference/manifolds/diff_manifold.html|differentiable part]]: [[https://trac.sagemath.org/ticket/30228|#30228]], [[https://trac.sagemath.org/ticket/30274|#30274]], [[https://trac.sagemath.org/ticket/30280|#30280]], [[https://trac.sagemath.org/ticket/30285|#30285]], [[https://trac.sagemath.org/ticket/30288|#30288]] In addition, various bugs have been fixed: [[https://trac.sagemath.org/ticket/30094|#30094]], [[https://trac.sagemath.org/ticket/30108|#30108]], [[https://trac.sagemath.org/ticket/30112|#30112]], [[https://trac.sagemath.org/ticket/30191|#30191]], [[https://trac.sagemath.org/ticket/30289|#30289]]. |
|
Line 18: | Line 550: |
* [[https://groups.google.com/d/msg/sage-devel/9gOkmF6rSjY/wEV4WBQABwAJ|sage-devel: require "./configure" before "make"]], [[https://trac.sagemath.org/ticket/29316|Trac #29316]] == Tickets == |
Sage 9.1 introduced [[https://wiki.sagemath.org/ReleaseTours/sage-9.1#Portability_improvements.2C_increased_use_of_system_packages|informational messages at the end of a ./configure run]] regarding system packages. To make sure that these messages are not overlooked, Sage 9.2 no longer invokes `./configure` when you type `make` in an unconfigured source tree. See [[https://groups.google.com/d/msg/sage-devel/9gOkmF6rSjY/wEV4WBQABwAJ|sage-devel: require "./configure" before "make"]], [[https://trac.sagemath.org/ticket/29316|Trac #29316]]. All standard Sage packages have been upgraded in Sage 9.2 so that they build correctly using gcc/gfortran 10.x. The Sage `./configure` script therefore now accepts these compiler versions. === For developers: Changes to the build system of sagelib === Let's talk about `src/setup.py`. The build system of the Sage library is based on `distutils` (not `setuptools`); it is implemented in the package `sage_setup`. In particular, it implements its own version of source code discovery methods similar to [[https://setuptools.readthedocs.io/en/latest/setuptools.html#using-find-packages|setuptools.find_packages]]: `sage_setup.find.find_python_sources`. Because of source discovery, developers can add new Python modules and packages under `src/sage/` simply by creating files and directories; it is not necessary to edit `setup.py`. Prior to Sage 9.2, the situation was different for Cython extensions. They had to be listed in `src/module_list.py`, either one by one, or using glob patterns such as `*` and `**`. Sage 9.2 has eliminated the need for `src/module_list.py` by extending `sage_setup.find.find_python_sources`; it now also finds Cython modules in the source tree (Trac [[https://trac.sagemath.org/ticket/29701|#29701]]). Some Cython modules need specific compiler and linker flags. Sage 9.2 has moved all of these flags from `Extension` options in `src/module_list.py` to `distutils:` directives in the individual `.pyx` source files, see [[https://trac.sagemath.org/ticket/29706|Trac #29706]] and [[https://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html#compiler-directives|Cython documentation]]. Sage 9.2 has also changed the mechanism for conditionalizing a Cython extension module on the presence of a Sage package. Consider the module [[https://git.sagemath.org/sage.git/tree/src/sage/graphs/graph_decompositions/tdlib.pyx?id=55c3fbc565fd7884f3df9555de83dd326ace276e|sage.graphs.graph_decompositions.tdlib]] as an example. Prior to Sage 9.2, this module was declared as an `OptionalExtension`, conditional on the SPKG `tdlib`, in `src/module_list.py`. The new mechanism is as follows. [[https://git.sagemath.org/sage.git/tree/src/setup.py?id=55c3fbc565fd7884f3df9555de83dd326ace276e#n53|src/setup.py]] maps the SPKG name `tdlib` to the "distribution name" `sage-tdlib`. At the top of the Cython source file [[https://git.sagemath.org/sage.git/tree/src/sage/graphs/graph_decompositions/tdlib.pyx?id=55c3fbc565fd7884f3df9555de83dd326ace276e|src/sage/graphs/graph_decompositions/tdlib.pyx]], there is a new directive `sage_setup: distribution = sage-tdlib`. Now the source discovery in [[https://git.sagemath.org/sage.git/tree/src/sage_setup/find.py?id=55c3fbc565fd7884f3df9555de83dd326ace276e#n61|sage_setup.find.find_python_sources]] includes this Cython module only if the SPKG `tdlib` is installed and current. == Cleaning == * [[https://trac.sagemath.org/ticket/29636|Trac #29636: Delete changelog sections from all SPKG information files]]; they were deprecated in favor of using Trac years ago. The contributions of Sage developers maintaining SPKGs are documented by our [[http://www.sagemath.org/changelogs/index.html|historical changelogs]]. * Removing support for Python 2 allowed us to remove several backport packages in [[https://trac.sagemath.org/ticket/29754|Trac #29754]] * We also removed the deprecated SageNB (superseded a long time ago by the Jupyter notebook) in [[https://trac.sagemath.org/ticket/29754|Trac #29754]] and several of its dependencies. * Support for installing "old-style Sage packages" (`.spkg` files), [[https://trac.sagemath.org/ticket/19158|deprecated in Sage 6.9]], has been removed in [[https://trac.sagemath.org/ticket/29289|Trac #29289]], after making the last two missing packages, `cunningham_tables` and `polytopes_db_4d`, available as normal optional Sage packages. Users who wish to package their own Sage code for distribution may find a [[https://wiki.sagemath.org/SageMathExternalPackages|list of external packages]] helpful, many of which follow best practices in packaging. == Availability of Sage 9.2 and installation help == Sage 9.2 has not been released yet. See [[https://groups.google.com/forum/#!forum/sage-release|sage-release]] for announcements of beta versions and release candidates. * See [[https://groups.google.com/forum/#!forum/sage-devel|sage-devel]] for development discussions. == More details == |
Line 25: | Line 589: |
== Availability of Sage 9.2 and installation help == The Sage 9.2 series has not been started yet. * See [[https://groups.google.com/forum/#!forum/sage-devel|sage-devel]] for development discussions. |
Sage 9.2 Release Tour
in progress (2020)
Contents
Python 3 transition completed
SageMath 9.0 was the first version of Sage running on Python 3 by default. SageMath 9.1 continued to support Python 2.
Sage 9.2 has removed support for Python 2.
See Python3-Switch for more details
Support for system Python 3.6 added
This allows Sage to use the system Python on some older Linux distributions that are still in widespread use in scientific computing, including centos-8 and fedora-{26,27,28} (although Python 3.7.x packages are also available for these). See #29033 for more details.
Unicode identifiers
Python 3 made much improved support for Unicode available, and Sage 9.2 has merged several Unicode improvements. Note that Python does not allow arbitrary Unicode characters in identifiers but only word constituents. So before you get excited about using emojis... note that they cannot be used:
However, we can use letters from various alphabets. The updated IPython allows us to type them using latex and unicode tab completion:
1 sage: μ, ν, ξ = 1, 2, 3 # type \mu<TAB>,
2 # \nu<TAB>, ...
3 sage: SR('λ + 2λ')
4 3*λ
5 sage: var('α', domain='real')
6 α
7 sage: Ш = EllipticCurve('389a').sha()
8 # type \CYR<TAB> CAP<TAB>
9 # LET<TAB> SHA<TAB><ENTER>
10 sage: Ш
11 Tate-Shafarevich group for the Elliptic Curve
12 defined by y^2 + y = x^3 + x^2 - 2*x over Rational Field
13 sage: GelʹfandT͡setlinPattern = GelfandTsetlinPattern
14 # type \MODIFIER LETTER
15 # PRIME<TAB><ENTER>
16 # for the romanized soft mark
17 sage: ГельфандЦетлинPattern = GelʹfandT͡setlinPattern
18 sage: ГельфандЦетлинPattern([[3, 2, 1], [2, 1], [1]]).pp()
19 3 2 1
20 2 1
21 1
22 sage: 四次方(x) = x^4
23 sage: 四次方(3)
24 81
We can use math accents...
... and have fun with modifier letters:
1 sage: ℚ̄ = QQbar # type \bbQ<TAB>\bar<TAB>
2 sage: %display unicode_art
3 sage: A = matrix(ℚ̄, [[1, 2*I], [3*I, 4]]); A
4 ⎛ 1 2*I⎞
5 ⎝3*I 4⎠
6 sage: Aᵀ = A.transpose() # type A\^T<TAB><ENTER>
7 sage: Aᵀ
8 ⎛ 1 3*I⎞
9 ⎝2*I 4⎠
10 sage: Aᴴ = A.conjugate_transpose()
11 # type A\^H<TAB><ENTER>
12 sage: Aᴴ
13 ⎛ 1 -3*I⎞
14 ⎝-2*I 4⎠
15 sage: C = Cone([[1, 1], [0, 1]])
16 sage: Cᵒ = C.dual(); Cᵒ # type C\^o<TAB><ENTER>
17 2-d cone in 2-d lattice M
But note that Python normalizes identifiers, so the following variants are not distinguished:
1 sage: AT == Aᵀ, AH == Aᴴ, Co == Cᵒ
2 (True, True, True)
3 sage: ℚ = QQ # type \bbQ<TAB><ENTER>
4 sage: ℚ
5 Rational Field
6 sage: Q = 42
7 sage: ℚ
8 42
9 sage: F = 1
10 sage: 𝐹, 𝐅, 𝓕, 𝕱, 𝗙, 𝘍, 𝙁, 𝙵 # type \itF<TAB>, \bfF<TAB>,
11 # \scrF<TAB>, \frakF<TAB>,
12 # \sansF<TAB>, ...
13 (1, 1, 1, 1, 1, 1, 1, 1)
We have also added a few Unicode aliases for global constants and functions.
See Meta-ticket #30111: Unicode support for more information.
For developers: Using Python 3.6+ features in sagelib
Meta-ticket #29756 provides a starting point for a discussion of new features of the Python language and standard library to bring them to systematic use in sagelib.
Package upgrades
The removal of support for Python 2 has enabled major package upgrades.
Major user-visible package upgrades below...
matplotlib
Dropping Python 2 support allowed us to make a major jump from matplotlib 2.2.5 to 3.2.1. See matplotlib's release notes for 3.0, 3.1, 3.2. In addition to improved output, this update will likely enable Sage developers to implement new features for plotting and graphics.
rpy2 and R
The rpy2 Python package is the foundation for SageMath's interface to R. Dropping Python 2 support allowed us to make the major upgrade from 2.8.2 to 3.3.5 in Trac #29441; see the release notes for details.
We only did a minor upgrade of R itself in the Sage distribution, to 3.6.3, the latest in the 3.6.x series. Of course, if R 4.0.x is installed in the system, Sage will use it instead of building its own copy.
The SageMath developers are eager to learn from users how they use the SageMath-R interface, and what needs to be added to it to become more powerful. Let us know at sage-devel.
sphinx
1.8.5 -> 3.1.2
IPython and Jupyter notebook
Dropping support for Python 2 allowed us to upgrade IPython from 5.8.0 to 7.13.0 in Trac #28197. See the release notes for the 6.x and 7.x series.
We have also upgraded the Jupyter notebook from 5.7.6 to 6.1.1 in Trac #26919; see the notebook changelog for more information.
Other package updates
For developers: Upgrading packages
Upgrading Python packages in the Sage distribution from PyPI has again become easier, thanks to Trac #20104. You can now do:
$ sage --package update-latest matplotlib Updating matplotlib: 3.3.0 -> 3.3.1 Downloading tarball to ...matplotlib-3.3.1.tar.bz2 [......................................................................]
When you do this, please remember to check that the checksums.ini file has an upstream_url in the format upstream_url=https://pypi.io/packages/source/m/matplotlib/matplotlib-VERSION.tar.gz. (This is not needed for updated-latest to work, but helps with automated tests of the upgrade ticket -- see Sage 9.1 release tour on this topic.)
Graphics
New features
Specify the rectangle in which to draw a matrix using the new xrange and yrange options of matrix_plot. For example, to draw a matrix in [0,1]×[0,1] instead of the default [-0.5,4.5]×[-0.5,4.5]: matrix_plot(identity_matrix(5), xrange=(0, 1), yrange=(0, 1)). 27895 (Markus Wageringel)
Set the initial camera orientation in Three.js plots using the new viewpoint option. Pass it a list/tuple of the form [[x,y,z],angle], such as that provided by the existing Get Viewpoint option accessible from the menu button in the lower-right corner of a Three.js plot. 29192 (Paul Masson)
Save a 3D graphics object directly to an HTML file that uses the Three.js viewer, similar to how you would save a PNG image: G.save('plot.html'). 29194 (Joshua Campbell)
Produce an interactive 3D animation that you can pan, rotate, and zoom while the animation is playing using the Three.js viewer. A slider and buttons for controlling playback are included on the page by default. To use this new feature construct an animation as you normally would, passing a list of still frames to the animate function, then call the interactive method. For example:
1 def build_frame(t): 2 """Build a single frame of animation at time t.""" 3 e = parametric_plot3d([sin(x-t), 0, x], 4 (x, 0, 2*pi), color='red') 5 b = parametric_plot3d([0, -sin(x-t), x], 6 (x, 0, 2*pi), color='green') 7 return e + b 8 9 frames = [build_frame(t) 10 for t in (0, pi/32, pi/16, .., 2*pi)] 11 animate(frames, delay=5).interactive( 12 projection='orthographic')
29194 (Joshua Campbell)
Implementation improvements
Points are now sampled exponentially when scale='semilogx' or scale='loglog' is specified. This decreases the number of points necessary for an accurate plot (and also increases the chance that the default number of points will produce an acceptable plot). 29523 (Blair Mason)
Points and lines are now ignored in STL 3D export. Moreover disjoint union of surfaces can be saved. 29732 (Frédéric Chapoton)
Three.js has been upgraded to version r117. 29809 (Paul Masson)
Long text is no longer clipped in Three.js plots. Multi-line text is not yet supported but is in the works. 29758 (Joshua Campbell)
JSmol's telemetry functionality has been disabled. It will no longer phone home when, for example, using viewer='jmol' in a Jupyter notebook. 30030 (Joshua Campbell)
- SVG export has been added to the javascript graph display tool:
G.show(method='js') 29807
For developers
Clarified that example Three.js plots in the documentation should use the online=True viewing option. 30136 (Paul Masson)
Linear and multilinear algebra
Sage has several specialized implementation classes for free modules and vector spaces. In Sage 9.2, the existing factory functions FreeModule and VectorSpace have been extended so that they cover two more cases.
Polyhedral geometry
New features
It is now possible to choose which backend to use to compute regions of hyperplane arrangements 29506:
It is now possible to compute the slack matrix of a polyhedron 29838:
It is now possible to apply an affine transformation on a polyhedron 30327:
1 sage: M = random_matrix(QQ,3,3)
2 sage: v = vector(QQ,(1,2,3))
3 sage: F = AffineGroup(3, QQ)
4 sage: f = F(M, v); f
5 [ 0 0 -2] [1]
6 x |-> [ 0 1 0] x + [2]
7 [ -1 -1 1/2] [3]
8 sage: cube = polytopes.cube()
9 sage: f * cube
10 A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 8 vertices
11 sage: f(cube) # also works
12 A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 8 vertices
Implementation improvements
- It is now possible to set up polyhedra with both Vrep and Hrep in the following constructions:
The generation of regions of hyperplane arrangement has been improved 29661
Ehrhart related functions are now cached 29196
Obtaining incidence matrix and combinatorial polyhedron is much faster for integer and rational polyhedra 29837, 29841
The testing framework using TestSuites is getting improved.
There are also some bug fixes and other improvements. For more details see the release notes for optimization and polyhedral geometry software interactions in Sage.
Combinatorics
Reduction from Dancing links to SAT or MILP
It is now possible to solve an instance of an exact cover problem using a reduction from a dancing links instance to SAT 29338 or MILP 29955:
1 sage: from sage.combinat.matrices.dancing_links import dlx_solver
2 sage: rows = [[0,1,2], [3,4,5], [0,1], [2,3,4,5], [0], [1,2,3,4,5]]
3 sage: d = dlx_solver(rows)
4 sage: d.one_solution()
5 [1, 0]
6 sage: d.one_solution_using_sat_solver('cryptominisat')
7 [2, 3]
8 sage: d.one_solution_using_sat_solver('glucose')
9 [2, 3]
10 sage: d.one_solution_using_sat_solver('glucose-syrup')
11 [2, 3]
12 sage: d.one_solution_using_sat_solver('picosat')
13 [4, 5]
14 sage: d.one_solution_using_milp_solver()
15 [0, 1]
16 sage: d.one_solution_using_milp_solver('Gurobi')
17 [0, 1]
Polyomino tilings
It is now possible to find a surrounding of a polyomino with copies of itself, see 29160. This is based on the dancing links solver in Sage. This is motivated by the Heesch's problem. An example is below:
sage: from sage.combinat.tiling import Polyomino sage: H = Polyomino([(-1, 1), (-1, 4), (-1, 7), (0, 0), (0, 1), (0, 2), ....: (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (1, 1), (1, 2), ....: (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (2, 0), (2, 2), ....: (2, 3), (2, 5), (2, 6), (2, 8)]) sage: H.show2d()
sage: %time solution = H.self_surrounding(10, ncpus=8) CPU times: user 1.69 s, sys: 1.08 s, total: 2.77 s Wall time: 3.85 s sage: G = sum([p.show2d() for p in solution], Graphics()) sage: G
Commutative algebra
Laurent polynomials
Rings of Laurent polynomials now support ideal creation and manipulation 29512:
sage: L.<x,y,z> = LaurentPolynomialRing(QQ, 3) sage: I = L.ideal([(x+y+z)^3+x*y, x^2+y^2+z^2]) sage: I.groebner_basis() (y^4 + 4*x*y*z^2 + y^2*z^2 + 2*x*z^3 + 2*y*z^3 - z^4 + 3/2*x*y*z + 1/4*x*z^2 + 1/4*y*z^2 - 1/4*z^3 + 1/8*x*y, x*y^2 - y^3 + 3*x*y*z + x*z^2 - z^3 + 1/2*x*y, x^2 + y^2 + z^2) sage: (x^3+y^3+z^3) in I False sage: x + x^-1*y^2 + x^-1*z^2 in I True
Motivic multiple zetas
The ring of motivic multiple zeta values has been implemented, using algorithms of Francis Brown. It allows to compute at least up to weight 12 22713.
sage: Multizeta(1,2)**2 12*ζ(1,1,1,3) + 6*ζ(1,1,2,2) + 2*ζ(1,2,1,2) sage: Multizeta(1,2)==Multizeta(3) True sage: Multizeta(2,3,4).n(100) 0.0029375850405618494701189454256
The numerical evaluation is based on PARI implementation.
Power series
There is new method to compute the coefficients in the Jacobi continued fraction expansion of a power series 29789.
sage: t = QQ[['t']].0 sage: f = sum(factorial(n)*t**n for n in range(20)).O(20) sage: f.jacobi_continued_fraction() ((-1, -1), (-3, -4), (-5, -9), (-7, -16), (-9, -25), (-11, -36), (-13, -49), (-15, -64), (-17, -81))
Manifolds
diff function for exterior derivatives
It is now possible to invoke diff to compute the differential (exterior derivative) of a differentiable form (#29953). For instance, for a scalar field:
sage: M = Manifold(2, 'M') sage: X.<x,y> = M.chart() sage: f = M.scalar_field(x^2*y, name='f') sage: diff(f) 1-form df on the 2-dimensional differentiable manifold M sage: diff(f).display() df = 2*x*y dx + x^2 dy
and for a 1-form:
sage: a = M.one_form(-y, x, name='a'); a.display() a = -y dx + x dy sage: diff(a) 2-form da on the 2-dimensional differentiable manifold M sage: diff(a).display() da = 2 dx/\dy
Unicode characters allowed in index notations
Greek letters (and more generally any Unicode non-digit word-constituent character) are now allowed in index notation for tensors (#29248). For instance, taking the trace of a type-(1,1) tensor field:
sage: E.<x,y> = EuclideanSpace() sage: t = E.tensor_field(1, 1, [[x, 1], [0, y]]) sage: t['^μ_μ'] Scalar field on the Euclidean plane E^2 sage: t['^μ_μ'] == t.trace() True
Dot and cross products of vector fields along a curve
The methods dot_product(), cross_product() and norm() can be now be used for vector fields defined along a differentiable map, the codomain of which is a Riemannian manifold (#30318). Previously, these methods worked only for vector fields on a Riemannian manifold, i.e. along the identity map. An important subcase is of course that of a curve in a Riemannian manifold. For instance, let us consider a helix C in the Euclidean space E3 parametrized by its arc length s:
sage: E.<x,y,z> = EuclideanSpace() sage: R.<s> = RealLine() sage: C = E.curve((2*cos(s/3), 2*sin(s/3), sqrt(5)*s/3), (s, -oo, +oo), ....: name='C') sage: C.display() C: R --> E^3 s |--> (x, y, z) = (2*cos(1/3*s), 2*sin(1/3*s), 1/3*sqrt(5)*s)
The tangent vector field T=C' has a unit norm since the parameter s is the arc length:
sage: T = C.tangent_vector_field() sage: T.display() C' = -2/3*sin(1/3*s) e_x + 2/3*cos(1/3*s) e_y + 1/3*sqrt(5) e_z sage: norm(T) Scalar field |C'| on the Real interval (0, 6*pi) sage: norm(T).expr() 1
We introduce the unit normal vector N via the derivative of T:
sage: T_prime = R.vector_field([diff(T[i], s) for i in E.irange()], dest_map=C, ....: name="T'") sage: N = T_prime / norm(T_prime) sage: N.display() -cos(1/3*s) e_x - sin(1/3*s) e_y
and we get the binormal vector B as the cross product of T and N:
sage: B = T.cross_product(N) sage: B Vector field along the Real number line R with values on the Euclidean space E^3 sage: B.display() 1/3*sqrt(5)*sin(1/3*s) e_x - 1/3*sqrt(5)*cos(1/3*s) e_y + 2/3 e_z
We can then form the Frenet-Serret frame:
sage: FS = R.vector_frame(('T', 'N', 'B'), (T, N, B), ....: symbol_dual=('t', 'n', 'b')) sage: FS Vector frame (R, (T,N,B)) with values on the Euclidean space E^3
and check that it is orthonormal:
sage: matrix([[u.dot(v).expr() for v in FS] for u in FS]) [1 0 0] [0 1 0] [0 0 1]
The Frenet-Serret formulas, expressing the curvature and torsion of C, are obtained as:
sage: N_prime = R.vector_field([diff(N[i], s) for i in E.irange()], ....: dest_map=C, name="N'") sage: B_prime = R.vector_field([diff(B[i], s) for i in E.irange()], ....: dest_map=C, name="B'") sage: for v in (T_prime, N_prime, B_prime): ....: v.display(FS) ....: T' = 2/9 N N' = -2/9 T + 1/9*sqrt(5) B B' = -1/9*sqrt(5) N
Orientability of manifolds and vector bundles
It is now possible to define an orientation on a differentiable manifold and on a vector bundle (#30178). Orientations of topological manifolds have also been introduced, according to this definition.
Euclidean spaces as metric spaces
Euclidean spaces have been endowed with a distance function and have been set in the category of complete metric spaces (#30062):
sage: E.<x,y> = EuclideanSpace() sage: p = E((1,0)) # the point of coordinates (1,0) sage: q = E((0,2)) # the point of coordinates (0,2) sage: d = E.dist # the distance function sage: d(p,q) sqrt(5) sage: p.dist(q) sqrt(5) sage: E.category() Join of Category of smooth manifolds over Real Field with 53 bits of precision and Category of complete metric spaces
Bundle connections
Bundle connections have been improved (#30208) and their action on vector fields and sections has been implemented (#30209).
Internal code improvements and bug fixes
Many improvements/refactoring of the code have been performed in this release:
In addition, various bugs have been fixed: #30094, #30108, #30112, #30191, #30289.
Configuration and build changes
Sage 9.1 introduced informational messages at the end of a ./configure run regarding system packages. To make sure that these messages are not overlooked, Sage 9.2 no longer invokes ./configure when you type make in an unconfigured source tree. See sage-devel: require "./configure" before "make", Trac #29316.
All standard Sage packages have been upgraded in Sage 9.2 so that they build correctly using gcc/gfortran 10.x. The Sage ./configure script therefore now accepts these compiler versions.
For developers: Changes to the build system of sagelib
Let's talk about src/setup.py. The build system of the Sage library is based on distutils (not setuptools); it is implemented in the package sage_setup. In particular, it implements its own version of source code discovery methods similar to setuptools.find_packages: sage_setup.find.find_python_sources. Because of source discovery, developers can add new Python modules and packages under src/sage/ simply by creating files and directories; it is not necessary to edit setup.py.
Prior to Sage 9.2, the situation was different for Cython extensions. They had to be listed in src/module_list.py, either one by one, or using glob patterns such as * and **. Sage 9.2 has eliminated the need for src/module_list.py by extending sage_setup.find.find_python_sources; it now also finds Cython modules in the source tree (Trac #29701).
Some Cython modules need specific compiler and linker flags. Sage 9.2 has moved all of these flags from Extension options in src/module_list.py to distutils: directives in the individual .pyx source files, see Trac #29706 and Cython documentation.
Sage 9.2 has also changed the mechanism for conditionalizing a Cython extension module on the presence of a Sage package. Consider the module sage.graphs.graph_decompositions.tdlib as an example. Prior to Sage 9.2, this module was declared as an OptionalExtension, conditional on the SPKG tdlib, in src/module_list.py. The new mechanism is as follows. src/setup.py maps the SPKG name tdlib to the "distribution name" sage-tdlib. At the top of the Cython source file src/sage/graphs/graph_decompositions/tdlib.pyx, there is a new directive sage_setup: distribution = sage-tdlib. Now the source discovery in sage_setup.find.find_python_sources includes this Cython module only if the SPKG tdlib is installed and current.
Cleaning
Trac #29636: Delete changelog sections from all SPKG information files; they were deprecated in favor of using Trac years ago. The contributions of Sage developers maintaining SPKGs are documented by our historical changelogs.
Removing support for Python 2 allowed us to remove several backport packages in Trac #29754
We also removed the deprecated SageNB (superseded a long time ago by the Jupyter notebook) in Trac #29754 and several of its dependencies.
Support for installing "old-style Sage packages" (.spkg files), deprecated in Sage 6.9, has been removed in Trac #29289, after making the last two missing packages, cunningham_tables and polytopes_db_4d, available as normal optional Sage packages. Users who wish to package their own Sage code for distribution may find a list of external packages helpful, many of which follow best practices in packaging.
Availability of Sage 9.2 and installation help
Sage 9.2 has not been released yet. See sage-release for announcements of beta versions and release candidates.
See sage-devel for development discussions.