Changeset 87beab7 in git
- Timestamp:
- Feb 11, 2009, 10:24:08 PM (14 years ago)
- Branches:
- (u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
- Children:
- 34fcf813ea36a30ddd0d8107abf9a73b247be289
- Parents:
- c5d8ddb1112344ad68257ea0c296d5b17aee0433
- Location:
- kernel
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/f5data.cc
rc5d8dd r87beab7 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: f5data.cc,v 1. 4 2009-02-08 19:17:54ederc Exp $ */4 /* $Id: f5data.cc,v 1.5 2009-02-11 21:24:07 ederc Exp $ */ 5 5 /* 6 6 * ABSTRACT: lpolynomial definition … … 30 30 ================================================================ 31 31 */ 32 LPoly::LPoly(poly t,int i,poly p ) {33 set(t,i,p );32 LPoly::LPoly(poly t,int i,poly p, Rule* r) { 33 set(t,i,p,r); 34 34 } 35 35 … … 46 46 } 47 47 48 void LPoly::setRule(Rule* r) { 49 _rule = r; 50 } 51 48 52 poly LPoly::getPoly() { 49 53 return polynomial; … … 58 62 } 59 63 60 void LPoly::set(poly t, int i, poly p) { 64 Rule* LPoly::getRule() { 65 return _rule; 66 } 67 void LPoly::set(poly t, int i, poly p, Rule* r) { 61 68 this->setTerm(t); 62 69 this->setIndex(i); 63 70 this->setPoly(p); 71 this->setRule(r); 64 72 } 65 73 … … 143 151 =================================== 144 152 */ 145 Rule::Rule(int i, poly t , LPoly* l) {153 Rule::Rule(int i, poly t) { 146 154 index = i; 147 155 term = t; 148 origin = l;149 156 } 150 157 … … 156 163 return term; 157 164 } 158 159 LPoly* Rule::getOrigin() {160 return origin;161 }162 163 void Rule::setOrigin(LPoly* l) {164 origin = l;165 }166 165 #endif -
kernel/f5data.h
rc5d8dd r87beab7 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: f5data.h,v 1. 4 2009-02-08 19:17:54ederc Exp $ */4 /* $Id: f5data.h,v 1.5 2009-02-11 21:24:07 ederc Exp $ */ 5 5 /* 6 6 * ABSTRACT: labeled polynomial interface … … 31 31 int index; //index of signature 32 32 poly polynomial; //standard polynomial data 33 Rule* _rule; 33 34 public: 34 LPoly(poly t, int i, poly p );35 LPoly(poly t, int i, poly p, Rule* r=NULL); 35 36 void setPoly(poly p); 36 37 poly getPoly(); … … 39 40 void setIndex(int i); 40 41 int getIndex(); 41 void set(poly t, int i, poly p); 42 void setRule(Rule* r); 43 Rule* getRule(); 44 void set(poly t, int i, poly p, Rule* r); 42 45 LPoly* get(); 43 46 }; … … 84 87 int index; // index of the labeled polynomial the rule comes from 85 88 poly term; // term of the labeled polynomial the rule comes from 86 LPoly* origin; // pointer of the LPoly which generated this rule (needed in criterion2())87 89 public: 88 Rule(int i, poly term , LPoly* l);90 Rule(int i, poly term); 89 91 int getIndex(); 90 92 poly getTerm(); 91 LPoly* getOrigin();92 void setOrigin(LPoly* l);93 93 }; 94 94 #endif -
kernel/f5gb.cc
rc5d8dd r87beab7 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: f5gb.cc,v 1.2 5 2009-02-09 14:24:08ederc Exp $ */4 /* $Id: f5gb.cc,v 1.26 2009-02-11 21:24:07 ederc Exp $ */ 5 5 /* 6 6 * ABSTRACT: f5gb interface … … 69 69 ================================================== 70 70 */ 71 LList* F5inc(int i, poly f_i, LList* gPrev, ideal gbPrev, poly ONE ) {71 LList* F5inc(int i, poly f_i, LList* gPrev, ideal gbPrev, poly ONE, LTagList* lTag, RList* rules, RTagList* rTag) { 72 72 int j; 73 // tag the first element of index i-1 for criterion 1 74 LTagList* lTag = new LTagList(gPrev->getFirst()); 75 // first element in rTag is NULL, this must be done due to possible later improvements 76 RTagList* rTag = new RTagList(); 73 Print("%p\n",gPrev->getFirst()); 74 pWrite(gPrev->getFirst()->getPoly()); 77 75 gPrev->insert(ONE,i,f_i); 78 76 Print("1st gPrev: "); 79 77 pWrite(gPrev->getFirst()->getPoly()); 80 78 Print("2nd gPrev: "); 81 pWrite(gPrev->getFirst()->getNext()->getPoly()); 79 Print("%p",gPrev->getFirst()->getNext()); 80 //pWrite(gPrev->getFirst()->getNext()->getPoly()); 82 81 CList* critPairs = new CList(); 83 RList* rules = new RList();84 82 CNode* critPairsMinDeg = new CNode(); 85 83 LNode* sPolys = new LNode(); 86 84 // computation of critical pairs with checking of criterion 1 and criterion 2 87 critPairs = criticalPair(gPrev, critPairs, lTag, rTag );88 LList* sPolyList = new LList();85 critPairs = criticalPair(gPrev, critPairs, lTag, rTag, rules); 86 static LList* sPolyList = new LList(); 89 87 // labeled polynomials which have passed reduction() and have to be added to list gPrev 90 LList* completed = new LList(); 88 static LList* completed = new LList(); 89 Print("_____________________________________________________________________________%p\n",completed->getFirst()->getLPoly()); 91 90 // the reduced labeled polynomials which are returned from subalgorithm reduction() 92 LNode* reducedLPolys = new LNode();91 static LList* reducedLPolys = new LList(); 93 92 // while there are critical pairs to be further checked and deleted/computed 94 93 while(NULL != critPairs->getFirst()->getData()) { … … 101 100 // added 102 101 computeSPols(critPairsMinDeg,rTag,rules,sPolyList); 103 104 reducedLPolys = reduction(sPolyList, completed, gPrev, lTag, rTag, gbPrev); 105 } 102 103 // DEBUG STUFF FOR SPOLYLIST 104 LNode* temp = sPolyList->getFirst(); 105 while(NULL != temp->getLPoly()) { 106 Print("Spolylist element: "); 107 pWrite(temp->getPoly()); 108 temp = temp->getNext(); 109 } 110 reducedLPolys = reduction(sPolyList, completed, gPrev, rules, lTag, rTag, gbPrev); 111 } 112 Print("HIER123\n"); 113 Print("%p\n",rules->getFirst()); 114 Print("%p\n",rTag->getFirst()); 115 if(rules->getFirst() != rTag->getFirst()) { 116 Print("+++++++++++++++++++++++++++++++++++++NEW RULES+++++++++++++++++++++++++++++++++++++\n"); 117 rTag->insert(rules->getFirst()); 118 } 119 else { 120 Print("+++++++++++++++++++++++++++++++++++NO NEW RULES++++++++++++++++++++++++++++++++++++\n"); 121 } 122 lTag->insert(gPrev->getFirst()); 106 123 return gPrev; 107 124 } … … 116 133 ================================================================ 117 134 */ 118 CList* criticalPair(LList* gPrev, CList* critPairs, LTagList* lTag, RTagList* rTag ) {135 CList* criticalPair(LList* gPrev, CList* critPairs, LTagList* lTag, RTagList* rTag, RList* rules) { 119 136 // initialization for usage in pLcm() 120 137 number nOne = nInit(1); … … 143 160 // testing both new labels by the F5 Criterion 144 161 if(!criterion1(u1, first, lTag) && !criterion1(u2, l, lTag) && 145 !criterion2(u1, first, r Tag) && !criterion2(u2, l, rTag)) {162 !criterion2(u1, first, rules, rTag) && !criterion2(u2, l, rules, rTag)) { 146 163 // if they pass the test, add them to CList critPairs, having the LPoly with greater 147 164 // label as first element in the CPair … … 182 199 // save the monom t1*label_term(l) as it is tested various times in the following 183 200 poly u1 = ppMult_qq(*t,l->getTerm()); 184 while(NULL != testNode ) {201 while(NULL != testNode && NULL != testNode->getLPoly()) { 185 202 if(pLmDivisibleByNoComp(testNode->getPoly(),u1)) { 186 203 Print("Criterion 1 NOT passed!\n"); … … 189 206 //pWrite(testNode->getNext()->getPoly()); 190 207 testNode = testNode->getNext(); 208 Print("ADDRESS OF TEST NODE: %p\n",testNode); 209 Print("Hier\n"); 191 210 } 192 211 Print("HIER DRIN CRITERION 1\n"); … … 202 221 ===================================== 203 222 */ 204 bool criterion2(poly* t, LNode* l, R TagList* rTag) {223 bool criterion2(poly* t, LNode* l, RList* rules, RTagList* rTag) { 205 224 Print("HIER DRIN CRITERION 2:=========================\n"); 206 225 // start at the previously added element to gPrev, as all other elements will have the same index for sure 207 RNode* testNode = rTag->get(l->getIndex()); 208 Print("ADDRESS TEST NODE: %p\n", testNode); 226 Print("%d\n",l->getIndex()); 227 RNode* testNode = new RNode(); 228 if(NULL == rTag->getFirst()->getRule()) { 229 testNode = rules->getFirst(); 230 } 231 else { 232 Print("%d\n",l->getIndex()); 233 Print("%d\n",rTag->getFirst()->getRuleIndex()); 234 pWrite(rTag->getFirst()->getRuleTerm()); 235 if(l->getIndex() > rTag->getFirst()->getRuleIndex()) { 236 testNode = rules->getFirst(); 237 Print("TEST NODE: %p\n",testNode); 238 } 239 else { 240 testNode = rTag->get(l->getIndex()); 241 } 242 } 209 243 // save the monom t1*label_term(l) as it is tested various times in the following 210 244 poly u1 = ppMult_qq(*t,l->getTerm()); 211 Print("Poly u1: ");212 245 pWrite(u1); 213 246 // first element added to rTag was NULL, check for this 214 while(NULL != testNode && NULL != testNode->getRule() && testNode->getRule()->getOrigin() != l->getLPoly()) { 215 Print("----------------------------------------------------------------------------------------------------------------------------------------------------\n"); 247 pWrite(l->getPoly()); 248 //Print("%p\n",testNode->getRule()); 249 Print("HIER !!!!\n"); 250 // NOTE: testNode is possibly NULL as rTag->get() returns NULL for elements of index <=1! 251 while(NULL != testNode && NULL != testNode->getRule() && testNode->getRule() != l->getRule() 252 && l->getIndex() == testNode->getRuleIndex()) { 216 253 pWrite(ppMult_qq(*t,l->getTerm())); 217 254 pWrite(testNode->getRuleTerm()); … … 220 257 return true; 221 258 } 222 Print("HIER AUCH DRIN?\n");223 Print("TEST NODE ADDRESS: %p\n",testNode->getNext());224 Print("TEST NODE LPOLY ADDRESS: %p\n",testNode->getNext()->getRule());225 259 testNode = testNode->getNext(); 226 260 } … … 235 269 ================================================================================================================= 236 270 */ 237 bool criterion2(poly* t, LPoly* l, R TagList* rTag, Rule* lastRuleTested) {271 bool criterion2(poly* t, LPoly* l, RList* rules, Rule* lastRuleTested) { 238 272 // start at the previously added element to gPrev, as all other elements will have the same index for sure 239 RNode* testNode = r Tag->getFirst();273 RNode* testNode = rules->getFirst(); 240 274 // save the monom t1*label_term(l) as it is tested various times in the following 241 275 poly u1 = ppMult_qq(*t,l->getTerm()); 242 276 // first element added to rTag was NULL, check for this 243 while(NULL != testNode && NULL != testNode->getRule() && testNode->getRule() != lastRuleTested) {277 while(NULL != testNode->getRule() && l->getRule() != lastRuleTested) { 244 278 if(pLmDivisibleBy(testNode->getRuleTerm(),ppMult_qq(*t,l->getTerm()))) { 245 279 Print("Criterion 2 NOT passed!\n"); … … 259 293 */ 260 294 void computeSPols(CNode* first, RTagList* rTag, RList* rules, LList* sPolyList) { 261 CNode* temp = first; 262 poly zero = pInit(); 295 CNode* temp = first; 296 static poly sp = pInit(); 297 Print("###############################IN SPOLS##############################\n"); 263 298 while(NULL != temp->getData()) { 264 299 // only if a new rule was added since the last test in subalgorithm criticalPair() 265 if(rules->getFirst() != rTag->getFirst()) {300 //if(rules->getFirst() != rTag->getFirst()) { 266 301 Print("IN SPOLS => NEW RULES AVAILABLE\n"); 267 if(!criterion2(temp->getAdT1(),temp->getAdLp1(),r Tag,temp->getLastRuleTested())) {302 if(!criterion2(temp->getAdT1(),temp->getAdLp1(),rules,temp->getLastRuleTested())) { 268 303 // the second component is tested only when it has the actual index, otherwise there is 269 304 // no new rule to test since the last test in subalgorithm criticalPair() 270 305 if(temp->getLp2Index() == temp->getLp1Index()) { 271 if(!criterion2(temp->getAdT2(),temp->getAdLp2(),r Tag,temp->getLastRuleTested())) {306 if(!criterion2(temp->getAdT2(),temp->getAdLp2(),rules,temp->getLastRuleTested())) { 272 307 // computation of S-polynomial 273 poly sp = pInit();274 308 sp = pSub(ppMult_qq(temp->getT1(),temp->getLp1Poly()), 275 309 ppMult_qq(temp->getT2(),temp->getLp2Poly())); 276 Print("BEGIN SPOLY \n====================\n");310 Print("BEGIN SPOLY1\n====================\n"); 277 311 pWrite(sp); 278 Print("END SPOLY \n====================\n");279 if( !pCmp(sp,zero)) {312 Print("END SPOLY1\n====================\n"); 313 if(NULL == sp) { 280 314 // as rules consist only of pointers we need to save the labeled 281 315 // S-polynomial also of a zero S-polynomial … … 286 320 Print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ZERO REDUCTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 287 321 reductionsToZero++; 288 rules->insert(temp->getLp1Index(),temp->getT1(),NULL); 289 rTag->setFirst(rules->getFirst()); 322 rules->insert(temp->getLp1Index(),temp->getT1()); 323 // as sp = NULL, delete it 324 delete(&sp); 290 325 } 291 326 else { 292 sPolyList->insert(temp->getT1(),temp->getLp1Index(),sp); 293 rules->insert(temp->getLp1Index(),temp->getT1(),sPolyList->getFirst()->getLPoly()); 294 rTag->setFirst(rules->getFirst()); 327 rules->insert(temp->getLp1Index(),temp->getT1()); 328 sPolyList->insert(temp->getT1(),temp->getLp1Index(),sp,rules->getFirst()->getRule()); 295 329 } 296 330 // data is saved in sPolyList or zero => delete sp 297 pDelete(&sp);298 331 } 299 332 } 300 333 else { // temp->getLp2Index() < temp->getLp1Index() 301 334 // computation of S-polynomial 302 poly sp = pInit();303 335 sp = pSub(ppMult_qq(temp->getT1(),temp->getLp1Poly()), 304 336 ppMult_qq(temp->getT2(),temp->getLp2Poly())); 305 Print("BEGIN SPOLY \n====================\n");337 Print("BEGIN SPOLY2\n====================\n"); 306 338 pWrite(sp); 307 Print("END SPOLY \n====================\n");308 if( !pCmp(sp,zero)) {339 Print("END SPOLY2\n====================\n"); 340 if(NULL == sp) { 309 341 // zeroList->insert(temp->getAdT1(),temp->getLp1Index(),&sp); 310 342 // origin of rule can be set NULL as the labeled polynomial … … 313 345 Print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ZERO REDUCTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 314 346 reductionsToZero++; 315 rules->insert(temp->getLp1Index(),temp->getT1() ,NULL);316 rTag->setFirst(rules->getFirst());317 347 rules->insert(temp->getLp1Index(),temp->getT1()); 348 // as sp = NULL, delete it 349 delete(&sp); 318 350 } 319 351 else { 320 sPolyList->insert(temp->getT1(),temp->getLp1Index(),sp); 321 rules->insert(temp->getLp1Index(),temp->getT1(),sPolyList->getFirst()->getLPoly()); 322 rTag->setFirst(rules->getFirst()); 352 rules->insert(temp->getLp1Index(),temp->getT1()); 353 sPolyList->insert(temp->getT1(),temp->getLp1Index(),sp,rules->getFirst()->getRule()); 323 354 } 324 355 // data is saved in sPolyList or zero => delete sp 325 pDelete(&sp);326 356 } 327 357 } 328 }358 //} 329 359 temp = temp->getNext(); 330 360 } 331 361 // these critical pairs can be deleted now as they are either useless for further computations or 332 362 // already saved as an S-polynomial to be reduced in the following 363 //pDelete(&sp); 333 364 delete first; 334 365 } … … 341 372 ======================================================================== 342 373 */ 343 L Node* reduction(LList* sPolyList, LList* completed, LList* gPrev, LTagList* lTag, RTagList*rTag,374 LList* reduction(LList* &sPolyList, LList* &completed, LList* &gPrev, RList* &rules, LTagList* &lTag, RTagList* &rTag, 344 375 ideal gbPrev) { 376 Print("##########################################In REDUCTION!########################################\n"); 345 377 // temporary normal form and zero polynomial for testing 346 378 poly tempNF = pInit(); 347 poly zero = pInit();379 TopRed* ret = new TopRed(); 348 380 // compute only if there are any S-polynomials to be reduced 381 Print("LENGTH OF SPOLYLIST: %d\n",sPolyList->getLength()); 349 382 if(NULL != sPolyList->getFirst()->getLPoly()) { 350 383 LNode* temp = sPolyList->getFirst(); 384 Print("HIER REDUCTION\n"); 351 385 while(NULL != temp->getLPoly()) { 352 poly test = temp->getPoly();353 Print("ADDRESS BEFORE: %p\n",&test);354 386 tempNF = kNF(gbPrev,currQuotient,temp->getPoly()); 387 pWrite(tempNF); 388 pWrite(temp->getPoly()); 355 389 temp->setPoly(tempNF); 356 Print("ADDRESS AFTER: %p\n",&test);357 Print("Nach NORMAL FORM: ");358 390 pWrite(temp->getPoly()); 359 391 // test if normal form is zero 360 if(0 == pLmCmp(temp->getPoly(),zero)) { 361 Print("HIER\n"); 362 Print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ZERO REDUCTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 392 if(NULL == tempNF) { 363 393 reductionsToZero++; 364 394 // TODO: sPolyList -> delete first element of list as it is zero and done 365 366 temp = temp->getNext();367 395 // TODO: problem is that when deleting the first element, the origin of the 368 396 // corresponding rule is deleted! 397 temp = temp->getNext(); 369 398 //sPolyList->setFirst(temp); 399 Print("///////////////////////////////////////////////////////////////////////\n"); 400 Print("%p\n",temp); 401 Print("%p\n",temp->getLPoly()); 402 Print("///////////////////////////////////////////////////////////////////////\n"); 370 403 } 371 404 else { 372 //Print("HIER\n"); 373 topReduction(temp, completed, gPrev, lTag, rTag); 405 ret = topReduction(temp, completed, gPrev, rules, lTag, rTag); 374 406 // in topReduction() the investigated first element of sPolyList will be deleted after its 375 407 // reduction has finished => the next to be investigated element is the newly first element 376 408 // in sPolyList => the while loop is finite 377 409 // first possible after implementation of topReduction(): temp = sPolyList->getFirst(); 378 temp = temp->getNext(); 379 } 380 } 381 } 382 return NULL; 410 completed = ret->getCompleted(); 411 Print("~~~HIER~~~\n"); 412 if(NULL != ret->getToDo()) { 413 sPolyList->insertByLabel(ret->getToDo()->getFirst()); 414 } 415 } 416 } 417 } 418 return ret->getCompleted(); 383 419 } 384 420 … … 391 427 ===================================================================================== 392 428 */ 393 void topReduction(LNode* l, LList* completed, LList* gPrev, LTagList* lTag, RTagList*rTag) {394 Print(" In topREDUCTION!\n");395 L Red* red = new LRed();429 TopRed* topReduction(LNode* l, LList* &completed, LList* &gPrev, RList* &rules, LTagList* &lTag, RTagList* &rTag) { 430 Print("##########################################In topREDUCTION!########################################\n"); 431 LNode* red = new LNode(); 396 432 do { 397 red = findReductor(l, completed, gPrev, lTag, rTag,433 red = findReductor(l, completed, gPrev, rules, lTag, rTag, 398 434 red->getGPrevRedCheck(), red->getCompletedRedCheck()); 435 Print("HIER TOP RED\n"); 399 436 // no reductor found 400 437 if(NULL == red) { 438 pWrite(l->getPoly()); 401 439 pNorm(l->getPoly()); 440 pWrite(l->getPoly()); 441 Print("________________________INSERT IN COMPLETED!____________________________\n"); 402 442 completed->insert(l->getLPoly()); 403 443 Print("%p\n",completed->getFirst()->getLPoly()); 444 pWrite(completed->getFirst()->getPoly()); 445 TopRed* ret = new TopRed(completed,NULL); 446 return ret; 404 447 } 405 448 // reductor found … … 421 464 ===================================================================== 422 465 */ 423 L Red* findReductor(LNode* l,LList* completed,LList* gPrev,LTagList* lTag,RTagList*rTag,466 LNode* findReductor(LNode* l,LList* &completed,LList* &gPrev, RList* &rules, LTagList* &lTag,RTagList* &rTag, 424 467 LNode* gPrevRedCheck, LNode* completedRedCheck) { 425 468 number nOne = nInit(1); … … 429 472 LNode* temp = new LNode(); 430 473 // setting starting point for search of reductors in gPrev 474 Print("----------------------------------------------------------------------------%p\n",completed->getFirst()->getLPoly()); 431 475 if(NULL != gPrevRedCheck) { 432 476 temp = gPrevRedCheck; … … 436 480 } 437 481 // search only for reductors with the same index, as reductions with elements of lower 438 // index w here already done in reduction() beforehand482 // index were already done in reduction() beforehand 439 483 while(NULL != temp->getLPoly() && temp->getIndex() == l->getIndex()) { 440 484 // divides head term t? 485 Print("HIER FIND\n"); 441 486 if(pLmDivisibleByNoComp(temp->getPoly(),t)) { 442 487 u = pDivide(t,pHead(temp->getPoly())); … … 452 497 if(pLmCmp(u,l->getTerm()) != 0) { 453 498 // passing criterion 2? 499 if(!criterion2(&u,temp, rules, rTag)) { 500 // passing criterion 1? 454 501 Print("HIER DRIN\n"); 455 if(!criterion2(&u,temp,rTag)) {456 // passing criterion 1?457 502 if(!criterion1(&u,temp,lTag)) { 458 503 // set tag findRedCheck such that you can start at this point when the 459 504 // next time a reductor is searched for in findReductor() 460 L Red* red = new LRed(u,temp->getIndex(),redPoly,temp->getNext(),completedRedCheck);505 LNode* red = new LNode(u,temp->getIndex(),redPoly,NULL,temp->getNext(),completedRedCheck); 461 506 return red; 462 507 } … … 473 518 else { 474 519 temp = completed->getFirst(); 520 Print("HIER FIND\n"); 521 Print("%p\n",temp->getLPoly()); 475 522 } 476 523 // search only for reductors with the same index, as reductions with elements of lower … … 488 535 if(pLmCmp(u,l->getTerm()) != 0) { 489 536 // passing criterion 2? 490 if(!criterion2(&u,temp, rTag)) {537 if(!criterion2(&u,temp, rules, rTag)) { 491 538 // passing criterion 1? 492 539 if(!criterion1(&u,temp,lTag)) { 493 540 // set tag findRedCheck such that you can start at this point when the 494 541 // next time a reductor is searched for in findReductor() 495 L Red* red = new LRed(u,temp->getIndex(),redPoly,gPrevRedCheck,temp->getNext());542 LNode* red = new LNode(u,temp->getIndex(),redPoly,NULL,gPrevRedCheck,temp->getNext()); 496 543 return red; 497 544 } … … 503 550 504 551 // no reductor found 552 Print("HIER DU NULL!\n"); 505 553 return NULL; 506 554 } … … 515 563 ideal F5main(ideal id, ring r) { 516 564 int i,j; 517 //static int* reductionsToZero = new int; 518 //*reductionsToZero = 0; 565 int gbLength; 519 566 // 1 polynomial for defining initial labels & further tests 520 567 poly ONE = pOne(); 568 // tag the first element of index i-1 for criterion 1 569 LTagList* lTag = new LTagList(); 570 Print("LTAG BEGINNING: %p\n",lTag->getFirst()); 571 572 // first element in rTag is first element of rules which is NULL RNode, 573 // this must be done due to possible later improvements 574 RList* rules = new RList(); 575 RTagList* rTag = new RTagList(rules->getFirst()); 521 576 i = 1; 522 poly* lcm = new poly;523 // initialization for usage in pLcm()524 *lcm = pOne();525 pWrite(*lcm);526 // definition of one-polynomial as global constant ONE527 //poly one = pInit();528 //pSetCoeff(one, nInit(1));529 //static poly ONE = one;530 531 577 for(j=0; j<IDELEMS(id); j++) { 532 578 if(NULL != id->m[j]) { … … 539 585 } 540 586 } 541 pLcm( id->m[0], id->m[1], *lcm);542 Print("LCM NEU\n");543 //*lcm = pHead(*lcm);544 //pWrite(*lcm);545 Print("\n\n");546 id = kInterRed(id,0);547 qsortDegree(&id->m[0],&id->m[IDELEMS(id)-1]);548 idShow(id);549 587 LList* gPrev = new LList(ONE, i, id->m[0]); 550 int gbLength = gPrev->getLength(); 551 pWrite(id->m[0]); 552 poly p = pHead(id->m[0]); 553 pWrite(p); 554 poly q = pHead(id->m[2]); 555 pWrite(q); 556 588 lTag->insert(gPrev->getFirst()); 557 589 // computing the groebner basis of the elements of index < actual index 590 gbLength = gPrev->getLength(); 558 591 Print("Laenge der bisherigen Groebner Basis: %d\n",gPrev->getLength()); 559 592 ideal gbPrev = idInit(gbLength,1); … … 564 597 565 598 for(i=2; i<=IDELEMS(id); i++) { 566 gPrev = F5inc(i, id->m[i-1], gPrev, gbPrev, ONE );599 gPrev = F5inc(i, id->m[i-1], gPrev, gbPrev, ONE, lTag, rules, rTag); 567 600 // comuting new groebner basis gbPrev 568 601 ideal gbAdd = idInit(gPrev->getLength()-gbLength,1); -
kernel/f5gb.h
rc5d8dd r87beab7 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: f5gb.h,v 1.2 3 2009-02-08 19:17:54ederc Exp $ */4 /* $Id: f5gb.h,v 1.24 2009-02-11 21:24:07 ederc Exp $ */ 5 5 /* 6 6 * ABSTRACT: f5gb interface … … 35 35 ================================================== 36 36 */ 37 LList* F5inc(int i, poly f_i, LList* gPrev, ideal gbPrev, poly ONE );37 LList* F5inc(int i, poly f_i, LList* gPrev, ideal gbPrev, poly ONE, LTagList* lTag, RList* rules, RTagList* rTag); 38 38 39 39 /* … … 44 44 ================================================================ 45 45 */ 46 CList* criticalPair(LList* gPrev, CList* critPairs, LTagList* lTag, RTagList* rTag );46 CList* criticalPair(LList* gPrev, CList* critPairs, LTagList* lTag, RTagList* rTag, RList* rules); 47 47 48 48 /* … … 58 58 ===================================== 59 59 */ 60 bool criterion2(poly* t, LNode* l, R TagList* rTag);60 bool criterion2(poly* t, LNode* l, RList* rules, RTagList* rTag); 61 61 62 62 /* … … 65 65 ========================================================================================================== 66 66 */ 67 bool criterion2(poly* t, LPoly* l, R TagList* rTag, Rule* lastRuleTested);67 bool criterion2(poly* t, LPoly* l, RList* rules, Rule* lastRuleTested); 68 68 69 69 /* … … 79 79 ======================================================================== 80 80 */ 81 L Node* reduction(LList* sPolyList, LList* completed, LList* gPrev, LTagList* lTag, RTagList*rTag,81 LList* reduction(LList* &sPolyList, LList* &completed, LList* &gPrev, RList* &rules, LTagList* &lTag, RTagList* &rTag, 82 82 ideal gbPrev); 83 83 … … 88 88 ===================================================================================== 89 89 */ 90 void topReduction(LNode* l, LList* completed, LList* gPrev, LTagList* lTag, RTagList*rTag);90 TopRed* topReduction(LNode* l, LList* &completed, LList* &gPrev, RList* &rules, LTagList* &lTag, RTagList* &rTag); 91 91 92 92 /* … … 95 95 ===================================================================== 96 96 */ 97 L Red* findReductor(LNode* l,LList* completed,LList* gPrev,LTagList* lTag,RTagList*rTag,97 LNode* findReductor(LNode* l,LList* &completed,LList* &gPrev, RList* &rules, LTagList* &lTag,RTagList* &rTag, 98 98 LNode* gPrevRedCheck, LNode* completedRedCheck); 99 99 100 100 /* 101 101 ====================================== 102 main function of our f5 implementation102 main function of our F5 implementation 103 103 ====================================== 104 104 */ -
kernel/f5lists.cc
rc5d8dd r87beab7 27 27 // generating new list elements (labeled / classical polynomial / LNode view) 28 28 LNode::LNode() { 29 data = NULL; 30 next = NULL; 29 data = NULL; 30 next = NULL; 31 gPrevRedCheck = NULL; 32 completedRedCheck = NULL; 31 33 } 32 34 LNode::LNode(LPoly* lp) { 33 data = lp; 34 next = NULL; 35 data = lp; 36 next = NULL; 37 gPrevRedCheck = NULL; 38 completedRedCheck = NULL; 35 39 } 36 40 37 41 LNode::LNode(LPoly* lp, LNode* l) { 38 data = lp; 39 next = l; 40 } 41 LNode::LNode(poly t, int i, poly p) { 42 LPoly* lp = new LPoly(t,i,p); 43 data = lp; 44 next = NULL; 42 Print("HIER LNODE\n"); 43 data = lp; 44 next = l; 45 gPrevRedCheck = NULL; 46 completedRedCheck = NULL; 47 } 48 49 LNode::LNode(poly t, int i, poly p, Rule* r, LNode* gPCheck, LNode* CompCheck) { 50 LPoly* lp = new LPoly(t,i,p,r); 51 data = lp; 52 next = NULL; 53 gPrevRedCheck = gPCheck; 54 completedRedCheck = CompCheck; 45 55 } 46 56 47 LNode::LNode(poly t, int i, poly p, LNode* l) { 48 LPoly* lp = new LPoly(t,i,p); 49 data = lp; 50 next = l; 57 LNode::LNode(poly t, int i, poly p, Rule* r, LNode* gPCheck, LNode* CompCheck, LNode* l) { 58 LPoly* lp = new LPoly(t,i,p,r); 59 data = lp; 60 next = l; 61 gPrevRedCheck = gPCheck; 62 completedRedCheck = CompCheck; 51 63 } 52 64 53 65 LNode::LNode(LNode* ln) { 54 data = ln->getLPoly(); 55 next = ln->getNext(); 66 data = ln->getLPoly(); 67 next = ln->getNext(); 68 gPrevRedCheck = NULL; 69 completedRedCheck = NULL; 56 70 } 57 71 58 72 LNode::~LNode() { 59 73 delete next; 74 delete gPrevRedCheck; 75 delete completedRedCheck; 60 76 delete data; 61 77 } … … 63 79 // insert new elements to the list always in front (labeled / classical polynomial view) 64 80 LNode* LNode::insert(LPoly* lp) { 81 Print("HIER\n"); 65 82 LNode* newElement = new LNode(lp, this); 66 83 return newElement; 67 84 } 68 85 69 LNode* LNode::insert(poly t, int i, poly p ) {70 LNode* newElement = new LNode(t, i, p, this);86 LNode* LNode::insert(poly t, int i, poly p, Rule* r) { 87 LNode* newElement = new LNode(t, i, p, r, NULL, NULL, this); 71 88 return newElement; 72 89 } … … 74 91 // insert new elemets to the list w.r.t. increasing labels 75 92 // only used for the S-polys to be reduced (TopReduction building new S-polys with higher label) 76 LNode* LNode::insertByLabel(poly t, int i, poly p ) {93 LNode* LNode::insertByLabel(poly t, int i, poly p, Rule* r) { 77 94 if(0 == pLmCmp(t,this->getTerm()) || -1 == pLmCmp(t,this->getTerm())) { 78 LNode* newElement = new LNode(t, i, p, this);95 LNode* newElement = new LNode(t, i, p, r, this); 79 96 return newElement; 80 97 } … … 83 100 while( NULL != temp->next->data ) { 84 101 if( 0 == pLmCmp(t,temp->next->getTerm()) || -1 == pLmCmp(t,temp->next->getTerm())) { 85 LNode* newElement = new LNode(t, i, p, temp->next);102 LNode* newElement = new LNode(t, i, p, r, temp->next); 86 103 temp->next = newElement; 87 104 return this; … … 91 108 } 92 109 } 93 LNode* newElement = new LNode(t, i, p, NULL);110 LNode* newElement = new LNode(t, i, p, r, NULL); 94 111 temp->next = newElement; 95 112 return this; … … 126 143 } 127 144 145 Rule* LNode::getRule() { 146 return data->getRule(); 147 } 148 149 LNode* LNode::getGPrevRedCheck() { 150 return gPrevRedCheck; 151 } 152 153 LNode* LNode::getCompletedRedCheck() { 154 return completedRedCheck; 155 } 156 128 157 // set the data from the LPoly saved in LNode 129 158 void LNode::setPoly(poly p) { … … 137 166 void LNode::setIndex(int i) { 138 167 data->setIndex(i); 168 } 169 170 void LNode::setGPrevRedCheck(LNode* l) { 171 gPrevRedCheck = l; 172 } 173 174 void LNode::setCompletedRedCheck(LNode* l) { 175 completedRedCheck = l; 139 176 } 140 177 … … 171 208 } 172 209 173 LList::LList(poly t,int i,poly p ) {174 first = new LNode(t,i,p );210 LList::LList(poly t,int i,poly p,Rule* r) { 211 first = new LNode(t,i,p,r); 175 212 length = 1; 176 213 } … … 186 223 } 187 224 188 void LList::insert(poly t,int i, poly p ) {189 first = first->insert(t,i,p );225 void LList::insert(poly t,int i, poly p, Rule* r) { 226 first = first->insert(t,i,p,r); 190 227 length++; 191 228 } 192 229 193 void LList::insertByLabel(poly t, int i, poly p) { 194 first = first->insertByLabel(t,i,p); 230 void LList::insertByLabel(poly t, int i, poly p, Rule* r) { 231 first = first->insertByLabel(t,i,p,r); 232 length++; 233 } 234 235 void LList::insertByLabel(LNode* l) { 236 first = first->insertByLabel(l->getTerm(),l->getIndex(),l->getPoly(),l->getRule()); 195 237 length++; 196 238 } … … 222 264 } 223 265 224 /*225 ===================================226 functions working on the class LRed227 ===================================228 */229 LRed::LRed() {230 data = NULL;231 gPrevRedCheck = NULL;232 completedRedCheck = NULL;233 }234 235 LRed::LRed(poly t,int i,poly p,LNode* g, LNode* c) {236 LPoly* lp = new LPoly(t,i,p);237 data = lp;238 gPrevRedCheck = g;239 completedRedCheck = c;240 }241 242 LPoly* LRed::getLPoly() {243 return data;244 }245 246 LNode* LRed::getGPrevRedCheck() {247 return gPrevRedCheck;248 }249 250 LNode* LRed::getCompletedRedCheck() {251 return completedRedCheck;252 }253 254 // get the data from the LPoly saved in LNode255 poly LRed::getPoly() {256 return data->getPoly();257 }258 259 poly LRed::getTerm() {260 return data->getTerm();261 }262 263 int LRed::getIndex() {264 return data->getIndex();265 }266 267 // set the data from the LPoly saved in LNode268 void LRed::setPoly(poly p) {269 data->setPoly(p);270 }271 272 void LRed::setTerm(poly t) {273 data->setTerm(t);274 }275 276 void LRed::setIndex(int i) {277 data->setIndex(i);278 }279 266 280 267 … … 284 271 ======================================= 285 272 */ 273 LTagNode::LTagNode() { 274 data = NULL; 275 next = NULL; 276 } 286 277 287 278 LTagNode::LTagNode(LNode* l) { … … 333 324 ======================================= 334 325 */ 326 LTagList::LTagList() { 327 LTagNode* first = new LTagNode(); 328 length = 0; 329 } 335 330 336 331 LTagList::LTagList(LNode* l) { … … 347 342 LNode* LTagList::get(int idx) { 348 343 return first->get(idx, length); 344 } 345 346 LNode* LTagList::getFirst() { 347 return first->getLNode(); 348 } 349 350 351 /* 352 ===================================== 353 functions working on the class TopRed 354 ===================================== 355 */ 356 357 TopRed::TopRed() { 358 _completed = NULL; 359 _toDo = NULL; 360 } 361 362 TopRed::TopRed(LList* c, LList* t) { 363 _completed = c; 364 _toDo = t; 365 } 366 367 LList* TopRed::getCompleted() { 368 return _completed; 369 } 370 371 LList* TopRed::getToDo() { 372 return _toDo; 349 373 } 350 374 … … 635 659 } 636 660 637 RNode* RNode::insert(int i, poly t , LPoly* l) {638 Rule* r = new Rule(i,t ,l);661 RNode* RNode::insert(int i, poly t) { 662 Rule* r = new Rule(i,t); 639 663 RNode* newElement = new RNode(r); 640 664 newElement->next = this; … … 658 682 } 659 683 660 LPoly* RNode::getRuleOrigin() {661 return data->getOrigin();662 }663 664 684 /* 665 685 ==================================== … … 675 695 } 676 696 677 void RList::insert(int i, poly t , LPoly* l) {678 first = first->insert(i,t ,l);697 void RList::insert(int i, poly t) { 698 first = first->insert(i,t); 679 699 } 680 700 … … 734 754 RNode* RTagNode::get(int idx, int length) { 735 755 if(idx==1 || idx==0) { 756 // NOTE: We set this NULL as putting it the last element in the list, i.e. the element having 757 // RNode* = NULL would cost lots of iterations at each step of F5inc, with increasing 758 // length of the list this should be prevented 736 759 return NULL; 737 760 } … … 739 762 int j; 740 763 RTagNode* temp = this; 741 for(j=1; j<=length-idx+1; j++) { 764 Print("\n\nHIER IN GET IDX\n"); 765 Print("FOR LOOP: %d\n",length-idx+1); 766 for(j=1; j<=length-idx+1; j++) { 742 767 temp = temp->next; 743 768 } … … 750 775 } 751 776 777 void RTagNode::print() { 778 RTagNode* temp = this; 779 Print("1. element: %d",getRNode()->getRule()->getIndex()); 780 pWrite(getRNode()->getRule()->getTerm()); 781 temp = temp->next; 782 int i = 2; 783 while(NULL != temp->getRNode()) { 784 Print("%d. element: %d",i,getRNode()->getRule()->getIndex()); 785 pWrite(getRNode()->getRule()->getTerm()); 786 temp = temp->next; 787 i++; 788 } 789 } 752 790 /* 753 791 ======================================= … … 769 807 void RTagList::insert(RNode* r) { 770 808 first = first->insert(r); 771 length++; 809 Print("LENGTH:%d\n",length); 810 length = length +1; 811 Print("LENGTH:%d\n",length); 772 812 } 773 813 … … 783 823 first->set(r); 784 824 } 825 826 void RTagList::print() { 827 first->print(); 828 } 829 830 int RTagList::getLength() { 831 return length; 832 } 785 833 #endif -
kernel/f5lists.h
rc5d8dd r87beab7 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: f5lists.h,v 1. 7 2009-02-08 19:17:54ederc Exp $ */4 /* $Id: f5lists.h,v 1.8 2009-02-11 21:24:08 ederc Exp $ */ 5 5 /* 6 6 * ABSTRACT: list interface … … 20 20 class LNode; 21 21 class LList; 22 class LRed;23 22 class LTagNode; 24 23 class LTagList; … … 38 37 class LNode { 39 38 private: 40 LPoly* data; 41 LNode* next; 39 LPoly* data; 40 LNode* next; 41 LNode* gPrevRedCheck; 42 LNode* completedRedCheck; 42 43 public: 43 44 // generating new list elements from the labeled / classical polynomial view … … 45 46 LNode(LPoly* lp); 46 47 LNode(LPoly* lp, LNode* l); 47 LNode(poly t, int i, poly p );48 LNode(poly t, int i, poly p, LNode* l);48 LNode(poly t, int i, poly p, Rule* r=NULL, LNode* gPCheck=NULL, LNode* CompCheck=NULL); 49 LNode(poly t, int i, poly p, Rule* r, LNode* gPCheck, LNode* CompCheck, LNode* l); 49 50 LNode(LNode* ln); 50 51 ~LNode(); 51 52 // insert new elements to the list in first place from the labeled / classical polynomial view 52 53 LNode* insert(LPoly* lp); 53 LNode* insert(poly t, int i, poly p );54 LNode* insert(poly t, int i, poly p, Rule* r); 54 55 // insert new elements to the list with resp. to increasing labels 55 56 // only used for the S-polys to be reduced (TopReduction building new S-polys with higher label) 56 LNode* insertByLabel(poly t, int i, poly p );57 LNode* insertByLabel(poly t, int i, poly p, Rule* r); 57 58 // deletes the first elements of the list with the same degree 58 59 // get next from current LNode … … 66 67 poly getTerm(); 67 68 int getIndex(); 69 Rule* getRule(); 70 LNode* getGPrevRedCheck(); 71 LNode* getCompletedRedCheck(); 68 72 // set the data from the LPoly saved in LNode 69 73 void setPoly(poly p); 70 74 void setTerm(poly t); 71 75 void setIndex(int i); 76 void setGPrevRedCheck(LNode* l); 77 void setCompletedRedCheck(LNode* l); 72 78 // test if for any list element the polynomial part of the data is equal to *p 73 79 bool polyTest(poly* p); … … 88 94 LList(); 89 95 LList(LPoly* lp); 90 LList(poly t,int i,poly p );96 LList(poly t,int i,poly p, Rule* r = NULL); 91 97 ~LList(); 92 98 void insert(LPoly* lp); 93 99 // insertion in front of the list 94 void insert(poly t,int i, poly p); 95 void insertByLabel(poly t, int i, poly p); 100 void insert(poly t,int i, poly p, Rule* r = NULL); 101 void insertByLabel(poly t, int i, poly p, Rule* r = NULL); 102 void insertByLabel(LNode* l); 96 103 void deleteByDeg(); 97 104 bool polyTest(poly* p); … … 103 110 104 111 105 /*106 =========================================107 class LRed (nodes for lists of Reductors)108 =========================================109 */110 class LRed {111 private:112 LPoly* data;113 LNode* gPrevRedCheck;114 LNode* completedRedCheck;115 public:116 // generating new list elements from the labeled / classical polynomial view117 LRed();118 LRed(poly t, int i, poly p, LNode* g, LNode* c);119 ~LRed();120 // get the LPoly* out of LNode*121 LPoly* getLPoly();122 // get the last reductor tested in subalgorithm findReductor() in f5gb.cc123 LNode* getGPrevRedCheck();124 LNode* getCompletedRedCheck();125 // get data from the labeled polynomial126 poly getPoly();127 poly getTerm();128 int getIndex();129 // set the data from the LPoly saved in LNode130 void setPoly(poly p);131 void setTerm(poly t);132 void setIndex(int i);133 };134 135 112 136 113 /* … … 144 121 LTagNode* next; 145 122 public: 123 LTagNode(); 146 124 LTagNode(LNode* l); 147 125 LTagNode(LNode* l, LTagNode* n); … … 164 142 int length; 165 143 public: 144 LTagList(); 166 145 LTagList(LNode* l); 167 146 ~LTagList(); … … 169 148 void insert(LNode* l); 170 149 LNode* get(int idx); 150 LNode* getFirst(); 151 }; 152 153 LNode* getGPrevRedCheck(); 154 LNode* getcompletedRedCheck(); 155 156 157 /* 158 ====================================================================================== 159 class TopRed(return values of subalgorithm TopRed in f5gb.cc), i.e. the first elements 160 of the lists LList* completed & LList* sPolyList 161 ====================================================================================== 162 */ 163 class TopRed { 164 private: 165 LList* _completed; 166 LList* _toDo; 167 public: 168 TopRed(); 169 TopRed(LList* c, LList* t); 170 LList* getCompleted(); 171 LList* getToDo(); 171 172 }; 172 173 … … 243 244 ~RNode(); 244 245 RNode* insert(Rule* r); 245 RNode* insert(int i, poly t , LPoly* l);246 RNode* insert(int i, poly t); 246 247 RNode* getNext(); 247 248 Rule* getRule(); 248 249 int getRuleIndex(); 249 250 poly getRuleTerm(); 250 LPoly* getRuleOrigin();251 251 }; 252 252 … … 266 266 ~RList(); 267 267 void insert(Rule* r); 268 void insert(int i, poly t , LPoly* l);268 void insert(int i, poly t); 269 269 RNode* getFirst(); 270 270 Rule* getRule(); … … 292 292 RNode* get(int idx, int length); 293 293 void set(RNode*); 294 void print(); 294 295 }; 295 296 … … 310 311 // declaration with first as parameter in LTagNode due to sorting of LTagList 311 312 void insert(RNode* r); 312 void insert(int i, poly* t, LPoly* l);313 313 RNode* getFirst(); 314 314 RNode* get(int idx); 315 315 void setFirst(RNode* r); 316 void print(); 317 int getLength(); 316 318 }; 317 319 #endif
Note: See TracChangeset
for help on using the changeset viewer.