Date: Saturday, November 18, 2017 @ 17:07:35
  Author: arojas
Revision: 267315

linbox 1.5 rebuild

Added:
  sagemath/trunk/sagemath-linbox-1.5.patch
Modified:
  sagemath/trunk/PKGBUILD

---------------------------+
 PKGBUILD                  |   10 +
 sagemath-linbox-1.5.patch |  272 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 279 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2017-11-18 17:06:54 UTC (rev 267314)
+++ PKGBUILD    2017-11-18 17:07:35 UTC (rev 267315)
@@ -9,7 +9,7 @@
 pkgbase=sagemath
 pkgname=(sagemath sagemath-jupyter)
 pkgver=8.0
-pkgrel=9
+pkgrel=10
 pkgdesc="Open Source Mathematics Software, free alternative to Magma, Maple, 
Mathematica, and Matlab"
 arch=(x86_64)
 url="http://www.sagemath.org";
@@ -37,7 +37,8 @@
 
source=("$pkgname-$pkgver.tar.gz::https://github.com/sagemath/sage/archive/$pkgver.tar.gz";
         env.patch package.patch latte-count.patch jupyter-path.patch 
sagemath-python3-notebook.patch test-optional.patch
         r-no-readline.patch fes02.patch sagemath-ecl-no-sigfpe.patch 
sagemath-cython-0.26.patch sagemath-threejs.patch
-        sagemath-pynac-0.7.11.patch sagemath-pynac-0.7.12.patch 
sagemath-detect-igraph.patch sagemath-networkx2.patch sagemath-brial-1.2.patch)
+        sagemath-pynac-0.7.11.patch sagemath-pynac-0.7.12.patch 
sagemath-detect-igraph.patch sagemath-networkx2.patch
+        sagemath-brial-1.2.patch sagemath-linbox-1.5.patch)
 sha256sums=('91df3e303add71616e24b38c04789f66d57ada7b1017e5369e850c42d5e8753d'
             'e0b5b8673300857fde823209a7e90faecf9e754ab812cc5e54297eddc0c79571'
             '4a2297e4d9d28f0b3a1f58e1b463e332affcb109eafde44837b1657e309c8212'
@@ -54,7 +55,8 @@
             '719bb39c9c2cd1c6e75be0969000ba5ffcd2875bb5190fce6bb6a6feaa76b96f'
             '90be1d1a90120bd5bd3620769480106ba809dd23e896bc4a3f8931e5340f3cda'
             'a1a0ab5b794136b518f5f66fe9f1689411fabb3b81560b159eae81f6f69000e3'
-            '64ee1930049a17a7295bb45513efc9d484299132900fc9b8e308a9fe1a2df149')
+            '64ee1930049a17a7295bb45513efc9d484299132900fc9b8e308a9fe1a2df149'
+            'a52d03e04c9d64bb957a1f8dcdae3280ebb9450a7fd76aaf5ae5de5c6f74774f')
 
 prepare(){
   cd sage-$pkgver
@@ -97,6 +99,8 @@
   patch -p1 -i ../sagemath-pynac-0.7.11.patch
 # fix build with pynac 0.7.12 https://trac.sagemath.org/ticket/23950
   patch -p1 -i ../sagemath-pynac-0.7.12.patch
+# fix build with linbox 1.5 https://trac.sagemath.org/ticket/24214
+  patch -p1 -i ../sagemath-linbox-1.5.patch
 
 # use python2
   sed -e 's|#!/usr/bin/env python|#!/usr/bin/env python2|' -e 's|exec 
python|exec python2|' -i src/bin/*

Added: sagemath-linbox-1.5.patch
===================================================================
--- sagemath-linbox-1.5.patch                           (rev 0)
+++ sagemath-linbox-1.5.patch   2017-11-18 17:07:35 UTC (rev 267315)
@@ -0,0 +1,272 @@
+diff --git a/src/sage/libs/linbox/fflas.pxd b/src/sage/libs/linbox/fflas.pxd
+index ca23d71..03bbee9 100644
+--- a/src/sage/libs/linbox/fflas.pxd
++++ b/src/sage/libs/linbox/fflas.pxd
+@@ -20,19 +20,29 @@ cdef extern from "fflas-ffpack/fflas-ffpack.h" namespace 
"std":
+         iterator end()
+         size_t size()
+ 
+-    cdef cppclass list[T]:
+-        cppclass iterator:
+-            T operator*()
+-            iterator operator++()
+-            bint operator==(iterator)
+-            bint operator!=(iterator)
+-        void push_back(T&)
+-        void pop_front()
+-        T& front()
+-        iterator begin()
+-        iterator end()
++cdef extern from "givaro/givpoly1.h":
++    ## template < typename T, typename A=std::allocator<T> >
++    ## class givvector : public __GIV_STANDARD_VECTOR<T,A>
++    cdef cppclass givvector "Givaro::givvector" [T,ALLOCATOR=*]:
++        T& operator[](size_t i)
+         size_t size()
+-        void clear()
++
++ctypedef givvector[ModDoubleFieldElement] ModDoubleDensePolynomial
++ctypedef givvector[ModFloatFieldElement] ModFloatDensePolynomial
++
++cdef extern from "givaro/givpoly1.h":
++    ## template <class Domain, class StorageTag= Givaro::Dense>
++    ## class GivPolynomialRing : public Givaro::Poly1FactorDom< 
Domain,StorageTag>
++    cdef cppclass ModDoublePolynomialRing 
"Givaro::Poly1Dom<Givaro::Modular<double>, Givaro::Dense>":
++        ctypedef givvector[ModDoubleField] Element
++        ctypedef givvector[ModDoubleField] Polynomial
++        ModDoublePolynomialRing(ModDoubleField& F)
++    ## template <class Domain, class StorageTag= Givaro::Dense>
++    ## class GivPolynomialRing : public Givaro::Poly1FactorDom< 
Domain,StorageTag>
++    cdef cppclass ModFloatPolynomialRing 
"Givaro::Poly1Dom<Givaro::Modular<float>, Givaro::Dense>":
++        ctypedef givvector[ModFloatField] Element
++        ctypedef givvector[ModFloatField] Polynomial
++        ModFloatPolynomialRing(ModFloatField& F)
+ 
+ cdef extern from "fflas-ffpack/fflas-ffpack.h":
+     ctypedef enum fflas_trans_enum "FFLAS::FFLAS_TRANSPOSE":
+@@ -105,13 +115,12 @@ cdef extern from "fflas-ffpack/fflas-ffpack.h":
+                                             size_t nr, size_t foo, size_t r,
+                                             ModDoubleFieldElement* matrix, 
size_t nc, size_t* Q)
+ 
+-    void ModDouble_MinPoly "FFPACK::MinPoly" ( ModDoubleField F,
++    void ModDouble_MinPoly "FFPACK::MinPoly" ( ModDoubleField& F,
+                                                vector[ModDoubleFieldElement] 
minP, size_t N,
+-                                               ModDoubleFieldElement* A, 
size_t lda,
+-                                               ModDoubleFieldElement* X, 
size_t ldx, size_t* P)
++                                               ModDoubleFieldElement*A, 
size_t lda)
+ 
+-    void ModDouble_CharPoly "FFPACK::CharPoly" ( ModDoubleField F,
+-                                                 
list[vector[ModDoubleFieldElement]] charp, size_t N,
++    void ModDouble_CharPoly "FFPACK::CharPoly" ( ModDoublePolynomialRing& R,
++                                                 ModDoubleDensePolynomial& 
charp, size_t N,
+                                                  ModDoubleFieldElement* A, 
size_t lda)
+ 
+     # float
+@@ -142,9 +151,8 @@ cdef extern from "fflas-ffpack/fflas-ffpack.h":
+ 
+     void ModFloat_MinPoly "FFPACK::MinPoly" ( ModFloatField F,
+                                               vector[ModFloatFieldElement] 
minP, size_t N,
+-                                              ModFloatFieldElement* A, size_t 
lda,
+-                                              ModFloatFieldElement* X, size_t 
ldx, size_t* P)
++                                              ModFloatFieldElement* A, size_t 
lda)
+ 
+-    void ModFloat_CharPoly "FFPACK::CharPoly" ( ModFloatField F,
+-                                                
list[vector[ModFloatFieldElement]] charp, size_t N,
++    void ModFloat_CharPoly "FFPACK::CharPoly" ( ModFloatPolynomialRing& F,
++                                                ModFloatDensePolynomial& 
charp, size_t N,
+                                                 ModFloatFieldElement* A, 
size_t lda )
+diff --git a/src/sage/libs/linbox/linbox_flint_interface.pyx 
b/src/sage/libs/linbox/linbox_flint_interface.pyx
+index 02a6151..a00d303 100644
+--- a/src/sage/libs/linbox/linbox_flint_interface.pyx
++++ b/src/sage/libs/linbox/linbox_flint_interface.pyx
+@@ -76,19 +76,23 @@ cdef extern from "givaro/zring.h":
+         ctypedef GivaroInteger Element
+ 
+ 
+-cdef extern from "givaro/givpoly1.h":
+-    ## template < typename T, typename A=std::allocator<T> >
+-    ## class givvector : public __GIV_STANDARD_VECTOR<T,A>
+-    cdef cppclass givvector "Givaro::givvector" [T,ALLOCATOR=*]:
+-        T& operator[](size_t i)
++cdef extern from "linbox/polynomial/dense-polynomial.h":
++    ## template<class Field>
++    ## class DensePolynomial : public Givaro::Poly1FactorDom<Field, 
Givaro::Dense>::Element
++    cdef cppclass LinBoxIntegerDensePolynomial 
"LinBox::DensePolynomial<Givaro::ZRing<Givaro::Integer> >":
++        ctypedef GivaroIntegerRing BaseRing
++        ctypedef GivaroInteger BaseRingElement
++        LinBoxIntegerDensePolynomial(BaseRing &F)
++        LinBoxIntegerDensePolynomial(BaseRing &F, size_t s)
++        BaseRingElement& operator[](size_t i)
+         size_t size()
+ 
+-cdef extern from "linbox/ring/givaro-polynomial.h":
+-    ## template <class Domain, class StorageTag= Givaro::Dense>
+-    ## class GivPolynomialRing : public Givaro::Poly1FactorDom< 
Domain,StorageTag>
+-    cdef cppclass LinBoxIntegerPolynomialRing 
"LinBox::GivPolynomialRing<Givaro::ZRing<Givaro::Integer>, Givaro::Dense>":
+-        ctypedef givvector[GivaroInteger] Element
+-        ctypedef givvector[GivaroInteger] Polynomial
++cdef extern from "linbox/ring/polynomial-ring.h":
++    ## template <class BaseRing, class StorageTag= Givaro::Dense>
++    ##        class PolynomialRing : public 
Givaro::Poly1FactorDom<BaseRing,StorageTag>
++    cdef cppclass LinBoxIntegerPolynomialRing 
"LinBox::PolynomialRing<Givaro::ZRing<Givaro::Integer>, Givaro::Dense>":
++        ctypedef LinBoxIntegerDensePolynomial Element
++        ctypedef LinBoxIntegerDensePolynomial Polynomial
+ 
+ cdef extern from "linbox/matrix/matrix-domain.h":
+     ## template <class Field_ >
+@@ -190,40 +194,32 @@ cdef void linbox_fmpz_mat_mul(fmpz_mat_t C, fmpz_mat_t 
A, fmpz_mat_t B):
+ cdef void linbox_fmpz_mat_charpoly(fmpz_poly_t cp, fmpz_mat_t A):
+     cdef GivaroIntegerRing ZZ
+     cdef LinBoxIntegerDenseMatrix * LBA
+-    cdef LinBoxIntegerPolynomialRing.Element m_A
+-
+-    # FIXME: bug in LinBox
+-    # see https://github.com/linbox-team/linbox/issues/51
+-    if fmpz_mat_nrows(A) == 0:
+-        fmpz_poly_one(cp)
+-        return
++    cdef LinBoxIntegerDensePolynomial * m_A
+ 
+     LBA = new LinBoxIntegerDenseMatrix(ZZ, fmpz_mat_nrows(A), 
fmpz_mat_ncols(A))
+     fmpz_mat_get_linbox(LBA[0], A)
+-    LinBoxIntegerDense_charpoly(m_A, LBA[0])
+-    fmpz_poly_set_linbox(cp, m_A)
++    m_A = new LinBoxIntegerDensePolynomial(ZZ, fmpz_mat_nrows(A))
++    LinBoxIntegerDense_charpoly(m_A[0], LBA[0])
++    fmpz_poly_set_linbox(cp, m_A[0])
+ 
+     del LBA
++    del m_A
+ 
+ 
+ # set mp to the minimal polynomial of A
+ cdef void linbox_fmpz_mat_minpoly(fmpz_poly_t mp, fmpz_mat_t A):
+     cdef GivaroIntegerRing ZZ
+     cdef LinBoxIntegerDenseMatrix * LBA
+-    cdef LinBoxIntegerPolynomialRing.Element m_A
+-
+-    # FIXME: bug in LinBox
+-    # see https://github.com/linbox-team/linbox/issues/51
+-    if fmpz_mat_nrows(A) == 0:
+-        fmpz_poly_one(mp)
+-        return
++    cdef LinBoxIntegerDensePolynomial * m_A
+ 
+     LBA = new LinBoxIntegerDenseMatrix(ZZ, fmpz_mat_nrows(A), 
fmpz_mat_ncols(A))
++    m_A = new LinBoxIntegerDensePolynomial(ZZ)
+     fmpz_mat_get_linbox(LBA[0], A)
+-    LinBoxIntegerDense_minpoly(m_A, LBA[0])
+-    fmpz_poly_set_linbox(mp, m_A)
++    LinBoxIntegerDense_minpoly(m_A[0], LBA[0])
++    fmpz_poly_set_linbox(mp, m_A[0])
+ 
+     del LBA
++    del m_A
+ 
+ 
+ # return the rank of A
+diff --git a/src/sage/matrix/matrix_modn_dense_double.pyx 
b/src/sage/matrix/matrix_modn_dense_double.pyx
+index 15c35cb..b1f6154 100644
+--- a/src/sage/matrix/matrix_modn_dense_double.pyx
++++ b/src/sage/matrix/matrix_modn_dense_double.pyx
+@@ -27,7 +27,9 @@ from sage.libs.linbox.fflas cimport ModDouble_fgemm as 
Mod_fgemm, ModDouble_fgem
+     ModDoubleRank as ModRank, ModDouble_echelon as Mod_echelon, \
+     ModDouble_applyp as Mod_applyp, \
+     ModDouble_MinPoly as Mod_MinPoly, \
+-    ModDouble_CharPoly as Mod_CharPoly
++    ModDouble_CharPoly as Mod_CharPoly, \
++    ModDoublePolynomialRing as ModDensePolyRing,\
++    ModDoubleDensePolynomial as ModDensePoly
+ 
+ # Limit for LinBox Modular<double>
+ MAX_MODULUS = 2**23
+diff --git a/src/sage/matrix/matrix_modn_dense_float.pyx 
b/src/sage/matrix/matrix_modn_dense_float.pyx
+index 61457ce..eda8f0b 100644
+--- a/src/sage/matrix/matrix_modn_dense_float.pyx
++++ b/src/sage/matrix/matrix_modn_dense_float.pyx
+@@ -25,7 +25,10 @@ from sage.libs.linbox.fflas cimport ModFloat_fgemm as 
Mod_fgemm, ModFloat_fgemv
+         ModFloatRank as ModRank, ModFloat_echelon as Mod_echelon, \
+         ModFloat_applyp as Mod_applyp, \
+         ModFloat_MinPoly as Mod_MinPoly, \
+-        ModFloat_CharPoly as Mod_CharPoly
++        ModFloat_CharPoly as Mod_CharPoly, \
++        ModFloatPolynomialRing as ModDensePolyRing,\
++        ModFloatDensePolynomial as ModDensePoly
++
+ 
+ # LinBox supports up to 2^11 using float but that's double dog slow,
+ # so we pick a smaller value for crossover
+diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi 
b/src/sage/matrix/matrix_modn_dense_template.pxi
+index 3da3e31..819ef2d 100644
+--- a/src/sage/matrix/matrix_modn_dense_template.pxi
++++ b/src/sage/matrix/matrix_modn_dense_template.pxi
+@@ -306,23 +306,15 @@ cdef inline linbox_minpoly(celement modulus, Py_ssize_t 
nrows, celement* entries
+     cdef Py_ssize_t i
+     cdef ModField *F = new ModField(<long>modulus)
+     cdef vector[ModFieldElement] *minP = new vector[ModFieldElement]()
+-    cdef ModFieldElement *X = <ModFieldElement*>check_allocarray(nrows * 
(nrows+1), sizeof(ModFieldElement))
+-    cdef size_t *P = <size_t*>check_allocarray(nrows, sizeof(size_t))
+-
+-    cdef celement *cpy = linbox_copy(modulus, entries, nrows, nrows)
+ 
+     if nrows*nrows > 1000: sig_on()
+-    Mod_MinPoly(F[0], minP[0], nrows, <ModFieldElement*>cpy, nrows, X, nrows, 
P)
++    Mod_MinPoly(F[0], minP[0], nrows, <ModFieldElement*>entries, nrows)
+     if nrows*nrows > 1000: sig_off()
+ 
+-    sig_free(cpy)
+-
+     l = []
+     for i in range(minP.size()):
+         l.append( <celement>minP.at(i) )
+ 
+-    sig_free(P)
+-    sig_free(X)
+     del F
+     return l
+ 
+@@ -332,27 +324,23 @@ cdef inline linbox_charpoly(celement modulus, Py_ssize_t 
nrows, celement* entrie
+     """
+     cdef Py_ssize_t i
+     cdef ModField *F = new ModField(<long>modulus)
+-    cdef std_list[vector[ModFieldElement]] P_list
+-    P_list.clear()
++    cdef ModDensePolyRing * R = new ModDensePolyRing(F[0])
++    cdef ModDensePoly  P
+ 
+     cdef celement *cpy = linbox_copy(modulus, entries, nrows, nrows)
+ 
+     if nrows*nrows > 1000: sig_on()
+-    Mod_CharPoly(F[0], P_list, nrows, <ModFieldElement*>cpy, nrows)
++    Mod_CharPoly(R[0], P, nrows, <ModFieldElement*>cpy, nrows)
+     if nrows*nrows > 1000: sig_off()
+ 
+     sig_free(cpy)
+ 
+-    cdef vector[ModFieldElement] tmp
+     l = []
+-    while P_list.size():
+-        l.append([])
+-        tmp = P_list.front()
+-        for i in range(tmp.size()):
+-            l[-1].append(<celement>tmp.at(i))
+-        P_list.pop_front()
++    for i in range(P.size()):
++        l.append(<celement>P[i])
+ 
+     del F
++    del R
+     return l
+ 
+ 
+@@ -1731,9 +1719,7 @@ cdef class Matrix_modn_dense_template(Matrix_dense):
+         R = self._base_ring[var]
+         # call linbox for charpoly
+         v = linbox_charpoly(self.p, self._nrows, self._entries)
+-        r = R(1)
+-        for e in v:
+-            r *= R(e)
++        r = R(v)
+         return r
+ 
+     def echelonize(self, algorithm="linbox", **kwds):

Reply via email to