[arch-commits] Commit in sagemath/trunk (PKGBUILD sagemath-linbox-1.6.patch)

Antonio Rojas arojas at archlinux.org
Mon May 20 15:51:43 UTC 2019


    Date: Monday, May 20, 2019 @ 15:51:43
  Author: arojas
Revision: 468112

Use upstream linbox patch

Modified:
  sagemath/trunk/PKGBUILD
  sagemath/trunk/sagemath-linbox-1.6.patch

---------------------------+
 PKGBUILD                  |    8 
 sagemath-linbox-1.6.patch |  597 ++++++++++++++++++++++++++++++++++++++------
 2 files changed, 532 insertions(+), 73 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2019-05-20 15:29:06 UTC (rev 468111)
+++ PKGBUILD	2019-05-20 15:51:43 UTC (rev 468112)
@@ -8,7 +8,7 @@
 pkgbase=sagemath
 pkgname=(sagemath sagemath-jupyter)
 pkgver=8.7
-pkgrel=3
+pkgrel=4
 pkgdesc="Open Source Mathematics Software, free alternative to Magma, Maple, Mathematica, and Matlab"
 arch=(x86_64)
 url="http://www.sagemath.org"
@@ -63,7 +63,7 @@
             'a42f3b152b1aedb8abf16bc70971419919d1fe30328574e7fef8305f9d07d938'
             '9ec56a3788e32c54f35abeaeedf7cadf6670fa10d39007050b23b93d3c35278e'
             '3ee624bb47f757516a860799d817168fe9cf74e603416e18e70c93c692259242'
-            '7e126c73d12c39be9012a66f979897fa630d540d30906dadff6c1384af4ec166')
+            '81fc39e39e8508f742ccc784efd0492fd04474cee75edf7bd3cbea43edd49b2e')
 
 prepare(){
   cd sage-$pkgver
@@ -85,8 +85,6 @@
   patch -p1 -i ../sagemath-sphinx-1.8.patch
 # port to GAP 4.10.1 API changes
   patch -p1 -i ../sagemath-gap-4.10.1.patch
-# fix build with linbox 1.6
-  patch -p1 -i ../sagemath-linbox-1.6.patch
 
 # Upstream patches  
 # fix build against libfes 0.2 http://trac.sagemath.org/ticket/15209
@@ -99,6 +97,8 @@
   patch -p1 -i ../sagemath-ecl-sigfpe.patch
 # Fix rendering with three.js r100 https://trac.sagemath.org/ticket/26718
   patch -p1 -i ../sagemath-threejs-100.patch
+# fix build with linbox 1.6 https://trac.sagemath.org/ticket/26932
+  patch -p1 -i ../sagemath-linbox-1.6.patch
 
 # use python2
   sed -e 's|sage-python23|python2|' -e 's|#!/usr/bin/env python\b|#!/usr/bin/env python2|' -i src/bin/*

Modified: sagemath-linbox-1.6.patch
===================================================================
--- sagemath-linbox-1.6.patch	2019-05-20 15:29:06 UTC (rev 468111)
+++ sagemath-linbox-1.6.patch	2019-05-20 15:51:43 UTC (rev 468112)
@@ -1,34 +1,89 @@
+diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
+index 810a197..7794c9e 100644
+--- a/src/sage/libs/linbox/conversion.pxd
++++ b/src/sage/libs/linbox/conversion.pxd
+@@ -45,7 +45,7 @@ from sage.modules.vector_integer_sparse cimport mpz_vector,  mpz_vector_get_entr
+ 
+ ctypedef enum linbox_specifier:
+     METHOD_DEFAULT              # no specification
+-    METHOD_BLAS_ELIMINATION     # BlasElimination
++    METHOD_DENSE_ELIMINATION     # DenseElimination
+     METHOD_SPARSE_ELIMINATION   # SparseElimination
+     METHOD_BLACKBOX             # Blackbox
+     METHOD_WIEDEMANN            # Wiedeman
+@@ -54,10 +54,10 @@ ctypedef enum linbox_specifier:
+ cdef inline linbox_specifier get_method(str algo) except ERROR:
+     if algo is None or algo == "default":
+         return METHOD_DEFAULT
+-    elif algo == "blas_elimination" or \
+-         algo == "linbox_blas_elimination" or \
+-         algo == "LinBox::BlasElimination":
+-        return METHOD_BLAS_ELIMINATION
++    elif algo == "dense_elimination" or \
++         algo == "linbox_dense_elimination" or \
++         algo == "LinBox::DenseElimination":
++        return METHOD_DENSE_ELIMINATION
+     elif algo == "sparse_elimination" or \
+          algo == "linbox_sparse_elimination" or \
+          algo == "LinBox::SparseElimination":
 diff --git a/src/sage/libs/linbox/fflas.pxd b/src/sage/libs/linbox/fflas.pxd
-index f3a7ce37ea..7d8d64d3b5 100644
+index f3a7ce3..8bf62f1 100644
 --- a/src/sage/libs/linbox/fflas.pxd
 +++ b/src/sage/libs/linbox/fflas.pxd
-@@ -64,8 +64,8 @@ cdef extern from "fflas-ffpack/fflas-ffpack.h" namespace "FFPACK":
+@@ -63,8 +63,7 @@ cdef extern from "fflas-ffpack/fflas-ffpack.h" namespace "FFPACK":
+     Modular_double.Element* Invert (Modular_double F, size_t order,
                                      Modular_double.Element* A, size_t A_stride, int nullity)
  
-     Modular_double.Element Det (Modular_double F,
+-    Modular_double.Element Det (Modular_double F,
 -                                size_t nrows, size_t ncols,
--                                Modular_double.Element* A, size_t A_stride)
-+                                Modular_double.Element det, size_t ncols,
-+                                Modular_double.Element* A, size_t A_stride, size_t* P, size_t* Q)
++    Modular_double.Element Det (Modular_double F, Modular_double.Element& d, size_t n,
+                                 Modular_double.Element* A, size_t A_stride)
  
      int Rank (Modular_double,
-               size_t nrows, size_t ncols,
-@@ -98,8 +98,8 @@ cdef extern from "fflas-ffpack/fflas-ffpack.h" namespace "FFPACK":
+@@ -97,8 +96,7 @@ cdef extern from "fflas-ffpack/fflas-ffpack.h" namespace "FFPACK":
+     Modular_float.Element* Invert (Modular_float F, size_t order,
                                     Modular_float.Element* A, size_t A_stride, int nullity)
  
-     Modular_float.Element Det (Modular_float F,
+-    Modular_float.Element Det (Modular_float F,
 -                               size_t nrows, size_t ncols,
--                               Modular_float.Element* A, size_t A_stride)
-+                               Modular_float.Element det, size_t ncols,
-+                               Modular_float.Element* A, size_t A_stride, size_t* P, size_t* Q)
++    Modular_float.Element Det (Modular_float F, Modular_float.Element& d, size_t n,
+                                Modular_float.Element* A, size_t A_stride)
  
      int Rank (Modular_float,
-               size_t nrows, size_t ncols,
 diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 35a3fa0125..a4bda24c0e 100644
+index 35a3fa0..fb0e0dc 100644
 --- a/src/sage/libs/linbox/linbox.pxd
 +++ b/src/sage/libs/linbox/linbox.pxd
-@@ -125,7 +125,7 @@ cdef extern from "linbox/solutions/methods.h" namespace "LinBox":
+@@ -10,10 +10,10 @@ from .givaro cimport *
+ 
+ cdef extern from "linbox/matrix/dense-matrix.h":
+     ## template <class _Field, class _blasRep=typename Vector<_Field>::Dense >
+-    ## class BlasMatrix ;
++    ## class DenseMatrix ;
+     ##
+     ## template <class _Field>
+-    ## using DenseMatrix = BlasMatrix<_Field> ;
++    ## using DenseMatrix = DenseMatrix<_Field> ;
+     cdef cppclass DenseMatrix_integer "LinBox::DenseMatrix<Givaro::ZRing<Givaro::Integer>>":
+         ctypedef ZRing Field
+         ctypedef Integer Element
+@@ -30,6 +30,7 @@ cdef extern from "linbox/matrix/dense-matrix.h":
+         ctypedef Modular_double Field
+         ctypedef double Element
+         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
++        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
+         void setEntry(size_t i, size_t j, Element& a)
+         Element &getEntry(size_t i, size_t j)
+ 
+@@ -39,6 +40,7 @@ cdef extern from "linbox/matrix/dense-matrix.h":
+         ctypedef Modular_float Field
+         ctypedef float Element
+         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
++        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
+         void setEntry(size_t i, size_t j, Element& a)
+         Element &getEntry(size_t i, size_t j)
+ 
+@@ -125,7 +127,7 @@ cdef extern from "linbox/solutions/methods.h" namespace "LinBox":
          pass
      cdef struct WiedemannTraits:
          pass
@@ -37,7 +92,7 @@
          pass
      cdef struct SparseEliminationTraits:
          pass
-@@ -135,7 +135,7 @@ cdef extern from "linbox/solutions/methods.h" namespace "LinBox":
+@@ -135,7 +137,7 @@ cdef extern from "linbox/solutions/methods.h" namespace "LinBox":
          ctypedef BlackboxSpecifier Blackbox
          ctypedef EliminationSpecifier Elimination
          ctypedef WiedemannTraits Wiedemann
@@ -46,31 +101,44 @@
          ctypedef SparseEliminationTraits SparseElimination
  
  cdef extern from "linbox/solutions/charpoly.h" namespace "LinBox":
-@@ -157,19 +157,20 @@ cdef extern from "linbox/algorithms/gauss.h":
+@@ -157,18 +159,24 @@ cdef extern from "linbox/algorithms/gauss.h":
                                               unsigned long Ni,
                                               unsigned long Nj)
  
 -cdef extern from "linbox/algorithms/echelon-form.h":
-+cdef extern from "linbox/solutions/echelon.h":
-     ## template<class Field>
-     ## class EchelonFormDomain
-     cdef cppclass EchelonForm_Modular_double "LinBox::EchelonFormDomain<Givaro::Modular<double>>":
-         ctypedef double Element
-         EchelonForm_Modular_double(Modular_double)
+-    ## template<class Field>
+-    ## class EchelonFormDomain
+-    cdef cppclass EchelonForm_Modular_double "LinBox::EchelonFormDomain<Givaro::Modular<double>>":
+-        ctypedef double Element
+-        EchelonForm_Modular_double(Modular_double)
 -        int rowReducedEchelon(DenseMatrix_Modular_double&, const DenseMatrix_Modular_double&)
- 
-     cdef cppclass EchelonForm_Modular_float "LinBox::EchelonFormDomain<Givaro::Modular<float>>":
-         ctypedef float Element
-         EchelonForm_Modular_float(Modular_float)
+-
+-    cdef cppclass EchelonForm_Modular_float "LinBox::EchelonFormDomain<Givaro::Modular<float>>":
+-        ctypedef float Element
+-        EchelonForm_Modular_float(Modular_float)
 -        int rowReducedEchelon(DenseMatrix_Modular_float, const DenseMatrix_Modular_float)
++cdef extern from "linbox/solutions/echelon.h" namespace "LinBox":
++    size_t rowEchelon (DenseMatrix_Modular_float&, const DenseMatrix_Modular_float&)
++    size_t rowEchelonize (DenseMatrix_Modular_float&)
++    size_t reducedRowEchelon (DenseMatrix_Modular_float&, const DenseMatrix_Modular_float&)
++    size_t reducedRowEchelonize (DenseMatrix_Modular_float&)
++    size_t colEchelon (DenseMatrix_Modular_float&, const DenseMatrix_Modular_float&)
++    size_t colEchelonize (DenseMatrix_Modular_float&)
++    size_t reducedColEchelon (DenseMatrix_Modular_float&, const DenseMatrix_Modular_float&)
++    size_t reducedColEchelonize (DenseMatrix_Modular_float&)
++
++    size_t rowEchelon (DenseMatrix_Modular_double&, const DenseMatrix_Modular_double&)
++    size_t rowEchelonize (DenseMatrix_Modular_double&)
++    size_t reducedRowEchelon (DenseMatrix_Modular_double&, const DenseMatrix_Modular_double&)
++    size_t reducedRowEchelonize (DenseMatrix_Modular_double&)
++    size_t colEchelon (DenseMatrix_Modular_double&, const DenseMatrix_Modular_double&)
++    size_t colEchelonize (DenseMatrix_Modular_double&)
++    size_t reducedColEchelon (DenseMatrix_Modular_double&, const DenseMatrix_Modular_double&)
++    size_t reducedColEchelonize (DenseMatrix_Modular_double&)
  
-+    int reducedRowEchelon(DenseMatrix_Modular_double, const DenseMatrix_Modular_double)
-+    int reducedRowEchelon(DenseMatrix_Modular_float, const DenseMatrix_Modular_float)
-+    
  cdef extern from "linbox/solutions/rank.h" namespace "LinBox":
      unsigned long & rank (unsigned long&, DenseMatrix_integer)
-     unsigned long & rank (unsigned long&, SparseMatrix_integer)
-@@ -185,7 +186,7 @@ cdef extern from "linbox/solutions/solve.h" namespace "LinBox":
+@@ -185,7 +193,7 @@ cdef extern from "linbox/solutions/solve.h" namespace "LinBox":
                                  Integer &,
                                  SparseMatrix_integer &,
                                  DenseVector_integer &,
@@ -80,112 +148,503 @@
      DenseVector_integer& solve (DenseVector_integer &,
                                  Integer &,
 diff --git a/src/sage/matrix/matrix_integer_sparse.pyx b/src/sage/matrix/matrix_integer_sparse.pyx
-index 7fa386eab7..5937720a03 100644
+index 7fa386e..132140f 100644
 --- a/src/sage/matrix/matrix_integer_sparse.pyx
 +++ b/src/sage/matrix/matrix_integer_sparse.pyx
-@@ -1081,7 +1081,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+@@ -42,7 +42,7 @@ from sage.libs.linbox.conversion cimport (
+     new_linbox_vector_integer_dense,
+     new_sage_vector_integer_dense,
+     new_linbox_matrix_integer_sparse,
+-    METHOD_DEFAULT, METHOD_BLAS_ELIMINATION,
++    METHOD_DEFAULT, METHOD_DENSE_ELIMINATION,
+     METHOD_SPARSE_ELIMINATION, METHOD_BLACKBOX,
+     METHOD_WIEDEMANN, get_method)
+ 
+@@ -926,7 +926,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+             - ``'linbox'`` or ``'linbox_default'`` - (default) use LinBox
+               and let it chooses the appropriate algorithm
+ 
+-            -  ``linbox_blas_elimination'`` - use LinBox dense elimination
++            -  ``linbox_dense_elimination'`` - use LinBox dense elimination
+ 
+             - ``'linbox_sparse_elimination'`` - use LinBox sparse elimination
+ 
+@@ -993,7 +993,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+ 
+         - ``b`` -- a dense integer vector
+ 
+-        - ``algorithm`` -- (optional) either ``None``, ``'blas_elimination'``,
++        - ``algorithm`` -- (optional) either ``None``, ``'dense_elimination'``,
+           ``'sparse_elimination'``, ``'wiedemann'`` or ``'blackbox'``.
+ 
+         OUTPUT: a pair ``(a, d)`` consisting of
+@@ -1012,7 +1012,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+             sage: b0 = vector((1,1,1,1))
+             sage: m._solve_vector_linbox(b0)
+             ((-1, -7, -3, -1), 1)
+-            sage: m._solve_vector_linbox(b0, 'blas_elimination')
++            sage: m._solve_vector_linbox(b0, 'dense_elimination')
+             ((-1, -7, -3, -1), 1)
+             sage: m._solve_vector_linbox(b0, 'sparse_elimination')
+             ((-1, -7, -3, -1), 1)
+@@ -1024,7 +1024,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+             sage: b1 = vector((1,2,3,4))
+             sage: m._solve_vector_linbox(b1)
+             ((-18, -92, -41, -17), 5)
+-            sage: m._solve_vector_linbox(b1, 'blas_elimination')
++            sage: m._solve_vector_linbox(b1, 'dense_elimination')
+             ((-18, -92, -41, -17), 5)
+             sage: m._solve_vector_linbox(b1, 'sparse_elimination')
+             ((-18, -92, -41, -17), 5)
+@@ -1039,7 +1039,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+ 
+         TESTS::
+ 
+-            sage: algos = ["default", "blas_elimination", "sparse_elimination",
++            sage: algos = ["default", "dense_elimination", "sparse_elimination",
+             ....:          "blackbox", "wiedemann"]
+             sage: for i in range(20):
+             ....:     dim = randint(1, 30)
+@@ -1080,8 +1080,8 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+             linbox.solve(res[0], D, A[0], b[0])
          elif method == METHOD_WIEDEMANN:
              linbox.solve(res[0], D, A[0], b[0], linbox.Method.Wiedemann())
-         elif method == METHOD_BLAS_ELIMINATION:
+-        elif method == METHOD_BLAS_ELIMINATION:
 -            linbox.solve(res[0], D, A[0], b[0], linbox.Method.BlasElimination())
++        elif method == METHOD_DENSE_ELIMINATION:
 +            linbox.solve(res[0], D, A[0], b[0], linbox.Method.DenseElimination())
          elif method == METHOD_SPARSE_ELIMINATION:
              linbox.solve(res[0], D, A[0], b[0], linbox.Method.SparseElimination())
          elif method == METHOD_BLACKBOX:
-@@ -1192,7 +1192,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+@@ -1136,7 +1136,7 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+ 
+         TESTS::
+ 
+-            sage: algos = ["default", "blas_elimination", "sparse_elimination",
++            sage: algos = ["default", "dense_elimination", "sparse_elimination",
+             ....:          "blackbox", "wiedemann"]
+ 
+             sage: for _ in range(10):
+@@ -1191,8 +1191,8 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
+             # solve the current row
              if algo == METHOD_DEFAULT:
                  linbox.solve(res[0], D, A[0], b[0])
-             elif algo == METHOD_BLAS_ELIMINATION:
+-            elif algo == METHOD_BLAS_ELIMINATION:
 -                linbox.solve(res[0], D, A[0], b[0], linbox.Method.BlasElimination())
++            elif algo == METHOD_DENSE_ELIMINATION:
 +                linbox.solve(res[0], D, A[0], b[0], linbox.Method.DenseElimination())
              elif algo == METHOD_SPARSE_ELIMINATION:
                  linbox.solve(res[0], D, A[0], b[0], linbox.Method.SparseElimination())
              elif algo == METHOD_BLACKBOX:
 diff --git a/src/sage/matrix/matrix_modn_dense_double.pyx b/src/sage/matrix/matrix_modn_dense_double.pyx
-index c4b1a46444..4f140ad239 100644
+index c4b1a46..880caec 100644
 --- a/src/sage/matrix/matrix_modn_dense_double.pyx
 +++ b/src/sage/matrix/matrix_modn_dense_double.pyx
-@@ -25,7 +25,7 @@ from sage.libs.linbox.givaro cimport \
+@@ -24,8 +24,8 @@ from sage.libs.linbox.givaro cimport \
+     Poly1Dom, Dense
  
  from sage.libs.linbox.linbox cimport \
-     DenseMatrix_Modular_double as BlasMatrix, \
+-    DenseMatrix_Modular_double as BlasMatrix, \
 -    EchelonForm_Modular_double as EchelonFormDomain
-+    reducedRowEchelon
++    reducedRowEchelonize, \
++    DenseMatrix_Modular_double as DenseMatrix
  
  from sage.libs.linbox.fflas cimport \
      fgemm, fgemv, Det, Rank, ReducedRowEchelonForm, applyP, \
 diff --git a/src/sage/matrix/matrix_modn_dense_float.pyx b/src/sage/matrix/matrix_modn_dense_float.pyx
-index 89d1a94ab2..198896259b 100644
+index 89d1a94..8a468c1 100644
 --- a/src/sage/matrix/matrix_modn_dense_float.pyx
 +++ b/src/sage/matrix/matrix_modn_dense_float.pyx
-@@ -24,7 +24,7 @@ from sage.libs.linbox.givaro cimport \
+@@ -23,8 +23,8 @@ from sage.libs.linbox.givaro cimport \
+     Poly1Dom, Dense
  
  from sage.libs.linbox.linbox cimport \
-     DenseMatrix_Modular_float as BlasMatrix, \
+-    DenseMatrix_Modular_float as BlasMatrix, \
 -    EchelonForm_Modular_float as EchelonFormDomain
-+    reducedRowEchelon
++    DenseMatrix_Modular_float as DenseMatrix, \
++    reducedRowEchelonize
  
  from sage.libs.linbox.fflas cimport \
      fgemm, fgemv, Det, Rank, ReducedRowEchelonForm, applyP, \
 diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index 6a5e164ede..7eb70dae86 100644
+index 6a5e164..230a16e 100644
 --- a/src/sage/matrix/matrix_modn_dense_template.pxi
 +++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -207,7 +207,6 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
+@@ -207,21 +207,12 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
          return 0,[]
  
      cdef ModField *F = new ModField(<long>modulus)
 -    cdef EchelonFormDomain *EF = new EchelonFormDomain(F[0])
-     cdef BlasMatrix *A = new BlasMatrix(F[0], <uint64_t>nrows, <uint64_t>ncols)
-     cdef BlasMatrix *E = new BlasMatrix(F[0], <uint64_t>nrows, <uint64_t>ncols)
- 
-@@ -218,7 +217,7 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         for j in range(ncols):
-             A.setEntry(i, j, <ModField.Element>entries[i*ncols+j])
- 
+-    cdef BlasMatrix *A = new BlasMatrix(F[0], <uint64_t>nrows, <uint64_t>ncols)
+-    cdef BlasMatrix *E = new BlasMatrix(F[0], <uint64_t>nrows, <uint64_t>ncols)
+-
++    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
++    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
+     cdef Py_ssize_t i,j
+-
+-    # TODO: can we avoid this copy?
+-    for i in range(nrows):
+-        for j in range(ncols):
+-            A.setEntry(i, j, <ModField.Element>entries[i*ncols+j])
+-
 -    cdef int r = EF.rowReducedEchelon(E[0], A[0])
-+    cdef int r = reducedRowEchelon(E[0], A[0])
      for i in range(nrows):
          for j in range(ncols):
-             entries[i*ncols+j] = <celement>E.getEntry(i,j)
-@@ -232,7 +231,7 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
+-            entries[i*ncols+j] = <celement>E.getEntry(i,j)
++            entries[i*ncols+j] = <celement>A.getEntry(i,j)
+ 
+     cdef Py_ssize_t ii = 0
+     cdef list pivots = []
+@@ -232,7 +223,7 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
                  ii = j+1
                  break
  
 -    del F, A, E, EF
-+    del F, A, E
++    del F
      return r, pivots
  
  cdef inline celement *linbox_copy(celement modulus, celement *entries,  Py_ssize_t nrows, Py_ssize_t ncols) except? NULL:
-@@ -265,7 +264,8 @@ cdef inline celement linbox_det(celement modulus, celement* entries, Py_ssize_t
+@@ -258,15 +249,16 @@ cdef inline int linbox_rank(celement modulus, celement* entries, Py_ssize_t nrow
+     del F
+     return r
+ 
+-cdef inline celement linbox_det(celement modulus, celement* entries, Py_ssize_t nrows, Py_ssize_t ncols):
++cdef inline celement linbox_det(celement modulus, celement* entries, Py_ssize_t n):
+     """
+     Return the determinant of this matrix.
+     """
      cdef ModField *F = new ModField(<long>modulus)
-     cdef celement *cpy = linbox_copy(modulus, entries, nrows, ncols)
-     if nrows*ncols > 1000: sig_on()
+-    cdef celement *cpy = linbox_copy(modulus, entries, nrows, ncols)
+-    if nrows*ncols > 1000: sig_on()
 -    d =  <celement>Det(F[0], nrows, ncols, <ModField.Element*>cpy, ncols)
-+    cdef ModField.Element det
-+    d =  <celement>Det(F[0], det, ncols, <ModField.Element*>cpy, ncols, <size_t*>NULL, <size_t*>NULL)
-     if nrows*ncols > 1000: sig_off()
+-    if nrows*ncols > 1000: sig_off()
++    cdef celement *cpy = linbox_copy(modulus, entries, n, n)
++    if n*n > 1000: sig_on()
++    cdef celement d
++    Det(F[0], d, n, <ModField.Element*>cpy, n)
++    if n*n > 1000: sig_off()
      sig_free(cpy)
      del F
+     return d
+@@ -1672,9 +1664,9 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
+ 
+         - ``algorithm``
+ 
+-          - ``linbox`` - uses the LinBox library (``EchelonFormDomain`` implementation, default)
++          - ``linbox`` - uses the LinBox library (wrapping fflas-ffpack)
+ 
+-          - ``linbox_noefd`` - uses the LinBox library (FFPACK directly, less memory but slower)
++          - ``linbox_noefd`` - uses the FFPACK directly, less memory and faster
+ 
+           - ``gauss`` - uses a custom slower `O(n^3)` Gauss
+             elimination implemented in Sage.
+@@ -1929,7 +1921,6 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
+         else:
+             r, pivots = linbox_echelonize(self.p, self._entries, self._nrows, self._ncols)
+         verbose('done with echelonize',t)
+-
+         self.cache('in_echelon_form',True)
+         self.cache('rank', r)
+         self.cache('pivots', tuple(pivots))
+@@ -2468,7 +2459,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
+             x = self.fetch('det')
+             if not x is None:
+                 return x
+-            d = linbox_det(self.p, self._entries, self._nrows, self._ncols)
++            d = linbox_det(self.p, self._entries, self._nrows)
+             d2 = self._coerce_element(d)
+             self.cache('det', d2)
+             return d2
 diff --git a/src/sage/matrix/matrix_modn_sparse.pyx b/src/sage/matrix/matrix_modn_sparse.pyx
-index 241167ace4..8e65cbb532 100644
+index 241167a..dd3a2f0 100644
 --- a/src/sage/matrix/matrix_modn_sparse.pyx
 +++ b/src/sage/matrix/matrix_modn_sparse.pyx
-@@ -1026,7 +1026,7 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+@@ -882,7 +882,7 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+             - ``'linbox'`` or ``'linbox_default'`` - (default) use LinBox
+               and let it chooses the appropriate algorithm
+ 
+-            -  ``linbox_blas_elimination'`` - use LinBox dense elimination
++            -  ``linbox_dense_elimination'`` - use LinBox dense elimination
+ 
+             - ``'linbox_sparse_elimination'`` - use LinBox sparse elimination
+ 
+@@ -949,7 +949,7 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+ 
+         - ``b`` -- a dense integer vector
+ 
+-        - ``algorithm`` -- (optional) either ``None``, ``'blas_elimination'``,
++        - ``algorithm`` -- (optional) either ``None``, ``'dense_elimination'``,
+           ``'sparse_elimination'``, ``'wiedemann'`` or ``'blackbox'``.
+ 
+         OUTPUT: a pair ``(a, d)`` consisting of
+@@ -968,7 +968,7 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+             sage: b0 = vector((1,1,1,1))
+             sage: m._solve_vector_linbox(b0)
+             ((-1, -7, -3, -1), 1)
+-            sage: m._solve_vector_linbox(b0, 'blas_elimination')
++            sage: m._solve_vector_linbox(b0, 'dense_elimination')
+             ((-1, -7, -3, -1), 1)
+             sage: m._solve_vector_linbox(b0, 'sparse_elimination')
+             ((-1, -7, -3, -1), 1)
+@@ -984,7 +984,7 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+ 
+         TESTS::
+ 
+-            sage: algos = ["default", "blas_elimination", "sparse_elimination",
++            sage: algos = ["default", "dense_elimination", "sparse_elimination",
+             ....:          "blackbox", "wiedemann"]
+             sage: for i in range(20):
+             ....:     dim = randint(1, 30)
+@@ -1025,8 +1025,8 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+             linbox.solve(res[0], D, A[0], b[0])
          elif method == METHOD_WIEDEMANN:
              linbox.solve(res[0], D, A[0], b[0], linbox.Method.Wiedemann())
-         elif method == METHOD_BLAS_ELIMINATION:
+-        elif method == METHOD_BLAS_ELIMINATION:
 -            linbox.solve(res[0], D, A[0], b[0], linbox.Method.BlasElimination())
++        elif method == METHOD_DENSE_ELIMINATION:
 +            linbox.solve(res[0], D, A[0], b[0], linbox.Method.DenseElimination())
          elif method == METHOD_SPARSE_ELIMINATION:
              linbox.solve(res[0], D, A[0], b[0], linbox.Method.SparseElimination())
          elif method == METHOD_BLACKBOX:
-@@ -1137,7 +1137,7 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+@@ -1081,7 +1081,7 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+ 
+         TESTS::
+ 
+-            sage: algos = ["default", "blas_elimination", "sparse_elimination",
++            sage: algos = ["default", "dense_elimination", "sparse_elimination",
+             ....:          "blackbox", "wiedemann"]
+ 
+             sage: for _ in range(10):
+@@ -1136,8 +1136,8 @@ cdef class Matrix_modn_sparse(matrix_sparse.Matrix_sparse):
+             # solve the current row
              if algo == METHOD_DEFAULT:
                  linbox.solve(res[0], D, A[0], b[0])
-             elif algo == METHOD_BLAS_ELIMINATION:
+-            elif algo == METHOD_BLAS_ELIMINATION:
 -                linbox.solve(res[0], D, A[0], b[0], linbox.Method.BlasElimination())
++            elif algo == METHOD_DENSE_ELIMINATION:
 +                linbox.solve(res[0], D, A[0], b[0], linbox.Method.DenseElimination())
              elif algo == METHOD_SPARSE_ELIMINATION:
                  linbox.solve(res[0], D, A[0], b[0], linbox.Method.SparseElimination())
              elif algo == METHOD_BLACKBOX:
+diff --git a/src/sage/rings/finite_rings/element_givaro.pxd b/src/sage/rings/finite_rings/element_givaro.pxd
+index f0fd7e35..8ae25c5 100644
+--- a/src/sage/rings/finite_rings/element_givaro.pxd
++++ b/src/sage/rings/finite_rings/element_givaro.pxd
+@@ -20,35 +20,35 @@ cdef extern from "givaro/givrandom.h":
+     GivRandom GivRandomSeeded  "Givaro::GivRandom"(unsigned long seed)
+ 
+ cdef extern from "givaro/gfq.h":
+-    ctypedef struct GivaroGfq "Givaro::GFqDom<int>":
++    cdef cppclass GivaroGfq "Givaro::GFqDom<int>":
+         #attributes
+         unsigned int one
+         unsigned int zero
+ 
+         # methods
+-        int (* mul)(int r, int a, int b)
+-        int (* add)(int r, int a, int b)
+-        int (* sub)(int r, int a, int b)
+-        int (* div)(int r, int a, int b)
+-        int (* inv)(int r, int x)
+-        int (* neg)(int r, int x)
+-        int (* mulin)(int a, int b)
+-        unsigned int (* characteristic)()
+-        unsigned int (* cardinality)()
+-        int (* exponent)()
+-        int (* random)(GivRandom gen, int res)
+-        int (* initi "init")(int res, int64_t e)
+-        int (* initd "init")(int res, double e)
+-        int (* indeterminate)()
+-        int (* convert)(int64_t r, int p)
+-        int (* read)(int r, int p)
+-        int (* axpyin)(int r, int a, int x)
+-        int (* axpy)(int r, int a, int b, int c)
+-        int (* axmy)(int r, int a, int b, int c)
+-        int (* maxpy)(int r, int a, int b, int c)
+-        bint (* isZero)(int e)
+-        bint (* isOne)(int e)
+-        bint (* isunit)(int e)
++        int mul(int r, int a, int b)
++        int add(int r, int a, int b)
++        int sub(int r, int a, int b)
++        int div(int r, int a, int b)
++        int inv(int r, int x)
++        int neg(int r, int x)
++        int mulin(int a, int b)
++        unsigned int characteristic()
++        unsigned int cardinality()
++        int exponent()
++        int random(GivRandom gen, int res)
++        int initi "init"(int& res, int64_t e)
++        int initd "init"(int& res, double e)
++        int indeterminate()
++        int64_t convert(int64_t& r, int p)
++        int read(int& r, int p)
++        int axpyin(int r, int a, int x)
++        int axpy(int r, int a, int b, int c)
++        int axmy(int r, int a, int b, int c)
++        int maxpy(int r, int a, int b, int c)
++        bint isZero(int e)
++        bint isOne(int e)
++        bint isunit(int e)
+ 
+     GivaroGfq *gfq_factorypk "new Givaro::GFqDom<int>" (unsigned int p, unsigned int k)
+     GivaroGfq *gfq_factorypkp "new Givaro::GFqDom<int>" (unsigned int p, unsigned int k, intvec poly)
+diff --git a/src/sage/rings/finite_rings/element_givaro.pyx b/src/sage/rings/finite_rings/element_givaro.pyx
+index 3739020..a7f9c2f 100644
+--- a/src/sage/rings/finite_rings/element_givaro.pyx
++++ b/src/sage/rings/finite_rings/element_givaro.pyx
+@@ -310,7 +310,7 @@ cdef class Cache_givaro(SageObject):
+         cdef int seed = current_randstate().c_random()
+         cdef int res
+         cdef GivRandom generator = GivRandomSeeded(seed)
+-        res = self.objectptr.random(generator,res)
++        self.objectptr.random(generator,res)
+         return make_FiniteField_givaroElement(self,res)
+ 
+     cpdef FiniteField_givaroElement element_from_data(self, e):
+@@ -386,16 +386,16 @@ cdef class Cache_givaro(SageObject):
+              isinstance(e, long) or is_IntegerMod(e):
+             try:
+                 e_int = e % self.characteristic()
+-                res = self.objectptr.initi(res, e_int)
++                self.objectptr.initi(res, e_int)
+             except ArithmeticError:
+                 raise TypeError("unable to coerce from a finite field other than the prime subfield")
+         elif e is None:
+             e_int = 0
+-            res = self.objectptr.initi(res, e_int)
++            self.objectptr.initi(res, e_int)
+ 
+         elif isinstance(e, float):
+             e_int = int(e) % self.characteristic()
+-            res = self.objectptr.initd(res, e_int)
++            self.objectptr.initd(res, e_int)
+ 
+         elif isinstance(e, str):
+             return self.parent(eval(e.replace("^","**"),self.parent.gens_dict()))
+@@ -406,7 +406,7 @@ cdef class Cache_givaro(SageObject):
+             ret = self._zero_element
+             for i in range(len(e)):
+                 e_int = e[i] % self.characteristic()
+-                res = self.objectptr.initi(res, e_int)
++                self.objectptr.initi(res, e_int)
+                 to_add = make_FiniteField_givaroElement(self, res)
+                 ret = ret + to_add*self.parent.gen()**i
+             return ret
+@@ -446,7 +446,7 @@ cdef class Cache_givaro(SageObject):
+             ret = self._zero_element
+             for i in range(len(e)):
+                 e_int = e[i] % self.characteristic()
+-                res = self.objectptr.initi(res, e_int)
++                self.objectptr.initi(res, e_int)
+                 to_add = make_FiniteField_givaroElement(self, res)
+                 ret = ret + to_add*self.parent.gen()**i
+             return ret
+@@ -475,8 +475,8 @@ cdef class Cache_givaro(SageObject):
+ 
+                 for i from 0 <= i <= degpol(t):
+                     c = gtolong(gel(t, i+2))
+-                    res = self.objectptr.axpyin(res, self.int_to_log(c), x)
+-                    x = self.objectptr.mul(x,x,g)
++                    self.objectptr.axpyin(res, self.int_to_log(c), x)
++                    self.objectptr.mulin(x,g)
+                 clear_stack()
+             else:
+                 clear_stack()
+@@ -580,21 +580,10 @@ cdef class Cache_givaro(SageObject):
+             sage: 2^7 + 2^4 + 2^2 + 2 + 1
+             151
+         """
+-        cdef GivaroGfq *k = self.objectptr
+-        cdef int ret = k.zero
+-        cdef int a = k.indeterminate()
+-        cdef int at = k.one
+-        cdef int ch = k.characteristic()
+-        cdef int t, i
+-
+-        if n<0 or n>k.cardinality():
++        if n<0 or n>self.order():
+             raise TypeError("n must be between 0 and self.order()")
+ 
+-        for i from 0 <= i < k.exponent():
+-            t = k.initi(t, n % ch)
+-            ret = k.axpy(ret, t, at, ret)
+-            at = k.mul(at,at,a)
+-            n //= ch
++        cdef int ret = self.int_to_log(n)
+         return make_FiniteField_givaroElement(self, ret)
+ 
+     def _element_repr(self, FiniteField_givaroElement e):
+@@ -715,7 +704,7 @@ cdef class Cache_givaro(SageObject):
+         """
+         cdef int r
+ 
+-        r = self.objectptr.axpy(r, a.element, b.element, c.element)
++        self.objectptr.axpy(r, a.element, b.element, c.element)
+         return make_FiniteField_givaroElement(self,r)
+ 
+     def a_times_b_minus_c(self,FiniteField_givaroElement a, FiniteField_givaroElement b, FiniteField_givaroElement c):
+@@ -734,7 +723,7 @@ cdef class Cache_givaro(SageObject):
+         """
+         cdef int r
+ 
+-        r = self.objectptr.axmy(r, a.element, b.element, c.element, )
++        self.objectptr.axmy(r, a.element, b.element, c.element, )
+         return make_FiniteField_givaroElement(self,r)
+ 
+     def c_minus_a_times_b(self,FiniteField_givaroElement a,
+@@ -754,7 +743,7 @@ cdef class Cache_givaro(SageObject):
+         """
+         cdef int r
+ 
+-        r = self.objectptr.maxpy(r , a.element, b.element, c.element, )
++        self.objectptr.maxpy(r , a.element, b.element, c.element, )
+         return make_FiniteField_givaroElement(self,r)
+ 
+     def __reduce__(self):
+@@ -1108,7 +1097,7 @@ cdef class FiniteField_givaroElement(FinitePolyExtElement):
+             2*b^3 + 2*b^2 + 2*b + 1
+         """
+         cdef int r
+-        r = self._cache.objectptr.add(r, self.element ,
++        self._cache.objectptr.add(r, self.element ,
+                                               (<FiniteField_givaroElement>right).element )
+         return make_FiniteField_givaroElement(self._cache,r)
+ 
+@@ -1125,7 +1114,7 @@ cdef class FiniteField_givaroElement(FinitePolyExtElement):
+             c^2
+         """
+         cdef int r
+-        r = self._cache.objectptr.mul(r, self.element,
++        self._cache.objectptr.mul(r, self.element,
+                                               (<FiniteField_givaroElement>right).element)
+         return make_FiniteField_givaroElement(self._cache,r)
+ 
+@@ -1147,7 +1136,7 @@ cdef class FiniteField_givaroElement(FinitePolyExtElement):
+         cdef int r
+         if (<FiniteField_givaroElement>right).element == 0:
+             raise ZeroDivisionError('division by zero in finite field')
+-        r = self._cache.objectptr.div(r, self.element,
++        self._cache.objectptr.div(r, self.element,
+                                               (<FiniteField_givaroElement>right).element)
+         return make_FiniteField_givaroElement(self._cache,r)
+ 
+@@ -1164,7 +1153,7 @@ cdef class FiniteField_givaroElement(FinitePolyExtElement):
+             2*a^2 + 2*a
+         """
+         cdef int r
+-        r = self._cache.objectptr.sub(r, self.element,
++        self._cache.objectptr.sub(r, self.element,
+                                               (<FiniteField_givaroElement>right).element)
+         return make_FiniteField_givaroElement(self._cache,r)
+ 
+@@ -1181,7 +1170,7 @@ cdef class FiniteField_givaroElement(FinitePolyExtElement):
+         """
+         cdef int r
+ 
+-        r = self._cache.objectptr.neg(r, self.element)
++        self._cache.objectptr.neg(r, self.element)
+         return make_FiniteField_givaroElement(self._cache,r)
+ 
+     def __invert__(FiniteField_givaroElement self):



More information about the arch-commits mailing list