source: git/kernel/f5lists.cc @ 2b7bb5d

spielwiese
Last change on this file since 2b7bb5d was e90881, checked in by Christian Eder, 15 years ago
implemented deletion of known useless polynomials before the interreduction of gprev takes place git-svn-id: file:///usr/local/Singular/svn/trunk@11596 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 26.8 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 next;
434    delete data;   
435}
436       
437// declaration with first as parameter due to sorting of LTagList
438LTagNode* LTagNode::insert(LNode* l) {
439    LTagNode* newElement  = new LTagNode(l, this);
440    return newElement;
441}
442
443LNode* LTagNode::getLNode() {
444    return this->data;
445}
446
447LTagNode* LTagNode::getNext() {
448    return next;
449}
450
451// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
452//       Thus given actual index i and idx being the index of the LPoly under investigation
453//       the element on position length-idx is the right one
454LNode* LTagNode::get(int idx, int length) {
455    if(idx == 1) {
456        return NULL;
457    }
458    else {
459        int j;
460        LTagNode* temp = this; // last
461        for(j=1;j<=length-idx+1;j++) {
462            temp = temp->next;
463        }
464        return temp->data;
465    }
466}
467
468
469/*
470=======================================
471functions working on the class LTagList
472=======================================
473*/
474LTagList::LTagList() {
475    LTagNode* first =   new LTagNode();
476   
477    length          =   0;
478}
479
480LTagList::LTagList(LNode* l) {
481    LTagNode* first =   new LTagNode(l);
482    length          =   1;
483}
484
485// declaration with first as parameter in LTagNode due to sorting of LTagList
486void LTagList::insert(LNode* l) {
487    first   =   first->insert(l);
488    length++;
489}
490
491void LTagList::setFirstCurrentIdx(LNode* l) {
492    firstCurrentIdx =   l;
493}
494
495LNode* LTagList::get(int idx) {
496    return first->get(idx, length);
497}
498
499LNode* LTagList::getFirst() {
500    return first->getLNode();
501}
502
503LNode* LTagList::getFirstCurrentIdx() {
504    return firstCurrentIdx;
505}
506
507/*
508=====================================
509functions working on the class TopRed
510=====================================
511*/
512
513TopRed::TopRed() {
514    _completed  =   NULL;
515    _toDo       =   NULL;
516}
517
518TopRed::TopRed(LList* c, LList* t) {
519    _completed  =   c;
520    _toDo       =   t;
521}
522
523LList* TopRed::getCompleted() {
524    return _completed;
525}
526
527LList* TopRed::getToDo() {
528    return _toDo;
529}
530
531/*
532====================================
533functions working on the class CNode
534====================================
535*/
536
537CNode::CNode() {
538    data    =   NULL;   
539    next    =   NULL;   
540}
541
542CNode::CNode(CPair* c) {
543    data    =   c;   
544    next    =   NULL;   
545}
546
547CNode::CNode(CPair* c, CNode* n) {
548    data    =   c;   
549    next    =   n;   
550}
551
552CNode::~CNode() {
553    delete data;
554}
555
556// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
557// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
558// working only with linked, but not doubly linked lists due to memory usage we have to check the
559// insertion around the first element separately from the insertion around all other elements in the list
560CNode* CNode::insert(CPair* c) {
561    if(NULL == this) {
562        CNode* newElement   =   new CNode(c, this);
563        return newElement;
564    }
565    else {
566        poly u1 = ppMult_qq(c->getT1(),c->getLp1Term());
567        if( c->getDeg() < this->data->getDeg() ) { // lower degree than the first list element
568            CNode* newElement   =   new CNode(c, this);
569            return newElement;
570        }
571        if( c->getDeg() == this->data->getDeg() ) { // same degree than the first list element
572            if(1 != pLmCmp(u1,ppMult_qq(this->data->getT1(), this->data->getLp1Term()))) {
573                //pWrite(u1);
574                //Print("Multi-Term in CritPairs Sortierung altes Element: ");
575                //pWrite(ppMult_qq(this->data->getT1(),this->data->getLp1Term()));
576                CNode* newElement   =   new CNode(c, this);
577                return newElement;
578            }
579            else {
580                //Print("Insert Deg\n");
581                CNode* temp = this;
582                while(  NULL != temp->next) {
583                    if(temp->next->data->getDeg() == c->getDeg() ) { 
584                        if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) {
585                            temp = temp->next;
586                        }
587                        else {
588                            CNode* newElement   =   new CNode(c, temp->next);
589                            temp->next          =   newElement;
590                            return this;
591                        } 
592                    }
593                    else {
594                        CNode* newElement   =   new CNode(c, temp->next);
595                        temp->next          =   newElement;
596                        return this;
597                    }
598                }
599                CNode* newElement   =   new CNode(c, NULL);
600                temp->next          =   newElement;
601                return this;
602            }
603        } // outer if-clause
604        if( c->getDeg() > this->data->getDeg() ) { // greater degree than the first list element
605            CNode* temp =   this;
606            while( NULL != temp->next ) {   
607                if( c->getDeg() < temp->next->data->getDeg() ) {
608                    CNode* newElement   =   new CNode(c, temp->next);
609                    temp->next          =   newElement;
610                    return this;
611                }
612                if( c->getDeg() == temp->next->data->getDeg() ) {
613                    if(1 != pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) { 
614                        CNode* newElement   =   new CNode(c, temp->next);
615                        temp->next          =   newElement;
616                        return this;
617                    }
618                    else {
619                        temp = temp->next;
620                        while(  NULL != temp->next ) {
621                            if( temp->next->data->getDeg() == c->getDeg() ) { 
622                                if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),
623                                               temp->next->data->getLp1Term()))) {
624                                    temp = temp->next;
625                                }
626                                else {
627                                    CNode* newElement   =   new CNode(c, temp->next);
628                                    temp->next          =   newElement;
629                                    return this;
630                                } 
631                            }
632                            else {
633                                CNode* newElement   =   new CNode(c, temp->next);
634                                temp->next          =   newElement;
635                                return this;
636                            }
637                        }
638                        CNode* newElement   =   new CNode(c, NULL);
639                        temp->next          =   newElement;
640                        return this;
641                    }
642                }
643                if( c->getDeg() > temp->next->data->getDeg() ) {
644                    temp    =   temp->next;
645                }
646            }
647            CNode* newElement   =   new CNode(c, NULL);
648            temp->next          =   newElement;
649            return this;
650        }
651    }
652}
653
654// get the first elements from CList which by the above sorting have minimal degree
655CNode* CNode::getMinDeg() {
656    CNode* temp = this;
657    while(NULL != temp) {
658        while(NULL != temp->next && temp->next->data->getDeg() == this->data->getDeg()) {
659            temp = temp->next;
660        }
661        CNode* returnCNode  =   temp->next;   
662        // every CList should end with a (NULL,NULL) element for a similar behaviour
663        // using termination conditions throughout the algorithm
664        temp->next          =   NULL;
665        return returnCNode;
666    }
667    return NULL;
668}
669
670CPair* CNode::getData() {
671    return data;
672}
673
674CNode* CNode::getNext() {
675    return next;
676}
677
678LPoly* CNode::getAdLp1() {
679    return this->data->getAdLp1();
680}
681
682LPoly* CNode::getAdLp2() {
683    return this->data->getAdLp2();
684}
685
686poly CNode::getLp1Poly() {
687    return this->data->getLp1Poly();
688}
689
690poly CNode::getLp2Poly() {
691    return this->data->getLp2Poly();
692}
693
694poly CNode::getLp1Term() {
695    return this->data->getLp1Term();
696}
697
698poly CNode::getLp2Term() {
699    return this->data->getLp2Term();
700}
701
702int CNode::getLp1Index() {
703    return this->data->getLp1Index();
704}
705
706int CNode::getLp2Index() {
707    return this->data->getLp2Index();
708}
709
710poly CNode::getT1() {
711    return this->data->getT1();
712}
713
714poly* CNode::getAdT1() {
715    return this->data->getAdT1();
716}
717
718poly CNode::getT2() {
719    return this->data->getT2();
720}
721
722poly* CNode::getAdT2() {
723    return this->data->getAdT2();
724}
725
726Rule* CNode::getTestedRule() {
727    return this->data->getTestedRule();
728}
729
730// for debugging
731void CNode::print() {
732    CNode* temp = this;
733    Print("___________________List of critical pairs______________________:\n");
734    while(NULL != temp) {
735        Print("LP1 Index: %d\n",temp->getLp1Index());
736        Print("T1: ");
737        pWrite(temp->getT1());
738        Print("%p\n",temp->getT1());
739        Print("LP1 Term: ");
740        pWrite(temp->getLp1Term());
741        Print("LP1 Poly: ");
742        pWrite(temp->getLp1Poly());
743        Print("LP2 Index: %d\n",temp->getLp2Index());
744        Print("T2: ");
745        pWrite(temp->getT2());
746        Print("%p\n",temp->getT2());
747        Print("LP2 Term: ");
748        pWrite(temp->getLp2Term());
749        Print("LP2 Poly: ");
750        pWrite(temp->getLp2Poly());
751        Print("\n");
752        temp = temp->next;
753    }
754}
755
756/*
757====================================
758functions working on the class CList
759====================================
760*/
761// for initialization of CLists, last element alwas has data=NULL and next=NULL
762CList::CList() {
763    first   =   NULL;
764}
765
766CList::CList(CPair* c) {
767    first   =   new CNode(c);
768}
769
770CList::~CList() {
771    CNode* temp;
772    while(NULL != first) {
773        temp    =   first;
774        first   =   first->getNext();
775        delete  temp;
776    }
777}
778
779// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
780// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
781void CList::insert(CPair* c) {
782    first = first->insert(c);
783}
784
785CNode* CList::getFirst() {
786    return first;
787}
788
789// get the first elements from CList which by the above sorting have minimal degree
790// returns the pointer on the first element of those
791CNode* CList::getMinDeg() {
792    CNode* temp     =   first;
793    first           =   first->getMinDeg();
794    return temp;
795}
796
797void CList::print() {
798    first->print();
799}
800
801/*
802====================================
803functions working on the class RNode
804====================================
805*/
806RNode::RNode() {
807    //Print("HIER RNODE CONSTRUCTOR\n");
808    data    =   NULL;
809    next    =   NULL;
810}
811
812RNode::RNode(Rule* r) {
813    data    =   r;
814    next    =   NULL;
815}
816
817RNode::~RNode() {
818    //Print("DELETE RULE\n");
819    delete  data;
820}
821
822RNode* RNode::insert(Rule* r) {
823    RNode* newElement   =   new RNode(r);
824    newElement->next    =   this;
825    return newElement;
826}
827
828RNode* RNode::insert(int i, poly t) {
829    //Print("IN INSERT: ");
830    //pWrite(t);
831    Rule*   r           =   new Rule(i,t);
832    //Print("ADDRESS OF RULE: %p\n",r);
833    RNode* newElement   =   new RNode(r);
834    //Print("ADDRESS OF RNODE: %p\n",newElement);
835    //Print("ADDRESS OF RNODE DATA: %p\n",newElement->getRule());
836    newElement->next    =   this;
837    return newElement;
838   
839    /*
840     * not useful, as it does not only adds new rules to be tested but also
841     * deletes rules to be tested if a rule is set to another place in the line
842     *
843    if(NULL == this || this->getRuleIndex() < newElement->getRuleIndex()) {
844        newElement->next    =   this;
845    }
846    else {
847        if(pDeg(newElement->getRuleTerm()) > pDeg(this->getRuleTerm())) {
848                newElement->next    =   this;
849        }
850        if(-1 == pLmCmp(newElement->getRuleTerm(),this->getRuleTerm())) {
851            Print("HAHI\n");
852            Print("%ld\n",pDeg(newElement->getRuleTerm()));
853            Print("%ld\n",pDeg(this->getRuleTerm()));
854           
855            pWrite(newElement->getRuleTerm());
856            pWrite(this->getRuleTerm());
857            RNode* temp    =   this;
858            while(NULL != temp->next && pDeg(newElement->getRuleTerm()) <= pDeg(temp->next->getRuleTerm())
859                    && -1 == pLmCmp(newElement->getRuleTerm(),temp->next->getRuleTerm())) {
860                temp    =   temp->next;
861            }
862            newElement->next    =   temp->next;
863            temp->next          =   newElement;
864            return this;
865        }
866        else {
867            newElement->next    =   this;
868            return newElement;
869        }
870    }
871    return newElement;
872    */
873}
874
875RNode* RNode::getNext() {
876    return next;
877}   
878
879Rule* RNode::getRule() {
880    return data;
881}
882
883int RNode::getRuleIndex() {
884    return data->getIndex();
885}
886
887poly RNode::getRuleTerm() {
888    return data->getTerm();
889}
890
891/*
892====================================
893functions working on the class RList
894====================================
895*/
896RList::RList() {
897    first = NULL;
898}
899
900RList::RList(Rule* r) {
901    first = new RNode(r);
902}
903
904RList::~RList() {
905    RNode* temp;
906    //Print("%p\n",first);
907    while(first) {
908        temp    =   first;
909        first   =   first->getNext();
910        //Print("1 %p\n",first);
911        //if(first) {
912            //Print("1' %p\n",first->getRule());
913            //Print("2 %p\n",first->getNext());
914            //Print("3 %p\n",first->getNext()->getRule());
915            //Print("3 %p\n",first->getNext()->getRuleTerm());
916        //}
917        delete  temp;
918    }
919    //Print("FERTIG\n");
920} 
921
922void RList::insert(int i, poly t) {
923    first = first->insert(i,t);
924}
925
926void RList::insert(Rule* r) {
927    first = first->insert(r);
928}
929
930RNode* RList::getFirst() {
931    return first;
932}
933
934Rule* RList::getRule() {
935    return this->getRule();
936}
937
938/*
939=======================================
940functions working on the class RTagNode
941=======================================
942*/
943
944RTagNode::RTagNode() {
945    data = NULL;
946    next = NULL;
947}
948 
949RTagNode::RTagNode(RNode* r) {
950    data = r;
951    next = NULL;
952}
953       
954RTagNode::RTagNode(RNode* r, RTagNode* n) {
955   
956    data = r;
957    next = n;
958}
959
960RTagNode::~RTagNode() {
961    delete data;   
962}
963       
964// declaration with first as parameter due to sorting of RTagList
965RTagNode* RTagNode::insert(RNode* r) {
966    //Print("Hier1\n");
967    RTagNode* newElement  = new RTagNode(r, this);
968    //Print("Hier2\n");
969    return newElement;
970}
971
972RNode* RTagNode::getRNode() {
973    return this->data;
974}
975
976RTagNode* RTagNode::getNext() {
977    return next;
978}
979
980// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
981//       Thus given actual index i and idx being the index of the LPoly under investigation
982//       the element on position length-idx+1 is the right one
983RNode* RTagNode::get(int idx, int length) {
984    if(idx==1 || idx==0) {
985        // NOTE: We set this NULL as putting it the last element in the list, i.e. the element having
986        //       RNode* = NULL would cost lots of iterations at each step of F5inc, with increasing
987        //       length of the list this should be prevented
988        return NULL;
989    }
990    else {
991        int j;
992        RTagNode* temp = this; 
993    //Print("\n\nHIER IN GET IDX\n");
994    //Print("FOR LOOP: %d\n",length-idx+1);   
995    for(j=1; j<=length-idx+1; j++) {
996            temp = temp->next;
997        }
998        return temp->data;
999    }
1000}
1001
1002void RTagNode::set(RNode* r) {
1003    this->data  =   r;
1004}
1005
1006void RTagNode::print() {
1007    RTagNode* temp  =   this;
1008    if(NULL != temp && NULL != temp->getRNode()) {
1009        Print("1. element: %d,  ",getRNode()->getRule()->getIndex());
1010        pWrite(getRNode()->getRule()->getTerm());
1011        temp    =   temp->next;
1012        int i   =   2;
1013        while(NULL != temp->getRNode() && NULL != temp) {
1014            Print("%d. element: %d,  ",i,getRNode()->getRule()->getIndex());
1015            pWrite(getRNode()->getRule()->getTerm());
1016            temp    =   temp->next;
1017            i++;
1018        }
1019    }
1020}
1021/*
1022=======================================
1023functions working on the class LTagList
1024=======================================
1025*/
1026
1027RTagList::RTagList() {
1028    RTagNode* first =   new RTagNode();
1029    length          =   0;
1030}
1031
1032RTagList::RTagList(RNode* r) {
1033    RTagNode* first =   new RTagNode(r);
1034    length          =   1;
1035}
1036
1037RTagList::~RTagList() {
1038    RTagNode* temp;
1039    while(first) {
1040        temp    =   first;
1041        first   =   first->getNext();
1042        delete  temp;
1043    }
1044}
1045
1046// declaration with first as parameter in LTagNode due to sorting of LTagList
1047void RTagList::insert(RNode* r) {
1048    first = first->insert(r);
1049    //Print("LENGTH:%d\n",length);
1050    length = length +1;
1051    //Print("LENGTH:%d\n",length);
1052}
1053
1054RNode* RTagList::getFirst() {
1055    return first->getRNode();
1056}
1057
1058RNode* RTagList::get(int idx) {
1059    return first->get(idx, length);
1060}
1061
1062void RTagList::setFirst(RNode* r) {
1063    first->set(r);
1064}
1065
1066void RTagList::print() {
1067    first->print();
1068}
1069
1070int RTagList::getLength() {
1071    return length;
1072}
1073#endif
Note: See TracBrowser for help on using the repository browser.