Ticket #1396: singular_options.patch

File singular_options.patch, 4.7 KB (added by john_perry, 13 years ago)

[with patch, needs work] Adds options to groebner_basis for lazy, redTail, redSB, and notSugar -- currently implemented for Singular only

  • sage/rings/polynomial/multi_polynomial_ideal.py

    # HG changeset patch
    # User jackperry@rabmoj.local
    # Date 1232762280 21600
    # Node ID f315aa5e8e95a69493aeff59b326330e12230637
    # Parent  b457e27d3ace23ebde8d16fa029b3e284a587f4a
    Added Singular options.
    
    diff -r b457e27d3ace -r f315aa5e8e95 sage/rings/polynomial/multi_polynomial_ideal.py
    a b  
    840840            return vdim
    841841
    842842    @redSB
    843     def _groebner_basis_singular(self, algorithm="groebner", *args, **kwds):
     843    def _groebner_basis_singular(self, algorithm="groebner", lazy=False, \
     844            redTail=False, redSB=True, notSugar=False,\
     845            *args, **kwds):
    844846        r"""
    845847        Return the reduced Groebner basis of this ideal. If the Groebner
    846848        basis for this ideal has been calculated before the cached
     
    887889        one.
    888890        """
    889891        R = self.ring()
    890         S = self._groebner_basis_singular_raw(algorithm=algorithm, *args, **kwds)
     892        S = self._groebner_basis_singular_raw(algorithm=algorithm, lazy=lazy, \
     893            redTail=redTail, redSB=redSB, notSugar=notSugar,\
     894            *args, **kwds)
    891895        S =  Sequence([R(S[i+1]) for i in range(len(S))], R, check=False, immutable=True)
    892896        return S
    893897
    894     def _groebner_basis_singular_raw(self, algorithm="groebner", singular=singular_default, *args, **kwds):
     898    def _groebner_basis_singular_raw(self, algorithm="groebner", lazy=False, \
     899            redTail=False, redSB=True, notSugar=False, \
     900            singular=singular_default, *args, **kwds):
    895901        r"""
    896902        Return a Grobner basis in \Singular format.
    897903
     
    903909            b*d^4 - b + d^5 - d, b*c - b*d + c^2*d^4 + c*d - 2*d^2,
    904910            b^2 + 2*b*d + d^2, a + b + c + d]
    905911        """
     912               
    906913        try:
    907914            return self.__gb_singular
    908915        except AttributeError:
     
    914921                singular.option(o)
    915922            else:
    916923                singular.option("no"+o)
     924               
     925        # user-specified Singular options
     926        s = self._singular_().parent()
     927        before_options = s.option("get")
     928        if lazy:
     929            s.option("lazy")
     930        else:
     931            s.option("nolazy")
     932        if notSugar:
     933            s.option("notSugar")
     934        else:
     935            s.option("nonotSugar")
     936        if redTail:
     937            s.option("redTail")
     938        else:
     939            s.option("noredTail")
     940        if redSB:
     941            s.option("redSB")
     942        else:
     943            s.option("noredSB")
    917944
    918945        if algorithm=="groebner":
    919             S = self._singular_().groebner()
     946            S = singular(self).groebner()
    920947        elif algorithm=="std":
    921948            S = self._singular_().std()
    922949        elif algorithm=="slimgb":
     
    928955        else:
    929956            raise TypeError, "algorithm '%s' unknown"%algorithm
    930957        self.__gb_singular = S
     958        singular.option("set",before_options)
    931959        return S
    932960
    933961    def _groebner_basis_libsingular(self, algorithm="std"):
     
    18271855                                        symmetry=symmetry, verbose=verbose)
    18281856
    18291857    @cached_method
    1830     def groebner_basis(self, algorithm='', *args, **kwds):
     1858    def groebner_basis(self, algorithm='', lazy=False, redTail=False, redSB=True,\
     1859            notSugar=False,  *args, **kwds):
    18311860        r"""
    18321861        Return the reduced Groebner basis of this ideal. A Groeber basis
    18331862        $g_1,...,g_n$ for an ideal $I$ is a basis such that
     
    19631992        available), or toy implementation.
    19641993        """
    19651994        from sage.rings.integer_mod_ring import is_IntegerModRing
    1966 
     1995       
    19671996        if algorithm.lower() == "magma":
    19681997            algorithm = "magma:GroebnerBasis"
    19691998        elif algorithm.lower() == "singular":
     
    19722001            algorithm = "macaulay2:gb"
    19732002        elif algorithm.lower() == "toy":
    19742003            algorithm = "toy:buchberger2"
    1975 
     2004       
    19762005        if algorithm is '':
    19772006            if self.ring().base_ring() is ZZ:
    19782007                try:
     
    19962025                    gb = filter(lambda f: f,[R(f) for f in gb])
    19972026            else:
    19982027                try:
    1999                     gb = self._groebner_basis_singular("groebner", *args, **kwds)
     2028                    gb = self._groebner_basis_singular("groebner", lazy=lazy, \
     2029                        redTail=redTail, redSB=redSB, \
     2030                        notSugar=notSugar, *args, **kwds)
    20002031                except TypeError, msg: # conversion to Singular not supported
    20012032                    if self.ring().term_order().is_global():
    20022033                        verbose("Warning: falling back to very slow toy implementation.", level=0)