Changeset 7588:cfcfa40e45e2


Ignore:
Timestamp:
11/11/07 13:02:05 (6 years ago)
Author:
Burcin Erocal <burcin@…>
Branch:
default
Message:

More PolyBoRi? wrappers.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • c_lib/include/pb_wrap.h

    r7584 r7588  
    44#include "ccobject.h" 
    55#include <sstream> 
     6#include <vector> 
    67 
    78USING_NAMESPACE_PBORI 
    89USING_NAMESPACE_PBORIGB 
    910 
     11BoolePolynomial get_ith_gen(const GroebnerStrategy& strat, int i){ 
     12    return strat.generators[i].p; 
     13} 
     14 
     15static int pairs_top_sugar(const GroebnerStrategy& strat){ 
     16    if (strat.pairs.pairSetEmpty()) 
     17        return -1; 
     18    else 
     19        return (strat.pairs.queue.top().sugar); 
     20} 
     21 
     22static std::vector<BoolePolynomial> someNextDegreeSpolys(GroebnerStrategy& strat, int n){ 
     23    std::vector<BoolePolynomial> res; 
     24    assert(!(strat.pairs.pairSetEmpty())); 
     25    strat.pairs.cleanTopByChainCriterion(); 
     26    deg_type deg=strat.pairs.queue.top().sugar; 
     27 
     28    while((!(strat.pairs.pairSetEmpty())) && \ 
     29                (strat.pairs.queue.top().sugar<=deg) && (res.size()<n)){ 
     30        assert(strat.pairs.queue.top().sugar==deg); 
     31        res.push_back(strat.nextSpoly()); 
     32        strat.pairs.cleanTopByChainCriterion(); 
     33    } 
     34    return res; 
     35} 
     36 
  • sage/libs/polybori/decl.pxi

    r7586 r7588  
    1818        PBNavigator (* elseBranch) () 
    1919        int (* value "operator*")() 
     20        bint (* isConstant)() 
     21        bint (* isTerminated)() 
    2022 
    2123    # non-allocating versions 
     
    99101        int (* lmDeg)() 
    100102        int (* length)() 
     103        int (* eliminationLength)() 
    101104        bint (* isZero)() 
    102105        bint (* isOne)() 
     
    110113        PBPolyIter (* orderedEnd)() 
    111114        void (* iadd "operator+=")(PBPoly right) 
     115        void (* iadd_PBMonom "operator+=")(PBMonom right) 
    112116        void (* imul "operator*=")(PBPoly right) 
    113117        void (* imul_monom "operator*=")(PBMonom right) 
    114  
     118        bint (* is_equal "operator==")(PBPoly right) 
    115119 
    116120    # non-allocating versions 
     
    137141    object PBPoly_to_str "_to_PyString<BoolePolynomial>"(PBPoly *p) 
    138142 
    139     ctypedef struct PBPoly_vector "std::vector<BoolePolynomial>": 
     143    ctypedef struct PBPolyVectorIter \ 
     144            "std::vector<BoolePolynomial>::iterator ": 
     145        PBPoly (* value "operator*")() 
     146        int (* next "operator++")() 
     147 
     148    bint PBPolyVectorIter_equal "operator=="(PBPolyVectorIter lhs, \ 
     149            PBPolyVectorIter rhs) 
     150 
     151    ctypedef struct PBPolyVector "std::vector<BoolePolynomial>": 
    140152        int (* size)() 
    141153        PBPoly (* get "operator[]")(int) 
    142  
    143     ctypedef struct GBStrategy "struct GroebnerStrategy": 
     154        PBPolyVectorIter (* begin)() 
     155        PBPolyVectorIter (* end)() 
     156        void (* push_back)(PBPoly val) 
     157 
     158    PBPolyVector* PBPolyVector_construct \ 
     159            "Construct< std::vector<BoolePolynomial> >"(void *mem) 
     160    void PBPolyVector_destruct "Destruct< std::vector<BoolePolynomial> >"\ 
     161            (PBPolyVector *mem) 
     162 
     163    ctypedef struct GBStrategy "GroebnerStrategy": 
     164        bint reduceByTailReduced 
     165        bint enabledLog 
     166        unsigned int reductionSteps 
     167        int normalForms 
     168        int currentDegree 
     169        int chainCriterions 
     170        int variableChainCriterions 
     171        int easyProductCriterions 
     172        int extendedProductCriterions 
     173        int averageLength 
     174        bint optRedTail 
     175        bint optLazy 
     176        bint optLL 
     177        bint optDelayNonMinimals 
     178        bint optBrutalReductions 
     179        bint optExchange 
     180        bint optAllowRecursion 
     181        bint optRedTailDegGrowth 
     182        bint optStepBounded 
     183        bint optLinearAlgebraInLastBlock 
     184        bint optRedTailInLastBlock  
     185        PBSet monomials 
     186        PBSet llReductor 
     187        bint (* containsOne)() 
     188        int (* addGenerator)(PBPoly, bint is_impl) 
    144189        void (* addGeneratorDelayed)(PBPoly) 
     190        void (* addAsYouWish)(PBPoly) 
    145191        void (* symmGB_F2)() 
    146         PBPoly_vector (* minimalize)() 
     192        void (* cleanTopByChainCriterion "pairs.cleanTopByChainCriterion")() 
     193        int (* nGenerators "generators.size")() 
     194        int (* npairs "pairs.queue.size")() 
     195        PBPolyVector (* minimalize)() 
     196        PBPolyVector (* minimalizeAndTailReduce)() 
     197 
     198    int (* pairs_top_sugar)(GBStrategy strat) 
     199    PBPolyVector (* someNextDegreeSpolys)(GBStrategy strat, int n) 
     200 
     201    PBPoly GB_get_ith_gen "get_ith_gen" (GBStrategy strat, int i) 
    147202 
    148203    # non-allocating versions 
    149204    GBStrategy* GBStrategy_construct "Construct<GroebnerStrategy>"(void *mem) 
     205    GBStrategy* GBStrategy_construct_gbstrategy \ 
     206            "Construct_p<GroebnerStrategy, GroebnerStrategy>" \ 
     207            (void *mem, GBStrategy strat) 
     208    PBPoly* PBPoly_construct_dd \ 
     209            "Construct_p<BoolePolynomial, BoolePolyRing::dd_type>" \ 
     210            (void *mem, PBDD d) 
    150211    void GBStrategy_destruct "Destruct<GroebnerStrategy>"(GBStrategy *mem) 
    151212 
     
    158219 
    159220    PBSet pb_mod_mon_set "mod_mon_set"(PBSet as, PBSet vs) 
     221 
     222    void pb_change_ordering "BoolePolyRing::changeOrdering" (ordercodes c) 
     223 
     224    PBPolyVector pb_parallel_reduce "parallel_reduce" \ 
     225        (PBPolyVector inp, GBStrategy strat, int average_steps, double delay_f) 
     226 
  • sage/rings/polynomial/polybori.pxd

    r7586 r7588  
    3838    cdef BooleSet _obj 
    3939    cdef BooleanPolynomialRing _ring 
     40 
     41cdef class GroebnerStrategy: 
     42    cdef GBStrategy _S 
     43    cdef BooleanPolynomialRing _parent 
     44 
     45cdef class BooleanPolynomialVector: 
     46    cdef PBPolyVector _vec 
     47    cdef BooleanPolynomialRing _parent 
     48 
     49cdef class BooleanPolynomialVectorIterator: 
     50    cdef BooleanPolynomialRing _parent 
     51    cdef PBPolyVectorIter _iter 
     52    cdef PBPolyVector _obj 
  • sage/rings/polynomial/polybori.pyx

    r7586 r7588  
    210210        return new_BMI_from_PBMonomIter(self._M, self._M.begin()) 
    211211 
    212     def _mul_c_impl(left, MonoidElement right): 
     212    cdef MonoidElement _mul_c_impl(left, MonoidElement right): 
    213213        cdef BooleanMonomial m = new_BM_from_PBMonom(\ 
    214214                (<BooleanMonomial>left)._parent, (<BooleanMonomial>left)._M) 
    215215        m._M.imul( (<BooleanMonomial>right)._M ) 
    216216        return m 
     217 
     218    def __add__(self, right): 
     219        cdef BooleanPolynomial res 
     220        if PY_TYPE_CHECK(right, BooleanMonomial): 
     221            res = new_BP_from_PBMonom( (<BooleanMonomial>self)._parent._ring, \ 
     222                                            (<BooleanMonomial>self)._M) 
     223            res._P.iadd_PBMonom((<BooleanMonomial>right)._M) 
     224            return res 
     225        else: 
     226            #FIXME 
     227            raise NotImplementedError, "Adding %s and %s is not supported." % \ 
     228                                            (type(self), type(right)) 
     229         
    217230 
    218231cdef inline BooleanMonomial new_BM(parent): 
     
    292305        p._P.imul( (<BooleanPolynomial>right)._P ) 
    293306        return p 
    294  
     307     
     308    def is_equal(self, BooleanPolynomial right): 
     309        #FIXME: change this to replace == operator 
     310        return self._P.is_equal(right._P) 
     311     
    295312    def __iter__(self): 
    296313        return new_BPI_from_PBPolyIter(self, self._P.orderedBegin()) 
     
    356373        return new_BM_from_PBMonom(self._parent._monom_monoid, self._P.usedVariables()) 
    357374 
     375    def elimination_length(self): 
     376        return self._P.eliminationLength() 
     377 
    358378    def __len__(self): 
    359379        return self._P.length() 
     
    365385        if name == 'diagram': 
    366386            return new_DD_from_PBDD(self._P.diagram()) 
     387        elif name == 'deg': 
     388            return self.total_degree 
     389        elif name == 'elength': 
     390            return self.elimination_length 
    367391        elif name == 'lead': 
    368392            return self.lm 
     
    414438    cdef PBPoly t 
    415439    cdef BooleanPolynomial p, r 
    416     cdef PBPoly_vector vec 
     440    cdef PBPolyVector vec 
    417441    cdef GBStrategy strat 
    418442 
     
    585609        return new_CN_from_PBNavigator(self._N.thenBranch()) 
    586610 
     611    def constant(self): 
     612        return self._N.isConstant() 
     613 
     614    def terminalOne(self): 
     615        return self._N.isTerminated() 
     616 
     617cdef class BooleanPolynomialVector: 
     618    def __init__(self): 
     619        PBPolyVector_construct(&self._vec)  
     620        self._parent = get_cring() 
     621 
     622    def __dealloc__(self): 
     623        PBPolyVector_destruct(&self._vec) 
     624 
     625    def __iter__(self): 
     626        #return new_BPVI_from_PBPolyVectorIter(self._parent, self._vec,  
     627        #    self._vec.begin()) 
     628        return BooleanPolynomialVectorIterator(self._parent, self) 
     629 
     630    def __len__(self): 
     631        return self._vec.size() 
     632 
     633    def __getitem__(self, ind): 
     634        return new_BP_from_PBPoly(self._parent, self._vec.get(ind)) 
     635 
     636    def append(self, BooleanPolynomial poly): 
     637        self._vec.push_back(poly._P) 
     638 
     639cdef inline BooleanPolynomialVector new_BPV_from_PBPolyVector(\ 
     640        BooleanPolynomialRing parent, PBPolyVector juice): 
     641    cdef BooleanPolynomialVector m 
     642    m = <BooleanPolynomialVector>PY_NEW(BooleanPolynomialVector) 
     643    m._vec = juice 
     644    m._parent = parent 
     645    return m 
     646 
     647cdef class BooleanPolynomialVectorIterator: 
     648    def __init__(self, BooleanPolynomialRing parent,  
     649                                    BooleanPolynomialVector vector): 
     650        self._parent = parent 
     651        self._obj = vector._vec 
     652        self._iter = self._obj.begin() 
     653 
     654    def __iter__(self): 
     655        return self 
     656 
     657    def __next__(self): 
     658        cdef PBPoly val 
     659        if PBPolyVectorIter_equal(self._iter, self._obj.end()): 
     660            raise StopIteration 
     661 
     662        val = self._iter.value() 
     663        self._iter.next() 
     664        return new_BP_from_PBPoly(self._parent, val) 
     665 
     666cdef inline BooleanPolynomialVectorIterator new_BPVI_from_PBPolyVectorIter(\ 
     667        BooleanPolynomialRing parent, PBPolyVector juice, PBPolyVectorIter itr): 
     668    """ 
     669    Construct a new BooleanMonomialIterator 
     670    """ 
     671    cdef BooleanPolynomialVectorIterator m 
     672    m = <BooleanPolynomialVectorIterator>PY_NEW(BooleanPolynomialVectorIterator) 
     673    m._obj = juice 
     674    m._iter = itr 
     675    m._parent = parent 
     676    return m 
     677 
     678 
     679cdef class GroebnerStrategy: 
     680    def __init__(self, param = None): 
     681        self._parent = get_cring() 
     682        if PY_TYPE_CHECK(param, GroebnerStrategy): 
     683            GBStrategy_construct_gbstrategy(&self._S,  
     684                    (<GroebnerStrategy>param)._S) 
     685        else:  
     686            GBStrategy_construct(&self._S) 
     687 
     688    def __dealloc__(self): 
     689        GBStrategy_destruct(&self._S) 
     690 
     691    def addGeneratorDelayed(self, BooleanPolynomial p): 
     692        self._S.addGeneratorDelayed(p._P) 
     693 
     694    def addGenerator(self, BooleanPolynomial p, bint is_impl=False): 
     695        return self._S.addGenerator(p._P, is_impl) 
     696 
     697    def addAsYouWish(self, BooleanPolynomial p): 
     698        self._S.addAsYouWish(p._P) 
     699 
     700    def cleanTopByChainCriterion(self): 
     701        self._S.cleanTopByChainCriterion() 
     702 
     703    def symmGB_F2(self): 
     704        self._S.symmGB_F2() 
     705 
     706    def containsOne(self): 
     707        return self._S.containsOne() 
     708 
     709    def minimalize(self): 
     710        cdef PBPolyVector v = self._S.minimalize() 
     711        return new_BPVI_from_PBPolyVectorIter(self._parent, v, v.begin()) 
     712 
     713    def minimalizeAndTailReduce(self): 
     714        cdef PBPolyVector v = self._S.minimalizeAndTailReduce() 
     715        return new_BPVI_from_PBPolyVectorIter(self._parent, v, v.begin()) 
     716 
     717    def npairs(self): 
     718        return self._S.npairs() 
     719 
     720    def topSugar(self): 
     721        return pairs_top_sugar(self._S) 
     722 
     723    def someSpolysInNextDegree(self, n): 
     724        cdef PBPolyVector v = someNextDegreeSpolys(self._S, n) 
     725        return new_BPV_from_PBPolyVector(self._parent, v) 
     726 
     727    def __len__(self): 
     728        return self._S.nGenerators() 
     729 
     730    def __getitem__(self, int i): 
     731        return new_BP_from_PBPoly(self._parent, GB_get_ith_gen(self._S, i)) 
     732 
     733    def __getattr__(self, name): 
     734        if name is 'enabledLog': 
     735            return self._S.enabledLog 
     736        if name is 'reductionSteps': 
     737            return self._S.reductionSteps 
     738        if name is 'normalForms': 
     739            return self._S.normalForms 
     740        if name is 'currentDegree': 
     741            return self._S.currentDegree 
     742        if name is 'chainCriterions': 
     743            return self._S.chainCriterions 
     744        if name is 'variableChainCriterions': 
     745            return self._S.variableChainCriterions 
     746        if name is 'easyProductCriterions': 
     747            return self._S.easyProductCriterions 
     748        if name is 'extendedProductCriterions': 
     749            return self._S.extendedProductCriterions 
     750        if name is 'averageLength': 
     751            return self._S.averageLength 
     752        if name is 'optRedTail': 
     753            return self._S.optRedTail 
     754        if name is 'optLazy': 
     755            return self._S.optLazy 
     756        if name is 'optLL': 
     757            return self._S.optLL 
     758        if name is 'optDelayNonMinimals': 
     759            return self._S.optDelayNonMinimals 
     760        if name is 'optBrutalReductions': 
     761            return self._S.optBrutalReductions 
     762        if name is 'optExchange': 
     763            return self._S.optExchange 
     764        if name is 'optAllowRecursion': 
     765            return self._S.optAllowRecursion 
     766        if name is 'optRedTailDegGrowth': 
     767            return self._S.optRedTailDegGrowth 
     768        if name is 'optStepBounded': 
     769            return self._S.optStepBounded 
     770        if name is 'optLinearAlgebraInLastBlock': 
     771            return self._S.optLinearAlgebraInLastBlock 
     772        if name is 'optRedTailInLastBlock': 
     773            return self._S.optRedTailInLastBlock, 
     774        if name is 'reduceByTailReduced': 
     775            return self._S.reduceByTailReduced 
     776        if name is 'monomials': 
     777            return new_BS_from_PBSet(self._S.monomials) 
     778        if name is 'llReductor': 
     779            return new_BS_from_PBSet(self._S.llReductor) 
     780        else: 
     781            raise AttributeError, name  
     782         
     783    def __setattr__(self, name, val): 
     784        if name is 'enabledLog': 
     785            self._S.enabledLog = val 
     786        elif name is 'reductionSteps': 
     787            self._S.reductionSteps = val 
     788        elif name is 'normalForms': 
     789            self._S.normalForms = val 
     790        elif name is 'currentDegree': 
     791            self._S.currentDegree = val 
     792        elif name is 'chainCriterions': 
     793            self._S.chainCriterions = val 
     794        elif name is 'variableChainCriterions': 
     795            self._S.variableChainCriterions = val 
     796        elif name is 'easyProductCriterions': 
     797            self._S.easyProductCriterions = val 
     798        elif name is 'extendedProductCriterions': 
     799            self._S.extendedProductCriterions = val 
     800        elif name is 'averageLength': 
     801            self._S.averageLength = val 
     802        elif name == 'optRedTail': 
     803            self._S.optRedTail = val 
     804        elif name is 'optLazy': 
     805            self._S.optLazy = val 
     806        elif name is 'optLL': 
     807            self._S.optLL = val 
     808        elif name is 'optDelayNonMinimals': 
     809            self._S.optDelayNonMinimals = val 
     810        elif name is 'optBrutalReductions': 
     811            self._S.optBrutalReductions = val 
     812        elif name is 'optExchange': 
     813            self._S.optExchange = val 
     814        elif name is 'optAllowRecursion': 
     815            self._S.optAllowRecursion = val 
     816        elif name is 'optRedTailDegGrowth': 
     817            self._S.optRedTailDegGrowth = val 
     818        elif name is 'optStepBounded': 
     819            self._S.optStepBounded = val 
     820        elif name is 'optLinearAlgebraInLastBlock': 
     821            self._S.optLinearAlgebraInLastBlock = val 
     822        elif name is 'optRedTailInLastBlock': 
     823            self._S.optRedTailInLastBlock = val 
     824        elif name is 'reduceByTailReduced': 
     825            self._S.reduceByTailReduced = val 
     826        else: 
     827            raise AttributeError, name  
     828 
    587829cdef inline CCuddNavigator new_CN_from_PBNavigator(PBNavigator juice): 
    588830    """ 
     
    615857    return new_BS_from_PBSet(b) 
    616858 
     859def get_order_code(): 
     860    R = get_cring() 
     861    return (<BooleanPolynomialRing>R)._R.getOrderCode() 
     862 
     863def change_ordering(order): 
     864    pb_change_ordering(order) 
     865 
     866def parallel_reduce(BooleanPolynomialVector inp, GroebnerStrategy strat, \ 
     867                                    int average_steps, double delay_f): 
     868    return new_BPV_from_PBPolyVector(inp._parent, \ 
     869        pb_parallel_reduce(inp._vec, strat._S, average_steps, delay_f)) 
     870     
    617871cdef BooleanPolynomialRing cur_ring 
    618872ring_callbacks = [] 
Note: See TracChangeset for help on using the changeset viewer.