Skip to content

Commit 0574dae

Browse files
author
Release Manager
committed
Trac #32635: sage.matrix.matrix_space: Import element classes on demand, fall back to generic on ImportError
This is to support modularization. Also, in extension of #32566, we switch another method to use `sage.rings.abc` for `isinstance` testing. (cherry-picked from #32432) URL: https://trac.sagemath.org/32635 Reported by: mkoeppe Ticket author(s): Matthias Koeppe Reviewer(s): Travis Scrimshaw
2 parents 61d9294 + 6d4ee6e commit 0574dae

File tree

2 files changed

+109
-52
lines changed

2 files changed

+109
-52
lines changed

src/sage/matrix/matrix2.pyx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10720,10 +10720,8 @@ cdef class Matrix(Matrix1):
1072010720
sage: mu*G == A
1072110721
True
1072210722
"""
10723-
import sage.rings.real_double
10724-
import sage.rings.complex_double
1072510723
R = self.base_ring()
10726-
if R in [sage.rings.real_double.RDF, sage.rings.complex_double.CDF]:
10724+
if isinstance(R, (sage.rings.abc.RealDoubleField, sage.rings.abc.ComplexDoubleField)):
1072710725
Q, R = self.transpose().QR()
1072810726
m = R.nrows(); n = R.ncols()
1072910727
if m > n:

src/sage/matrix/matrix_space.py

Lines changed: 108 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -40,33 +40,16 @@
4040
from . import matrix_generic_dense
4141
from . import matrix_generic_sparse
4242

43-
from . import matrix_modn_sparse
44-
45-
from . import matrix_mod2_dense
46-
from . import matrix_gf2e_dense
47-
48-
from . import matrix_integer_dense
49-
from . import matrix_integer_sparse
50-
51-
from . import matrix_rational_dense
52-
from . import matrix_rational_sparse
53-
54-
from . import matrix_polynomial_dense
55-
from . import matrix_mpolynomial_dense
56-
5743
# Sage imports
5844
import sage.structure.coerce
5945
from sage.structure.parent import Parent
6046
from sage.structure.unique_representation import UniqueRepresentation
6147
import sage.rings.integer as integer
62-
import sage.rings.number_field.all
63-
import sage.rings.finite_rings.integer_mod_ring
6448
import sage.rings.finite_rings.finite_field_constructor
65-
import sage.rings.polynomial.multi_polynomial_ring_base
6649
import sage.misc.latex as latex
6750
import sage.modules.free_module
6851

69-
from sage.misc.all import lazy_attribute
52+
from sage.misc.lazy_attribute import lazy_attribute
7053

7154
from sage.categories.rings import Rings
7255
from sage.categories.fields import Fields
@@ -209,25 +192,54 @@ def get_matrix_class(R, nrows, ncols, sparse, implementation):
209192
if implementation is None:
210193
# Choose default implementation:
211194
if R is sage.rings.integer_ring.ZZ:
212-
return matrix_integer_dense.Matrix_integer_dense
195+
try:
196+
from . import matrix_integer_dense
197+
except ImportError:
198+
pass
199+
else:
200+
return matrix_integer_dense.Matrix_integer_dense
213201

214-
if R is sage.rings.rational_field.QQ:
215-
return matrix_rational_dense.Matrix_rational_dense
202+
elif R is sage.rings.rational_field.QQ:
203+
try:
204+
from . import matrix_rational_dense
205+
except ImportError:
206+
pass
207+
else:
208+
return matrix_rational_dense.Matrix_rational_dense
216209

217-
if R is sage.rings.real_double.RDF:
218-
from . import matrix_real_double_dense
219-
return matrix_real_double_dense.Matrix_real_double_dense
210+
elif isinstance(R, sage.rings.abc.RealDoubleField):
211+
try:
212+
from . import matrix_real_double_dense
213+
except ImportError:
214+
pass
215+
else:
216+
return matrix_real_double_dense.Matrix_real_double_dense
220217

221-
if R is sage.rings.complex_double.CDF:
218+
elif isinstance(R, sage.rings.abc.ComplexDoubleField):
222219
if implementation is None or implementation == 'numpy':
223-
from . import matrix_complex_double_dense
224-
return matrix_complex_double_dense.Matrix_complex_double_dense
220+
try:
221+
from . import matrix_complex_double_dense
222+
except ImportError:
223+
pass
224+
else:
225+
return matrix_complex_double_dense.Matrix_complex_double_dense
225226

226-
if sage.rings.finite_rings.finite_field_constructor.is_FiniteField(R):
227+
elif sage.rings.finite_rings.finite_field_constructor.is_FiniteField(R):
227228
if R.order() == 2:
228-
return matrix_mod2_dense.Matrix_mod2_dense
229+
try:
230+
from . import matrix_mod2_dense
231+
except ImportError:
232+
pass
233+
else:
234+
return matrix_mod2_dense.Matrix_mod2_dense
235+
229236
if R.characteristic() == 2 and R.order() <= 65536: # 65536 == 2^16
230-
return matrix_gf2e_dense.Matrix_gf2e_dense
237+
try:
238+
from . import matrix_gf2e_dense
239+
except ImportError:
240+
pass
241+
else:
242+
return matrix_gf2e_dense.Matrix_gf2e_dense
231243

232244
if (not R.is_prime_field()) and R.order() < 256:
233245
try:
@@ -247,37 +259,67 @@ def get_matrix_class(R, nrows, ncols, sparse, implementation):
247259
from . import matrix_cyclo_dense
248260
return matrix_cyclo_dense.Matrix_cyclo_dense
249261

250-
from sage.symbolic.ring import SR
251-
if R is SR:
252-
from . import matrix_symbolic_dense
253-
return matrix_symbolic_dense.Matrix_symbolic_dense
262+
try:
263+
from sage.symbolic.ring import SR
264+
except ImportError:
265+
pass
266+
else:
267+
if R is SR:
268+
try:
269+
from . import matrix_symbolic_dense
270+
except ImportError:
271+
pass
272+
else:
273+
return matrix_symbolic_dense.Matrix_symbolic_dense
254274

255-
from sage.rings.complex_arb import ComplexBallField
256-
if isinstance(R, ComplexBallField):
257-
from . import matrix_complex_ball_dense
258-
return matrix_complex_ball_dense.Matrix_complex_ball_dense
275+
if isinstance(R, sage.rings.abc.ComplexBallField):
276+
try:
277+
from . import matrix_complex_ball_dense
278+
except ImportError:
279+
pass
280+
else:
281+
return matrix_complex_ball_dense.Matrix_complex_ball_dense
259282

260-
if sage.rings.polynomial.polynomial_ring.is_PolynomialRing(R) and R.base_ring() in _Fields:
261-
return matrix_polynomial_dense.Matrix_polynomial_dense
283+
try:
284+
from sage.rings.polynomial import polynomial_ring, multi_polynomial_ring_base
285+
except ImportError:
286+
pass
287+
else:
288+
if polynomial_ring.is_PolynomialRing(R) and R.base_ring() in _Fields:
289+
try:
290+
from . import matrix_polynomial_dense
291+
except ImportError:
292+
pass
293+
else:
294+
return matrix_polynomial_dense.Matrix_polynomial_dense
262295

263-
if sage.rings.polynomial.multi_polynomial_ring_base.is_MPolynomialRing(R) and R.base_ring() in _Fields:
264-
return matrix_mpolynomial_dense.Matrix_mpolynomial_dense
296+
elif multi_polynomial_ring_base.is_MPolynomialRing(R) and R.base_ring() in _Fields:
297+
try:
298+
from . import matrix_mpolynomial_dense
299+
except ImportError:
300+
pass
301+
else:
302+
return matrix_mpolynomial_dense.Matrix_mpolynomial_dense
265303

266304
# The fallback
267305
return matrix_generic_dense.Matrix_generic_dense
268306

269307
# Deal with request for a specific implementation
270308
if implementation == 'flint':
271309
if R is sage.rings.integer_ring.ZZ:
310+
from . import matrix_integer_dense
272311
return matrix_integer_dense.Matrix_integer_dense
273312
if R is sage.rings.rational_field.QQ:
313+
from . import matrix_rational_dense
274314
return matrix_rational_dense.Matrix_rational_dense
275315
raise ValueError("'flint' matrices are only available over the integers or the rationals")
276316

277317
if implementation == 'm4ri':
278318
if R.is_field() and R.characteristic() == 2 and R.order() <= 65536:
279319
if R.order() == 2:
320+
from . import matrix_mod2_dense
280321
return matrix_mod2_dense.Matrix_mod2_dense
322+
from . import matrix_gf2e_dense
281323
return matrix_gf2e_dense.Matrix_gf2e_dense
282324
raise ValueError("'m4ri' matrices are only available for fields of characteristic 2 and order <= 65536")
283325

@@ -326,14 +368,30 @@ def get_matrix_class(R, nrows, ncols, sparse, implementation):
326368
if implementation is not None:
327369
raise ValueError("cannot choose an implementation for sparse matrices")
328370

329-
if isinstance(R, sage.rings.abc.IntegerModRing) and R.order() < matrix_modn_sparse.MAX_MODULUS:
330-
return matrix_modn_sparse.Matrix_modn_sparse
371+
if isinstance(R, sage.rings.abc.IntegerModRing):
372+
try:
373+
from . import matrix_modn_sparse
374+
except ImportError:
375+
pass
376+
else:
377+
if R.order() < matrix_modn_sparse.MAX_MODULUS:
378+
return matrix_modn_sparse.Matrix_modn_sparse
331379

332380
if sage.rings.rational_field.is_RationalField(R):
333-
return matrix_rational_sparse.Matrix_rational_sparse
381+
try:
382+
from . import matrix_rational_sparse
383+
except ImportError:
384+
pass
385+
else:
386+
return matrix_rational_sparse.Matrix_rational_sparse
334387

335388
if sage.rings.integer_ring.is_IntegerRing(R):
336-
return matrix_integer_sparse.Matrix_integer_sparse
389+
try:
390+
from . import matrix_integer_sparse
391+
except ImportError:
392+
pass
393+
else:
394+
return matrix_integer_sparse.Matrix_integer_sparse
337395

338396
# the fallback
339397
return matrix_generic_sparse.Matrix_generic_sparse
@@ -2457,8 +2515,8 @@ def test_trivial_matrices_inverse(ring, sparse=True, implementation=None, checkr
24572515

24582516

24592517
# Fix unpickling Matrix_modn_dense and Matrix_integer_2x2
2460-
from sage.matrix.matrix_modn_dense_double import Matrix_modn_dense_double
2461-
from sage.matrix.matrix_integer_dense import Matrix_integer_dense
2518+
lazy_import('sage.matrix.matrix_modn_dense_double', 'Matrix_modn_dense_double')
2519+
lazy_import('sage.matrix.matrix_integer_dense', 'Matrix_integer_dense')
24622520
from sage.misc.persist import register_unpickle_override
24632521
def _MatrixSpace_ZZ_2x2():
24642522
from sage.rings.integer_ring import ZZ
@@ -2471,5 +2529,6 @@ def _MatrixSpace_ZZ_2x2():
24712529
'MatrixSpace_ZZ_2x2_class', MatrixSpace)
24722530
register_unpickle_override('sage.matrix.matrix_integer_2x2',
24732531
'MatrixSpace_ZZ_2x2', _MatrixSpace_ZZ_2x2)
2532+
lazy_import('sage.matrix.matrix_gf2e_dense', 'unpickle_matrix_gf2e_dense_v0')
24742533
register_unpickle_override('sage.matrix.matrix_mod2e_dense',
2475-
'unpickle_matrix_mod2e_dense_v0', matrix_gf2e_dense.unpickle_matrix_gf2e_dense_v0)
2534+
'unpickle_matrix_mod2e_dense_v0', unpickle_matrix_gf2e_dense_v0)

0 commit comments

Comments
 (0)