source: git/kernel/f5lists.cc @ 418bd6

spielwiese
Last change on this file since 418bd6 was 418bd6, checked in by Christian Eder, 15 years ago
added idea for termination of F5: split critical pairs in "useful" and "useless" ones, check later on if there are "useful" ones left, else terminate the algorithm. git-svn-id: file:///usr/local/Singular/svn/trunk@12147 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 27.6 KB
RevLine 
[71f00c5]1#include "mod2.h"
2
[ae5177]3#ifdef HAVE_F5
[71f00c5]4#include "kutil.h"
5#include "structs.h"
6#include "omalloc.h"
7#include "polys.h"
8#include "p_polys.h"
9#include "ideals.h"
10#include "febase.h"
11#include "kstd1.h"
12#include "khstd.h"
13#include "kbuckets.h"
14#include "weight.h"
15#include "intvec.h"
16#include "pInline1.h"
17#include "f5gb.h"
[5d0556]18#include "f5data.h"
[f4e338f]19#include "f5lists.h"
[71f00c5]20
21/*
22====================================
23functions working on the class LNode
24====================================
25*/
26
[a0350e9]27// generating new list elements (labeled / classical polynomial / LNode view)
[9bb97e]28LNode::LNode() {
[87beab7]29    data                =   NULL;
30    next                =   NULL;
[9bb97e]31}
[a05c71]32LNode::LNode(LPolyOld* lp) {
[87beab7]33    data                =   lp;
34    next                =   NULL;
[71f00c5]35}
36       
[a05c71]37LNode::LNode(LPolyOld* lp, LNode* l) {
[598870]38//Print("HIER LNODE\n");
[87beab7]39    data                =   lp;
40    next                =   l;
[66e7b5]41}
[87beab7]42
[a05c71]43LNode::LNode(poly t, int i, poly p, RuleOld* r) {
44LPolyOld* lp           =   new LPolyOld(t,i,p,r);
[87beab7]45data                =   lp;
46next                =   NULL;
[71f00c5]47}
48       
[a05c71]49LNode::LNode(poly t, int i, poly p, RuleOld* r, LNode* l) {
50    LPolyOld* lp           =   new LPolyOld(t,i,p,r);
[87beab7]51    data                =   lp;
52    next                =   l;
[66e7b5]53}
54
[9cb4078]55LNode::LNode(LNode* ln) {
[a05c71]56    data                =   ln->getLPolyOld();
[87beab7]57    next                =   ln->getNext();
[71f00c5]58}
59       
60LNode::~LNode() {
[416ea2]61    //delete next;
[55a828]62    //Print("DELETE LNODE\n");
[71f00c5]63    delete data;   
64}
[338842d]65
66void LNode::deleteAll() {
67    while(NULL != next) {
[55a828]68        //Print("%p\n",next);
69        //pWrite(next->data->getPoly());
[338842d]70        next->deleteAll();
71    }
72    delete data;
73}
74
[d51339]75// insert new elements to the list always at the end (labeled / classical polynomial view)
76// needed for list gPrev
[a05c71]77inline LNode* LNode::insert(LPolyOld* lp) {
[598870]78    //Print("LAST GPREV: ");
79    //pWrite(this->getPoly());
[e3b5ed]80    if(NULL == this) {
81        LNode* newElement   =   new LNode(lp,this);
82        return newElement;
83    }
84    else {
85        LNode* newElement   =   new LNode(lp, NULL);
86        this->next          =   newElement;
87        return newElement;
88    }
[71f00c5]89}
90       
[a05c71]91inline LNode* LNode::insert(poly t, int i, poly p, RuleOld* r) {
[e3b5ed]92    if(NULL == this) {
93        LNode* newElement   =   new LNode(t,i,p,r,this);
94        return newElement;
95    }
96    else {
97        LNode* newElement   =   new LNode(t, i, p, r, NULL);
98        this->next          =   newElement;
99        return newElement;
100    }
[71f00c5]101}
[416ea2]102
[d51339]103// insert new elements to the list always in front (labeled / classical polynomial view)
104// needed for sPolyList
[a05c71]105inline LNode* LNode::insertSP(LPolyOld* lp) {
[d51339]106    LNode* newElement   =   new LNode(lp, this);
[c9193a]107    //Print("INSERTED IN SPOLYLIST: ");
108    //pWrite(lp->getTerm());
[d51339]109    return newElement;
110}
111       
[a05c71]112inline LNode* LNode::insertSP(poly t, int i, poly p, RuleOld* r) {
[338842d]113    LNode* newElement   =   new LNode(t, i, p, r, this);
[c9193a]114     //Print("INSERTED IN SPOLYLIST: ");
115  //pWrite(t);
[8066e80]116return newElement;
[416ea2]117}
[cce6ed3]118// insert new elemets to the list w.r.t. increasing labels
119// only used for the S-polys to be reduced (TopReduction building new S-polys with higher label)
[a05c71]120inline LNode* LNode::insertByLabel(poly t, int i, poly p, RuleOld* r) {
[c9193a]121    //Print("ADDING SOLYS TO THE LIST\n");
122    //Print("new element: ");
123    //pWrite(t);
[c4158f]124       if(NULL == this) { // || NULL == data) {
[338842d]125        LNode* newElement   =   new LNode(t, i, p, r, this);
[cce6ed3]126        return newElement;
127    }
128    else {
[c9193a]129         //Print("tested element1: ");
130    //pWrite(this->getTerm());
[61944d0]131        if(-1 == pLmCmp(t,this->getTerm())) {
[c9193a]132            //Print("HIERDRIN\n");
[338842d]133            LNode* newElement   =   new LNode(t, i, p, r, this);
[c9193a]134            //Print("%p\n",this);
135            //Print("%p\n",newElement->next);
[70c15e]136            return newElement;
137        }
138        else {
139            LNode* temp = this;
140            while(NULL != temp->next && NULL != temp->next->data) {
[c9193a]141                //Print("tested element: ");
142                //pWrite(temp->getTerm());
[8066e80]143 if(-1 == pLmCmp(t,temp->next->getTerm())) {
[338842d]144                    LNode* newElement   =   new LNode(t, i, p, r, temp->next);
[70c15e]145                    temp->next          =   newElement;
146                    return this;
147                }
148                else {
149                    temp = temp->next;
[598870]150                    //Print("%p\n",temp);
151                    //Print("%p\n",temp->data);
[70c15e]152                   
[598870]153                    //Print("%p\n",temp->next);
[70c15e]154                }
[cce6ed3]155            }
[598870]156        //Print("HIER\n");
[338842d]157            LNode* newElement   =   new LNode(t, i, p, r, temp->next);
[70c15e]158            temp->next          =   newElement;
159            return this;
[cce6ed3]160        }
161    }
162}
163
[f16a76d]164inline LNode* LNode::insertFirst(LNode* l) {
165    l->next =   this;
166    return l;
167}
168
[e90881]169inline LNode* LNode::insertByLabel(LNode* l) {
[f16a76d]170    //Print("ADDING SOLYS TO THE LIST\n");
[e90881]171    //Print("new element: ");
172    //pWrite(t);
173       if(NULL == this) { // || NULL == data) {
174        l->next =   this;
175        return l;
176    }
177    else {
178         //Print("tested element1: ");
179    //pWrite(this->getTerm());
180        if(-1 == pLmCmp(l->getTerm(),this->getTerm())) {
181            //Print("HIERDRIN\n");
182            l->next =   this;
183            //Print("%p\n",this);
184            //Print("%p\n",newElement->next);
185            return l;
186        }
187        else {
188            LNode* temp = this;
189            while(NULL != temp->next && NULL != temp->next->data) {
190                //Print("tested element: ");
191                //pWrite(temp->getTerm());
192                if(-1 == pLmCmp(l->getTerm(),temp->next->getTerm())) {
193                    l->next     =   temp->next;
194                    temp->next  =   l;
195                    return this;
196                }
197                else {
198                    temp = temp->next;
199                    //Print("%p\n",temp);
200                    //Print("%p\n",temp->data);
201                   
202                    //Print("%p\n",temp->next);
203                }
204            }
205        //Print("HIER\n");
206            l->next     =   temp->next;
207            temp->next  =   l;
208            return this;
209        }
210    }
211}
212
[cce6ed3]213// deletes the first elements of the list with the same degree
[0179d5]214// only used for the S-polys, which are already sorted by increasing degree by CListOld
[cce6ed3]215LNode*  LNode::deleteByDeg() {
216    return this;
217}
218
[71f00c5]219// get next from current LNode
220LNode* LNode::getNext() {
221    return next;
222}
[d51339]223
[a05c71]224// get the LPolyOld* out of LNode*
225LPolyOld* LNode::getLPolyOld() {
[71f00c5]226    return data;
227}
228
[a05c71]229// get the data from the LPolyOld saved in LNode
[66e7b5]230poly LNode::getPoly() {
[71f00c5]231    return data->getPoly();
232}
233
[66e7b5]234poly LNode::getTerm() {
[cce6ed3]235    return data->getTerm();
236}
237
[66e7b5]238int LNode::getIndex() {
[cce6ed3]239    return data->getIndex();
240}
241
[a05c71]242RuleOld* LNode::getRuleOld() {
243    return data->getRuleOld();
[87beab7]244}
245
[a05c71]246void LNode::setRuleOld(RuleOld* r) {
247    return data->setRuleOld(r);
[c3efd3b]248}
249
[e90881]250bool LNode::getDel() {
251    return data->getDel();
252}
253
[a05c71]254// set the data from the LPolyOld saved in LNode
[9bb97e]255void LNode::setPoly(poly p) {
256    data->setPoly(p);
257}
258
259void LNode::setTerm(poly t) {
260    data->setTerm(t);
261}
262
263void LNode::setIndex(int i) {
264    data->setIndex(i);
265}
266
[61944d0]267void LNode::setNext(LNode* l) {
268    next    =   l;
269}
270
[e90881]271void LNode::setDel(bool d) {
272    data->setDel(d);
273}
274
[71f00c5]275// test if for any list element the polynomial part of the data is equal to *p
[a0350e9]276bool LNode::polyTest(poly* p) {
[71f00c5]277    LNode* temp = new LNode(this);
278    while(NULL != temp) {
[66e7b5]279        if(pComparePolys(temp->getPoly(),*p)) {
[71f00c5]280            return 1;
281        }
282        temp = temp->next;
283    }
284    return 0;
285}
286
[cce6ed3]287LNode* LNode::getNext(LNode* l) {
288    return l->next;
289}
[71f00c5]290
[d51339]291// for debugging
292void LNode::print() {
293    LNode* temp = this;
294    Print("___________________List of S-polynomials______________________:\n");
[598870]295    Print("%p\n",this);
[70c15e]296    while(NULL != temp && NULL != temp->data) {
[d51339]297        Print("Index: %d\n",temp->getIndex());
298        Print("Term: ");
[61944d0]299        pWrite(temp->getTerm());
[d51339]300        Print("Poly: ");
[61944d0]301        pWrite(temp->getPoly());
[f16a76d]302        Print("%p\n",temp->getPoly());
[e90881]303        Print("DELETE? %d\n",temp->getDel());
[d51339]304        temp = temp->next;
305    }
[8066e80]306    Print("_______________________________________________________________\n");
[d51339]307}
308
[e90881]309int LNode::count(LNode* l) {
310    int nonDel  =   0;
311    LNode* temp =   l;
312    while(NULL != temp) {
313        if(!temp->getDel()) {
314            nonDel++;
315            temp    =   temp->next;
316        }
317        else {
318            temp    =   temp->next;
319        }
320    }
321    return nonDel;
322}
[d51339]323
[71f00c5]324/*
325====================================
326functions working on the class LList
327====================================
328*/
329
[9bb97e]330LList::LList() {
[c4158f]331    first   =   last    =   NULL;;
[9bb97e]332    length  =   0;
333}
334
[a05c71]335LList::LList(LPolyOld* lp) {
[9bb97e]336    first   =   new LNode(lp);
[416ea2]337    last    =   first;
[9bb97e]338    length  =   1;
[71f00c5]339}
340
[a05c71]341LList::LList(poly t,int i,poly p,RuleOld* r) {
[87beab7]342    first   =   new LNode(t,i,p,r);
[416ea2]343    last    =   first;
[9bb97e]344    length  =   1;
[71f00c5]345} 
346
347LList::~LList() {
[338842d]348    LNode* temp;
349    while(first) {
350        temp    =   first;
351        first   =   first->getNext();
352        delete  temp;
[55a828]353        //Print("%p\n",first);
[338842d]354    }
[71f00c5]355}
356
[d51339]357// insertion at the end of the list, needed for gPrev
[a05c71]358void LList::insert(LPolyOld* lp) {
[d51339]359    last = last->insert(lp);
[e3b5ed]360    if(NULL == first) {
361        first   =   last;
362    }
[598870]363    //Print("NEW LAST GPREV: ");
364    //pWrite(last->getPoly());
[e3b5ed]365    //Print("%p\n",first);
366    //pWrite(first->getPoly());
[9bb97e]367    length++;
[598870]368    //Print("LENGTH %d\n",length);
[71f00c5]369}
370
[a05c71]371void LList::insert(poly t,int i, poly p, RuleOld* r) {
[d51339]372    last = last->insert(t,i,p,r);
[e3b5ed]373    if(NULL == first) {
374        first   =   last;
375    }
[d51339]376    length++;
[598870]377    //Print("LENGTH %d\n",length);
[d51339]378}
379
380// insertion in front of the list, needed for sPolyList
[a05c71]381void LList::insertSP(LPolyOld* lp) {
[d51339]382    first = first->insertSP(lp);
[87beab7]383    length++;
[598870]384    //Print("LENGTH %d\n",length);
[87beab7]385}
386
[a05c71]387void LList::insertSP(poly t,int i, poly p, RuleOld* r) {
[d51339]388    first = first->insertSP(t,i,p,r);
[416ea2]389    length++;
[598870]390    //Print("LENGTH %d\n",length);
[416ea2]391}
392
[d51339]393
[a05c71]394void LList::insertByLabel(poly t, int i, poly p, RuleOld* r) {
[87beab7]395    first = first->insertByLabel(t,i,p,r);
[9bb97e]396    length++;
[598870]397    //Print("LENGTH %d\n",length);
[71f00c5]398}
399
[f16a76d]400void LList::insertFirst(LNode* l) {
401    first = first->insertFirst(l);
402    length++;
403    //Print("LENGTH %d\n",length);
404}
405
[87beab7]406void LList::insertByLabel(LNode* l) {
[e90881]407    first = first->insertByLabel(l);
[9bb97e]408    length++;
[598870]409    //Print("LENGTH %d\n",length);
[71f00c5]410}
411
[cce6ed3]412void LList::deleteByDeg() {
413    first = first->deleteByDeg();
414}
415
416bool LList::polyTest(poly* p) {
417    return first->polyTest(p);
[71f00c5]418}
419
420LNode* LList::getFirst() {
421    return first;
422}
423
[416ea2]424LNode* LList::getLast() {
425    return last;
426}
427
[9bb97e]428int LList::getLength() {
429    return length;
430}
431
[fcb8022]432void LList::setFirst(LNode* l) {
[61944d0]433    LNode* temp =   first;
434    temp->setNext(NULL);
[fcb8022]435    first       =   l;
[416ea2]436    length--;
[fcb8022]437}
438
[d51339]439void LList::print() {
440    first->print();
441}
[fcb8022]442
[e90881]443int LList::count(LNode* l) {
444    return first->count(l);
445}
[a0350e9]446/*
447=======================================
[66e7b5]448functions working on the class LTagNode
[a0350e9]449=======================================
450*/
[87beab7]451LTagNode::LTagNode() {
452    data    =   NULL;
453    next    =   NULL;
454}
[a0350e9]455
[66e7b5]456LTagNode::LTagNode(LNode* l) {
[a0350e9]457    data = l;
458    next = NULL;
459}
460       
[66e7b5]461LTagNode::LTagNode(LNode* l, LTagNode* n) {
462    data = l;
463    next = n;
464}
465
466 LTagNode::~LTagNode() {
[a0350e9]467    delete data;   
468}
469       
[66e7b5]470// declaration with first as parameter due to sorting of LTagList
471LTagNode* LTagNode::insert(LNode* l) {
472    LTagNode* newElement  = new LTagNode(l, this);
473    return newElement;
[a0350e9]474}
475
[66e7b5]476LNode* LTagNode::getLNode() {
[a0350e9]477    return this->data;
478}
479
[d51339]480LTagNode* LTagNode::getNext() {
481    return next;
482}
483
[66e7b5]484// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
[a05c71]485//       Thus given actual index i and idx being the index of the LPolyOld under investigation
[66e7b5]486//       the element on position length-idx is the right one
487LNode* LTagNode::get(int idx, int length) {
488    if(idx == 1) {
489        return NULL;
490    }
491    else {
492        int j;
493        LTagNode* temp = this; // last
494        for(j=1;j<=length-idx+1;j++) {
495            temp = temp->next;
496        }
497        return temp->data;
[a0350e9]498    }
499}
500
[66e7b5]501
[a0350e9]502/*
503=======================================
[66e7b5]504functions working on the class LTagList
[a0350e9]505=======================================
506*/
[87beab7]507LTagList::LTagList() {
508    LTagNode* first =   new LTagNode();
[d51339]509   
[87beab7]510    length          =   0;
511}
[a0350e9]512
[66e7b5]513LTagList::LTagList(LNode* l) {
514    LTagNode* first =   new LTagNode(l);
515    length          =   1;
[a0350e9]516}
517
[6b0aa2]518LTagList::~LTagList() {
519    LTagNode* temp;
520    while(first) {
521        temp    =   first;
522        first   =   first->getNext();
523        delete  temp;
524        //Print("%p\n",first);
525    }
526}
527
[66e7b5]528// declaration with first as parameter in LTagNode due to sorting of LTagList
529void LTagList::insert(LNode* l) {
530    first   =   first->insert(l);
531    length++;
[a0350e9]532}
533
[d51339]534void LTagList::setFirstCurrentIdx(LNode* l) {
535    firstCurrentIdx =   l;
536}
537
[66e7b5]538LNode* LTagList::get(int idx) {
539    return first->get(idx, length);
[a0350e9]540}
541
[87beab7]542LNode* LTagList::getFirst() {
543    return first->getLNode();
544}
545
[d51339]546LNode* LTagList::getFirstCurrentIdx() {
547    return firstCurrentIdx;
548}
[87beab7]549
550/*
551=====================================
552functions working on the class TopRed
553=====================================
554*/
555
556TopRed::TopRed() {
557    _completed  =   NULL;
558    _toDo       =   NULL;
559}
560
561TopRed::TopRed(LList* c, LList* t) {
562    _completed  =   c;
563    _toDo       =   t;
564}
565
566LList* TopRed::getCompleted() {
567    return _completed;
568}
569
570LList* TopRed::getToDo() {
571    return _toDo;
572}
573
[a0350e9]574/*
575====================================
576functions working on the class CNode
577====================================
578*/
579
[66e7b5]580CNode::CNode() {
581    data    =   NULL;   
582    next    =   NULL;   
583}
584
[0179d5]585CNode::CNode(CPairOld* c) {
[a0350e9]586    data    =   c;   
587    next    =   NULL;   
588}
589
[0179d5]590CNode::CNode(CPairOld* c, CNode* n) {
[66e7b5]591    data    =   c;   
592    next    =   n;   
593}
594
[a0350e9]595CNode::~CNode() {
596    delete data;
597}
598
599// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
600// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
601// working only with linked, but not doubly linked lists due to memory usage we have to check the
602// insertion around the first element separately from the insertion around all other elements in the list
[0179d5]603CNode* CNode::insert(CPairOld* c) {
[7c81165]604    if(NULL == this) {
[66e7b5]605        CNode* newElement   =   new CNode(c, this);
[a0350e9]606        return newElement;
607    }
[66e7b5]608    else {
609        poly u1 = ppMult_qq(c->getT1(),c->getLp1Term());
610        if( c->getDeg() < this->data->getDeg() ) { // lower degree than the first list element
611            CNode* newElement   =   new CNode(c, this);
[a0350e9]612            return newElement;
613        }
[66e7b5]614        if( c->getDeg() == this->data->getDeg() ) { // same degree than the first list element
[fcb8022]615            if(1 != pLmCmp(u1,ppMult_qq(this->data->getT1(), this->data->getLp1Term()))) {
[598870]616                //pWrite(u1);
617                //Print("Multi-Term in CritPairs Sortierung altes Element: ");
618                //pWrite(ppMult_qq(this->data->getT1(),this->data->getLp1Term()));
[66e7b5]619                CNode* newElement   =   new CNode(c, this);
620                return newElement;
621            }
622            else {
[598870]623                //Print("Insert Deg\n");
[66e7b5]624                CNode* temp = this;
[7c81165]625                while(  NULL != temp->next) {
[66e7b5]626                    if(temp->next->data->getDeg() == c->getDeg() ) { 
627                        if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) {
628                            temp = temp->next;
629                        }
630                        else {
631                            CNode* newElement   =   new CNode(c, temp->next);
632                            temp->next          =   newElement;
633                            return this;
634                        } 
[a0350e9]635                    }
636                    else {
[66e7b5]637                        CNode* newElement   =   new CNode(c, temp->next);
[a0350e9]638                        temp->next          =   newElement;
639                        return this;
[66e7b5]640                    }
[a0350e9]641                }
[7c81165]642                CNode* newElement   =   new CNode(c, NULL);
[a0350e9]643                temp->next          =   newElement;
644                return this;
645            }
[66e7b5]646        } // outer if-clause
647        if( c->getDeg() > this->data->getDeg() ) { // greater degree than the first list element
648            CNode* temp =   this;
[7c81165]649            while( NULL != temp->next ) {   
[66e7b5]650                if( c->getDeg() < temp->next->data->getDeg() ) {
651                    CNode* newElement   =   new CNode(c, temp->next);
[a0350e9]652                    temp->next          =   newElement;
653                    return this;
654                }
[66e7b5]655                if( c->getDeg() == temp->next->data->getDeg() ) {
[fcb8022]656                    if(1 != pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) { 
[66e7b5]657                        CNode* newElement   =   new CNode(c, temp->next);
658                        temp->next          =   newElement;
659                        return this;
660                    }
661                    else {
662                        temp = temp->next;
[7c81165]663                        while(  NULL != temp->next ) {
[66e7b5]664                            if( temp->next->data->getDeg() == c->getDeg() ) { 
665                                if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),
666                                               temp->next->data->getLp1Term()))) {
667                                    temp = temp->next;
668                                }
669                                else {
670                                    CNode* newElement   =   new CNode(c, temp->next);
671                                    temp->next          =   newElement;
672                                    return this;
673                                } 
[a0350e9]674                            }
675                            else {
[66e7b5]676                                CNode* newElement   =   new CNode(c, temp->next);
[a0350e9]677                                temp->next          =   newElement;
678                                return this;
[66e7b5]679                            }
[a0350e9]680                        }
[7c81165]681                        CNode* newElement   =   new CNode(c, NULL);
[66e7b5]682                        temp->next          =   newElement;
683                        return this;
[a0350e9]684                    }
[66e7b5]685                }
686                if( c->getDeg() > temp->next->data->getDeg() ) {
687                    temp    =   temp->next;
[a0350e9]688                }
689            }
[7c81165]690            CNode* newElement   =   new CNode(c, NULL);
[66e7b5]691            temp->next          =   newElement;
692            return this;
[a0350e9]693        }
694    }
695}
696
[0179d5]697// get the first elements from CListOld which by the above sorting have minimal degree
[cce6ed3]698CNode* CNode::getMinDeg() {
699    CNode* temp = this;
[7c81165]700    while(NULL != temp) {
701        while(NULL != temp->next && temp->next->data->getDeg() == this->data->getDeg()) {
[cce6ed3]702            temp = temp->next;
703        }
704        CNode* returnCNode  =   temp->next;   
[0179d5]705        // every CListOld should end with a (NULL,NULL) element for a similar behaviour
[9bb97e]706        // using termination conditions throughout the algorithm
[7c81165]707        temp->next          =   NULL;
[cce6ed3]708        return returnCNode;
709    }
710    return NULL;
711}
712
[0179d5]713CPairOld* CNode::getData() {
[9bb97e]714    return data;
715}
716
717CNode* CNode::getNext() {
718    return next;
719}
720
[a05c71]721LPolyOld* CNode::getAdLp1() {
[9bb97e]722    return this->data->getAdLp1();
723}
724
[a05c71]725LPolyOld* CNode::getAdLp2() {
[9bb97e]726    return this->data->getAdLp2();
727}
728
[66e7b5]729poly CNode::getLp1Poly() {
730    return this->data->getLp1Poly();
731}
732
733poly CNode::getLp2Poly() {
734    return this->data->getLp2Poly();
735}
736
737poly CNode::getLp1Term() {
738    return this->data->getLp1Term();
739}
740
741poly CNode::getLp2Term() {
742    return this->data->getLp2Term();
743}
744
745int CNode::getLp1Index() {
746    return this->data->getLp1Index();
747}
748
749int CNode::getLp2Index() {
750    return this->data->getLp2Index();
751}
752
753poly CNode::getT1() {
754    return this->data->getT1();
755}
756
[9bb97e]757poly* CNode::getAdT1() {
758    return this->data->getAdT1();
759}
760
[66e7b5]761poly CNode::getT2() {
762    return this->data->getT2();
763}
764
[9bb97e]765poly* CNode::getAdT2() {
766    return this->data->getAdT2();
767}
768
[418bd6]769bool CNode::getDel() {
770  return data->getDel();
771}
772
[a05c71]773RuleOld* CNode::getTestedRuleOld() {
774    return this->data->getTestedRuleOld();
[9bb97e]775}
776
[66e7b5]777// for debugging
778void CNode::print() {
779    CNode* temp = this;
[d51339]780    Print("___________________List of critical pairs______________________:\n");
[7c81165]781    while(NULL != temp) {
[f16a76d]782        pWrite(ppMult_qq(temp->getT1(),temp->getLp1Term()));
[d51339]783        Print("LP1 Index: %d\n",temp->getLp1Index());
[66e7b5]784        Print("T1: ");
785        pWrite(temp->getT1());
[1534d9]786        Print("%p\n",temp->getT1());
[d51339]787        Print("LP1 Term: ");
[66e7b5]788        pWrite(temp->getLp1Term());
[d51339]789        Print("LP1 Poly: ");
790        pWrite(temp->getLp1Poly());
791        Print("LP2 Index: %d\n",temp->getLp2Index());
792        Print("T2: ");
[66e7b5]793        pWrite(temp->getT2());
[1534d9]794        Print("%p\n",temp->getT2());
[d51339]795        Print("LP2 Term: ");
[66e7b5]796        pWrite(temp->getLp2Term());
[d51339]797        Print("LP2 Poly: ");
798        pWrite(temp->getLp2Poly());
[66e7b5]799        Print("\n");
800        temp = temp->next;
801    }
802}
[cce6ed3]803
[a0350e9]804/*
805====================================
[0179d5]806functions working on the class CListOld
[a0350e9]807====================================
808*/
[0179d5]809// for initialization of CListOlds, last element alwas has data=NULL and next=NULL
810CListOld::CListOld() {
[7c81165]811    first   =   NULL;
[66e7b5]812}
813
[0179d5]814CListOld::CListOld(CPairOld* c) {
[66e7b5]815    first   =   new CNode(c);
[a0350e9]816}
817
[0179d5]818CListOld::~CListOld() {
[9cb4078]819    CNode* temp;
[7c81165]820    while(NULL != first) {
[9cb4078]821        temp    =   first;
822        first   =   first->getNext();
823        delete  temp;
824    }
[a0350e9]825}
826
827// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
828// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
[0179d5]829void CListOld::insert(CPairOld* c) {
[7c81165]830    first = first->insert(c);
[71f00c5]831}
[cce6ed3]832
[0179d5]833CNode* CListOld::getFirst() {
[9bb97e]834    return first;
835}
836
[0179d5]837// get the first elements from CListOld which by the above sorting have minimal degree
[cce6ed3]838// returns the pointer on the first element of those
[0179d5]839CNode* CListOld::getMinDeg() {
[cce6ed3]840    CNode* temp     =   first;
841    first           =   first->getMinDeg();
842    return temp;
843}
844
[0179d5]845void CListOld::print() {
[66e7b5]846    first->print();
847}
[cce6ed3]848
849/*
850====================================
851functions working on the class RNode
852====================================
853*/
[66e7b5]854RNode::RNode() {
[55a828]855    //Print("HIER RNODE CONSTRUCTOR\n");
[66e7b5]856    data    =   NULL;
857    next    =   NULL;
858}
859
[a05c71]860RNode::RNode(RuleOld* r) {
[cce6ed3]861    data    =   r;
862    next    =   NULL;
863}
864
865RNode::~RNode() {
[a05c71]866    //Print("DELETE RuleOld\n");
[cce6ed3]867    delete  data;
868}
869
[a05c71]870RNode* RNode::insert(RuleOld* r) {
[cce6ed3]871    RNode* newElement   =   new RNode(r);
872    newElement->next    =   this;
873    return newElement;
874}
875
[87beab7]876RNode* RNode::insert(int i, poly t) {
[55a828]877    //Print("IN INSERT: ");
878    //pWrite(t);
[a05c71]879    RuleOld*   r           =   new RuleOld(i,t);
880    //Print("ADDRESS OF RuleOld: %p\n",r);
[9bb97e]881    RNode* newElement   =   new RNode(r);
[55a828]882    //Print("ADDRESS OF RNODE: %p\n",newElement);
[a05c71]883    //Print("ADDRESS OF RNODE DATA: %p\n",newElement->getRuleOld());
[f6c7c9b]884    newElement->next    =   this;
885    return newElement;
[787685]886}
887
888
[a05c71]889RNode* RNode::insertOrdered(RuleOld* r) {
[787685]890    RNode* newElement   =   new RNode(r); 
891    RNode* temp         =   this;
892    if(NULL == temp) {
893        newElement->next =   temp;
894        return newElement;
895    }
[a05c71]896    if(1 == pLmCmp(newElement->getRuleOldTerm(),temp->getRuleOldTerm())) {
[787685]897        newElement->next =   temp;
898        return newElement;
[1534d9]899    }
900    else {
[a05c71]901        while(NULL != temp && 1 ==  pLmCmp(temp->getRuleOldTerm(),newElement->getRuleOldTerm())) {
[787685]902            temp    =   temp->getNext();
[1534d9]903        }
[787685]904        newElement->next =   temp;
905        return this;
[1534d9]906    }
[9bb97e]907}
908
[787685]909
[66e7b5]910RNode* RNode::getNext() {
911    return next;
912}   
913
[a05c71]914RuleOld* RNode::getRuleOld() {
[66e7b5]915    return data;
916}
917
[a05c71]918int RNode::getRuleOldIndex() {
[66e7b5]919    return data->getIndex();
920}
921
[a05c71]922poly RNode::getRuleOldTerm() {
[66e7b5]923    return data->getTerm();
924}
925
[6b0aa2]926void RNode::print() {
927    RNode* temp  =   this;
928    while(NULL != temp) {
[a05c71]929        pWrite(temp->getRuleOldTerm());
930        Print("%d\n\n",temp->getRuleOldIndex());
[6b0aa2]931        temp    =   temp->getNext();
932    }
933}
934
[cce6ed3]935/*
936====================================
937functions working on the class RList
938====================================
939*/
[66e7b5]940RList::RList() {
[1534d9]941    first = NULL;
[66e7b5]942}
943
[a05c71]944RList::RList(RuleOld* r) {
[cce6ed3]945    first = new RNode(r);
946}
947
[338842d]948RList::~RList() {
[9cb4078]949    RNode* temp;
[55a828]950    //Print("%p\n",first);
[1534d9]951    while(first) {
[9cb4078]952        temp    =   first;
953        first   =   first->getNext();
[55a828]954        //Print("1 %p\n",first);
955        //if(first) {
[a05c71]956            //Print("1' %p\n",first->getRuleOld());
[55a828]957            //Print("2 %p\n",first->getNext());
[a05c71]958            //Print("3 %p\n",first->getNext()->getRuleOld());
959            //Print("3 %p\n",first->getNext()->getRuleOldTerm());
[55a828]960        //}
[9cb4078]961        delete  temp;
962    }
[55a828]963    //Print("FERTIG\n");
[9cb4078]964} 
[338842d]965
[87beab7]966void RList::insert(int i, poly t) {
967    first = first->insert(i,t);
[9bb97e]968}
969
[a05c71]970void RList::insert(RuleOld* r) {
[cce6ed3]971    first = first->insert(r);
972}
[66e7b5]973
[a05c71]974void RList::insertOrdered(RuleOld* r) {
[787685]975    first   =   first->insertOrdered(r);
976}
977
[66e7b5]978RNode* RList::getFirst() {
979    return first;
980}
981
[a05c71]982RuleOld* RList::getRuleOld() {
983    return this->getRuleOld();
[66e7b5]984}
985
[6b0aa2]986void RList::print() {
987    first->print();
988}
989
[66e7b5]990/*
991=======================================
992functions working on the class RTagNode
993=======================================
994*/
995
[a41f3aa]996RTagNode::RTagNode() {
997    data = NULL;
998    next = NULL;
999}
1000 
[66e7b5]1001RTagNode::RTagNode(RNode* r) {
1002    data = r;
1003    next = NULL;
1004}
1005       
1006RTagNode::RTagNode(RNode* r, RTagNode* n) {
[e6d283f]1007   
[66e7b5]1008    data = r;
1009    next = n;
1010}
1011
[338842d]1012RTagNode::~RTagNode() {
[66e7b5]1013    delete data;   
1014}
1015       
[fcb8022]1016// declaration with first as parameter due to sorting of RTagList
[66e7b5]1017RTagNode* RTagNode::insert(RNode* r) {
[598870]1018    //Print("Hier1\n");
[66e7b5]1019    RTagNode* newElement  = new RTagNode(r, this);
[598870]1020    //Print("Hier2\n");
[66e7b5]1021    return newElement;
1022}
1023
1024RNode* RTagNode::getRNode() {
[df638fb]1025    //Print("%p\n", this);
1026    //Print("%p\n",this->data);
[66e7b5]1027    return this->data;
1028}
1029
[9cb4078]1030RTagNode* RTagNode::getNext() {
1031    return next;
1032}
1033
[66e7b5]1034// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
[a05c71]1035//       Thus given actual index i and idx being the index of the LPolyOld under investigation
[66e7b5]1036//       the element on position length-idx+1 is the right one
1037RNode* RTagNode::get(int idx, int length) {
[a41f3aa]1038    if(idx==1 || idx==0) {
[87beab7]1039        // NOTE: We set this NULL as putting it the last element in the list, i.e. the element having
1040        //       RNode* = NULL would cost lots of iterations at each step of F5inc, with increasing
1041        //       length of the list this should be prevented
[66e7b5]1042        return NULL;
1043    }
1044    else {
1045        int j;
1046        RTagNode* temp = this; 
[598870]1047    //Print("\n\nHIER IN GET IDX\n");
1048    //Print("FOR LOOP: %d\n",length-idx+1);   
[87beab7]1049    for(j=1; j<=length-idx+1; j++) {
[66e7b5]1050            temp = temp->next;
1051        }
1052        return temp->data;
1053    }
1054}
1055
[fcb8022]1056void RTagNode::set(RNode* r) {
1057    this->data  =   r;
1058}
[66e7b5]1059
[ae5177]1060
[87beab7]1061void RTagNode::print() {
1062    RTagNode* temp  =   this;
[e6d283f]1063    if(NULL != temp && NULL != temp->getRNode()) {
[a05c71]1064        Print("1. element: %d,  ",getRNode()->getRuleOld()->getIndex());
1065        pWrite(getRNode()->getRuleOld()->getTerm());
[87beab7]1066        temp    =   temp->next;
[e6d283f]1067        int i   =   2;
1068        while(NULL != temp->getRNode() && NULL != temp) {
[a05c71]1069            Print("%d. element: %d,  ",i,getRNode()->getRuleOld()->getIndex());
1070            pWrite(getRNode()->getRuleOld()->getTerm());
[e6d283f]1071            temp    =   temp->next;
1072            i++;
1073        }
[87beab7]1074    }
1075}
[ae5177]1076
[66e7b5]1077/*
1078=======================================
1079functions working on the class LTagList
1080=======================================
1081*/
1082
[a41f3aa]1083RTagList::RTagList() {
1084    RTagNode* first =   new RTagNode();
1085    length          =   0;
1086}
1087
[66e7b5]1088RTagList::RTagList(RNode* r) {
1089    RTagNode* first =   new RTagNode(r);
1090    length          =   1;
1091}
1092
[338842d]1093RTagList::~RTagList() {
[9cb4078]1094    RTagNode* temp;
[c4158f]1095    while(first) {
[9cb4078]1096        temp    =   first;
1097        first   =   first->getNext();
1098        delete  temp;
1099    }
[338842d]1100}
1101
[66e7b5]1102// declaration with first as parameter in LTagNode due to sorting of LTagList
1103void RTagList::insert(RNode* r) {
1104    first = first->insert(r);
[598870]1105    //Print("LENGTH:%d\n",length);
[87beab7]1106    length = length +1;
[598870]1107    //Print("LENGTH:%d\n",length);
[66e7b5]1108}
1109
[8978fd]1110RNode* RTagList::getFirst() {
1111    return first->getRNode();
1112}
1113
[66e7b5]1114RNode* RTagList::get(int idx) {
1115    return first->get(idx, length);
1116}
[fcb8022]1117
1118void RTagList::setFirst(RNode* r) {
1119    first->set(r);
1120}
[87beab7]1121
1122void RTagList::print() {
1123    first->print();
1124}
1125
1126int RTagList::getLength() {
1127    return length;
1128}
[71f00c5]1129#endif
Note: See TracBrowser for help on using the repository browser.