diff --git a/src/module_list.py b/src/module_list.py index a49ed36..7798cb8 100644 --- a/src/module_list.py +++ b/src/module_list.py @@ -27,6 +27,18 @@ lapack_libs = list(lapack_pc['libraries']) lapack_library_dirs = list(lapack_pc['library_dirs']) lapack_include_dirs = list(lapack_pc['include_dirs']) +# FFLAS-FFPACK +fflas_ffpack_pc = pkgconfig.parse('fflas-ffpack') +fflas_ffpack_libs = list(fflas_ffpack_pc['libraries']) +fflas_ffpack_library_dirs = list(fflas_ffpack_pc['library_dirs']) +fflas_ffpack_cflags = pkgconfig.cflags('fflas-ffpack').split() + +# Givaro +givaro_pc = pkgconfig.parse('givaro') +givaro_libs = list(givaro_pc['libraries']) +givaro_library_dirs = list(givaro_pc['library_dirs']) +givaro_cflags = pkgconfig.cflags('givaro').split() + # GNU Scientific Library # Note we replace the built-in gslcblas with the above cblas gsl_pc = pkgconfig.parse('gsl') @@ -40,6 +52,12 @@ gd_libs = list(gd_pc['libraries']) gd_library_dirs = list(gd_pc['library_dirs']) gd_include_dirs = list(gd_pc['include_dirs']) +# LinBox +linbox_pc = pkgconfig.parse('linbox') +linbox_libs = list(linbox_pc['libraries']) +linbox_library_dirs = list(linbox_pc['library_dirs']) +linbox_cflags = pkgconfig.cflags('linbox').split() + # PNG image library png_pc = pkgconfig.parse('libpng') png_libs = list(png_pc['libraries']) @@ -58,9 +76,18 @@ zlib_include_dirs = list(zlib_pc['include_dirs']) ######################################################### aliases = dict( + FFLASFFPACK_CFLAGS=fflas_ffpack_cflags, + FFLASFFPACK_LIBRARIES=fflas_ffpack_libs, + FFLASFFPACK_LIBDIR=fflas_ffpack_library_dirs, + GIVARO_CFLAGS=givaro_cflags, + GIVARO_LIBRARIES=givaro_libs, + GIVARO_LIBDIR=givaro_library_dirs, GSL_LIBRARIES=gsl_libs, GSL_LIBDIR=gsl_library_dirs, GSL_INCDIR=gsl_include_dirs, + LINBOX_CFLAGS=linbox_cflags, + LINBOX_LIBRARIES=linbox_libs, + LINBOX_LIBDIR=linbox_library_dirs, ) ######################################################### @@ -85,12 +112,6 @@ except ValueError: singular_libs = ['singular', 'flint', 'ntl', 'gmpxx', 'gmp', 'readline', 'm'] ######################################################### -### Givaro flags -######################################################### - -givaro_extra_compile_args =['-D__STDC_LIMIT_MACROS'] - -######################################################### ### Library order ######################################################### @@ -105,8 +126,7 @@ givaro_extra_compile_args =['-D__STDC_LIMIT_MACROS'] # at the very end of the list. library_order_list = [ "singular", "ec", "ecm", - "linboxsage", "ntl", "iml", "linbox", "givaro", -] + gsl_libs + [ +] + linbox_libs + gsl_libs + [ "pari", "flint", "ratpoints", "ecl", "glpk", "ppl", "arb", "fplll", "mpfi", "mpfr", "mpc", "gmp", "gmpxx", "polybori", @@ -593,13 +613,10 @@ ext_modules = [ Extension('sage.libs.linbox.linbox', sources = ['sage/libs/linbox/linbox.pyx'], - libraries = ['linboxsage', 'ntl', 'iml', 'linbox', - 'givaro', 'mpfr', 'gmp', 'gmpxx'] + cblas_libs, + libraries = linbox_libs, language = 'c++', library_dirs = cblas_library_dirs, - include_dirs = cblas_include_dirs, - extra_compile_args = givaro_extra_compile_args, - depends = [os.path.join(SAGE_INC, 'givaro', 'givconfig.h')]), + include_dirs = cblas_include_dirs), Extension('sage.libs.lcalc.lcalc_Lfunction', sources = ['sage/libs/lcalc/lcalc_Lfunction.pyx'], @@ -645,9 +662,8 @@ ext_modules = [ Extension('sage.libs.singular.singular', sources = ['sage/libs/singular/singular.pyx'], - libraries = ['givaro'] + singular_libs, - language="c++", - extra_compile_args = givaro_extra_compile_args), + libraries = singular_libs, + language="c++"), Extension('sage.libs.singular.polynomial', sources = ['sage/libs/singular/polynomial.pyx'], @@ -667,8 +683,7 @@ ext_modules = [ Extension('sage.libs.singular.function', sources = ['sage/libs/singular/function.pyx'], libraries = singular_libs, - language="c++", - extra_compile_args = givaro_extra_compile_args), + language="c++"), Extension('sage.libs.singular.option', sources = ['sage/libs/singular/option.pyx'], @@ -923,19 +938,17 @@ ext_modules = [ Extension('sage.matrix.matrix_modn_dense_float', sources = ['sage/matrix/matrix_modn_dense_float.pyx'], language="c++", - libraries = ['ntl', 'linbox', 'givaro', 'mpfr', 'gmpxx', 'gmp'] + cblas_libs, + libraries = linbox_libs + cblas_libs, library_dirs = cblas_library_dirs, - include_dirs = cblas_include_dirs, - extra_compile_args = ['-DDISABLE_COMMENTATOR'] + givaro_extra_compile_args), + include_dirs = cblas_include_dirs), Extension('sage.matrix.matrix_modn_dense_double', sources = ['sage/matrix/matrix_modn_dense_double.pyx'], language="c++", - libraries = ['ntl', 'linbox', 'givaro', 'mpfr', 'gmpxx', 'gmp'] + cblas_libs, + libraries = linbox_libs + cblas_libs, library_dirs = cblas_library_dirs, include_dirs = cblas_include_dirs, - extra_compile_args = ["-D_XPG6", "-DDISABLE_COMMENTATOR"] - + m4ri_extra_compile_args + givaro_extra_compile_args), + extra_compile_args = ["-D_XPG6"]), Extension('sage.matrix.matrix_modn_sparse', sources = ['sage/matrix/matrix_modn_sparse.pyx']), @@ -1374,8 +1387,7 @@ ext_modules = [ Extension('sage.rings.finite_rings.element_givaro', sources = ["sage/rings/finite_rings/element_givaro.pyx"], libraries = ['givaro', 'ntl', 'gmpxx', 'gmp', 'm'], - language='c++', - extra_compile_args = givaro_extra_compile_args), + language='c++'), Extension('sage.rings.finite_rings.element_ntl_gf2e', sources = ['sage/rings/finite_rings/element_ntl_gf2e.pyx'], @@ -1395,8 +1407,7 @@ ext_modules = [ sources = ["sage/rings/finite_rings/hom_finite_field_givaro.pyx"], # this order is needed to compile under windows. libraries = ['givaro', 'ntl', 'gmpxx', 'gmp', 'm'], - language='c++', - extra_compile_args = givaro_extra_compile_args), + language='c++'), ################################ ## @@ -1548,8 +1559,7 @@ ext_modules = [ Extension('sage.rings.polynomial.plural', sources = ['sage/rings/polynomial/plural.pyx'], libraries = ['m', 'readline', 'singular', 'givaro', 'gmpxx', 'gmp'], - language="c++", - extra_compile_args = givaro_extra_compile_args), + language="c++"), Extension('sage.rings.polynomial.multi_polynomial_libsingular', sources = ['sage/rings/polynomial/multi_polynomial_libsingular.pyx'], diff --git a/src/sage/libs/linbox/echelonform.pxd b/src/sage/libs/linbox/echelonform.pxd index 3097c8b..cf4902d 100644 --- a/src/sage/libs/linbox/echelonform.pxd +++ b/src/sage/libs/linbox/echelonform.pxd @@ -1,23 +1,27 @@ +# distutils: extra_compile_args = LINBOX_CFLAGS +# distutils: libraries = LINBOX_LIBRARIES +# distutils: library_dirs = LINBOX_LIBDIR + from sage.libs.linbox.modular cimport ModDoubleField, ModDoubleFieldElement, ModFloatField, ModFloatFieldElement from libc.stdint cimport uint64_t -cdef extern from "linbox/matrix/blas-matrix.h" namespace "LinBox": - cdef cppclass BlasMatrixDouble "LinBox::BlasMatrix >": +cdef extern from "linbox/matrix/dense-matrix.h" namespace "LinBox": + cdef cppclass BlasMatrixDouble "LinBox::DenseMatrix >": BlasMatrixDouble(ModDoubleField F, uint64_t nrows, uint64_t ncols) void setEntry(size_t i, size_t j, ModDoubleFieldElement t) ModDoubleFieldElement &getEntry(size_t i, size_t j) - cdef cppclass BlasMatrixFloat "LinBox::BlasMatrix >": + cdef cppclass BlasMatrixFloat "LinBox::DenseMatrix >": BlasMatrixFloat(ModFloatField F, uint64_t nrows, uint64_t ncols) void setEntry(size_t i, size_t j, ModFloatFieldElement t) ModFloatFieldElement &getEntry(size_t i, size_t j) cdef extern from "linbox/algorithms/echelon-form.h": - cdef cppclass EchelonFormDomainDouble "LinBox::EchelonFormDomain >": + cdef cppclass EchelonFormDomainDouble "LinBox::EchelonFormDomain >": EchelonFormDomainDouble(ModDoubleField) int rowReducedEchelon(BlasMatrixDouble, BlasMatrixDouble) - cdef cppclass EchelonFormDomainFloat "LinBox::EchelonFormDomain >": + cdef cppclass EchelonFormDomainFloat "LinBox::EchelonFormDomain >": EchelonFormDomainFloat(ModFloatField) int rowReducedEchelon(BlasMatrixFloat, BlasMatrixFloat) diff --git a/src/sage/libs/linbox/fflas.pxd b/src/sage/libs/linbox/fflas.pxd index e102004..01ab1b1 100644 --- a/src/sage/libs/linbox/fflas.pxd +++ b/src/sage/libs/linbox/fflas.pxd @@ -1,3 +1,7 @@ +# distutils: extra_compile_args = FFLASFFPACK_CFLAGS +# distutils: libraries = FFLASFFPACK_LIBRARIES +# distutils: library_dirs = FFLASFFPACK_LIBDIR + from modular cimport ModDoubleField, ModFloatField, ModDoubleFieldElement, ModFloatFieldElement cdef extern from "fflas-ffpack/fflas-ffpack.h" namespace "std": diff --git a/src/sage/libs/linbox/linbox.pyx b/src/sage/libs/linbox/linbox.pyx index e932347..a9bd6d1 100644 --- a/src/sage/libs/linbox/linbox.pyx +++ b/src/sage/libs/linbox/linbox.pyx @@ -1,3 +1,7 @@ +# distutils: extra_compile_args = LINBOX_CFLAGS +# distutils: libraries = LINBOX_LIBRARIES +# distutils: library_dirs = LINBOX_LIBDIR + r""" Linbox interface """ diff --git a/src/sage/libs/linbox/modular.pxd b/src/sage/libs/linbox/modular.pxd index 7ef204c..ea5fb29 100644 --- a/src/sage/libs/linbox/modular.pxd +++ b/src/sage/libs/linbox/modular.pxd @@ -1,10 +1,10 @@ -cdef extern from "linbox/field/modular.h": +cdef extern from "givaro/modular.h": # double - cdef cppclass ModDoubleFieldElement "LinBox::Modular::Element": + cdef cppclass ModDoubleFieldElement "Givaro::Modular::Element": pass - cdef cppclass ModDoubleField "LinBox::Modular": + cdef cppclass ModDoubleField "Givaro::Modular": ModDoubleField(int modulus) ModDoubleFieldElement init(ModDoubleFieldElement res, int v) ModDoubleFieldElement init(ModDoubleFieldElement res, double v) @@ -20,10 +20,10 @@ cdef extern from "linbox/field/modular.h": # float - cdef cppclass ModFloatFieldElement "LinBox::Modular::Element": + cdef cppclass ModFloatFieldElement "Givaro::Modular::Element": pass - cdef cppclass ModFloatField "LinBox::Modular": + cdef cppclass ModFloatField "Givaro::Modular": ModFloatField(int modulus) ModFloatFieldElement init(ModFloatFieldElement res, int v) ModFloatFieldElement init(ModFloatFieldElement res, double v) diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx index 33d7f7ec..77f6e0a 100644 --- a/src/sage/libs/singular/singular.pyx +++ b/src/sage/libs/singular/singular.pyx @@ -22,6 +22,7 @@ cdef extern from "limits.h": import os +from libc.stdint cimport int64_t from sage.libs.singular.decl cimport intvec from sage.libs.singular.decl cimport SR_HDL, SR_INT, SR_TO_INT from sage.libs.singular.decl cimport singular_options, singular_verbose_options @@ -155,7 +156,7 @@ cdef FFgivE si2sa_GFqGivaro(number *n, ring *_ring, Cache_givaro cache): order = cache.objectptr.cardinality() - 1 while z: - c = cache.objectptr.initi(c, napGetCoeff(z)) + c = cache.objectptr.initi(c, napGetCoeff(z)) e = napGetExpFrom(z,1, _ring) if e == 0: ret = cache.objectptr.add(ret, c, ret) diff --git a/src/sage/rings/finite_rings/element_givaro.pxd b/src/sage/rings/finite_rings/element_givaro.pxd index 68def46..91c4ed7 100644 --- a/src/sage/rings/finite_rings/element_givaro.pxd +++ b/src/sage/rings/finite_rings/element_givaro.pxd @@ -1,9 +1,15 @@ -from sage.structure.element cimport Element, RingElement, ModuleElement -from sage.rings.finite_rings.element_base cimport FinitePolyExtElement +# distutils: extra_compile_args = GIVARO_CFLAGS + +from libcpp.vector cimport vector +ctypedef vector[int] intvec + +from libc.stdint cimport int64_t -from sage.structure.parent cimport Parent +from sage.rings.finite_rings.element_base cimport FinitePolyExtElement +from sage.structure.parent cimport Parent from sage.structure.sage_object cimport SageObject + cdef extern from "givaro/givconfig.h": pass @@ -13,16 +19,7 @@ cdef extern from "givaro/givrandom.h": GivRandom GivRandomSeeded "Givaro::GivRandom"(unsigned long seed) -cdef extern from "givaro/givgfq.h": - ctypedef struct intvec "std::vector": - void (* push_back)(int elem) - - ctypedef struct constintvec "const std::vector" - - intvec intvec_factory "std::vector"(int len) - -cdef extern from "givaro/givgfq.h": - +cdef extern from "givaro/gfq.h": ctypedef struct GivaroGfq "Givaro::GFqDom": #attributes unsigned int one @@ -40,10 +37,10 @@ cdef extern from "givaro/givgfq.h": unsigned int (* cardinality)() int (* exponent)() int (* random)(GivRandom gen, int res) - int (* initi "init")(int res, int e) + int (* initi "init")(int res, int64_t e) int (* initd "init")(int res, double e) int (* indeterminate)() - int (* convert)(int r, int p) + 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) @@ -60,7 +57,12 @@ cdef extern from "givaro/givgfq.h": void delete "delete "(void *o) int gfq_element_factory "Givaro::GFqDom::Element"() -cdef class FiniteField_givaroElement(FinitePolyExtElement) #forward declaration + +cdef class FiniteField_givaroElement(FinitePolyExtElement): + cdef int element + cdef Cache_givaro _cache + cdef object _multiplicative_order + cdef FiniteField_givaroElement _new_c(self, int value) cdef class Cache_givaro(SageObject): cdef GivaroGfq *objectptr # C++ object @@ -85,11 +87,4 @@ cdef class FiniteField_givaro_iterator: cdef int iterator cdef Cache_givaro _cache -cdef class FiniteField_givaroElement(FinitePolyExtElement): - cdef int element - cdef Cache_givaro _cache - cdef object _multiplicative_order - cdef FiniteField_givaroElement _new_c(self, int value) - - cdef inline FiniteField_givaroElement make_FiniteField_givaroElement(Cache_givaro cache, int x) diff --git a/src/sage/rings/finite_rings/element_givaro.pyx b/src/sage/rings/finite_rings/element_givaro.pyx index d32b5cf..f2afa44 100644 --- a/src/sage/rings/finite_rings/element_givaro.pyx +++ b/src/sage/rings/finite_rings/element_givaro.pyx @@ -58,8 +58,9 @@ from sage.misc.randstate cimport randstate, current_randstate from sage.rings.finite_rings.finite_field_base cimport FiniteField from sage.rings.ring cimport Ring from element_ext_pari import FiniteField_ext_pariElement -from element_pari_ffelt import FiniteFieldElement_pari_ffelt +from element_pari_ffelt cimport FiniteFieldElement_pari_ffelt from sage.structure.sage_object cimport SageObject +from sage.structure.element cimport Element, ModuleElement, RingElement import operator import sage.arith.all import finite_field_constructor as finite_field @@ -373,18 +374,16 @@ cdef class Cache_givaro(SageObject): elif isinstance(e, int) or \ isinstance(e, Integer) or \ isinstance(e, long) or is_IntegerMod(e): - try: - e_int = e - except OverflowError: - e_int = e % self.characteristic() + e_int = e % self.characteristic() res = self.objectptr.initi(res, e_int) elif e is None: e_int = 0 - res = self.objectptr.initi(res,e_int) + res = self.objectptr.initi(res, e_int) elif isinstance(e, float): - res = self.objectptr.initd(res,e) + e_int = int(e) % self.characteristic() + res = self.objectptr.initd(res, e_int) elif isinstance(e, str): return self.parent(eval(e.replace("^","**"),self.parent.gens_dict())) @@ -394,8 +393,8 @@ cdef class Cache_givaro(SageObject): raise TypeError, "e.parent must match self.vector_space" ret = self._zero_element for i in range(len(e)): - e_entry = e[i] % self.characteristic() - res = self.objectptr.initi(res, int(e_entry)) + e_int = e[i] % self.characteristic() + res = self.objectptr.initi(res, e_int) to_add = make_FiniteField_givaroElement(self, res) ret = ret + to_add*self.parent.gen()**i return ret @@ -434,8 +433,8 @@ cdef class Cache_givaro(SageObject): raise ValueError, "list is too long" ret = self._zero_element for i in range(len(e)): - e_entry = e[i] % self.characteristic() - res = self.objectptr.initi(res, int(e_entry)) + e_int = e[i] % self.characteristic() + res = self.objectptr.initi(res, e_int) to_add = make_FiniteField_givaroElement(self, res) ret = ret + to_add*self.parent.gen()**i return ret @@ -572,19 +571,17 @@ cdef class Cache_givaro(SageObject): cdef int ret = k.zero cdef int a = k.indeterminate() cdef int at = k.one - cdef unsigned int ch = k.characteristic() - cdef int _n, t, i + cdef int ch = k.characteristic() + cdef int t, i if n<0 or n>k.cardinality(): raise TypeError, "n must be between 0 and self.order()" - _n = n - for i from 0 <= i < k.exponent(): - t = k.initi(t, _n%ch) + t = k.initi(t, n % ch) ret = k.axpy(ret, t, at, ret) at = k.mul(at,at,a) - _n = _n/ch + n //= ch return make_FiniteField_givaroElement(self, ret) def _element_repr(self, FiniteField_givaroElement e): diff --git a/src/sage/rings/finite_rings/finite_field_givaro.py b/src/sage/rings/finite_rings/finite_field_givaro.py index adbaab3..c431f6d 100644 --- a/src/sage/rings/finite_rings/finite_field_givaro.py +++ b/src/sage/rings/finite_rings/finite_field_givaro.py @@ -269,7 +269,8 @@ class FiniteField_givaro(FiniteField): sage: k(2) # indirect doctest 0 - Floats coerce in: + Floats are converted like integers:: + sage: k(float(2.0)) 0 @@ -343,7 +344,7 @@ class FiniteField_givaro(FiniteField): sage: k(pari('Mod(1,2)')) 1 sage: k(pari('Mod(2,3)')) - 0 + a sage: k(pari('Mod(1,3)*a^20')) a^7 + a^5 + a^4 + a^2