source: git/kernel/f5lists.cc @ 1534d9

spielwiese
Last change on this file since 1534d9 was 1534d9, checked in by Christian Eder, 15 years ago
changed data structure RList, sorted insertion of rules, still problems with degree of monomials of rules git-svn-id: file:///usr/local/Singular/svn/trunk@11563 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 24.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
153// deletes the first elements of the list with the same degree
154// only used for the S-polys, which are already sorted by increasing degree by CList
155LNode*  LNode::deleteByDeg() {
156    return this;
157}
158
159// get next from current LNode
160LNode* LNode::getNext() {
161    return next;
162}
163
164// get the LPoly* out of LNode*
165LPoly* LNode::getLPoly() {
166    return data;
167}
168
169// get the data from the LPoly saved in LNode
170poly LNode::getPoly() {
171    return data->getPoly();
172}
173
174poly LNode::getTerm() {
175    return data->getTerm();
176}
177
178int LNode::getIndex() {
179    return data->getIndex();
180}
181
182Rule* LNode::getRule() {
183    return data->getRule();
184}
185
186// set the data from the LPoly saved in LNode
187void LNode::setPoly(poly p) {
188    data->setPoly(p);
189}
190
191void LNode::setTerm(poly t) {
192    data->setTerm(t);
193}
194
195void LNode::setIndex(int i) {
196    data->setIndex(i);
197}
198
199void LNode::setNext(LNode* l) {
200    next    =   l;
201}
202
203// test if for any list element the polynomial part of the data is equal to *p
204bool LNode::polyTest(poly* p) {
205    LNode* temp = new LNode(this);
206    while(NULL != temp) {
207        if(pComparePolys(temp->getPoly(),*p)) {
208            return 1;
209        }
210        temp = temp->next;
211    }
212    return 0;
213}
214
215LNode* LNode::getNext(LNode* l) {
216    return l->next;
217}
218
219// for debugging
220void LNode::print() {
221    LNode* temp = this;
222    Print("___________________List of S-polynomials______________________:\n");
223    Print("%p\n",this);
224    while(NULL != temp && NULL != temp->data) {
225        Print("Index: %d\n",temp->getIndex());
226        Print("Term: ");
227        pWrite(temp->getTerm());
228        Print("Poly: ");
229        pWrite(temp->getPoly());
230        Print("%p\n",temp->next);
231        temp = temp->next;
232    }
233    Print("_______________________________________________________________\n");
234}
235
236
237/*
238====================================
239functions working on the class LList
240====================================
241*/
242
243LList::LList() {
244    first   =   last    =   NULL;;
245    length  =   0;
246}
247
248LList::LList(LPoly* lp) {
249    first   =   new LNode(lp);
250    last    =   first;
251    length  =   1;
252}
253
254LList::LList(poly t,int i,poly p,Rule* r) {
255    first   =   new LNode(t,i,p,r);
256    last    =   first;
257    length  =   1;
258} 
259
260LList::~LList() {
261    LNode* temp;
262    while(first) {
263        temp    =   first;
264        first   =   first->getNext();
265        delete  temp;
266        //Print("%p\n",first);
267    }
268}
269
270// insertion at the end of the list, needed for gPrev
271void LList::insert(LPoly* lp) {
272    last = last->insert(lp);
273    //Print("NEW LAST GPREV: ");
274    //pWrite(last->getPoly());
275    length++;
276    //Print("LENGTH %d\n",length);
277}
278
279void LList::insert(poly t,int i, poly p, Rule* r) {
280    last = last->insert(t,i,p,r);
281    length++;
282    //Print("LENGTH %d\n",length);
283}
284
285// insertion in front of the list, needed for sPolyList
286void LList::insertSP(LPoly* lp) {
287    first = first->insertSP(lp);
288    length++;
289    //Print("LENGTH %d\n",length);
290}
291
292void LList::insertSP(poly t,int i, poly p, Rule* r) {
293    first = first->insertSP(t,i,p,r);
294    length++;
295    //Print("LENGTH %d\n",length);
296}
297
298
299void LList::insertByLabel(poly t, int i, poly p, Rule* r) {
300    first = first->insertByLabel(t,i,p,r);
301    length++;
302    //Print("LENGTH %d\n",length);
303}
304
305void LList::insertByLabel(LNode* l) {
306    first = first->insertByLabel(l->getTerm(),l->getIndex(),l->getPoly(),l->getRule());
307    length++;
308    //Print("LENGTH %d\n",length);
309}
310
311void LList::deleteByDeg() {
312    first = first->deleteByDeg();
313}
314
315bool LList::polyTest(poly* p) {
316    return first->polyTest(p);
317}
318
319LNode* LList::getFirst() {
320    return first;
321}
322
323LNode* LList::getLast() {
324    return last;
325}
326
327int LList::getLength() {
328    return length;
329}
330
331void LList::setFirst(LNode* l) {
332    LNode* temp =   first;
333    temp->setNext(NULL);
334    first       =   l;
335    length--;
336}
337
338void LList::print() {
339    first->print();
340}
341
342/*
343=======================================
344functions working on the class LTagNode
345=======================================
346*/
347LTagNode::LTagNode() {
348    data    =   NULL;
349    next    =   NULL;
350}
351
352LTagNode::LTagNode(LNode* l) {
353    data = l;
354    next = NULL;
355}
356       
357LTagNode::LTagNode(LNode* l, LTagNode* n) {
358    data = l;
359    next = n;
360}
361
362 LTagNode::~LTagNode() {
363    delete next;
364    delete data;   
365}
366       
367// declaration with first as parameter due to sorting of LTagList
368LTagNode* LTagNode::insert(LNode* l) {
369    LTagNode* newElement  = new LTagNode(l, this);
370    return newElement;
371}
372
373LNode* LTagNode::getLNode() {
374    return this->data;
375}
376
377LTagNode* LTagNode::getNext() {
378    return next;
379}
380
381// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
382//       Thus given actual index i and idx being the index of the LPoly under investigation
383//       the element on position length-idx is the right one
384LNode* LTagNode::get(int idx, int length) {
385    if(idx == 1) {
386        return NULL;
387    }
388    else {
389        int j;
390        LTagNode* temp = this; // last
391        for(j=1;j<=length-idx+1;j++) {
392            temp = temp->next;
393        }
394        return temp->data;
395    }
396}
397
398
399/*
400=======================================
401functions working on the class LTagList
402=======================================
403*/
404LTagList::LTagList() {
405    LTagNode* first =   new LTagNode();
406   
407    length          =   0;
408}
409
410LTagList::LTagList(LNode* l) {
411    LTagNode* first =   new LTagNode(l);
412    length          =   1;
413}
414
415// declaration with first as parameter in LTagNode due to sorting of LTagList
416void LTagList::insert(LNode* l) {
417    first   =   first->insert(l);
418    length++;
419}
420
421void LTagList::setFirstCurrentIdx(LNode* l) {
422    firstCurrentIdx =   l;
423}
424
425LNode* LTagList::get(int idx) {
426    return first->get(idx, length);
427}
428
429LNode* LTagList::getFirst() {
430    return first->getLNode();
431}
432
433LNode* LTagList::getFirstCurrentIdx() {
434    return firstCurrentIdx;
435}
436
437/*
438=====================================
439functions working on the class TopRed
440=====================================
441*/
442
443TopRed::TopRed() {
444    _completed  =   NULL;
445    _toDo       =   NULL;
446}
447
448TopRed::TopRed(LList* c, LList* t) {
449    _completed  =   c;
450    _toDo       =   t;
451}
452
453LList* TopRed::getCompleted() {
454    return _completed;
455}
456
457LList* TopRed::getToDo() {
458    return _toDo;
459}
460
461/*
462====================================
463functions working on the class CNode
464====================================
465*/
466
467CNode::CNode() {
468    data    =   NULL;   
469    next    =   NULL;   
470}
471
472CNode::CNode(CPair* c) {
473    data    =   c;   
474    next    =   NULL;   
475}
476
477CNode::CNode(CPair* c, CNode* n) {
478    data    =   c;   
479    next    =   n;   
480}
481
482CNode::~CNode() {
483    delete data;
484}
485
486// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
487// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
488// working only with linked, but not doubly linked lists due to memory usage we have to check the
489// insertion around the first element separately from the insertion around all other elements in the list
490CNode* CNode::insert(CPair* c) {
491    if(NULL == this) {
492        CNode* newElement   =   new CNode(c, this);
493        return newElement;
494    }
495    else {
496        poly u1 = ppMult_qq(c->getT1(),c->getLp1Term());
497        if( c->getDeg() < this->data->getDeg() ) { // lower degree than the first list element
498            CNode* newElement   =   new CNode(c, this);
499            return newElement;
500        }
501        if( c->getDeg() == this->data->getDeg() ) { // same degree than the first list element
502            if(1 != pLmCmp(u1,ppMult_qq(this->data->getT1(), this->data->getLp1Term()))) {
503                //pWrite(u1);
504                //Print("Multi-Term in CritPairs Sortierung altes Element: ");
505                //pWrite(ppMult_qq(this->data->getT1(),this->data->getLp1Term()));
506                CNode* newElement   =   new CNode(c, this);
507                return newElement;
508            }
509            else {
510                //Print("Insert Deg\n");
511                CNode* temp = this;
512                while(  NULL != temp->next) {
513                    if(temp->next->data->getDeg() == c->getDeg() ) { 
514                        if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) {
515                            temp = temp->next;
516                        }
517                        else {
518                            CNode* newElement   =   new CNode(c, temp->next);
519                            temp->next          =   newElement;
520                            return this;
521                        } 
522                    }
523                    else {
524                        CNode* newElement   =   new CNode(c, temp->next);
525                        temp->next          =   newElement;
526                        return this;
527                    }
528                }
529                CNode* newElement   =   new CNode(c, NULL);
530                temp->next          =   newElement;
531                return this;
532            }
533        } // outer if-clause
534        if( c->getDeg() > this->data->getDeg() ) { // greater degree than the first list element
535            CNode* temp =   this;
536            while( NULL != temp->next ) {   
537                if( c->getDeg() < temp->next->data->getDeg() ) {
538                    CNode* newElement   =   new CNode(c, temp->next);
539                    temp->next          =   newElement;
540                    return this;
541                }
542                if( c->getDeg() == temp->next->data->getDeg() ) {
543                    if(1 != pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),temp->next->data->getLp1Term()))) { 
544                        CNode* newElement   =   new CNode(c, temp->next);
545                        temp->next          =   newElement;
546                        return this;
547                    }
548                    else {
549                        temp = temp->next;
550                        while(  NULL != temp->next ) {
551                            if( temp->next->data->getDeg() == c->getDeg() ) { 
552                                if(1 == pLmCmp(u1,ppMult_qq(temp->next->data->getT1(),
553                                               temp->next->data->getLp1Term()))) {
554                                    temp = temp->next;
555                                }
556                                else {
557                                    CNode* newElement   =   new CNode(c, temp->next);
558                                    temp->next          =   newElement;
559                                    return this;
560                                } 
561                            }
562                            else {
563                                CNode* newElement   =   new CNode(c, temp->next);
564                                temp->next          =   newElement;
565                                return this;
566                            }
567                        }
568                        CNode* newElement   =   new CNode(c, NULL);
569                        temp->next          =   newElement;
570                        return this;
571                    }
572                }
573                if( c->getDeg() > temp->next->data->getDeg() ) {
574                    temp    =   temp->next;
575                }
576            }
577            CNode* newElement   =   new CNode(c, NULL);
578            temp->next          =   newElement;
579            return this;
580        }
581    }
582}
583
584// get the first elements from CList which by the above sorting have minimal degree
585CNode* CNode::getMinDeg() {
586    CNode* temp = this;
587    while(NULL != temp) {
588        while(NULL != temp->next && temp->next->data->getDeg() == this->data->getDeg()) {
589            temp = temp->next;
590        }
591        CNode* returnCNode  =   temp->next;   
592        // every CList should end with a (NULL,NULL) element for a similar behaviour
593        // using termination conditions throughout the algorithm
594        temp->next          =   NULL;
595        return returnCNode;
596    }
597    return NULL;
598}
599
600CPair* CNode::getData() {
601    return data;
602}
603
604CNode* CNode::getNext() {
605    return next;
606}
607
608LPoly* CNode::getAdLp1() {
609    return this->data->getAdLp1();
610}
611
612LPoly* CNode::getAdLp2() {
613    return this->data->getAdLp2();
614}
615
616poly CNode::getLp1Poly() {
617    return this->data->getLp1Poly();
618}
619
620poly CNode::getLp2Poly() {
621    return this->data->getLp2Poly();
622}
623
624poly CNode::getLp1Term() {
625    return this->data->getLp1Term();
626}
627
628poly CNode::getLp2Term() {
629    return this->data->getLp2Term();
630}
631
632int CNode::getLp1Index() {
633    return this->data->getLp1Index();
634}
635
636int CNode::getLp2Index() {
637    return this->data->getLp2Index();
638}
639
640poly CNode::getT1() {
641    return this->data->getT1();
642}
643
644poly* CNode::getAdT1() {
645    return this->data->getAdT1();
646}
647
648poly CNode::getT2() {
649    return this->data->getT2();
650}
651
652poly* CNode::getAdT2() {
653    return this->data->getAdT2();
654}
655
656Rule* CNode::getTestedRule() {
657    return this->data->getTestedRule();
658}
659
660// for debugging
661void CNode::print() {
662    CNode* temp = this;
663    Print("___________________List of critical pairs______________________:\n");
664    while(NULL != temp) {
665        Print("LP1 Index: %d\n",temp->getLp1Index());
666        Print("T1: ");
667        pWrite(temp->getT1());
668        Print("%p\n",temp->getT1());
669        Print("LP1 Term: ");
670        pWrite(temp->getLp1Term());
671        Print("LP1 Poly: ");
672        pWrite(temp->getLp1Poly());
673        Print("LP2 Index: %d\n",temp->getLp2Index());
674        Print("T2: ");
675        pWrite(temp->getT2());
676        Print("%p\n",temp->getT2());
677        Print("LP2 Term: ");
678        pWrite(temp->getLp2Term());
679        Print("LP2 Poly: ");
680        pWrite(temp->getLp2Poly());
681        Print("\n");
682        temp = temp->next;
683    }
684}
685
686/*
687====================================
688functions working on the class CList
689====================================
690*/
691// for initialization of CLists, last element alwas has data=NULL and next=NULL
692CList::CList() {
693    first   =   NULL;
694}
695
696CList::CList(CPair* c) {
697    first   =   new CNode(c);
698}
699
700CList::~CList() {
701    CNode* temp;
702    while(NULL != first) {
703        temp    =   first;
704        first   =   first->getNext();
705        delete  temp;
706    }
707}
708
709// insert sorts the critical pairs firstly by increasing total degree, secondly by increasing label
710// note: as all critical pairs have the same index here, the second sort is done on the terms of the labels
711void CList::insert(CPair* c) {
712    first = first->insert(c);
713}
714
715CNode* CList::getFirst() {
716    return first;
717}
718
719// get the first elements from CList which by the above sorting have minimal degree
720// returns the pointer on the first element of those
721CNode* CList::getMinDeg() {
722    CNode* temp     =   first;
723    first           =   first->getMinDeg();
724    return temp;
725}
726
727void CList::print() {
728    first->print();
729}
730
731/*
732====================================
733functions working on the class RNode
734====================================
735*/
736RNode::RNode() {
737    //Print("HIER RNODE CONSTRUCTOR\n");
738    data    =   NULL;
739    next    =   NULL;
740}
741
742RNode::RNode(Rule* r) {
743    data    =   r;
744    next    =   NULL;
745}
746
747RNode::~RNode() {
748    //Print("DELETE RULE\n");
749    delete  data;
750}
751
752RNode* RNode::insert(Rule* r) {
753    RNode* newElement   =   new RNode(r);
754    newElement->next    =   this;
755    return newElement;
756}
757
758RNode* RNode::insert(int i, poly t) {
759    //Print("IN INSERT: ");
760    //pWrite(t);
761    Rule*   r           =   new Rule(i,t);
762    //Print("ADDRESS OF RULE: %p\n",r);
763    RNode* newElement   =   new RNode(r);
764    //Print("ADDRESS OF RNODE: %p\n",newElement);
765    //Print("ADDRESS OF RNODE DATA: %p\n",newElement->getRule());
766    if(NULL == this || this->getRuleIndex() < newElement->getRuleIndex()) {
767        newElement->next    =   this;
768    }
769    else {
770        if(pDeg(newElement->getRuleTerm()) > pDeg(this->getRuleTerm())) {
771                newElement->next    =   this;
772        }
773        if(-1 == pLmCmp(newElement->getRuleTerm(),this->getRuleTerm())) {
774            Print("HAHI\n");
775            Print("%ld\n",pDeg(newElement->getRuleTerm()));
776            Print("%ld\n",pDeg(this->getRuleTerm()));
777           
778            pWrite(newElement->getRuleTerm());
779            pWrite(this->getRuleTerm());
780            RNode* temp    =   this;
781            while(NULL != temp->next && pDeg(newElement->getRuleTerm()) <= pDeg(temp->next->getRuleTerm())
782                    && -1 == pLmCmp(newElement->getRuleTerm(),temp->next->getRuleTerm())) {
783                temp    =   temp->next;
784            }
785            newElement->next    =   temp->next;
786            temp->next          =   newElement;
787            return this;
788        }
789        else {
790            newElement->next    =   this;
791            return newElement;
792        }
793    }
794    return newElement;
795}
796
797RNode* RNode::getNext() {
798    return next;
799}   
800
801Rule* RNode::getRule() {
802    return data;
803}
804
805int RNode::getRuleIndex() {
806    return data->getIndex();
807}
808
809poly RNode::getRuleTerm() {
810    return data->getTerm();
811}
812
813/*
814====================================
815functions working on the class RList
816====================================
817*/
818RList::RList() {
819    first = NULL;
820}
821
822RList::RList(Rule* r) {
823    first = new RNode(r);
824}
825
826RList::~RList() {
827    RNode* temp;
828    //Print("%p\n",first);
829    while(first) {
830        temp    =   first;
831        first   =   first->getNext();
832        //Print("1 %p\n",first);
833        //if(first) {
834            //Print("1' %p\n",first->getRule());
835            //Print("2 %p\n",first->getNext());
836            //Print("3 %p\n",first->getNext()->getRule());
837            //Print("3 %p\n",first->getNext()->getRuleTerm());
838        //}
839        delete  temp;
840    }
841    //Print("FERTIG\n");
842} 
843
844void RList::insert(int i, poly t) {
845    first = first->insert(i,t);
846}
847
848void RList::insert(Rule* r) {
849    first = first->insert(r);
850}
851
852RNode* RList::getFirst() {
853    return first;
854}
855
856Rule* RList::getRule() {
857    return this->getRule();
858}
859
860/*
861=======================================
862functions working on the class RTagNode
863=======================================
864*/
865
866RTagNode::RTagNode() {
867    data = NULL;
868    next = NULL;
869}
870 
871RTagNode::RTagNode(RNode* r) {
872    data = r;
873    next = NULL;
874}
875       
876RTagNode::RTagNode(RNode* r, RTagNode* n) {
877   
878    data = r;
879    next = n;
880}
881
882RTagNode::~RTagNode() {
883    delete data;   
884}
885       
886// declaration with first as parameter due to sorting of RTagList
887RTagNode* RTagNode::insert(RNode* r) {
888    //Print("Hier1\n");
889    RTagNode* newElement  = new RTagNode(r, this);
890    //Print("Hier2\n");
891    return newElement;
892}
893
894RNode* RTagNode::getRNode() {
895    return this->data;
896}
897
898RTagNode* RTagNode::getNext() {
899    return next;
900}
901
902// NOTE: We insert at the beginning of the list and length = i-1, where i is the actual index.
903//       Thus given actual index i and idx being the index of the LPoly under investigation
904//       the element on position length-idx+1 is the right one
905RNode* RTagNode::get(int idx, int length) {
906    if(idx==1 || idx==0) {
907        // NOTE: We set this NULL as putting it the last element in the list, i.e. the element having
908        //       RNode* = NULL would cost lots of iterations at each step of F5inc, with increasing
909        //       length of the list this should be prevented
910        return NULL;
911    }
912    else {
913        int j;
914        RTagNode* temp = this; 
915    //Print("\n\nHIER IN GET IDX\n");
916    //Print("FOR LOOP: %d\n",length-idx+1);   
917    for(j=1; j<=length-idx+1; j++) {
918            temp = temp->next;
919        }
920        return temp->data;
921    }
922}
923
924void RTagNode::set(RNode* r) {
925    this->data  =   r;
926}
927
928void RTagNode::print() {
929    RTagNode* temp  =   this;
930    if(NULL != temp && NULL != temp->getRNode()) {
931        Print("1. element: %d,  ",getRNode()->getRule()->getIndex());
932        pWrite(getRNode()->getRule()->getTerm());
933        temp    =   temp->next;
934        int i   =   2;
935        while(NULL != temp->getRNode() && NULL != temp) {
936            Print("%d. element: %d,  ",i,getRNode()->getRule()->getIndex());
937            pWrite(getRNode()->getRule()->getTerm());
938            temp    =   temp->next;
939            i++;
940        }
941    }
942}
943/*
944=======================================
945functions working on the class LTagList
946=======================================
947*/
948
949RTagList::RTagList() {
950    RTagNode* first =   new RTagNode();
951    length          =   0;
952}
953
954RTagList::RTagList(RNode* r) {
955    RTagNode* first =   new RTagNode(r);
956    length          =   1;
957}
958
959RTagList::~RTagList() {
960    RTagNode* temp;
961    while(first) {
962        temp    =   first;
963        first   =   first->getNext();
964        delete  temp;
965    }
966}
967
968// declaration with first as parameter in LTagNode due to sorting of LTagList
969void RTagList::insert(RNode* r) {
970    first = first->insert(r);
971    //Print("LENGTH:%d\n",length);
972    length = length +1;
973    //Print("LENGTH:%d\n",length);
974}
975
976RNode* RTagList::getFirst() {
977    return first->getRNode();
978}
979
980RNode* RTagList::get(int idx) {
981    return first->get(idx, length);
982}
983
984void RTagList::setFirst(RNode* r) {
985    first->set(r);
986}
987
988void RTagList::print() {
989    first->print();
990}
991
992int RTagList::getLength() {
993    return length;
994}
995#endif
Note: See TracBrowser for help on using the repository browser.