source: git/kernel/f5lists.cc @ 6b0aa2

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