source: git/kernel/f5lists.cc @ e3b5ed

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