Changeset 4199b3 in git
- Timestamp:
- Mar 17, 2011, 5:37:55 PM (12 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
- Children:
- e7463f6a2c8fb0cc7abe50aa54f387c997fec2d8
- Parents:
- 9a038bd3951d010760b79ca2e8b0eb43932c0b9a
- Location:
- kernel
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/gfan.cc
r9a038bd r4199b3 9 9 #include <kernel/mod2.h> 10 10 11 #ifdef HAVE_ GFAN11 #ifdef HAVE_FANS 12 12 #include <kernel/options.h> 13 13 #include <kernel/kstd1.h> 14 14 #include <kernel/kutil.h> 15 #include "int64vec.h"15 // #include "int64vec.h" 16 16 #include <kernel/polys.h> 17 17 #include <kernel/ideals.h> 18 18 #include <kernel/kmatrix.h> 19 19 #include <kernel/GMPrat.h> 20 #include "fast_maps.h" //Mapping of ideals 21 #include "maps.h" 22 #include "ring.h" apparently not needed 23 #include "structs.h" 20 21 #include "ring.h" //apparently not needed 22 // #include "structs.h" 24 23 #include <Singular/lists.h> 25 24 #include <kernel/prCopy.h> 26 25 #include <kernel/stairc.h> 27 #include <bitset>28 #include <fstream> read-write cones to files29 #include <gmp.h>26 // #include <bitset> 27 #include <fstream> //read-write cones to files 28 // #include <gmp.h> 30 29 #include <string> 31 30 #include <sstream> 32 #include <time.h>31 // #include <time.h> 33 32 #include <stdlib.h> 34 #include <gmpxx.h>35 #include <vector>36 33 #include <assert.h> 37 34 // #include <Singular/bbfan.h> 35 // #include <Singular/bbcone.h> 36 #include <gfanlib/gfanlib.h> 38 37 39 38 /*DO NOT REMOVE THIS*/ … … 42 41 #endif 43 42 44 Hacks for different working places43 //Hacks for different working places 45 44 #define p800 46 47 #ifdef UNI48 #include <ers/urmel/alggeom/monerjan/cddlib/include/setoper.h>49 #include <ers/urmel/alggeom/monerjan/cddlib/include/cdd.h>50 #endif51 52 #ifdef HOME53 #include <me/momo/studium/diplomarbeit/cddlib/include/setoper.h>54 #include <me/momo/studium/diplomarbeit/cddlib/include/cdd.h>55 #endif56 57 #ifdef ITWM58 #include <slg/monerjan/cddlib/include/setoper.h>59 #include <slg/monerjan/cddlib/include/cdd.h>60 #include <slg/monerjan/cddlib/include/cddmp.h>61 #endif62 45 63 46 #ifdef p800 … … 68 51 69 52 #ifndef gfan_DEBUG 70 #define gfan_DEBUG53 // #define gfan_DEBUG 71 54 #ifndef gfan_DEBUGLEVEL 72 55 #define gfan_DEBUGLEVEL 1 … … 74 57 #endif 75 58 76 NOTE Defining this will slow things down!77 Only good for very coarse profiling78 #define gfanp59 //NOTE Defining this will slow things down! 60 //Only good for very coarse profiling 61 // #define gfanp 79 62 #ifdef gfanp 80 63 #include <sys/time.h> … … 84 67 #ifndef SHALLOW 85 68 #define SHALLOW 69 #endif 70 71 #ifndef USE_ZFAN 72 #define USE_ZFAN 86 73 #endif 87 74 … … 96 83 * 97 84 */ 98 85 99 86 /** \brief The default constructor for facets 100 87 */ 101 facet::facet() 102 { 103 Pointer to next facet. */88 facet::facet() 89 { 90 // Pointer to next facet. */ 104 91 /* Defaults to NULL. This way there is no need to check explicitly */ 105 92 this->fNormal=NULL; 106 this->interiorPoint=NULL; 93 this->interiorPoint=NULL; 107 94 this->UCN=0; 108 95 this->codim2Ptr=NULL; 109 this->codim=1; default for (codim-1)-facets96 this->codim=1; //default for (codim-1)-facets 110 97 this->numCodim2Facets=0; 111 98 this->numRays=0; 112 99 this->flipGB=NULL; 113 100 this->next=NULL; 114 this->prev=NULL; 115 this->flipRing=NULL; the ring on the other side101 this->prev=NULL; 102 this->flipRing=NULL; //the ring on the other side 116 103 this->isFlippable=FALSE; 117 104 } 118 105 119 106 /** \brief Constructor for facets of codim == 2 120 107 * Note that as of now the code of the constructors is only for facets and codim2-faces. One … … 124 111 { 125 112 this->fNormal=NULL; 126 this->interiorPoint=NULL; 113 this->interiorPoint=NULL; 127 114 this->UCN=0; 128 115 this->codim2Ptr=NULL; … … 130 117 { 131 118 this->codim=n; 132 } NOTE Handle exception here!119 }//NOTE Handle exception here! 133 120 this->numCodim2Facets=0; 134 121 this->numRays=0; … … 139 126 this->isFlippable=FALSE; 140 127 } 141 128 142 129 /** \brief The copy constructor 143 130 * By default only copies the fNormal, f2Normals and UCN … … 148 135 this->UCN=f.UCN; 149 136 this->isFlippable=f.isFlippable; 150 Needed for flip2151 NOTE ONLY REFERENCE152 this->interiorPoint=iv64Copy(f.interiorPoint); only referencing is prolly not the best thing to do in a copy constructor137 //Needed for flip2 138 //NOTE ONLY REFERENCE 139 this->interiorPoint=iv64Copy(f.interiorPoint);//only referencing is prolly not the best thing to do in a copy constructor 153 140 facet* f2Copy; 154 141 f2Copy=f.codim2Ptr; … … 168 155 { 169 156 f2Act=new facet(2); 170 this->codim2Ptr=f2Act; 157 this->codim2Ptr=f2Act; 171 158 } 172 159 else … … 180 167 int64vec *f2Normal; 181 168 f2Normal = f2Copy->getFacetNormal(); 182 f2Act->setFacetNormal(f2Copy->getFacetNormal());169 // f2Act->setFacetNormal(f2Copy->getFacetNormal()); 183 170 f2Act->setFacetNormal(f2Normal); 184 171 delete f2Normal; 185 172 f2Act->setUCN(f2Copy->getUCN()); 186 173 f2Copy = f2Copy->next; 187 } 174 } 188 175 } 189 176 … … 209 196 { 210 197 #ifdef gfan_DEBUG 211 printf("shallowdel@UCN %i\n", this->getUCN());198 // printf("shallowdel@UCN %i\n", this->getUCN()); 212 199 #endif 213 200 this->fNormal=NULL; 214 this->UCN=0;201 // this->UCN=0; 215 202 this->interiorPoint=NULL; 216 203 this->codim2Ptr=NULL; … … 219 206 this->flipGB=NULL; 220 207 this->flipRing=NULL; 221 assert(this->fNormal==NULL); 222 delete(this);223 } 224 208 assert(this->fNormal==NULL); 209 // delete(this); 210 } 211 225 212 /** The default destructor */ 226 213 facet::~facet() 227 214 { 228 215 #ifdef gfan_DEBUG 229 printf("~facet@UCN %i\n",this->getUCN());216 // printf("~facet@UCN %i\n",this->getUCN()); 230 217 #endif 231 218 if(this->fNormal!=NULL) … … 234 221 delete this->interiorPoint; 235 222 /* Cleanup the codim2-structure */ 236 if(this->codim==2)237 {238 facet *codim2Ptr;239 codim2Ptr = this->codim2Ptr;240 while(codim2Ptr!=NULL)241 {242 if(codim2Ptr->fNormal!=NULL)243 {244 delete codim2Ptr->fNormal;//NOTE Do not want this anymore since the rays are now in gcone!245 codim2Ptr = codim2Ptr->next;246 }247 }248 }249 The rays are stored in the cone!223 // if(this->codim==2) 224 // { 225 // facet *codim2Ptr; 226 // codim2Ptr = this->codim2Ptr; 227 // while(codim2Ptr!=NULL) 228 // { 229 // if(codim2Ptr->fNormal!=NULL) 230 // { 231 // delete codim2Ptr->fNormal;//NOTE Do not want this anymore since the rays are now in gcone! 232 // codim2Ptr = codim2Ptr->next; 233 // } 234 // } 235 // } 236 //The rays are stored in the cone! 250 237 if(this->flipGB!=NULL) 251 238 idDelete((ideal *)&this->flipGB); 252 if(this->flipRing!=NULL && this->flipRing->idroot!=(idhdl)0xfbfbfbfbfbfbfbfb)253 rDelete(this->flipRing); //See vol II/134254 this->flipRing=NULL;239 // if(this->flipRing!=NULL && this->flipRing->idroot!=(idhdl)0xfbfbfbfbfbfbfbfb) 240 // rDelete(this->flipRing); //See vol II/134 241 // this->flipRing=NULL; 255 242 this->prev=NULL; 256 243 this->next=NULL; 257 244 } 258 245 259 246 inline const int64vec *facet::getRef2FacetNormal() const 260 247 { 261 248 return(this->fNormal); 262 } 249 } 263 250 264 251 /** Equality check for facets based on unique interior points*/ … … 281 268 } 282 269 } 283 if( fIntP->compare(gIntP)!=0) res=FALSE;270 // if( fIntP->compare(gIntP)!=0) res=FALSE; 284 271 #ifdef gfanp 285 272 gettimeofday(&end, 0); 286 273 gcone::t_areEqual += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec)); 287 #endif 274 #endif 288 275 return res; 289 276 } … … 308 295 int notParallelCtr=0; 309 296 int ctr=0; 310 const int64vec* fNormal; No new since iv64Copy and therefore getFacetNormal return a new297 const int64vec* fNormal; //No new since iv64Copy and therefore getFacetNormal return a new 311 298 const int64vec* sNormal; 312 fNormal = f->getRef2FacetNormal();->getFacetNormal(); 313 sNormal = s->getRef2FacetNormal();->getFacetNormal(); 314 Do not need parallelity. Too time consuming 315 if(!isParallel(*fNormal,*sNormal)) 316 if(fNormal->compare(ivNeg(sNormal))!=0)//This results in a Mandelbug 317 notParallelCtr++; 318 else//parallelity, so we check the codim2-facets 299 fNormal = f->getRef2FacetNormal();//->getFacetNormal(); 300 sNormal = s->getRef2FacetNormal();//->getFacetNormal(); 301 #include "intvec.h" 302 //Do not need parallelity. Too time consuming 303 // if(!isParallel(*fNormal,*sNormal)) 304 // if(fNormal->compare(ivNeg(sNormal))!=0)//This results in a Mandelbug 305 // notParallelCtr++; 306 // else//parallelity, so we check the codim2-facets 319 307 int64vec *fNRef=const_cast<int64vec*>(fNormal); 320 308 int64vec *sNRef=const_cast<int64vec*>(sNormal); 321 if(isParallel(*fNormal,*sNormal)) 309 // if(isParallel(*fNormal,*sNormal)) 322 310 if(isParallel(*fNRef,*sNRef)) 323 if(fNormal->compare((sNormal))!=0)//Behold! Teh definitive Mandelbug311 // if(fNormal->compare((sNormal))!=0)//Behold! Teh definitive Mandelbug 324 312 { 325 313 facet* f2Act; 326 314 facet* s2Act; 327 f2Act = f->codim2Ptr; 315 f2Act = f->codim2Ptr; 328 316 ctr=0; 329 317 while(f2Act!=NULL) 330 318 { 331 319 const int64vec* f2Normal; 332 f2Normal = f2Act->getRef2FacetNormal(); ->getFacetNormal();333 int64vec *f2Ref=const_cast<int64vec*>(f2Normal);320 f2Normal = f2Act->getRef2FacetNormal();//->getFacetNormal(); 321 // int64vec *f2Ref=const_cast<int64vec*>(f2Normal); 334 322 s2Act = s->codim2Ptr; 335 323 while(s2Act!=NULL) 336 324 { 337 325 const int64vec* s2Normal; 338 s2Normal = s2Act->getRef2FacetNormal(); ->getFacetNormal();339 bool foo=areEqual(f2Normal,s2Normal);340 int64vec *s2Ref=const_cast<int64vec*>(s2Normal);326 s2Normal = s2Act->getRef2FacetNormal();//->getFacetNormal(); 327 // bool foo=areEqual(f2Normal,s2Normal); 328 // int64vec *s2Ref=const_cast<int64vec*>(s2Normal); 341 329 int foo=f2Normal->compare(s2Normal); 342 330 if(foo==0) 343 331 ctr++; 344 332 s2Act = s2Act->next; 345 delete s2Normal;333 // delete s2Normal; 346 334 } 347 delete f2Normal;335 // delete f2Normal; 348 336 f2Act = f2Act->next; 349 } 350 } 351 delete fNormal;352 delete sNormal;337 } 338 } 339 // delete fNormal; 340 // delete sNormal; 353 341 if(ctr==f->numCodim2Facets) 354 342 res=TRUE; … … 365 353 #endif 366 354 return res; 367 int64vec *foo=ivNeg(sNormal);368 if(fNormal->compare(foo)!=0) //facet normals369 {370 delete foo;371 res=FALSE;372 }373 else374 {375 facet* f2Act;376 facet* s2Act;377 f2Act = f->codim2Ptr; 378 ctr=0;379 while(f2Act!=NULL)380 {381 int64vec* f2Normal;382 f2Normal = f2Act->getFacetNormal();383 s2Act = s->codim2Ptr;384 while(s2Act!=NULL)385 {386 int64vec* s2Normal;387 s2Normal = s2Act->getFacetNormal();388 // bool foo=areEqual(f2Normal,s2Normal);389 int foo=f2Normal->compare(s2Normal);390 if(foo==0)391 ctr++;392 s2Act = s2Act->next;393 delete s2Normal;394 }395 delete f2Normal;396 f2Act = f2Act->next;397 }398 } 399 delete fNormal;400 delete sNormal;401 if(ctr==f->numCodim2Facets)402 res=TRUE;403 return res;404 } 405 355 // int64vec *foo=ivNeg(sNormal); 356 // if(fNormal->compare(foo)!=0) //facet normals 357 // { 358 // delete foo; 359 // res=FALSE; 360 // } 361 // else 362 // { 363 // facet* f2Act; 364 // facet* s2Act; 365 // f2Act = f->codim2Ptr; 366 // ctr=0; 367 // while(f2Act!=NULL) 368 // { 369 // int64vec* f2Normal; 370 // f2Normal = f2Act->getFacetNormal(); 371 // s2Act = s->codim2Ptr; 372 // while(s2Act!=NULL) 373 // { 374 // int64vec* s2Normal; 375 // s2Normal = s2Act->getFacetNormal(); 376 // // bool foo=areEqual(f2Normal,s2Normal); 377 // int foo=f2Normal->compare(s2Normal); 378 // if(foo==0) 379 // ctr++; 380 // s2Act = s2Act->next; 381 // delete s2Normal; 382 // } 383 // delete f2Normal; 384 // f2Act = f2Act->next; 385 // } 386 // } 387 // delete fNormal; 388 // delete sNormal; 389 // if(ctr==f->numCodim2Facets) 390 // res=TRUE; 391 // return res; 392 } 393 406 394 /** Stores the facet normal \param int64vec*/ 407 395 inline void facet::setFacetNormal(int64vec *iv) … … 409 397 if(this->fNormal!=NULL) 410 398 delete this->fNormal; 411 this->fNormal = iv64Copy(iv); 412 } 413 414 /** Hopefully returns the facet normal 399 this->fNormal = iv64Copy(iv); 400 } 401 402 /** Hopefully returns the facet normal 415 403 * Mind: iv64Copy returns a new int64vec, so use this in the following way: 416 404 * int64vec *iv; … … 420 408 */ 421 409 inline int64vec *facet::getFacetNormal() const 422 { 410 { 423 411 return iv64Copy(this->fNormal); 424 return this->fNormal;412 // return this->fNormal; 425 413 } 426 414 … … 430 418 fNormal->show(); 431 419 } 432 420 433 421 /** Store the flipped GB*/ 434 422 inline void facet::setFlipGB(ideal I) … … 436 424 this->flipGB=idCopy(I); 437 425 } 438 426 439 427 /** Returns a pointer to the flipped GB 440 428 Seems not be used … … 445 433 return this->flipGB; 446 434 } 447 435 448 436 /** Print the flipped GB*/ 449 437 inline void facet::printFlipGB() … … 453 441 #endif 454 442 } 455 443 456 444 /** Set the UCN */ 457 445 inline void facet::setUCN(int n) … … 459 447 this->UCN=n; 460 448 } 461 462 /** \brief Get the UCN 449 450 /** \brief Get the UCN 463 451 * Returns the UCN iff this != NULL, else -1 464 452 */ … … 474 462 #ifdef NDEBUG 475 463 if(this!=NULL) 476 #endif 464 #endif 477 465 return this->UCN; 478 466 else 479 467 return -1; 480 468 } 481 469 482 470 /** Store an interior point of the facet */ 483 471 inline void facet::setInteriorPoint(int64vec *iv) … … 487 475 this->interiorPoint = iv64Copy(iv); 488 476 } 489 477 490 478 /** Returns a pointer to this->interiorPoint 491 479 * MIND: iv64Copy returns a new int64vec … … 501 489 return (this->interiorPoint); 502 490 } 503 491 504 492 /** \brief Debugging function 505 493 * prints the facet normal an all (codim-2)-facets that belong to it 506 494 */ 507 495 volatile void facet::fDebugPrint() 508 { 509 facet *codim2Act; 496 { 497 facet *codim2Act; 510 498 codim2Act = this->codim2Ptr; 511 499 int64vec *fNormal; 512 fNormal = this->getFacetNormal(); 500 fNormal = this->getFacetNormal(); 513 501 printf("=======================\n"); 514 502 printf("Facet normal = (");fNormal->show(1,1);printf(")\n"); … … 524 512 } 525 513 printf("=======================\n"); 526 delete fNormal; 527 } 528 529 friend class gcone; //Bad style514 delete fNormal; 515 } 516 517 //friend class gcone; //Bad style 530 518 531 519 … … 538 526 539 527 540 /** \brief Default constructor. 528 /** \brief Default constructor. 541 529 * 542 530 * Initialises this->next=NULL and this->facetPtr=NULL … … 546 534 this->next=NULL; 547 535 this->prev=NULL; 548 this->facetPtr=NULL; maybe this->facetPtr = new facet();536 this->facetPtr=NULL; //maybe this->facetPtr = new facet(); 549 537 this->baseRing=currRing; 550 538 this->counter++; 551 this->UCN=this->counter; 539 this->UCN=this->counter; 552 540 this->numFacets=0; 553 541 this->ivIntPt=NULL; 554 542 this->gcRays=NULL; 555 543 } 556 544 557 545 /** \brief Constructor with ring and ideal 558 546 * 559 * This constructor takes the root ring and the root ideal as parameters and stores 547 * This constructor takes the root ring and the root ideal as parameters and stores 560 548 * them in the private members gcone::rootRing and gcone::inputIdeal 561 549 * This constructor is only called once in the computation of the Gröbner fan, … … 569 557 this->next=NULL; 570 558 this->prev=NULL; 571 this->facetPtr=NULL; 559 this->facetPtr=NULL; 572 560 this->inputIdeal=I; 573 561 this->baseRing=currRing; … … 579 567 this->gcRays=NULL; 580 568 } 581 582 /** \brief Copy constructor 569 570 /** \brief Copy constructor 583 571 * 584 572 * Copies a cone, sets this->gcBasis to the flipped GB 585 573 * Call this only after a successful call to gcone::flip which sets facet::flipGB 586 */ 574 */ 587 575 gcone::gcone(const gcone& gc, const facet &f) 588 576 { 589 577 this->next=NULL; 590 this->prev=(gcone *)&gc; //comment in to get a tree578 // this->prev=(gcone *)&gc; //comment in to get a tree 591 579 this->prev=NULL; 592 this->numVars=gc.numVars; 580 this->numVars=gc.numVars; 593 581 this->counter++; 594 582 this->UCN=this->counter; … … 596 584 this->facetPtr=NULL; 597 585 this->gcBasis=idrCopyR(f.flipGB, f.flipRing); 598 this->inputIdeal=idCopy(this->gcBasis);586 // this->inputIdeal=idCopy(this->gcBasis); 599 587 this->baseRing=rCopy(f.flipRing); 600 588 this->numFacets=0; … … 602 590 this->gcRays=NULL; 603 591 } 604 605 /** \brief Default destructor 592 593 /** \brief Default destructor 606 594 */ 607 595 gcone::~gcone() … … 619 607 idDelete((ideal *)&this->gcBasis); 620 608 #endif 621 idDelete((ideal *)&this->gcBasis);622 if(this->inputIdeal!=NULL)623 idDelete((ideal *)&this->inputIdeal);624 if (this->rootRing!=NULL && this->rootRing!=(ip_sring *)0xfefefefefefefefe)625 rDelete(this->rootRing);609 // idDelete((ideal *)&this->gcBasis); 610 // if(this->inputIdeal!=NULL) 611 // idDelete((ideal *)&this->inputIdeal); 612 // if (this->rootRing!=NULL && this->rootRing!=(ip_sring *)0xfefefefefefefefe) 613 // rDelete(this->rootRing); 626 614 if(this->UCN!=1 && this->baseRing!=NULL) 627 615 rDelete(this->baseRing); … … 638 626 } 639 627 this->counter--; 640 should be deleted in noRevS641 dd_FreeMatrix(this->ddFacets);642 dd_FreeMatrix(this->ddFacets);628 //should be deleted in noRevS 629 // dd_FreeMatrix(this->ddFacets); 630 //dd_FreeMatrix(this->ddFacets); 643 631 for(int ii=0;ii<this->numRays;ii++) 644 632 delete(gcRays[ii]); 645 633 omFree(gcRays); 646 } 634 } 647 635 648 636 /** Returns the number of cones existing at the time*/ … … 651 639 return this->counter; 652 640 } 653 641 654 642 /** \brief Set the interior point of a cone */ 655 643 inline void gcone::setIntPoint(int64vec *iv) … … 659 647 this->ivIntPt=iv64Copy(iv); 660 648 } 661 649 662 650 /** \brief Returns either a physical copy the interior point of a cone or just a reference to it.*/ 663 651 inline int64vec *gcone::getIntPoint(bool shallow) … … 668 656 return iv64Copy(this->ivIntPt); 669 657 } 670 658 671 659 /** \brief Print the interior point */ 672 660 inline void gcone::showIntPoint() … … 674 662 ivIntPt->show(); 675 663 } 676 664 677 665 /** \brief Print facets 678 666 * This is mainly for debugging purposes. Usually called from within gdb … … 708 696 printf("\n"); 709 697 } 710 698 711 699 /** For debugging purposes only */ 712 700 static volatile void showSLA(facet &f) … … 718 706 facet *codim2Act; 719 707 codim2Act = fAct->codim2Ptr; 720 708 721 709 printf("\n"); 722 710 while(fAct!=NULL) 723 711 { 724 int64vec *fNormal; 712 int64vec *fNormal; 725 713 fNormal=fAct->getFacetNormal(); 726 714 printf("(");fNormal->show(1,0); … … 745 733 } 746 734 } 747 735 748 736 static void idDebugPrint(const ideal &I) 749 737 { … … 761 749 static void invPrint(const ideal &I) 762 750 { 763 int numElts=IDELEMS(I);764 cout << "inv = ";765 for(int ii=0;ii<numElts;ii++);766 {767 pWrite0(pHead(I->m[ii]));768 cout << ",";769 }770 cout << endl;751 // int numElts=IDELEMS(I); 752 // cout << "inv = "; 753 // for(int ii=0;ii<numElts;ii++); 754 // { 755 // pWrite0(pHead(I->m[ii])); 756 // cout << ","; 757 // } 758 // cout << endl; 771 759 } 772 760 … … 784 772 return res; 785 773 } 786 774 787 775 /** \brief Set gcone::numFacets */ 788 776 inline void gcone::setNumFacets() 789 777 { 790 778 } 791 779 792 780 /** \brief Get gcone::numFacets */ 793 781 inline int gcone::getNumFacets() … … 795 783 return this->numFacets; 796 784 } 797 785 798 786 inline int gcone::getUCN() 799 787 { 800 if( this!=NULL) && ( this!=(gcone * const)0xfbfbfbfbfbfbfbfb && this!=(gcone * const)0xfbfbfbfb ) )788 if( this!=NULL)// && ( this!=(gcone * const)0xfbfbfbfbfbfbfbfb && this!=(gcone * const)0xfbfbfbfb ) ) 801 789 return this->UCN; 802 790 else … … 829 817 * as its input. Redundancies are automatically removed using cddlib's dd_MatrixCanonicalize. 830 818 * Other methods for redundancy checkings might be implemented later. See Anders' diss p.44. 831 * Note that in order to use cddlib a 0-th column has to be added to the matrix since cddlib expects 819 * Note that in order to use cddlib a 0-th column has to be added to the matrix since cddlib expects 832 820 * each row to represent an inequality of type const+x1+...+xn <= 0. While computing the normals we come across 833 821 * the set \f$ \partial\mathcal{G} \f$ which we might store for later use. C.f p71 of journal … … 844 832 #endif 845 833 poly aktpoly; 846 int rows; will contain the dimensions of the ineq matrix - deprecated by834 int rows; // will contain the dimensions of the ineq matrix - deprecated by 847 835 dd_rowrange ddrows; 848 836 dd_colrange ddcols; 849 dd_rowset ddredrows; # of redundant rows in ddineq850 dd_rowset ddlinset; the opposite851 dd_rowindex ddnewpos=NULL; all to make dd_Canonicalize happy852 dd_NumberType ddnumb=dd_Integer; Number type853 dd_ErrorType dderr=dd_NoError; 854 Compute the # inequalities i.e. rows of the matrix855 rows=0; Initialization837 dd_rowset ddredrows; // # of redundant rows in ddineq 838 dd_rowset ddlinset; // the opposite 839 dd_rowindex ddnewpos=NULL; // all to make dd_Canonicalize happy 840 dd_NumberType ddnumb=dd_Integer; //Number type 841 dd_ErrorType dderr=dd_NoError; 842 //Compute the # inequalities i.e. rows of the matrix 843 rows=0; //Initialization 856 844 for (int ii=0;ii<IDELEMS(I);ii++) 857 845 { 858 aktpoly=(poly)I->m[ii];859 rows=rows+pLength(aktpoly)-1;846 // aktpoly=(poly)I->m[ii]; 847 // rows=rows+pLength(aktpoly)-1; 860 848 rows=rows+pLength((poly)I->m[ii])-1; 861 849 } 862 850 863 dd_rowrange aktmatrixrow=0; needed to store the diffs of the expvects in the rows of ddineq851 dd_rowrange aktmatrixrow=0; // needed to store the diffs of the expvects in the rows of ddineq 864 852 ddrows=rows; 865 853 ddcols=this->numVars; 866 dd_MatrixPtr ddineq; Matrix to store the inequalities867 ddineq=dd_CreateMatrix(ddrows,ddcols+1); The first col has to be 0 since cddlib checks for additive consts there868 869 We loop through each g\in GB and compute the resulting inequalities854 dd_MatrixPtr ddineq; //Matrix to store the inequalities 855 ddineq=dd_CreateMatrix(ddrows,ddcols+1); //The first col has to be 0 since cddlib checks for additive consts there 856 857 // We loop through each g\in GB and compute the resulting inequalities 870 858 for (int i=0; i<IDELEMS(I); i++) 871 859 { 872 aktpoly=(poly)I->m[i]; get aktpoly as i-th component of I873 simpler version of storing expvect diffs860 aktpoly=(poly)I->m[i]; //get aktpoly as i-th component of I 861 //simpler version of storing expvect diffs 874 862 int *leadexpv=(int*)omAlloc(((this->numVars)+1)*sizeof(int)); 875 863 pGetExpV(aktpoly,leadexpv); … … 879 867 pNextTerm/*aktpoly*/=pNext(pNextTerm); 880 868 int *tailexpv=(int*)omAlloc(((this->numVars)+1)*sizeof(int)); 881 pGetExpV(pNextTerm,tailexpv); 869 pGetExpV(pNextTerm,tailexpv); 882 870 for(int kk=1;kk<=this->numVars;kk++) 883 { 871 { 884 872 dd_set_si(ddineq->matrix[(dd_rowrange)aktmatrixrow][kk],leadexpv[kk]-tailexpv[kk]); 885 873 } 886 874 aktmatrixrow += 1; 887 875 omFree(tailexpv); 888 } 889 omFree(leadexpv); 890 } for876 } 877 omFree(leadexpv); 878 } //for 891 879 #if true 892 880 /*Let's make the preprocessing here. This could already be done in the above for-loop, … … 895 883 * Quote: [...] every non-zero spoly should have at least one of its terms in inv(G) 896 884 */ 897 ideal initialForm=idInit(IDELEMS(I),1);898 int64vec *gamma=new int64vec(this->numVars);885 // ideal initialForm=idInit(IDELEMS(I),1); 886 // int64vec *gamma=new int64vec(this->numVars); 899 887 int falseGammaCounter=0; 900 888 int *redRowsArray=NULL; 901 889 int num_alloc=0; 902 int num_elts=0; 890 int num_elts=0; 903 891 for(int ii=0;ii<ddineq->rowsize;ii++) 904 892 { 905 893 ideal initialForm=idInit(IDELEMS(I),I->rank); 906 read row ii into gamma907 int64 tmp;894 //read row ii into gamma 895 // int64 tmp; 908 896 int64vec *gamma=new int64vec(this->numVars); 909 897 for(int jj=1;jj<=this->numVars;jj++) … … 915 903 computeInv((ideal&)I,initialForm,*gamma); 916 904 delete gamma; 917 Create leading ideal905 //Create leading ideal 918 906 ideal L=idInit(IDELEMS(initialForm),1); 919 907 for(int jj=0;jj<IDELEMS(initialForm);jj++) … … 922 910 L->m[jj]=pCopy(/*pHead(initialForm->m[jj]))*/p); 923 911 pDelete(&p); 924 } 925 912 } 913 926 914 LObject *P = new sLObject();//TODO What's the difference between sLObject and LObject? 927 915 memset(P,0,sizeof(LObject)); … … 930 918 { 931 919 bool isMaybeFacet=FALSE; 932 P->p1=initialForm->m[jj]; build spolys of initialForm in_v920 P->p1=initialForm->m[jj]; //build spolys of initialForm in_v 933 921 934 922 for(int kk=jj+1;kk<=IDELEMS(initialForm)-1;kk++) 935 923 { 936 924 P->p2=initialForm->m[kk]; 937 ksCreateSpoly(P); 938 if(P->p!=NULL) spoly non zero=?939 { 925 ksCreateSpoly(P); 926 if(P->p!=NULL) //spoly non zero=? 927 { 940 928 poly p;//NOTE Don't use pInit here. Evil memleak will follow 941 929 poly q; 942 930 poly pDel,qDel; 943 931 p=pCopy(P->p); 944 q=pHead(p); Monomial q932 q=pHead(p); //Monomial q 945 933 pDelete(&q); 946 934 pDel=p; qDel=q; 947 935 isMaybeFacet=FALSE; 948 TODO: Suffices to check LTs here936 //TODO: Suffices to check LTs here 949 937 while(p!=NULL) 950 { 938 { 951 939 q=pHead(p); 952 940 for(int ll=0;ll<IDELEMS(L);ll++) 953 941 { 954 942 if(pLmEqual(L->m[ll],q) || pDivisibleBy(L->m[ll],q)) 955 { 943 { 956 944 isMaybeFacet=TRUE; 957 break; for945 break;//for 958 946 } 959 947 } … … 961 949 if(isMaybeFacet==TRUE) 962 950 { 963 break; while(p!=NULL)951 break;//while(p!=NULL) 964 952 } 965 953 p=pNext(p); 966 } while967 pDelete(&p);//NOTE Better to use pDel and qDel. Commenting in this line will not work!954 }//while 955 // pDelete(&p);//NOTE Better to use pDel and qDel. Commenting in this line will not work! 968 956 if(q!=NULL) pDelete(&q); 969 957 pDelete(&pDel); … … 971 959 if(isMaybeFacet==FALSE) 972 960 { 973 dd_set_si(ddineq->matrix[ii][0],1); 974 if(num_alloc==0)975 num_alloc += 1;976 else 977 num_alloc += 1;961 dd_set_si(ddineq->matrix[ii][0],1); 962 // if(num_alloc==0) 963 // num_alloc += 1; 964 // else 965 // num_alloc += 1; 978 966 if(num_alloc==num_elts) num_alloc==0 ? num_alloc=1 : num_alloc*=2; 979 967 980 968 void *tmp = realloc(redRowsArray,(num_alloc*sizeof(int))); 981 969 if(!tmp) … … 987 975 redRowsArray[num_elts]=ii; 988 976 num_elts++; 989 break;//for(int kk, since we have found one that is not in L990 goto _start; mea culpa, mea culpa, mea maxima culpa977 //break;//for(int kk, since we have found one that is not in L 978 goto _start; //mea culpa, mea culpa, mea maxima culpa 991 979 } 992 } if(P->p!=NULL)980 }//if(P->p!=NULL) 993 981 pDelete(&(P->p)); 994 } for k995 } for jj982 }//for k 983 }//for jj 996 984 _start:; 997 985 idDelete(&L); 998 986 delete P; 999 987 idDelete(&initialForm); 1000 } for(ii<ddineq-rowsize1001 delete gamma;1002 int offset=0; needed for correction of redRowsArray[ii]988 }//for(ii<ddineq-rowsize 989 // delete gamma; 990 int offset=0;//needed for correction of redRowsArray[ii] 1003 991 #ifdef gfan_DEBUG 1004 992 printf("Removed %i of %i in preprocessing step\n",num_elts,ddineq->rowsize); … … 1006 994 for( int ii=0;ii<num_elts;ii++ ) 1007 995 { 1008 dd_MatrixRowRemove(&ddineq,redRowsArray[ii]+1-offset); cddlib sucks at enumeration996 dd_MatrixRowRemove(&ddineq,redRowsArray[ii]+1-offset);//cddlib sucks at enumeration 1009 997 offset++; 1010 } 1011 free(redRowsArray); NOTE May crash on some machines.998 } 999 free(redRowsArray);//NOTE May crash on some machines. 1012 1000 /*And now for the strictly positive rows 1013 1001 * Doesn't gain significant speedup … … 1022 1010 (*ivPos)[jj]=(int)mpq_get_d(ddineq->matrix[ii][jj+1]); 1023 1011 bool isStrictlyPos=FALSE; 1024 int posCtr=0; 1012 int posCtr=0; 1025 1013 for(int jj=0;jj<this->numVars;jj++) 1026 1014 { … … 1030 1018 { 1031 1019 if ((*ivPos)[jj]>=0) 1032 { 1033 posCtr++; 1020 { 1021 posCtr++; 1034 1022 } 1035 } 1023 } 1036 1024 delete ivCanonical; 1037 1025 } … … 1052 1040 posRowsArray = (int*)tmp; 1053 1041 posRowsArray[num_elts]=ii; 1054 num_elts++; 1042 num_elts++; 1055 1043 } 1056 1044 delete ivPos; … … 1065 1053 #endif 1066 1054 1067 dd_MatrixCanonicalize(&ddineq, &ddlinset, &ddredrows, &ddnewpos, &dderr); 1068 ddrows = ddineq->rowsize; Size of the matrix with redundancies removed1055 dd_MatrixCanonicalize(&ddineq, &ddlinset, &ddredrows, &ddnewpos, &dderr); 1056 ddrows = ddineq->rowsize; //Size of the matrix with redundancies removed 1069 1057 ddcols = ddineq->colsize; 1070 1058 1071 1059 this->ddFacets = dd_CopyMatrix(ddineq); 1072 1073 /*Write the normals into class facet*/ 1074 facet *fAct; pointer to active facet1060 1061 /*Write the normals into class facet*/ 1062 facet *fAct; //pointer to active facet 1075 1063 int numNonFlip=0; 1076 1064 for (int kk = 0; kk<ddrows; kk++) 1077 1065 { 1078 int64 ggT=1; NOTE Why does (int)mpq_get_d(ddineq->matrix[kk][1]) not work?1079 int64vec *load = new int64vec(this->numVars); int64vec to store a single facet normal that will then be stored via setFacetNormal1066 int64 ggT=1;//NOTE Why does (int)mpq_get_d(ddineq->matrix[kk][1]) not work? 1067 int64vec *load = new int64vec(this->numVars);//int64vec to store a single facet normal that will then be stored via setFacetNormal 1080 1068 for (int jj = 1; jj <ddcols; jj++) 1081 1069 { 1082 1070 int64 val; 1083 1071 val = (int64)mpq_get_d(ddineq->matrix[kk][jj]); 1084 (*load)[jj-1] = val; store typecasted entry at pos jj-1 of load1072 (*load)[jj-1] = val; //store typecasted entry at pos jj-1 of load 1085 1073 ggT = int64gcd(ggT,/*(int64&)foo*/val); 1086 } for (int jj = 1; jj <ddcols; jj++)1074 }//for (int jj = 1; jj <ddcols; jj++) 1087 1075 if(ggT>1) 1088 1076 { 1089 1077 for(int ll=0;ll<this->numVars;ll++) 1090 (*load)[ll] /= ggT; make primitive vector1078 (*load)[ll] /= ggT;//make primitive vector 1091 1079 } 1092 1080 /*Quick'n'dirty hack for flippability. Executed only if gcone::hasHomInput==FALSE 1093 1081 * Otherwise every facet intersects the positive orthant 1094 */ 1082 */ 1095 1083 if(gcone::hasHomInput==FALSE) 1096 1084 { 1097 TODO: No dP needed1085 //TODO: No dP needed 1098 1086 bool isFlip=FALSE; 1099 1087 for(int jj = 0; jj<load->length(); jj++) 1100 1088 { 1101 int64vec *ivCanonical = new int64vec(load->length());1102 (*ivCanonical)[jj]=1;1103 if (dotProduct(*load,*ivCanonical)<0) 1104 {1105 isFlip=TRUE;1106 break; //URGHS1107 }1108 delete ivCanonical;1089 // int64vec *ivCanonical = new int64vec(load->length()); 1090 // (*ivCanonical)[jj]=1; 1091 // if (dotProduct(*load,*ivCanonical)<0) 1092 // { 1093 // isFlip=TRUE; 1094 // break; //URGHS 1095 // } 1096 // delete ivCanonical; 1109 1097 if((*load)[jj]<0) 1110 1098 { 1111 1099 isFlip=TRUE; 1112 1100 break; 1113 } 1101 } 1114 1102 }/*End of check for flippability*/ 1115 if(iv64isStrictlyPositive(load))1116 isFlip=TRUE;1103 // if(iv64isStrictlyPositive(load)) 1104 // isFlip=TRUE; 1117 1105 if(isFlip==FALSE) 1118 1106 { … … 1123 1111 facet *fRoot = new facet(); 1124 1112 this->facetPtr = fRoot; 1125 fAct = fRoot; 1113 fAct = fRoot; 1126 1114 } 1127 1115 else … … 1134 1122 fAct->setUCN(this->getUCN()); 1135 1123 #ifdef gfan_DEBUG 1136 printf("Marking facet (");load->show(1,0);printf(") as non flippable\n"); 1124 printf("Marking facet (");load->show(1,0);printf(") as non flippable\n"); 1137 1125 #endif 1138 1126 } … … 1153 1141 fAct->isFlippable=TRUE; 1154 1142 fAct->setFacetNormal(load); 1155 fAct->setUCN(this->getUCN()); 1143 fAct->setUCN(this->getUCN()); 1156 1144 } 1157 } hasHomInput==FALSE1158 else Every facet is flippable1159 { /*Now load should be full and we can call setFacetNormal*/ 1145 }//hasHomInput==FALSE 1146 else //Every facet is flippable 1147 { /*Now load should be full and we can call setFacetNormal*/ 1160 1148 this->numFacets++; 1161 1149 if(this->numFacets==1) … … 1172 1160 fAct->isFlippable=TRUE; 1173 1161 fAct->setFacetNormal(load); 1174 fAct->setUCN(this->getUCN()); 1175 } if (isFlippable==FALSE)1176 delete load; 1177 } for (int kk = 0; kk<ddrows; kk++)1178 1179 In cases like I=<x-1,y-1> there are only non-flippable facets...1162 fAct->setUCN(this->getUCN()); 1163 }//if (isFlippable==FALSE) 1164 delete load; 1165 }//for (int kk = 0; kk<ddrows; kk++) 1166 1167 //In cases like I=<x-1,y-1> there are only non-flippable facets... 1180 1168 if(numNonFlip==this->numFacets) 1181 { 1169 { 1182 1170 WerrorS ("Only non-flippable facets. Terminating...\n"); 1183 exit(-1);//Bit harsh maybe...1184 } 1185 1171 // exit(-1);//Bit harsh maybe... 1172 } 1173 1186 1174 /* 1187 1175 Now we should have a linked list containing the facet normals of those facets that are … … 1189 1177 -flipable 1190 1178 Adressing is done via *facetPtr 1191 */ 1179 */ 1192 1180 if (compIntPoint==TRUE) 1193 1181 { … … 1198 1186 { 1199 1187 dd_set_si(posRestr->matrix[ii][jj],1); 1200 jj++; 1188 jj++; 1201 1189 } 1202 1190 dd_MatrixAppendTo(&ddineq,posRestr); 1203 interiorPoint(ddineq, *iv); NOTE ddineq contains non-flippable facets1204 this->setIntPoint(iv); stores the interior point in gcone::ivIntPt1191 interiorPoint(ddineq, *iv); //NOTE ddineq contains non-flippable facets 1192 this->setIntPoint(iv); //stores the interior point in gcone::ivIntPt 1205 1193 delete iv; 1206 1194 dd_FreeMatrix(posRestr); 1207 } 1208 //Clean up but don't delete the return value! 1209 dd_FreeMatrix(ddineq);1210 set_free(ddredrows); check1211 set_free(ddlinset); check1212 free(ddnewpos);//<-- NOTE Here the crash occurs omAlloc issue?1195 } 1196 //Clean up but don't delete the return value! 1197 //dd_FreeMatrix(ddineq); 1198 set_free(ddredrows);//check 1199 set_free(ddlinset);//check 1200 //free(ddnewpos);//<-- NOTE Here the crash occurs omAlloc issue? 1213 1201 #ifdef gfanp 1214 1202 gettimeofday(&end, 0); … … 1216 1204 #endif 1217 1205 1218 } gcone::getConeNormals(ideal I)1219 1206 }//gcone::getConeNormals(ideal I) 1207 1220 1208 /** \brief Compute the (codim-2)-facets of a given cone 1221 1209 * This method is used during noRevS … … 1229 1217 gettimeofday(&start, 0); 1230 1218 #endif 1231 this->facetPtr->codim2Ptr = new facet(2); //instantiate a (codim-2)-facet1219 //this->facetPtr->codim2Ptr = new facet(2); //instantiate a (codim-2)-facet 1232 1220 facet *fAct; 1233 fAct = this->facetPtr; 1221 fAct = this->facetPtr; 1234 1222 facet *codim2Act; 1235 codim2Act = this->facetPtr->codim2Ptr;1236 dd_MatrixPtr ddineq; ,P,ddakt;1223 //codim2Act = this->facetPtr->codim2Ptr; 1224 dd_MatrixPtr ddineq;//,P,ddakt; 1237 1225 dd_ErrorType err; 1238 ddineq = facets2Matrix(gc); //get a matrix representation of the cone1226 //ddineq = facets2Matrix(gc); //get a matrix representation of the cone 1239 1227 ddineq = dd_CopyMatrix(gc.ddFacets); 1240 1228 /*Now set appropriate linearity*/ 1241 for (int ii=0; ii<this->numFacets; ii++) 1242 { 1229 for (int ii=0; ii<this->numFacets; ii++) 1230 { 1243 1231 dd_rowset impl_linset, redset; 1244 1232 dd_rowindex newpos; 1245 1233 dd_MatrixPtr ddakt; 1246 1234 ddakt = dd_CopyMatrix(ddineq); 1247 ddakt->representation=dd_Inequality; //Not using this makes it faster. But why does the quick check below still work?1248 ddakt->representation=dd_Generator;1235 // ddakt->representation=dd_Inequality; //Not using this makes it faster. But why does the quick check below still work? 1236 // ddakt->representation=dd_Generator; 1249 1237 set_addelem(ddakt->linset,ii+1);/*Now set appropriate linearity*/ 1250 1238 #ifdef gfanp 1251 1239 timeval t_ddMC_start, t_ddMC_end; 1252 1240 gettimeofday(&t_ddMC_start,0); 1253 #endif 1254 dd_MatrixCanonicalize(&ddakt, &impl_linset, &redset, &newpos, &err);1241 #endif 1242 //dd_MatrixCanonicalize(&ddakt, &impl_linset, &redset, &newpos, &err); 1255 1243 dd_PolyhedraPtr ddpolyh; 1256 1244 ddpolyh=dd_DDMatrix2Poly(ddakt, &err); 1257 ddpolyh=dd_DDMatrix2Poly2(ddakt, dd_MaxCutoff, &err);1245 // ddpolyh=dd_DDMatrix2Poly2(ddakt, dd_MaxCutoff, &err); 1258 1246 dd_MatrixPtr P; 1259 P=dd_CopyGenerators(ddpolyh); 1247 P=dd_CopyGenerators(ddpolyh); 1260 1248 dd_FreePolyhedra(ddpolyh); 1261 TODO Call for one cone , normalize - check equalities - plus lineality -done1249 //TODO Call for one cone , normalize - check equalities - plus lineality -done 1262 1250 #ifdef gfanp 1263 1251 gettimeofday(&t_ddMC_end,0); 1264 1252 t_ddMC += (t_ddMC_end.tv_sec - t_ddMC_start.tv_sec + 1e-6*(t_ddMC_end.tv_usec - t_ddMC_start.tv_usec)); 1265 #endif 1253 #endif 1266 1254 /* We loop through each row of P normalize it by making all 1267 1255 * entries integer ones and add the resulting vector to the 1268 1256 * int matrix facet::codim2Facets */ 1269 1257 for (int jj=1;jj<=/*ddakt*/P->rowsize;jj++) 1270 { 1258 { 1271 1259 fAct->numCodim2Facets++; 1272 if(fAct->numCodim2Facets==1) 1273 { 1274 fAct->codim2Ptr = new facet(2); 1260 if(fAct->numCodim2Facets==1) 1261 { 1262 fAct->codim2Ptr = new facet(2); 1275 1263 codim2Act = fAct->codim2Ptr; 1276 1264 } … … 1297 1285 #endif 1298 1286 codim2Act->setFacetNormal(n); 1299 delete n; 1300 } 1287 delete n; 1288 } 1301 1289 /*We check whether the facet spanned by the codim-2 facets 1302 1290 * intersects with the positive orthant. Otherwise we define this 1303 * facet to be non-flippable. Works since we set the appropriate 1291 * facet to be non-flippable. Works since we set the appropriate 1304 1292 * linearity for ddakt above. 1305 1293 */ 1306 TODO It might be faster to compute jus the implied equations instead of a relative interior point1307 int64vec *iv_intPoint = new int64vec(this->numVars);1308 dd_MatrixPtr shiftMatrix;1309 dd_MatrixPtr intPointMatrix;1310 shiftMatrix = dd_CreateMatrix(this->numVars,this->numVars+1);1311 for(int kk=0;kk<this->numVars;kk++)1312 {1313 dd_set_si(shiftMatrix->matrix[kk][0],1);1314 dd_set_si(shiftMatrix->matrix[kk][kk+1],1);1315 }1316 intPointMatrix=dd_MatrixAppend(ddakt,shiftMatrix);1317 #ifdef gfanp1318 timeval t_iP_start, t_iP_end;1319 gettimeofday(&t_iP_start, 0);1320 #endif 1321 interiorPoint(intPointMatrix,*iv_intPoint);1322 // dd_rowset impl_linste,lbasis;1323 // dd_LPSolutionPtr lps=NULL;1324 // dd_ErrorType err;1325 // dd_FindRelativeInterior(intPointMatrix, &impl_linset, &lbasis, &lps, &err);1326 #ifdef gfanp1327 gettimeofday(&t_iP_end, 0);1328 t_iP += (t_iP_end.tv_sec - t_iP_start.tv_sec + 1e-6*(t_iP_end.tv_usec - t_iP_start.tv_usec));1329 #endif1330 for(int ll=0;ll<this->numVars;ll++)1331 {1332 if( (*iv_intPoint)[ll] < 0 )1333 {1334 fAct->isFlippable=FALSE;1335 break;1336 }1337 }1294 //TODO It might be faster to compute jus the implied equations instead of a relative interior point 1295 // int64vec *iv_intPoint = new int64vec(this->numVars); 1296 // dd_MatrixPtr shiftMatrix; 1297 // dd_MatrixPtr intPointMatrix; 1298 // shiftMatrix = dd_CreateMatrix(this->numVars,this->numVars+1); 1299 // for(int kk=0;kk<this->numVars;kk++) 1300 // { 1301 // dd_set_si(shiftMatrix->matrix[kk][0],1); 1302 // dd_set_si(shiftMatrix->matrix[kk][kk+1],1); 1303 // } 1304 // intPointMatrix=dd_MatrixAppend(ddakt,shiftMatrix); 1305 // #ifdef gfanp 1306 // timeval t_iP_start, t_iP_end; 1307 // gettimeofday(&t_iP_start, 0); 1308 // #endif 1309 // interiorPoint(intPointMatrix,*iv_intPoint); 1310 // // dd_rowset impl_linste,lbasis; 1311 // // dd_LPSolutionPtr lps=NULL; 1312 // // dd_ErrorType err; 1313 // // dd_FindRelativeInterior(intPointMatrix, &impl_linset, &lbasis, &lps, &err); 1314 // #ifdef gfanp 1315 // gettimeofday(&t_iP_end, 0); 1316 // t_iP += (t_iP_end.tv_sec - t_iP_start.tv_sec + 1e-6*(t_iP_end.tv_usec - t_iP_start.tv_usec)); 1317 // #endif 1318 // for(int ll=0;ll<this->numVars;ll++) 1319 // { 1320 // if( (*iv_intPoint)[ll] < 0 ) 1321 // { 1322 // fAct->isFlippable=FALSE; 1323 // break; 1324 // } 1325 // } 1338 1326 /*End of check*/ 1339 1327 /*This test should be way less time consuming*/ … … 1358 1346 } 1359 1347 if(containsStrictlyPosRay==FALSE) 1360 TODO Not sufficient. Intersect with pos orthant for pos int1348 //TODO Not sufficient. Intersect with pos orthant for pos int 1361 1349 fAct->isFlippable=FALSE; 1362 1350 #ifdef gfanp … … 1365 1353 #endif 1366 1354 /**/ 1367 fAct = fAct->next; 1355 fAct = fAct->next; 1368 1356 dd_FreeMatrix(ddakt); 1369 1357 dd_FreeMatrix(P); 1370 } for1358 }//for 1371 1359 dd_FreeMatrix(ddineq); 1372 1360 #ifdef gfanp … … 1375 1363 #endif 1376 1364 } 1377 1365 1378 1366 /** Really extremal rays this time ;) 1379 1367 * Extremal rays are unique modulo the homogeneity space. … … 1383 1371 * checking whether the inner product of the ray with the normal is zero. 1384 1372 * We use ivAdd here which returns a new int64vec. Therefore we need to avoid 1385 * a memory leak which would be cause by the line 1373 * a memory leak which would be cause by the line 1386 1374 * iv=ivAdd(iv,b) 1387 * So we keep pointer tmp to iv and delete(tmp), so there should not occur a 1375 * So we keep pointer tmp to iv and delete(tmp), so there should not occur a 1388 1376 * memleak 1389 1377 * TODO normalization … … 1397 1385 gettimeofday(&poly_start,0); 1398 1386 #endif 1399 Add lineality space - dd_LinealitySpace1387 //Add lineality space - dd_LinealitySpace 1400 1388 dd_MatrixPtr ddineq; 1401 dd_ErrorType err; 1402 if(dd_LinealitySpace->rowsize>0)//The linspace might be 01403 ddineq = dd_AppendMatrix(gc.ddFacets,gcone::dd_LinealitySpace);1404 else1405 ddineq = dd_CopyMatrix(gc.ddFacets);1389 dd_ErrorType err; 1390 // if(dd_LinealitySpace->rowsize>0)//The linspace might be 0 1391 // ddineq = dd_AppendMatrix(gc.ddFacets,gcone::dd_LinealitySpace); 1392 // else 1393 // ddineq = dd_CopyMatrix(gc.ddFacets); 1406 1394 ddineq = (dd_LinealitySpace->rowsize>0) ? dd_AppendMatrix(gc.ddFacets,gcone::dd_LinealitySpace) : dd_CopyMatrix(gc.ddFacets); 1407 1395 /* In case the input is non-homogeneous we add constrains for the positive orthant. 1408 * This is justified by the fact that for non-homog ideals we only consider the 1396 * This is justified by the fact that for non-homog ideals we only consider the 1409 1397 * restricted fan. This way we can be sure to find strictly positive interior points. 1410 1398 * This in turn makes life easy when checking for flippability! … … 1421 1409 assert(ddineq); 1422 1410 dd_FreeMatrix(ddPosRestr); 1423 } 1411 } 1424 1412 dd_PolyhedraPtr ddPolyh; 1425 1413 ddPolyh = dd_DDMatrix2Poly(ddineq, &err); … … 1434 1422 /* Compute interior point on the fly*/ 1435 1423 int64vec *ivIntPointOfCone = new int64vec(this->numVars); 1436 mpq_t *colSum = new mpq_t[this->numVars];1437 int denom[this->numVars];//denominators of colSum1438 NOTE TODO need to gcd of rows and factor out! -> makeInt1439 /*for(int jj=0;jj<this->numVars;jj++)1440 {1441 mpq_init(colSum[jj]);1442 for(int ii=0;ii<P->rowsize;ii++)1443 {1444 mpq_t tmp; mpq_init(tmp);1445 mpq_t sum; mpq_init(sum);1446 mpq_set(sum,colSum[jj]);1447 mpq_add(tmp,sum,P->matrix[ii][jj+1]);1448 mpq_set(colSum[jj],tmp);1449 mpq_clear(tmp);1450 mpq_clear(sum);1451 }1452 mpz_t den; mpz_init(den);1453 mpq_get_den(den,colSum[jj]);1454 denom[jj]=(int)mpz_get_si(den);1455 mpz_clear(den);1456 }1457 Now compute lcm of denominators of colSum[jj]1458 NOTE gcd as well and normalise instantly?1459 mpz_t kgV; mpz_init(kgV);1460 mpz_set_str(kgV,"1",10);1461 mpz_t den; mpz_init(den);1462 mpz_t tmp; mpz_init(tmp);1463 mpq_get_den(tmp,colSum[0]);1464 for (int ii=0;ii<(this->numVars)-1;ii++)1465 {1466 mpq_get_den(den,colSum[ii+1]);1467 mpz_lcm(kgV,tmp,den);1468 mpz_set(tmp, kgV);1469 }1470 mpq_t qkgV;1471 mpq_init(qkgV);1472 mpq_set_z(qkgV,kgV);1473 mpz_clear(kgV);1474 mpz_clear(den);1475 mpz_clear(tmp);*/1476 1424 int64vec *foo = new int64vec(this->numVars); 1477 1425 for(int ii=0;ii<P->rowsize;ii++) 1478 1426 { 1479 int64vec *foo = new int64vec(this->numVars);1427 // int64vec *foo = new int64vec(this->numVars); 1480 1428 int64vec *tmp = ivIntPointOfCone; 1481 1429 makeInt(P,ii+1,*foo); 1482 1430 ivIntPointOfCone = iv64Add(ivIntPointOfCone,foo); 1483 1431 delete tmp; 1484 delete foo;1432 // delete foo; 1485 1433 } 1486 1434 delete foo; … … 1488 1436 for (int ii=0;ii<(this->numVars);ii++) 1489 1437 { 1490 mpq_t product;1491 mpq_init(product);1492 mpq_mul(product,qkgV,colSum[ii]);1493 (*ivIntPointOfCone)[ii]=(int64)mpz_get_d(mpq_numref(product));1494 if( (*ivIntPointOfCone)[ii]>INT_MAX ) 1438 // mpq_t product; 1439 // mpq_init(product); 1440 // mpq_mul(product,qkgV,colSum[ii]); 1441 // (*ivIntPointOfCone)[ii]=(int64)mpz_get_d(mpq_numref(product)); 1442 if( (*ivIntPointOfCone)[ii]>INT_MAX ) 1495 1443 WarnS("Interior point exceeds INT_MAX!\n"); 1496 mpq_clear(product);1497 Compute intgcd1444 // mpq_clear(product); 1445 //Compute intgcd 1498 1446 ggT=int64gcd(ggT,(*ivIntPointOfCone)[ii]); 1499 1447 } 1500 1501 Divide out a common gcd > 11448 1449 //Divide out a common gcd > 1 1502 1450 if(ggT>1) 1503 1451 { … … 1508 1456 } 1509 1457 } 1510 mpq_clear(qkgV);1511 delete [] colSum;1458 // mpq_clear(qkgV); 1459 // delete [] colSum; 1512 1460 /*For homogeneous input (like Det3,3,5) the int points may be negative. So add a suitable multiple of (1,_,1)*/ 1513 1461 if(hasHomInput==TRUE && iv64isStrictlyPositive(ivIntPointOfCone)==FALSE) … … 1517 1465 for(int ii=0;ii<this->numVars;ii++) 1518 1466 { 1519 (*ivOne)[ii]=1;1467 // (*ivOne)[ii]=1; 1520 1468 if ((*ivIntPointOfCone)[ii]<maxNegEntry) maxNegEntry=(*ivIntPointOfCone)[ii]; 1521 1469 } 1522 1470 maxNegEntry *= -1; 1523 maxNegEntry++; To be on the safe side1471 maxNegEntry++;//To be on the safe side 1524 1472 for(int ii=0;ii<this->numVars;ii++) 1525 1473 (*ivOne)[ii]=maxNegEntry; … … 1527 1475 ivIntPointOfCone=iv64Add(ivIntPointOfCone,ivOne); 1528 1476 delete(tmp); 1529 while( !iv64isStrictlyPositive(ivIntPointOfCone) )1530 {1531 int64vec *tmp = ivIntPointOfCone;1532 for(int jj=0;jj<this->numVars;jj++)1533 (*ivOne)[jj] = (*ivOne)[jj] << 1; //times 21534 ivIntPointOfCone = ivAdd(ivIntPointOfCone,ivOne);1535 delete tmp; 1536 }1477 // while( !iv64isStrictlyPositive(ivIntPointOfCone) ) 1478 // { 1479 // int64vec *tmp = ivIntPointOfCone; 1480 // for(int jj=0;jj<this->numVars;jj++) 1481 // (*ivOne)[jj] = (*ivOne)[jj] << 1; //times 2 1482 // ivIntPointOfCone = ivAdd(ivIntPointOfCone,ivOne); 1483 // delete tmp; 1484 // } 1537 1485 delete ivOne; 1538 1486 int64 ggT=(*ivIntPointOfCone)[0]; … … 1545 1493 } 1546 1494 } 1547 assert(iv64isStrictlyPositive(ivIntPointOfCone));1548 1495 // assert(iv64isStrictlyPositive(ivIntPointOfCone)); 1496 1549 1497 this->setIntPoint(ivIntPointOfCone); 1550 1498 delete(ivIntPointOfCone); 1551 1499 /* end of interior point computation*/ 1552 1553 Loop through the rows of P and check whether fNormal*row[i]=0 => row[i] belongs to fNormal1500 1501 //Loop through the rows of P and check whether fNormal*row[i]=0 => row[i] belongs to fNormal 1554 1502 int rows=P->rowsize; 1555 1503 facet *fAct=gc.facetPtr; 1556 Construct an array to hold the extremal rays of the cone1557 this->gcRays = (int64vec**)omAlloc0(sizeof(int64vec*)*P->rowsize); 1504 //Construct an array to hold the extremal rays of the cone 1505 this->gcRays = (int64vec**)omAlloc0(sizeof(int64vec*)*P->rowsize); 1558 1506 for(int ii=0;ii<P->rowsize;ii++) 1559 1507 { 1560 1508 int64vec *rowvec = new int64vec(this->numVars); 1561 makeInt(P,ii+1,*rowvec); get an integer entry instead of rational, rowvec is primitve1509 makeInt(P,ii+1,*rowvec);//get an integer entry instead of rational, rowvec is primitve 1562 1510 this->gcRays[ii] = iv64Copy(rowvec); 1563 1511 delete rowvec; 1564 } 1512 } 1565 1513 this->numRays=P->rowsize; 1566 Check which rays belong to which facet1514 //Check which rays belong to which facet 1567 1515 while(fAct!=NULL) 1568 1516 { 1569 const int64vec *fNormal; = new int64vec(this->numVars);1570 fNormal = fAct->getRef2FacetNormal(); ->getFacetNormal();1517 const int64vec *fNormal;// = new int64vec(this->numVars); 1518 fNormal = fAct->getRef2FacetNormal();//->getFacetNormal(); 1571 1519 int64vec *ivIntPointOfFacet = new int64vec(this->numVars); 1572 1520 for(int ii=0;ii<rows;ii++) 1573 { 1521 { 1574 1522 if(dotProduct(*fNormal,this->gcRays[ii])==0) 1575 1523 { 1576 int64vec *tmp = ivIntPointOfFacet; Prevent memleak1524 int64vec *tmp = ivIntPointOfFacet;//Prevent memleak 1577 1525 fAct->numCodim2Facets++; 1578 1526 facet *codim2Act; 1579 if(fAct->numCodim2Facets==1) 1580 { 1581 fAct->codim2Ptr = new facet(2); 1527 if(fAct->numCodim2Facets==1) 1528 { 1529 fAct->codim2Ptr = new facet(2); 1582 1530 codim2Act = fAct->codim2Ptr; 1583 1531 } … … 1587 1535 codim2Act = codim2Act->next; 1588 1536 } 1589 codim2Act->setFacetNormal(rowvec);1590 Rather just let codim2Act point to the corresponding int64vec of gcRays1537 //codim2Act->setFacetNormal(rowvec); 1538 //Rather just let codim2Act point to the corresponding int64vec of gcRays 1591 1539 codim2Act->fNormal=this->gcRays[ii]; 1592 fAct->numRays++; 1593 Memleak avoided via tmp1540 fAct->numRays++; 1541 //Memleak avoided via tmp 1594 1542 ivIntPointOfFacet=iv64Add(ivIntPointOfFacet,this->gcRays[ii]); 1595 Now tmp still points to the OLD address of ivIntPointOfFacet1543 //Now tmp still points to the OLD address of ivIntPointOfFacet 1596 1544 delete(tmp); 1597 1545 1598 1546 } 1599 } For non-homog input ivIntPointOfFacet should already be >0 here1600 if(!hasHomInput) {assert(iv64isStrictlyPositive(ivIntPointOfFacet));}1601 if we have no strictly pos ray but the input is homogeneous1602 then add a suitable multiple of (1,...,1)1547 }//For non-homog input ivIntPointOfFacet should already be >0 here 1548 // if(!hasHomInput) {assert(iv64isStrictlyPositive(ivIntPointOfFacet));} 1549 //if we have no strictly pos ray but the input is homogeneous 1550 //then add a suitable multiple of (1,...,1) 1603 1551 if( !iv64isStrictlyPositive(ivIntPointOfFacet) && hasHomInput==TRUE) 1604 1552 { … … 1611 1559 for(int jj=0;jj<this->numVars;jj++) 1612 1560 { 1613 (*ivOne)[jj] = (*ivOne)[jj] << 1; times 21561 (*ivOne)[jj] = (*ivOne)[jj] << 1; //times 2 1614 1562 } 1615 1563 ivIntPointOfFacet = iv64Add(ivIntPointOfFacet/*diff*/,ivOne); 1616 delete tmp; 1564 delete tmp; 1617 1565 } 1618 1566 delete ivOne; … … 1625 1573 for(int ii=0;ii<this->numVars;ii++) 1626 1574 (*ivIntPointOfFacet)[ii] /= ggT; 1627 } 1575 } 1628 1576 fAct->setInteriorPoint(ivIntPointOfFacet); 1629 1577 1630 1578 delete(ivIntPointOfFacet); 1631 Now (if we have at least 3 variables) do a bubblesort on the rays1579 //Now (if we have at least 3 variables) do a bubblesort on the rays 1632 1580 /*if(this->numVars>2) 1633 1581 { … … 1643 1591 do 1644 1592 { 1645 exchanged=FALSE; n=fAct->numRays-1;1593 exchanged=FALSE;//n=fAct->numRays-1; 1646 1594 for(unsigned ii=0;ii<=n-1;ii++) 1647 { 1595 { 1648 1596 if((A[ii]->fNormal)->compare((A[ii+1]->fNormal))==1) 1649 1597 { 1650 Swap rays1598 //Swap rays 1651 1599 cout << "Swapping "; 1652 1600 A[ii]->fNormal->show(1,0); cout << " with "; A[ii+1]->fNormal->show(1,0); cout << endl; … … 1657 1605 if(ii==0) 1658 1606 fAct->codim2Ptr=A[ii+1]; 1659 end swap1660 facet *tmp=A[ii]; swap in list1607 //end swap 1608 facet *tmp=A[ii];//swap in list 1661 1609 A[ii+1]=A[ii]; 1662 1610 A[ii]=tmp; 1663 tmp=NULL; 1664 } 1611 // tmp=NULL; 1612 } 1665 1613 } 1666 n--; 1614 n--; 1667 1615 }while(exchanged==TRUE && n>=0); 1668 }*/ if pVariables>21669 delete fNormal; 1616 }*///if pVariables>2 1617 // delete fNormal; 1670 1618 fAct = fAct->next; 1671 } end of facet checking1619 }//end of facet checking 1672 1620 dd_FreeMatrix(P); 1673 Now all extremal rays should be set w.r.t their respective fNormal1674 TODO Not sufficient -> vol2 II/125&1271675 NOTE Sufficient according to cddlibs doc. These ARE rays1621 //Now all extremal rays should be set w.r.t their respective fNormal 1622 //TODO Not sufficient -> vol2 II/125&127 1623 //NOTE Sufficient according to cddlibs doc. These ARE rays 1676 1624 //What the hell... let's just take interior points 1677 1625 if(gcone::hasHomInput==FALSE) … … 1680 1628 while(fAct!=NULL) 1681 1629 { 1682 bool containsStrictlyPosRay=FALSE;1683 facet *codim2Act;1684 codim2Act = fAct->codim2Ptr;1685 while(codim2Act!=NULL)1686 {1687 int64vec *rayvec;1688 rayvec = codim2Act->getFacetNormal();//Mind this is no normal but a ray!1689 //int negCtr=0;1690 if(iv64isStrictlyPositive(rayvec))1691 {1692 containsStrictlyPosRay=TRUE;1693 delete(rayvec);1694 break;1695 } 1696 delete(rayvec);1697 codim2Act = codim2Act->next;1698 }1699 if(containsStrictlyPosRay==FALSE)1700 fAct->isFlippable=FALSE;1630 // bool containsStrictlyPosRay=FALSE; 1631 // facet *codim2Act; 1632 // codim2Act = fAct->codim2Ptr; 1633 // while(codim2Act!=NULL) 1634 // { 1635 // int64vec *rayvec; 1636 // rayvec = codim2Act->getFacetNormal();//Mind this is no normal but a ray! 1637 // //int negCtr=0; 1638 // if(iv64isStrictlyPositive(rayvec)) 1639 // { 1640 // containsStrictlyPosRay=TRUE; 1641 // delete(rayvec); 1642 // break; 1643 // } 1644 // delete(rayvec); 1645 // codim2Act = codim2Act->next; 1646 // } 1647 // if(containsStrictlyPosRay==FALSE) 1648 // fAct->isFlippable=FALSE; 1701 1649 if(!iv64isStrictlyPositive(fAct->interiorPoint)) 1702 1650 fAct->isFlippable=FALSE; 1703 1651 fAct = fAct->next; 1704 1652 } 1705 } hasHomInput?1653 }//hasHomInput? 1706 1654 #ifdef gfanp 1707 1655 gettimeofday(&end, 0); 1708 1656 t_getExtremalRays += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec)); 1709 #endif 1657 #endif 1710 1658 } 1711 1659 … … 1713 1661 void gcone::orderRays() 1714 1662 { 1715 qsort(gcRays,sizeof(int64vec),int64vec::compare);1716 } 1717 1663 // qsort(gcRays,sizeof(int64vec),int64vec::compare); 1664 } 1665 1718 1666 inline bool gcone::iv64isStrictlyPositive(const int64vec * iv64) 1719 1667 { … … 1725 1673 res=FALSE; 1726 1674 break; 1727 } 1675 } 1728 1676 } 1729 1677 return res; 1730 1678 } 1731 1679 1732 /** \brief Compute the Groebner Basis on the other side of a shared facet 1680 /** \brief Compute the Groebner Basis on the other side of a shared facet 1733 1681 * 1734 1682 * Implements algorithm 4.3.2 from Anders' thesis. … … 1738 1686 * Parallelity is checked using basic linear algebra. See gcone::isParallel. 1739 1687 * Other possibilities include computing the rank of the matrix consisting of the vectors in question and 1740 * computing an interior point of the facet and taking all terms having the same weight with respect 1688 * computing an interior point of the facet and taking all terms having the same weight with respect 1741 1689 * to this interior point. 1742 1690 *\param ideal, facet 1743 1691 * Input: a marked,reduced Groebner basis and a facet 1744 1692 */ 1745 inline void gcone::flip(ideal gb, facet *f) Compute "the other side"1746 { 1693 inline void gcone::flip(ideal gb, facet *f) //Compute "the other side" 1694 { 1747 1695 #ifdef gfanp 1748 1696 timeval start, end; 1749 1697 gettimeofday(&start, 0); 1750 #endif 1751 int64vec *fNormal; = new int64vec(this->numVars); //facet normal, check for parallelity1752 fNormal = f->getFacetNormal(); read this->fNormal;1698 #endif 1699 int64vec *fNormal;// = new int64vec(this->numVars); //facet normal, check for parallelity 1700 fNormal = f->getFacetNormal(); //read this->fNormal; 1753 1701 #ifdef gfan_DEBUG 1754 std::cout << "running gcone::flip" << std::endl;1702 // std::cout << "running gcone::flip" << std::endl; 1755 1703 printf("flipping UCN %i over facet",this->getUCN()); 1756 1704 fNormal->show(1,0); 1757 printf(") with UCN %i\n",f->getUCN() ); 1705 printf(") with UCN %i\n",f->getUCN() ); 1758 1706 #endif 1759 1707 if(this->getUCN() != f->getUCN()) … … 1763 1711 } 1764 1712 /*1st step: Compute the initial ideal*/ 1765 /*poly initialFormElement[IDELEMS(gb)];*/ array of #polys in GB to store initial form1713 /*poly initialFormElement[IDELEMS(gb)];*/ //array of #polys in GB to store initial form 1766 1714 ideal initialForm=idInit(IDELEMS(gb),this->gcBasis->rank); 1767 1715 1768 1716 computeInv(gb,initialForm,*fNormal); 1769 1717 … … 1771 1719 /* cout << "Initial ideal is: " << endl; 1772 1720 idShow(initialForm); 1773 f->printFlipGB();*/1774 cout << "===" << endl;1775 #endif 1721 //f->printFlipGB();*/ 1722 // cout << "===" << endl; 1723 #endif 1776 1724 /*2nd step: lift initial ideal to a GB of the neighbouring cone using minus alpha as weight*/ 1777 1725 /*Substep 2.1 1778 compute $G_{-\alpha}(in_v(I)) 1726 compute $G_{-\alpha}(in_v(I)) 1779 1727 see journal p. 66 1780 1728 NOTE Check for different rings. Prolly it will not always be necessary to add a weight, if the … … 1783 1731 ring srcRing=currRing; 1784 1732 ring tmpRing; 1785 1733 1786 1734 if( (srcRing->order[0]!=ringorder_a)) 1787 1735 { 1788 int64vec *iv; = new int64vec(this->numVars);1789 iv = ivNeg(fNormal); ivNeg uses iv64Copy -> new1790 tmpRing=rCopyAndAddWeight(srcRing,ivNeg(fNormal));1736 int64vec *iv;// = new int64vec(this->numVars); 1737 iv = ivNeg(fNormal);//ivNeg uses iv64Copy -> new 1738 // tmpRing=rCopyAndAddWeight(srcRing,ivNeg(fNormal)); 1791 1739 tmpRing=rCopyAndAddWeight(srcRing,iv); 1792 1740 delete iv; … … 1805 1753 tmpRing->block1[0]=length; 1806 1754 rComplete(tmpRing); 1807 omFree(A);1808 } 1809 delete fNormal; 1810 rChangeCurrRing(tmpRing); 1811 1812 ideal ina; 1755 //omFree(A); 1756 } 1757 delete fNormal; 1758 rChangeCurrRing(tmpRing); 1759 1760 ideal ina; 1813 1761 ina=idrCopyR(initialForm,srcRing); 1814 1762 idDelete(&initialForm); 1815 1763 ideal H; 1816 H=kStd(ina,NULL,isHomog,NULL); //we know it is homogeneous1764 // H=kStd(ina,NULL,isHomog,NULL); //we know it is homogeneous 1817 1765 #ifdef gfanp 1818 1766 timeval t_kStd_start, t_kStd_end; … … 1822 1770 H=kStd(ina,NULL,isHomog,NULL/*,gcone::hilbertFunction*/); 1823 1771 else 1824 H=kStd(ina,NULL,isNotHomog,NULL); This is \mathcal(G)_{>_-\alpha}(in_v(I))1772 H=kStd(ina,NULL,isNotHomog,NULL); //This is \mathcal(G)_{>_-\alpha}(in_v(I)) 1825 1773 #ifdef gfanp 1826 1774 gettimeofday(&t_kStd_end, 0); … … 1835 1783 rChangeCurrRing(srcRing); 1836 1784 ideal srcRing_H; 1837 ideal srcRing_HH; 1785 ideal srcRing_HH; 1838 1786 srcRing_H=idrCopyR(H,tmpRing); 1839 1787 //H is needed further below, so don't idDelete here 1840 1788 srcRing_HH=ffG(srcRing_H,this->gcBasis); 1841 1789 idDelete(&srcRing_H); 1842 1790 1843 1791 /*Substep 2.2.1 1844 1792 * Mark according to G_-\alpha … … 1846 1794 * we have to compute an interior point of C(srcRing_HH). For this we need to know the cone 1847 1795 * represented by srcRing_HH MARKED ACCORDING TO G_{-\alpha} 1848 * Thus we check whether the leading monomials of srcRing_HH and srcRing_H coincide. If not we 1796 * Thus we check whether the leading monomials of srcRing_HH and srcRing_H coincide. If not we 1849 1797 * compute the difference accordingly 1850 1798 */ … … 1852 1800 timeval t_markings_start, t_markings_end; 1853 1801 gettimeofday(&t_markings_start, 0); 1854 #endif 1802 #endif 1855 1803 bool markingsAreCorrect=FALSE; 1856 1804 dd_MatrixPtr intPointMatrix; 1857 1805 int iPMatrixRows=0; 1858 dd_rowrange aktrow=0; 1806 dd_rowrange aktrow=0; 1859 1807 for (int ii=0;ii<IDELEMS(srcRing_HH);ii++) 1860 1808 { 1861 1809 poly aktpoly=(poly)srcRing_HH->m[ii];//This is a pointer, so don't pDelete 1862 iPMatrixRows = iPMatrixRows+pLength(aktpoly); 1810 iPMatrixRows = iPMatrixRows+pLength(aktpoly); 1863 1811 } 1864 1812 /* additionally one row for the standard-simplex and another for a row that becomes 0 during 1865 1813 * construction of the differences 1866 1814 */ 1867 intPointMatrix = dd_CreateMatrix(iPMatrixRows+2,this->numVars+1); 1868 intPointMatrix->numbtype=dd_Integer; NOTE: DO NOT REMOVE OR CHANGE TO dd_Rational1869 1815 intPointMatrix = dd_CreateMatrix(iPMatrixRows+2,this->numVars+1); 1816 intPointMatrix->numbtype=dd_Integer; //NOTE: DO NOT REMOVE OR CHANGE TO dd_Rational 1817 1870 1818 for (int ii=0;ii<IDELEMS(srcRing_HH);ii++) 1871 1819 { 1872 markingsAreCorrect=FALSE; crucial to initialise here1820 markingsAreCorrect=FALSE; //crucial to initialise here 1873 1821 poly aktpoly=srcRing_HH->m[ii]; //Only a pointer, so don't pDelete 1874 1822 /*Comparison of leading monomials is done via exponent vectors*/ … … 1878 1826 int *dst_ExpV = (int *)omAlloc((this->numVars+1)*sizeof(int)); 1879 1827 pGetExpV(aktpoly,src_ExpV); 1880 rChangeCurrRing(tmpRing); this ring change is crucial!1828 rChangeCurrRing(tmpRing); //this ring change is crucial! 1881 1829 poly p=pCopy(H->m[ii]); 1882 1830 pGetExpV(p/*pCopy(H->m[ii])*/,dst_ExpV); … … 1887 1835 { 1888 1836 #ifdef gfan_DEBUG 1889 cout << src_ExpV[kk] << "," << dst_ExpV[kk] << endl;1837 // cout << src_ExpV[kk] << "," << dst_ExpV[kk] << endl; 1890 1838 #endif 1891 1839 if (src_ExpV[kk]!=dst_ExpV[kk]) … … 1893 1841 expVAreEqual=FALSE; 1894 1842 } 1895 } 1843 } 1896 1844 if (expVAreEqual==TRUE) 1897 1845 { 1898 markingsAreCorrect=TRUE; everything is fine1846 markingsAreCorrect=TRUE; //everything is fine 1899 1847 #ifdef gfan_DEBUG 1900 cout << "correct markings" << endl;1901 #endif 1902 } if (pHead(aktpoly)==pHead(H->m[jj])1848 // cout << "correct markings" << endl; 1849 #endif 1850 }//if (pHead(aktpoly)==pHead(H->m[jj]) 1903 1851 omFree(src_ExpV); 1904 1852 omFree(dst_ExpV); 1905 } for (int jj=0;jj<IDELEMS(H);jj++)1906 1853 }//for (int jj=0;jj<IDELEMS(H);jj++) 1854 1907 1855 int *leadExpV=(int *)omAlloc((this->numVars+1)*sizeof(int)); 1908 1856 if (markingsAreCorrect==TRUE) … … 1913 1861 { 1914 1862 rChangeCurrRing(tmpRing); 1915 pGetExpV(pHead(H->m[ii]),leadExpV); We use H->m[ii] as leading monomial1863 pGetExpV(pHead(H->m[ii]),leadExpV); //We use H->m[ii] as leading monomial 1916 1864 rChangeCurrRing(srcRing); 1917 1865 } 1918 /*compute differences of the expvects*/ 1866 /*compute differences of the expvects*/ 1919 1867 while (pNext(aktpoly)!=NULL) 1920 1868 { 1921 1869 int *v=(int *)omAlloc((this->numVars+1)*sizeof(int)); 1922 /*The following if-else-block makes sure the first term (i.e. the wrongly marked term) 1870 /*The following if-else-block makes sure the first term (i.e. the wrongly marked term) 1923 1871 is not omitted when computing the differences*/ 1924 1872 if(markingsAreCorrect==TRUE) … … 1934 1882 int ctr=0; 1935 1883 for (int jj=0;jj<this->numVars;jj++) 1936 { 1937 /*Store into ddMatrix*/ 1884 { 1885 /*Store into ddMatrix*/ 1938 1886 if(leadExpV[jj+1]-v[jj+1]) 1939 1887 ctr++; … … 1941 1889 } 1942 1890 /*It ought to be more sensible to avoid 0-rows in the first place*/ 1943 if(ctr==this->numVars)//We have a 0-row1944 dd_MatrixRowRemove(&intPointMatrix,aktrow);1945 else1891 // if(ctr==this->numVars)//We have a 0-row 1892 // dd_MatrixRowRemove(&intPointMatrix,aktrow); 1893 // else 1946 1894 aktrow +=1; 1947 1895 omFree(v); 1948 1896 } 1949 1897 omFree(leadExpV); 1950 } for (int ii=0;ii<IDELEMS(srcRing_HH);ii++)1898 }//for (int ii=0;ii<IDELEMS(srcRing_HH);ii++) 1951 1899 #ifdef gfanp 1952 1900 gettimeofday(&t_markings_end, 0); … … 1960 1908 preprocessInequalities(intPointMatrix); 1961 1909 /*Now we add the constraint for the standard simplex*/ 1962 dd_set_si(intPointMatrix->matrix[aktrow][0],-1);1963 for (int jj=1;jj<=this->numVars;jj++)1964 {1965 dd_set_si(intPointMatrix->matrix[aktrow][jj],1);1966 }1910 // dd_set_si(intPointMatrix->matrix[aktrow][0],-1); 1911 // for (int jj=1;jj<=this->numVars;jj++) 1912 // { 1913 // dd_set_si(intPointMatrix->matrix[aktrow][jj],1); 1914 // } 1967 1915 //Let's make sure we compute interior points from the positive orthant 1968 dd_MatrixPtr posRestr=dd_CreateMatrix(this->numVars,this->numVars+1);1969 1970 int jj=1;1971 for (int ii=0;ii<this->numVars;ii++)1972 {1973 dd_set_si(posRestr->matrix[ii][jj],1);1974 jj++; 1975 }1916 // dd_MatrixPtr posRestr=dd_CreateMatrix(this->numVars,this->numVars+1); 1917 // 1918 // int jj=1; 1919 // for (int ii=0;ii<this->numVars;ii++) 1920 // { 1921 // dd_set_si(posRestr->matrix[ii][jj],1); 1922 // jj++; 1923 // } 1976 1924 /*We create a matrix containing the standard simplex 1977 1925 * and constraints to assure a strictly positive point … … 1983 1931 { 1984 1932 dd_set_si(posRestr->matrix[ii][0],-1); 1985 for(int jj=1;jj<=this->numVars;jj++) 1986 dd_set_si(posRestr->matrix[ii][jj],1); 1933 for(int jj=1;jj<=this->numVars;jj++) 1934 dd_set_si(posRestr->matrix[ii][jj],1); 1987 1935 } 1988 1936 else … … 2005 1953 dd_rowindex newpos; 2006 1954 2007 NOTE Here we should remove interiorPoint and instead2008 create and ordering like (a(omega),a(fNormal),dp)2009 if(this->ivIntPt==NULL)2010 interiorPoint(intPointMatrix, *iv_weight); iv_weight now contains the interior point2011 else2012 iv_weight=this->getIntPoint();1955 //NOTE Here we should remove interiorPoint and instead 1956 // create and ordering like (a(omega),a(fNormal),dp) 1957 // if(this->ivIntPt==NULL) 1958 interiorPoint(intPointMatrix, *iv_weight); //iv_weight now contains the interior point 1959 // else 1960 // iv_weight=this->getIntPoint(); 2013 1961 dd_FreeMatrix(intPointMatrix); 2014 1962 /*Crude attempt for interior point */ … … 2034 1982 gettimeofday(&t_dd_end, 0); 2035 1983 t_dd += (t_dd_end.tv_sec - t_dd_start.tv_sec + 1e-6*(t_dd_end.tv_usec - t_dd_start.tv_usec)); 2036 #endif 2037 1984 #endif 1985 2038 1986 /*Step 3 2039 * turn the minimal basis into a reduced one */ 2040 NOTE May assume that at this point srcRing already has 3 blocks of orderins, starting with a2041 Thus:2042 ring dstRing=rCopyAndChangeWeight(srcRing,iv_weight);1987 * turn the minimal basis into a reduced one */ 1988 // NOTE May assume that at this point srcRing already has 3 blocks of orderins, starting with a 1989 // Thus: 1990 //ring dstRing=rCopyAndChangeWeight(srcRing,iv_weight); 2043 1991 ring dstRing=rCopy0(tmpRing); 2044 1992 int length=iv_weight->length(); … … 2054 2002 delete iv_weight; 2055 2003 2056 ideal dstRing_I; 2004 ideal dstRing_I; 2057 2005 dstRing_I=idrCopyR(srcRing_HH,srcRing); 2058 idDelete(&srcRing_HH); Hmm.... causes trouble - no more2059 dstRing_I=idrCopyR(inputIdeal,srcRing);2006 idDelete(&srcRing_HH); //Hmm.... causes trouble - no more 2007 //dstRing_I=idrCopyR(inputIdeal,srcRing); 2060 2008 BITSET save=test; 2061 2009 test|=Sy_bit(OPT_REDSB); 2062 2010 test|=Sy_bit(OPT_REDTAIL); 2063 2011 #ifdef gfan_DEBUG 2064 test|=Sy_bit(6); //OPT_DEBUG2012 // test|=Sy_bit(6); //OPT_DEBUG 2065 2013 #endif 2066 2014 ideal tmpI; 2067 NOTE Any of the two variants of tmpI={idrCopy(),dstRing_I} does the trick2068 tmpI = idrCopyR(this->inputIdeal,this->baseRing);2015 //NOTE Any of the two variants of tmpI={idrCopy(),dstRing_I} does the trick 2016 //tmpI = idrCopyR(this->inputIdeal,this->baseRing); 2069 2017 tmpI = dstRing_I; 2070 2018 #ifdef gfanp … … 2080 2028 #endif 2081 2029 idDelete(&tmpI); 2082 idNorm(dstRing_I); 2083 kInterRed(dstRing_I);2030 idNorm(dstRing_I); 2031 // kInterRed(dstRing_I); 2084 2032 idSkipZeroes(dstRing_I); 2085 2033 test=save; 2086 2034 /*End of step 3 - reduction*/ 2087 2088 f->setFlipGB(dstRing_I); store the flipped GB2089 idDelete(&dstRing_I);2090 f->flipRing=rCopy(dstRing); store the ring on the other side2035 2036 f->setFlipGB(dstRing_I);//store the flipped GB 2037 // idDelete(&dstRing_I); 2038 f->flipRing=rCopy(dstRing); //store the ring on the other side 2091 2039 #ifdef gfan_DEBUG 2092 2040 printf("Flipped GB is UCN %i:\n",counter+1); 2093 2041 idDebugPrint(dstRing_I); 2094 2042 printf("\n"); 2095 #endif 2096 idDelete(&dstRing_I); 2097 rChangeCurrRing(srcRing); return to the ring we started the computation of flipGB in2043 #endif 2044 idDelete(&dstRing_I); 2045 rChangeCurrRing(srcRing); //return to the ring we started the computation of flipGB in 2098 2046 rDelete(dstRing); 2099 2047 #ifdef gfanp … … 2101 2049 time_flip += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec)); 2102 2050 #endif 2103 } void flip(ideal gb, facet *f)2051 }//void flip(ideal gb, facet *f) 2104 2052 2105 2053 /** \brief A slightly different approach to flipping … … 2111 2059 * will be from a ring with (a(),dp,C) and our resulting cone from (a(),a(),dp,C). Hence a way 2112 2060 * must be found to circumvent the sequence of a()'s growing to a ridiculous size. 2113 * Therefore: We use (a(),a(),dp,C) for the computation of the reduced basis. But then we 2114 * do have an interior point of the cone by adding the extremal rays. So we replace 2115 * the latter cone by a cone with (a(sum_of_rays),dp,C). 2061 * Therefore: We use (a(),a(),dp,C) for the computation of the reduced basis. But then we 2062 * do have an interior point of the cone by adding the extremal rays. So we replace 2063 * the latter cone by a cone with (a(sum_of_rays),dp,C). 2116 2064 * Con: It's incredibly ugly 2117 2065 * Pro: No messing around with readConeFromFile() … … 2125 2073 #endif 2126 2074 const int64vec *fNormal; 2127 fNormal = f->getRef2FacetNormal();/*->getFacetNormal();*/ read this->fNormal;2075 fNormal = f->getRef2FacetNormal();/*->getFacetNormal();*/ //read this->fNormal; 2128 2076 #ifdef gfan_DEBUG 2129 2077 printf("flipping UCN %i over facet(",this->getUCN()); 2130 2078 fNormal->show(1,0); 2131 printf(") with UCN %i\n",f->getUCN()); 2079 printf(") with UCN %i\n",f->getUCN()); 2132 2080 #endif 2133 2081 if(this->getUCN() != f->getUCN()) … … 2137 2085 } 2138 2086 /*1st step: Compute the initial ideal*/ 2139 ideal initialForm=idInit(IDELEMS(gb),this->gcBasis->rank); 2087 ideal initialForm=idInit(IDELEMS(gb),this->gcBasis->rank); 2140 2088 computeInv( gb, initialForm, *fNormal ); 2141 2089 ring srcRing=currRing; 2142 2090 ring tmpRing; 2143 2091 2144 2092 const int64vec *intPointOfFacet; 2145 2093 intPointOfFacet=f->getInteriorPoint(); 2146 Now we need two blocks of ringorder_a!2147 May assume the same situation as in flip() here2094 //Now we need two blocks of ringorder_a! 2095 //May assume the same situation as in flip() here 2148 2096 if( (srcRing->order[0]!=ringorder_a/*64*/) && (srcRing->order[1]!=ringorder_a/*64*/) ) 2149 2097 { 2150 int64vec *iv = new int64vec(this->numVars); init with 1s, since we do not need a 2nd block here but later2151 int64vec *iv_foo = new int64vec(this->numVars,1);//placeholder2152 int64vec *ivw = ivNeg(const_cast<int64vec*>(fNormal)); 2098 int64vec *iv = new int64vec(this->numVars);//init with 1s, since we do not need a 2nd block here but later 2099 // int64vec *iv_foo = new int64vec(this->numVars,1);//placeholder 2100 int64vec *ivw = ivNeg(const_cast<int64vec*>(fNormal)); 2153 2101 tmpRing=rCopyAndAddWeight2(srcRing,ivw/*intPointOfFacet*/,iv); 2154 2102 delete iv;delete ivw; 2155 delete iv_foo;2156 } 2157 else 2103 // delete iv_foo; 2104 } 2105 else 2158 2106 { 2159 2107 int64vec *iv=new int64vec(this->numVars); … … 2168 2116 { 2169 2117 A1[jj] = -(*fNormal)[jj]; 2170 A2[jj] = 1; -(*fNormal)[jj];//NOTE Do we need this here? This is only the facet ideal2118 A2[jj] = 1;//-(*fNormal)[jj];//NOTE Do we need this here? This is only the facet ideal 2171 2119 } 2172 2120 omFree(tmpRing->wvhdl[0]); 2173 2121 if(tmpRing->wvhdl[1]!=NULL) 2174 2122 omFree(tmpRing->wvhdl[1]); 2175 tmpRing->wvhdl[0]=(int*)A1; 2123 tmpRing->wvhdl[0]=(int*)A1; 2176 2124 tmpRing->block1[0]=length; 2177 tmpRing->wvhdl[1]=(int*)A2; 2125 tmpRing->wvhdl[1]=(int*)A2; 2178 2126 tmpRing->block1[1]=length; 2179 2127 rComplete(tmpRing);*/ 2180 2128 } 2181 delete fNormal; //NOTE Do not delete when using getRef2FacetNormal();2182 rChangeCurrRing(tmpRing); 2183 Now currRing should have (a(),a(),dp,C)2184 ideal ina; 2129 // delete fNormal; //NOTE Do not delete when using getRef2FacetNormal(); 2130 rChangeCurrRing(tmpRing); 2131 //Now currRing should have (a(),a(),dp,C) 2132 ideal ina; 2185 2133 ina=idrCopyR(initialForm,srcRing); 2186 2134 idDelete(&initialForm); … … 2193 2141 test|=Sy_bit(OPT_REDSB); 2194 2142 test|=Sy_bit(OPT_REDTAIL); 2195 if(gcone::hasHomInput==TRUE)2143 // if(gcone::hasHomInput==TRUE) 2196 2144 H=kStd(ina,NULL,testHomog/*isHomog*/,NULL/*,gcone::hilbertFunction*/); 2197 else2198 H=kStd(ina,NULL,isNotHomog,NULL); //This is \mathcal(G)_{>_-\alpha}(in_v(I))2145 // else 2146 // H=kStd(ina,NULL,isNotHomog,NULL); //This is \mathcal(G)_{>_-\alpha}(in_v(I)) 2199 2147 test=save; 2200 2148 #ifdef gfanp … … 2204 2152 idSkipZeroes(H); 2205 2153 idDelete(&ina); 2206 2154 2207 2155 rChangeCurrRing(srcRing); 2208 2156 ideal srcRing_H; 2209 ideal srcRing_HH; 2157 ideal srcRing_HH; 2210 2158 srcRing_H=idrCopyR(H,tmpRing); 2211 2159 //H is needed further below, so don't idDelete here 2212 2160 srcRing_HH=ffG(srcRing_H,this->gcBasis); 2213 2161 idDelete(&srcRing_H); 2214 Now BBA(srcRing_HH) with (a(),a(),dp)2162 //Now BBA(srcRing_HH) with (a(),a(),dp) 2215 2163 /* Evil modification of currRing */ 2216 2164 ring dstRing=rCopy0(tmpRing); … … 2222 2170 { 2223 2171 A1[jj] = (*intPointOfFacet)[jj]; 2224 A2[jj] = -(*ivw)[jj]; TODO Or minus (*ivw)[ii] ??? NOTE minus2172 A2[jj] = -(*ivw)[jj];//TODO Or minus (*ivw)[ii] ??? NOTE minus 2225 2173 } 2226 2174 omFree(dstRing->wvhdl[0]); 2227 2175 if(dstRing->wvhdl[1]!=NULL) 2228 2176 omFree(dstRing->wvhdl[1]); 2229 dstRing->wvhdl[0]=(int*)A1; 2177 dstRing->wvhdl[0]=(int*)A1; 2230 2178 dstRing->block1[0]=length; 2231 dstRing->wvhdl[1]=(int*)A2; 2179 dstRing->wvhdl[1]=(int*)A2; 2232 2180 dstRing->block1[1]=length; 2233 2181 rComplete(dstRing); 2234 2182 rChangeCurrRing(dstRing); 2235 ideal dstRing_I; 2183 ideal dstRing_I; 2236 2184 dstRing_I=idrCopyR(srcRing_HH,srcRing); 2237 idDelete(&srcRing_HH); Hmm.... causes trouble - no more2185 idDelete(&srcRing_HH); //Hmm.... causes trouble - no more 2238 2186 save=test; 2239 2187 test|=Sy_bit(OPT_REDSB); … … 2242 2190 tmpI = dstRing_I; 2243 2191 #ifdef gfanp 2244 timeval t_kStd_start, t_kStd_end;2192 // timeval t_kStd_start, t_kStd_end; 2245 2193 gettimeofday(&t_kStd_start,0); 2246 2194 #endif 2247 if(gcone::hasHomInput==TRUE)2248 dstRing_I=kStd(tmpI,NULL,isHomog,NULL/*,gcone::hilbertFunction*/);2249 else2195 // if(gcone::hasHomInput==TRUE) 2196 // dstRing_I=kStd(tmpI,NULL,isHomog,NULL/*,gcone::hilbertFunction*/); 2197 // else 2250 2198 dstRing_I=kStd(tmpI,NULL,testHomog,NULL); 2251 2199 #ifdef gfanp … … 2254 2202 #endif 2255 2203 idDelete(&tmpI); 2256 idNorm(dstRing_I); 2204 idNorm(dstRing_I); 2257 2205 idSkipZeroes(dstRing_I); 2258 2206 test=save; 2259 2207 /*End of step 3 - reduction*/ 2260 2208 2261 2209 f->setFlipGB(dstRing_I); 2262 2210 f->flipRing=rCopy(dstRing); 2263 2211 rDelete(tmpRing); 2264 2212 rDelete(dstRing); 2265 Now we should have dstRing with (a(),a(),dp,C)2266 This must be replaced with (a(),dp,C) BEFORE gcTmp is actually added to the list2267 of cones in noRevS2213 //Now we should have dstRing with (a(),a(),dp,C) 2214 //This must be replaced with (a(),dp,C) BEFORE gcTmp is actually added to the list 2215 //of cones in noRevS 2268 2216 rChangeCurrRing(srcRing); 2269 2217 #ifdef gfanp … … 2271 2219 time_flip2 += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec)); 2272 2220 #endif 2273 } flip22221 }//flip2 2274 2222 2275 2223 /** \brief Compute initial ideal … … 2289 2237 poly aktpoly = (poly)gb->m[ii];//Ptr, so don't pDelete(aktpoly) 2290 2238 int *leadExpV=(int *)omAlloc((this->numVars+1)*sizeof(int)); 2291 pGetExpV(aktpoly,leadExpV); find the leading exponent in leadExpV[1],...,leadExpV[n], use pNext(p)2239 pGetExpV(aktpoly,leadExpV); //find the leading exponent in leadExpV[1],...,leadExpV[n], use pNext(p) 2292 2240 initialFormElement=pHead(aktpoly); 2293 int *v=(int *)omAlloc((this->numVars+1)*sizeof(int));2241 // int *v=(int *)omAlloc((this->numVars+1)*sizeof(int)); 2294 2242 while(pNext(aktpoly)!=NULL) /*loop trough terms and check for parallelity*/ 2295 2243 { 2296 2244 int64vec *check = new int64vec(this->numVars); 2297 aktpoly=pNext(aktpoly); next term2245 aktpoly=pNext(aktpoly); //next term 2298 2246 int *v=(int *)omAlloc((this->numVars+1)*sizeof(int)); 2299 pGetExpV(aktpoly,v); 2247 pGetExpV(aktpoly,v); 2300 2248 /* Convert (int)v into (int64vec)check */ 2301 bool notPar=FALSE;2249 // bool notPar=FALSE; 2302 2250 for (int jj=0;jj<this->numVars;jj++) 2303 2251 { 2304 2252 (*check)[jj]=v[jj+1]-leadExpV[jj+1]; 2305 register int64 foo=(fNormal)[jj];2306 if( ( (*check)[jj] == /*fNormal[jj]*/foo ) 2307 || ( (/*fNormal[jj]*/foo!=0) && ( ( (*check)[jj] % /*fNormal[jj]*/foo ) !=0 ) ) ) 2308 {2309 notPar=TRUE;2310 break;2311 }2253 // register int64 foo=(fNormal)[jj]; 2254 // if( ( (*check)[jj] == /*fNormal[jj]*/foo ) 2255 // || ( (/*fNormal[jj]*/foo!=0) && ( ( (*check)[jj] % /*fNormal[jj]*/foo ) !=0 ) ) ) 2256 // { 2257 // notPar=TRUE; 2258 // break; 2259 // } 2312 2260 } 2313 2261 omFree(v); 2314 if (isParallel(*check,fNormal)) Found a parallel vector. Add it2315 if(notPar==FALSE)2316 { 2317 initialFormElement = pAdd((initialFormElement),(poly)pHead(aktpoly)); pAdd = p_Add_q destroys args2262 if (isParallel(*check,fNormal))//Found a parallel vector. Add it 2263 // if(notPar==FALSE) 2264 { 2265 initialFormElement = pAdd((initialFormElement),(poly)pHead(aktpoly));//pAdd = p_Add_q destroys args 2318 2266 } 2319 2267 delete check; 2320 } while2321 omFree(v);2268 }//while 2269 // omFree(v); 2322 2270 #ifdef gfan_DEBUG 2323 cout << "Initial Form="; 2324 pWrite(initialFormElement[ii]);2325 cout << "---" << endl;2271 // cout << "Initial Form="; 2272 // pWrite(initialFormElement[ii]); 2273 // cout << "---" << endl; 2326 2274 #endif 2327 2275 /*Now initialFormElement must be added to (ideal)initialForm */ … … 2329 2277 pDelete(&initialFormElement); 2330 2278 omFree(leadExpV); 2331 } for2279 }//for 2332 2280 #ifdef gfanp 2333 2281 gettimeofday(&end, 0); … … 2343 2291 * compute the factors \f$ a_i \f$ 2344 2292 */ 2345 NOTE: Should be replaced by kNF or kNF22346 NOTE: Done2347 NOTE: removed with r122862348 2293 //NOTE: Should be replaced by kNF or kNF2 2294 //NOTE: Done 2295 //NOTE: removed with r12286 2296 2349 2297 /** \brief Compute \f$ f-f^{\mathcal{G}} \f$ 2350 2298 */ 2351 NOTE: use kNF or kNF2 instead of restOfDivision2299 //NOTE: use kNF or kNF2 instead of restOfDivision 2352 2300 inline ideal gcone::ffG(const ideal &H, const ideal &G) 2353 2301 { … … 2356 2304 for (int ii=0;ii<size;ii++) 2357 2305 { 2358 poly temp1;//=pInit();2359 poly temp2;//=pInit();2360 poly temp3; =pInit();//polys to temporarily store values for pSub2361 res->m[ii]=pCopy(kNF(G, NULL,H->m[ii],0,0));2362 temp1=pCopy(H->m[ii]);//TRY2363 temp2=pCopy(res->m[ii]);2364 NOTE if gfanHeuristic=0 (sic!) this results in dPolyErrors - mon from wrong ring2365 temp2=pCopy(kNF(G, NULL,H->m[ii],0,0));//TRY2366 temp3=pSub(temp1, temp2);//TRY2367 temp3=pSub(pCopy(H->m[ii]),pCopy(kNF(G,NULL,H->m[ii],0,0))); NOTRY2306 // poly temp1;//=pInit(); 2307 // poly temp2;//=pInit(); 2308 poly temp3;//=pInit();//polys to temporarily store values for pSub 2309 // res->m[ii]=pCopy(kNF(G, NULL,H->m[ii],0,0)); 2310 // temp1=pCopy(H->m[ii]);//TRY 2311 // temp2=pCopy(res->m[ii]); 2312 //NOTE if gfanHeuristic=0 (sic!) this results in dPolyErrors - mon from wrong ring 2313 // temp2=pCopy(kNF(G, NULL,H->m[ii],0,0));//TRY 2314 // temp3=pSub(temp1, temp2);//TRY 2315 temp3=pSub(pCopy(H->m[ii]),pCopy(kNF(G,NULL,H->m[ii],0,0)));//NOTRY 2368 2316 res->m[ii]=pCopy(temp3); 2369 res->m[ii]=pSub(temp1,temp2); //buggy2370 cout << "res->m["<<ii<<"]=";pWrite(res->m[ii]);2371 pDelete(&temp1);//TRY2372 pDelete(&temp2);2317 //res->m[ii]=pSub(temp1,temp2); //buggy 2318 //cout << "res->m["<<ii<<"]=";pWrite(res->m[ii]); 2319 // pDelete(&temp1);//TRY 2320 // pDelete(&temp2); 2373 2321 pDelete(&temp3); 2374 2322 } 2375 2323 return res; 2376 2324 } 2377 2325 2378 2326 /** \brief Preprocessing of inequlities 2379 2327 * Do some preprocessing on the matrix of inequalities … … 2388 2336 int num_elts=0; 2389 2337 int offset=0;*/ 2390 Remove zeroes (and strictly pos rows?)2338 //Remove zeroes (and strictly pos rows?) 2391 2339 for(int ii=0;ii<ddineq->rowsize;ii++) 2392 2340 { 2393 2341 int64vec *iv = new int64vec(this->numVars); 2394 int64vec *ivNull = new int64vec(this->numVars); Needed for intvec64::compare(*int64vec)2342 int64vec *ivNull = new int64vec(this->numVars);//Needed for intvec64::compare(*int64vec) 2395 2343 int posCtr=0; 2396 2344 for(int jj=0;jj<this->numVars;jj++) 2397 2345 { 2398 2346 (*iv)[jj]=(int)mpq_get_d(ddineq->matrix[ii][jj+1]); 2399 if((*iv)[jj]>0) check for strictly pos rows2347 if((*iv)[jj]>0)//check for strictly pos rows 2400 2348 posCtr++; 2401 Behold! This will delete the row for the standard simplex!2349 //Behold! This will delete the row for the standard simplex! 2402 2350 } 2403 if( (iv->compare(0)==0) || (posCtr==iv->length()) )2404 if( (posCtr==iv->length()) || (iv->compare(ivNull)==0) ) 2351 // if( (iv->compare(0)==0) || (posCtr==iv->length()) ) 2352 if( (posCtr==iv->length()) || (iv->compare(ivNull)==0) ) 2405 2353 { 2406 2354 dd_MatrixRowRemove(&ddineq,ii+1); 2407 ii--; Yes. This is on purpose2355 ii--;//Yes. This is on purpose 2408 2356 } 2409 2357 delete iv; 2410 2358 delete ivNull; 2411 2359 } 2412 Remove duplicates of rows2413 posRowsArray=NULL;2414 num_alloc=0;2415 num_elts=0;2416 offset=0;2417 int num_newRows = ddineq->rowsize;2418 for(int ii=0;ii<ddineq->rowsize-1;ii++)2419 for(int ii=0;ii<num_newRows-1;ii++)2420 {2421 int64vec *iv = new int64vec(this->numVars);//1st vector to check against2422 for(int jj=0;jj<this->numVars;jj++)2423 (*iv)[jj]=(int)mpq_get_d(ddineq->matrix[ii][jj+1]);2424 for(int jj=ii+1;jj</*ddineq->rowsize*/num_newRows;jj++)2425 {2426 int64vec *ivCheck = new int64vec(this->numVars);//Checked against iv2427 for(int kk=0;kk<this->numVars;kk++)2428 (*ivCheck)[kk]=(int)mpq_get_d(ddineq->matrix[jj][kk+1]);2429 if (iv->compare(ivCheck)==0)2430 {2431 // cout << "=" << endl;2432 // num_alloc++;2433 // void *tmp=realloc(posRowsArray,(num_alloc*sizeof(int)));2434 // if(!tmp)2435 // {2436 // WerrorS("Woah dude! Couldn't realloc memory\n");2437 // exit(-1);2438 // }2439 // posRowsArray = (int*)tmp;2440 // posRowsArray[num_elts]=jj;2441 // num_elts++;2442 dd_MatrixRowRemove(&ddineq,jj+1);2443 num_newRows = ddineq->rowsize;2444 }2445 delete ivCheck;2446 }2447 delete iv;2448 }2449 for(int ii=0;ii<num_elts;ii++)2450 {2451 dd_MatrixRowRemove(&ddineq,posRowsArray[ii]+1-offset);2452 offset++;2453 }2454 free(posRowsArray);2455 Apply Thm 2.1 of JOTA Vol 53 No 1 April 1987*/2456 } preprocessInequalities2457 2360 //Remove duplicates of rows 2361 // posRowsArray=NULL; 2362 // num_alloc=0; 2363 // num_elts=0; 2364 // offset=0; 2365 // int num_newRows = ddineq->rowsize; 2366 // for(int ii=0;ii<ddineq->rowsize-1;ii++) 2367 // for(int ii=0;ii<num_newRows-1;ii++) 2368 // { 2369 // int64vec *iv = new int64vec(this->numVars);//1st vector to check against 2370 // for(int jj=0;jj<this->numVars;jj++) 2371 // (*iv)[jj]=(int)mpq_get_d(ddineq->matrix[ii][jj+1]); 2372 // for(int jj=ii+1;jj</*ddineq->rowsize*/num_newRows;jj++) 2373 // { 2374 // int64vec *ivCheck = new int64vec(this->numVars);//Checked against iv 2375 // for(int kk=0;kk<this->numVars;kk++) 2376 // (*ivCheck)[kk]=(int)mpq_get_d(ddineq->matrix[jj][kk+1]); 2377 // if (iv->compare(ivCheck)==0) 2378 // { 2379 // // cout << "=" << endl; 2380 // // num_alloc++; 2381 // // void *tmp=realloc(posRowsArray,(num_alloc*sizeof(int))); 2382 // // if(!tmp) 2383 // // { 2384 // // WerrorS("Woah dude! Couldn't realloc memory\n"); 2385 // // exit(-1); 2386 // // } 2387 // // posRowsArray = (int*)tmp; 2388 // // posRowsArray[num_elts]=jj; 2389 // // num_elts++; 2390 // dd_MatrixRowRemove(&ddineq,jj+1); 2391 // num_newRows = ddineq->rowsize; 2392 // } 2393 // delete ivCheck; 2394 // } 2395 // delete iv; 2396 // } 2397 // for(int ii=0;ii<num_elts;ii++) 2398 // { 2399 // dd_MatrixRowRemove(&ddineq,posRowsArray[ii]+1-offset); 2400 // offset++; 2401 // } 2402 // free(posRowsArray); 2403 //Apply Thm 2.1 of JOTA Vol 53 No 1 April 1987*/ 2404 }//preprocessInequalities 2405 2458 2406 /** \brief Compute a Groebner Basis 2459 2407 * … … 2462 2410 *\return void 2463 2411 */ 2464 inline void gcone::getGB(const ideal &inputIdeal) 2412 inline void gcone::getGB(const ideal &inputIdeal) 2465 2413 { 2466 2414 BITSET save=test; … … 2471 2419 idNorm(gb); 2472 2420 idSkipZeroes(gb); 2473 this->gcBasis=gb; write the GB into gcBasis2421 this->gcBasis=gb; //write the GB into gcBasis 2474 2422 test=save; 2475 } void getGB2476 2423 }//void getGB 2424 2477 2425 /** \brief Compute the negative of a given int64vec 2478 */ 2426 */ 2479 2427 static int64vec* ivNeg(/*const*/int64vec *iv) 2480 { Hm, switching to int64vec const int64vec does no longer work2481 int64vec *res; = new int64vec(iv->length());2428 { //Hm, switching to int64vec const int64vec does no longer work 2429 int64vec *res;// = new int64vec(iv->length()); 2482 2430 res=iv64Copy(iv); 2483 *res *= (int)-1; 2431 *res *= (int)-1; 2484 2432 return res; 2485 2433 } … … 2489 2437 * 2490 2438 */ 2491 static int dotProduct(const int64vec &iva, const int64vec &ivb) 2492 { 2493 int res=0; 2439 static int dotProduct(const int64vec &iva, const int64vec &ivb) 2440 { 2441 int res=0; 2494 2442 for (int i=0;i<pVariables;i++) 2495 2443 { 2496 #ifndef NDEBUG2497 (const_cast<int64vec*>(&iva))->show(1,0); (const_cast<int64vec*>(&ivb))->show(1,0);2498 #endif2444 // #ifndef NDEBUG 2445 // (const_cast<int64vec*>(&iva))->show(1,0); (const_cast<int64vec*>(&ivb))->show(1,0); 2446 // #endif 2499 2447 res = res+(iva[i]*ivb[i]); 2500 2448 } … … 2506 2454 */ 2507 2455 static bool isParallel(const int64vec &a,const int64vec &b) 2508 { 2509 /*#ifdef gfanp 2456 { 2457 /*#ifdef gfanp 2510 2458 timeval start, end; 2511 2459 gettimeofday(&start, 0); 2512 #endif*/ 2460 #endif*/ 2513 2461 bool res; 2514 2462 int lhs=dotProduct(a,b)*dotProduct(a,b); 2515 2463 int rhs=dotProduct(a,a)*dotProduct(b,b); 2516 #ifdef gfanp2517 gettimeofday(&end, 0);2518 t_isParallel += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec));2519 #endif 2520 return res;2464 // #ifdef gfanp 2465 // gettimeofday(&end, 0); 2466 // t_isParallel += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec)); 2467 // #endif 2468 // return res; 2521 2469 return res = (lhs==rhs)?TRUE:FALSE; 2522 } bool isParallel2470 }//bool isParallel 2523 2471 2524 2472 /** \brief Compute an interior point of a given cone 2525 * Result will be written into int64vec iv. 2473 * Result will be written into int64vec iv. 2526 2474 * Any rational point is automatically converted into an integer. 2527 2475 */ 2528 void gcone::interiorPoint( dd_MatrixPtr &M, int64vec &iv) no const &M here since we want to remove redundant rows2476 void gcone::interiorPoint( dd_MatrixPtr &M, int64vec &iv) //no const &M here since we want to remove redundant rows 2529 2477 { 2530 2478 dd_LPPtr lp,lpInt; … … 2532 2480 dd_LPSolverType solver=dd_DualSimplex; 2533 2481 dd_LPSolutionPtr lpSol=NULL; 2534 dd_rowset ddlinset,ddredrows; //needed for dd_FindRelativeInterior2535 dd_rowindex ddnewpos;2536 dd_NumberType numb; 2537 M->representation=dd_Inequality;2538 2539 NOTE: Make this n-dimensional!2540 dd_set_si(M->rowvec[0],1);dd_set_si(M->rowvec[1],1);dd_set_si(M->rowvec[2],1);2541 2482 // dd_rowset ddlinset,ddredrows; //needed for dd_FindRelativeInterior 2483 // dd_rowindex ddnewpos; 2484 dd_NumberType numb; 2485 //M->representation=dd_Inequality; 2486 2487 //NOTE: Make this n-dimensional! 2488 //dd_set_si(M->rowvec[0],1);dd_set_si(M->rowvec[1],1);dd_set_si(M->rowvec[2],1); 2489 2542 2490 /*NOTE: Leave the following line commented out! 2543 2491 * Otherwise it will slow down computations a great deal 2544 2492 * */ 2545 dd_MatrixCanonicalizeLinearity(&M, &ddlinset, &ddnewpos, &err);2546 if (err!=dd_NoError){cout << "Error during dd_MatrixCanonicalize" << endl;}2493 // dd_MatrixCanonicalizeLinearity(&M, &ddlinset, &ddnewpos, &err); 2494 //if (err!=dd_NoError){cout << "Error during dd_MatrixCanonicalize" << endl;} 2547 2495 dd_MatrixPtr posRestr=dd_CreateMatrix(this->numVars,this->numVars+1); 2548 2496 int jj=1; … … 2550 2498 { 2551 2499 dd_set_si(posRestr->matrix[ii][jj],1); 2552 jj++; 2500 jj++; 2553 2501 } 2554 2502 dd_MatrixAppendTo(&M,posRestr); … … 2558 2506 if (lp==NULL){WerrorS("LP is NULL");} 2559 2507 #ifdef gfan_DEBUG 2560 dd_WriteLP(stdout,lp);2561 #endif 2562 2508 // dd_WriteLP(stdout,lp); 2509 #endif 2510 2563 2511 lpInt=dd_MakeLPforInteriorFinding(lp); 2564 2512 if (err!=dd_NoError){WerrorS("Error during dd_MakeLPForInteriorFinding in gcone::interiorPoint");} 2565 2513 #ifdef gfan_DEBUG 2566 dd_WriteLP(stdout,lpInt);2567 #endif 2568 dd_FindRelativeInterior(M,&ddlinset,&ddredrows,&lpSol,&err);2514 // dd_WriteLP(stdout,lpInt); 2515 #endif 2516 // dd_FindRelativeInterior(M,&ddlinset,&ddredrows,&lpSol,&err); 2569 2517 if (err!=dd_NoError) 2570 2518 { 2571 2519 WerrorS("Error during dd_FindRelativeInterior in gcone::interiorPoint"); 2572 2520 dd_WriteErrorMessages(stdout, err); 2573 } 2574 dd_LPSolve(lpInt,solver,&err); This will not result in a point from the relative interior2575 if (err!=dd_NoError){WerrorS("Error during dd_LPSolve");} 2521 } 2522 dd_LPSolve(lpInt,solver,&err); //This will not result in a point from the relative interior 2523 // if (err!=dd_NoError){WerrorS("Error during dd_LPSolve");} 2576 2524 lpSol=dd_CopyLPSolution(lpInt); 2577 if (err!=dd_NoError){WerrorS("Error during dd_CopyLPSolution");}2525 // if (err!=dd_NoError){WerrorS("Error during dd_CopyLPSolution");} 2578 2526 #ifdef gfan_DEBUG 2579 2527 printf("Interior point: "); … … 2583 2531 } 2584 2532 printf("\n"); 2585 #endif 2586 NOTE The following strongly resembles parts of makeInt.2587 Maybe merge sometimes2533 #endif 2534 //NOTE The following strongly resembles parts of makeInt. 2535 //Maybe merge sometimes 2588 2536 mpz_t kgV; mpz_init(kgV); 2589 2537 mpz_set_str(kgV,"1",10); … … 2609 2557 } 2610 2558 #ifdef gfan_DEBUG 2611 iv.show();2612 cout << endl;2559 // iv.show(); 2560 // cout << endl; 2613 2561 #endif 2614 2562 mpq_clear(qkgV); 2615 2563 mpz_clear(tmp); 2616 2564 mpz_clear(den); 2617 mpz_clear(kgV); 2618 2565 mpz_clear(kgV); 2566 2619 2567 dd_FreeLPSolution(lpSol); 2620 2568 dd_FreeLPData(lpInt); 2621 2569 dd_FreeLPData(lp); 2622 set_free(ddlinset);2623 set_free(ddredrows); 2624 2625 } void interiorPoint(dd_MatrixPtr const &M)2570 // set_free(ddlinset); 2571 // set_free(ddredrows); 2572 2573 }//void interiorPoint(dd_MatrixPtr const &M) 2626 2574 2627 2575 /** Computes an interior point of a cone by taking two interior points a,b from two different facets 2628 2576 * and then computing b+(a-b)/2 2629 * Of course this only works for flippable facets 2630 * Two cases may occur: 2577 * Of course this only works for flippable facets 2578 * Two cases may occur: 2631 2579 * 1st: There are only two facets who share the only strictly positive ray 2632 2580 * 2nd: There are at least two facets which have a distinct positive ray … … 2637 2585 * positive => these lie in a plane and thus their sum is not from relative interior. 2638 2586 * So let's just sum up all rays, find one strictly positive and shift the point along that ray 2639 * 2587 * 2640 2588 * Used by noRevS 2641 2589 *NOTE no longer used nor maintained. MM Mar 9, 2010 2642 2590 */ 2643 void gcone::interiorPoint2()2644 {//idPrint(this->gcBasis);2645 #ifdef gfan_DEBUG2646 if(this->ivIntPt!=NULL)2647 WarnS("Interior point already exists - ovrewriting!");2648 #endif2649 facet *f1 = this->facetPtr;2650 facet *f2 = NULL;2651 int64vec *intF1=NULL;2652 while(f1!=NULL)2653 {2654 if(f1->isFlippable)2655 {2656 facet *f1Ray = f1->codim2Ptr;2657 while(f1Ray!=NULL)2658 {2659 const int64vec *check=f1Ray->getRef2FacetNormal();2660 if(iv64isStrictlyPositive(check))2661 {2662 intF1=iv64Copy(check);2663 break;2664 } 2665 f1Ray=f1Ray->next;2666 }2667 }2668 if(intF1!=NULL)2669 break;2670 f1=f1->next;2671 }2672 if(f1!=NULL && f1->next!=NULL)//Choose another facet, different from f12673 f2=f1->next;2674 else2675 f2=this->facetPtr;2676 if(intF1==NULL && hasHomInput==TRUE)2677 {2678 intF1 = new int64vec(this->numVars);2679 for(int ii=0;ii<this->numVars;ii++)2680 (*intF1)[ii]=1;2681 }2682 assert(f1); assert(f2);2683 int64vec *intF2=f2->getInteriorPoint();2684 mpq_t *qPosRay = new mpq_t[this->numVars];//The positive ray from above2685 mpq_t *qIntPt = new mpq_t[this->numVars];//starting vector a+((b-a)/2)2686 mpq_t *qPosIntPt = new mpq_t[this->numVars];//This should be >0 eventually2687 for(int ii=0;ii<this->numVars;ii++)2688 {2689 mpq_init(qPosRay[ii]);2690 mpq_init(qIntPt[ii]);2691 mpq_init(qPosIntPt[ii]);2692 } 2693 //Compute a+((b-a)/2) && Convert intF1 to mpq2694 for(int ii=0;ii<this->numVars;ii++)2695 {2696 mpq_t a,b;2697 mpq_init(a); mpq_init(b);2698 mpq_set_si(a,(*intF1)[ii],1);2699 mpq_set_si(b,(*intF2)[ii],1);2700 mpq_t diff;2701 mpq_init(diff);2702 mpq_sub(diff,b,a); //diff=b-a2703 mpq_t quot;2704 mpq_init(quot);2705 mpq_div_2exp(quot,diff,1); //quot=diff/2=(b-a)/22706 mpq_clear(diff);2707 //Don't be clever and reuse diff here2708 mpq_t sum; mpq_init(sum);2709 mpq_add(sum,b,quot); //sum=b+quot=a+(b-a)/22710 mpq_set(qIntPt[ii],sum);2711 mpq_clear(sum);2712 mpq_clear(quot);2713 mpq_clear(a); mpq_clear(b);2714 //Now for intF12715 mpq_set_si(qPosRay[ii],(*intF1)[ii],1);2716 }2717 //Now add: qPosIntPt=qPosRay+qIntPt until qPosIntPt >02718 while(TRUE)2719 { 2720 bool success=FALSE;2721 int posCtr=0; 2722 for(int ii=0;ii<this->numVars;ii++)2723 {2724 mpq_t sum; mpq_init(sum);2725 mpq_add(sum,qPosRay[ii],qIntPt[ii]);2726 mpq_set(qPosIntPt[ii],sum);2727 mpq_clear(sum);2728 if(mpq_sgn(qPosIntPt[ii])==1)2729 posCtr++;2730 }2731 if(posCtr==this->numVars)//qPosIntPt > 0 2732 break;2733 else2734 {2735 mpq_t qTwo; mpq_init(qTwo);2736 mpq_set_ui(qTwo,2,1);2737 for(int jj=0;jj<this->numVars;jj++)2738 {2739 mpq_t tmp; mpq_init(tmp);2740 mpq_mul(tmp,qPosRay[jj],qTwo);2741 mpq_set( qPosRay[jj], tmp);2742 mpq_clear(tmp);2743 }2744 mpq_clear(qTwo);2745 }2746 }//while2747 //Now qPosIntPt ought to be >0, so convert back to int :D2748 /*Compute lcm of the denominators*/2749 mpz_t *denom = new mpz_t[this->numVars];2750 mpz_t tmp,kgV;2751 mpz_init(tmp); mpz_init(kgV);2752 for (int ii=0;ii<this->numVars;ii++)2753 {2754 mpz_t z;2755 mpz_init(z);2756 mpq_get_den(z,qPosIntPt[ii]);2757 mpz_init(denom[ii]);2758 mpz_set( denom[ii], z);2759 mpz_clear(z); 2760 }2761 2762 mpz_set(tmp,denom[0]);2763 for (int ii=0;ii<this->numVars;ii++)2764 {2765 mpz_lcm(kgV,tmp,denom[ii]);2766 mpz_set(tmp,kgV); 2767 }2768 mpz_clear(tmp); 2769 /*Multiply the nominators by kgV*/2770 mpq_t qkgV,res;2771 mpq_init(qkgV);2772 mpq_canonicalize(qkgV); 2773 mpq_init(res);2774 mpq_canonicalize(res);2775 2776 mpq_set_num(qkgV,kgV);2777 int64vec *n=new int64vec(this->numVars);2778 for (int ii=0;ii<this->numVars;ii++)2779 {2780 mpq_canonicalize(qPosIntPt[ii]);2781 mpq_mul(res,qkgV,qPosIntPt[ii]);2782 (*n)[ii]=(int)mpz_get_d(mpq_numref(res));2783 }2784 this->setIntPoint(n);2785 delete n;2786 delete [] qPosIntPt;2787 delete [] denom;2788 delete [] qPosRay;2789 delete [] qIntPt;2790 mpz_clear(kgV);2791 mpq_clear(qkgV); mpq_clear(res);2792 }2793 2591 // void gcone::interiorPoint2() 2592 // {//idPrint(this->gcBasis); 2593 // #ifdef gfan_DEBUG 2594 // if(this->ivIntPt!=NULL) 2595 // WarnS("Interior point already exists - ovrewriting!"); 2596 // #endif 2597 // facet *f1 = this->facetPtr; 2598 // facet *f2 = NULL; 2599 // int64vec *intF1=NULL; 2600 // while(f1!=NULL) 2601 // { 2602 // if(f1->isFlippable) 2603 // { 2604 // facet *f1Ray = f1->codim2Ptr; 2605 // while(f1Ray!=NULL) 2606 // { 2607 // const int64vec *check=f1Ray->getRef2FacetNormal(); 2608 // if(iv64isStrictlyPositive(check)) 2609 // { 2610 // intF1=iv64Copy(check); 2611 // break; 2612 // } 2613 // f1Ray=f1Ray->next; 2614 // } 2615 // } 2616 // if(intF1!=NULL) 2617 // break; 2618 // f1=f1->next; 2619 // } 2620 // if(f1!=NULL && f1->next!=NULL)//Choose another facet, different from f1 2621 // f2=f1->next; 2622 // else 2623 // f2=this->facetPtr; 2624 // if(intF1==NULL && hasHomInput==TRUE) 2625 // { 2626 // intF1 = new int64vec(this->numVars); 2627 // for(int ii=0;ii<this->numVars;ii++) 2628 // (*intF1)[ii]=1; 2629 // } 2630 // assert(f1); assert(f2); 2631 // int64vec *intF2=f2->getInteriorPoint(); 2632 // mpq_t *qPosRay = new mpq_t[this->numVars];//The positive ray from above 2633 // mpq_t *qIntPt = new mpq_t[this->numVars];//starting vector a+((b-a)/2) 2634 // mpq_t *qPosIntPt = new mpq_t[this->numVars];//This should be >0 eventually 2635 // for(int ii=0;ii<this->numVars;ii++) 2636 // { 2637 // mpq_init(qPosRay[ii]); 2638 // mpq_init(qIntPt[ii]); 2639 // mpq_init(qPosIntPt[ii]); 2640 // } 2641 // //Compute a+((b-a)/2) && Convert intF1 to mpq 2642 // for(int ii=0;ii<this->numVars;ii++) 2643 // { 2644 // mpq_t a,b; 2645 // mpq_init(a); mpq_init(b); 2646 // mpq_set_si(a,(*intF1)[ii],1); 2647 // mpq_set_si(b,(*intF2)[ii],1); 2648 // mpq_t diff; 2649 // mpq_init(diff); 2650 // mpq_sub(diff,b,a); //diff=b-a 2651 // mpq_t quot; 2652 // mpq_init(quot); 2653 // mpq_div_2exp(quot,diff,1); //quot=diff/2=(b-a)/2 2654 // mpq_clear(diff); 2655 // //Don't be clever and reuse diff here 2656 // mpq_t sum; mpq_init(sum); 2657 // mpq_add(sum,b,quot); //sum=b+quot=a+(b-a)/2 2658 // mpq_set(qIntPt[ii],sum); 2659 // mpq_clear(sum); 2660 // mpq_clear(quot); 2661 // mpq_clear(a); mpq_clear(b); 2662 // //Now for intF1 2663 // mpq_set_si(qPosRay[ii],(*intF1)[ii],1); 2664 // } 2665 // //Now add: qPosIntPt=qPosRay+qIntPt until qPosIntPt >0 2666 // while(TRUE) 2667 // { 2668 // bool success=FALSE; 2669 // int posCtr=0; 2670 // for(int ii=0;ii<this->numVars;ii++) 2671 // { 2672 // mpq_t sum; mpq_init(sum); 2673 // mpq_add(sum,qPosRay[ii],qIntPt[ii]); 2674 // mpq_set(qPosIntPt[ii],sum); 2675 // mpq_clear(sum); 2676 // if(mpq_sgn(qPosIntPt[ii])==1) 2677 // posCtr++; 2678 // } 2679 // if(posCtr==this->numVars)//qPosIntPt > 0 2680 // break; 2681 // else 2682 // { 2683 // mpq_t qTwo; mpq_init(qTwo); 2684 // mpq_set_ui(qTwo,2,1); 2685 // for(int jj=0;jj<this->numVars;jj++) 2686 // { 2687 // mpq_t tmp; mpq_init(tmp); 2688 // mpq_mul(tmp,qPosRay[jj],qTwo); 2689 // mpq_set( qPosRay[jj], tmp); 2690 // mpq_clear(tmp); 2691 // } 2692 // mpq_clear(qTwo); 2693 // } 2694 // }//while 2695 // //Now qPosIntPt ought to be >0, so convert back to int :D 2696 // /*Compute lcm of the denominators*/ 2697 // mpz_t *denom = new mpz_t[this->numVars]; 2698 // mpz_t tmp,kgV; 2699 // mpz_init(tmp); mpz_init(kgV); 2700 // for (int ii=0;ii<this->numVars;ii++) 2701 // { 2702 // mpz_t z; 2703 // mpz_init(z); 2704 // mpq_get_den(z,qPosIntPt[ii]); 2705 // mpz_init(denom[ii]); 2706 // mpz_set( denom[ii], z); 2707 // mpz_clear(z); 2708 // } 2709 // 2710 // mpz_set(tmp,denom[0]); 2711 // for (int ii=0;ii<this->numVars;ii++) 2712 // { 2713 // mpz_lcm(kgV,tmp,denom[ii]); 2714 // mpz_set(tmp,kgV); 2715 // } 2716 // mpz_clear(tmp); 2717 // /*Multiply the nominators by kgV*/ 2718 // mpq_t qkgV,res; 2719 // mpq_init(qkgV); 2720 // mpq_canonicalize(qkgV); 2721 // mpq_init(res); 2722 // mpq_canonicalize(res); 2723 // 2724 // mpq_set_num(qkgV,kgV); 2725 // int64vec *n=new int64vec(this->numVars); 2726 // for (int ii=0;ii<this->numVars;ii++) 2727 // { 2728 // mpq_canonicalize(qPosIntPt[ii]); 2729 // mpq_mul(res,qkgV,qPosIntPt[ii]); 2730 // (*n)[ii]=(int)mpz_get_d(mpq_numref(res)); 2731 // } 2732 // this->setIntPoint(n); 2733 // delete n; 2734 // delete [] qPosIntPt; 2735 // delete [] denom; 2736 // delete [] qPosRay; 2737 // delete [] qIntPt; 2738 // mpz_clear(kgV); 2739 // mpq_clear(qkgV); mpq_clear(res); 2740 // } 2741 2794 2742 /** \brief Copy a ring and add a weighted ordering in first place 2795 * 2743 * 2796 2744 */ 2797 ring gcone::rCopyAndAddWeight(const ring &r, int64vec *ivw) 2745 ring gcone::rCopyAndAddWeight(const ring &r, int64vec *ivw) 2798 2746 { 2799 2747 ring res=rCopy0(r); 2800 2748 int jj; 2801 2749 2802 2750 omFree(res->order); 2803 2751 res->order =(int *)omAlloc0(4*sizeof(int/*64*/)); … … 2808 2756 omfree(res->wvhdl); 2809 2757 res->wvhdl =(int **)omAlloc0(4*sizeof(int/*64*/**)); 2810 2758 2811 2759 res->order[0]=ringorder_a/*64*/; 2812 2760 res->block0[0]=1; 2813 2761 res->block1[0]=res->N; 2814 res->order[1]=ringorder_dp; basically useless, since that should never be used2762 res->order[1]=ringorder_dp; //basically useless, since that should never be used 2815 2763 res->block0[1]=1; 2816 2764 res->block1[1]=res->N; … … 2820 2768 int/*64*/ *A=(int/*64*/ *)omAlloc0(length*sizeof(int/*64*/)); 2821 2769 for (jj=0;jj<length;jj++) 2822 { 2770 { 2823 2771 A[jj]=(*ivw)[jj]; 2824 2772 if((*ivw)[jj]>=INT_MAX) WarnS("A[jj] exceeds INT_MAX in gcone::rCopyAndAddWeight!\n"); 2825 } 2773 } 2826 2774 res->wvhdl[0]=(int *)A; 2827 2775 res->block1[0]=length; 2828 2776 2829 2777 rComplete(res); 2830 2778 return res; 2831 } rCopyAndAdd2832 2833 ring gcone::rCopyAndAddWeight2(const ring &r,const int64vec *ivw, const int64vec *fNormal) 2779 }//rCopyAndAdd 2780 2781 ring gcone::rCopyAndAddWeight2(const ring &r,const int64vec *ivw, const int64vec *fNormal) 2834 2782 { 2835 2783 ring res=rCopy0(r); 2836 2784 2837 2785 omFree(res->order); 2838 2786 res->order =(int *)omAlloc0(5*sizeof(int/*64*/)); … … 2843 2791 omfree(res->wvhdl); 2844 2792 res->wvhdl =(int **)omAlloc0(5*sizeof(int/*64*/**)); 2845 2793 2846 2794 res->order[0]=ringorder_a/*64*/; 2847 2795 res->block0[0]=1; … … 2850 2798 res->block0[1]=1; 2851 2799 res->block1[1]=res->N; 2852 2800 2853 2801 res->order[2]=ringorder_dp; 2854 2802 res->block0[2]=1; 2855 2803 res->block1[2]=res->N; 2856 2804 2857 2805 res->order[3]=ringorder_C; 2858 2806 … … 2861 2809 int/*64*/ *A2=(int/*64*/ *)omAlloc0(length*sizeof(int/*64*/)); 2862 2810 for (int jj=0;jj<length;jj++) 2863 { 2811 { 2864 2812 A1[jj]=(*ivw)[jj]; 2865 2813 A2[jj]=-(*fNormal)[jj]; 2866 2814 if((*ivw)[jj]>=INT_MAX || (*fNormal)[jj]>=INT_MAX) WarnS("A[jj] exceeds INT_MAX in gcone::rCopyAndAddWeight2!\n"); 2867 } 2815 } 2868 2816 res->wvhdl[0]=(int *)A1; 2869 2817 res->block1[0]=length; … … 2873 2821 return res; 2874 2822 } 2875 2876 NOTE not needed anywhere2877 ring rCopyAndChangeWeight(ring const &r, int64vec *ivw)2878 {2879 ring res=rCopy0(currRing);2880 rComplete(res);2881 rSetWeightVec(res,(int64*)ivw);2882 //rChangeCurrRing(rnew);2883 return res;2884 }2885 2823 2824 //NOTE not needed anywhere 2825 // ring rCopyAndChangeWeight(ring const &r, int64vec *ivw) 2826 // { 2827 // ring res=rCopy0(currRing); 2828 // rComplete(res); 2829 // rSetWeightVec(res,(int64*)ivw); 2830 // //rChangeCurrRing(rnew); 2831 // return res; 2832 // } 2833 2886 2834 /** \brief Checks whether a given facet is a search facet 2887 2835 * Determines whether a given facet of a cone is the search facet of a neighbouring cone … … 2890 2838 * that is first crossed during the generic walk. 2891 2839 * We then check whether the fNormal of this facet is parallel to the fNormal of our testfacet. 2892 * If this is the case, then our facet is indeed a search facet and TRUE is retuned. 2840 * If this is the case, then our facet is indeed a search facet and TRUE is retuned. 2893 2841 */ 2894 removed with r122862895 2842 //removed with r12286 2843 2896 2844 /** \brief Check for equality of two intvecs 2897 2845 */ … … 2909 2857 return res; 2910 2858 } 2911 2859 2912 2860 /** \brief The reverse search algorithm 2913 2861 */ 2914 removed with r122862862 //removed with r12286 2915 2863 /** \brief Compute the lineality/homogeneity space 2916 2864 * It is the kernel of the inequality matrix Ax=0 … … 2921 2869 dd_MatrixPtr res; 2922 2870 dd_MatrixPtr ddineq; 2923 ddineq=dd_CopyMatrix(this->ddFacets); 2924 Add a row of 0s in 0th place2871 ddineq=dd_CopyMatrix(this->ddFacets); 2872 //Add a row of 0s in 0th place 2925 2873 dd_MatrixPtr ddAppendRowOfZeroes=dd_CreateMatrix(1,this->numVars+1); 2926 2874 dd_MatrixPtr ddFoo=dd_AppendMatrix(ddAppendRowOfZeroes,ddineq); … … 2929 2877 ddineq=dd_CopyMatrix(ddFoo); 2930 2878 dd_FreeMatrix(ddFoo); 2931 Cohen starts here2932 int dimKer=0; Cohen calls this r2933 int m=ddineq->rowsize; Rows2934 int n=ddineq->colsize; Cols2879 //Cohen starts here 2880 int dimKer=0;//Cohen calls this r 2881 int m=ddineq->rowsize;//Rows 2882 int n=ddineq->colsize;//Cols 2935 2883 int c[m+1]; 2936 2884 int d[n+1]; … … 2938 2886 c[ii]=0; 2939 2887 for(int ii=0;ii<n;ii++) 2940 d[ii]=0; 2941 2888 d[ii]=0; 2889 2942 2890 for(int k=1;k<n;k++) 2943 2891 { 2944 //Let's find a j s.t. m[j][k]!=0 && c[j]=0 2945 int condCtr=0; Check each row for zeroness2892 //Let's find a j s.t. m[j][k]!=0 && c[j]=0 2893 int condCtr=0;//Check each row for zeroness 2946 2894 for(int j=1;j<m;j++) 2947 2895 { … … 2955 2903 mpq_set(ratd,quot); 2956 2904 mpq_canonicalize(ratd); 2957 2905 2958 2906 mpq_set_str(ddineq->matrix[j][k],"-1",10); 2959 2907 for(int ss=k+1;ss<n;ss++) 2960 2908 { 2961 2909 mpq_t prod; mpq_init(prod); 2962 mpq_mul(prod, ratd, ddineq->matrix[j][ss]); 2910 mpq_mul(prod, ratd, ddineq->matrix[j][ss]); 2963 2911 mpq_set(ddineq->matrix[j][ss],prod); 2964 2912 mpq_canonicalize(ddineq->matrix[j][ss]); 2965 2913 mpq_clear(prod); 2966 } 2914 } 2967 2915 for(int ii=1;ii<m;ii++) 2968 2916 { … … 2970 2918 { 2971 2919 mpq_set(ratd,ddineq->matrix[ii][k]); 2972 mpq_set_str(ddineq->matrix[ii][k],"0",10); 2920 mpq_set_str(ddineq->matrix[ii][k],"0",10); 2973 2921 for(int ss=k+1;ss<n;ss++) 2974 2922 { … … 2984 2932 } 2985 2933 } 2986 c[j]=k; 2934 c[j]=k; 2987 2935 d[k]=j; 2988 mpq_clear(quot); mpq_clear(ratd); mpq_clear(one); 2936 mpq_clear(quot); mpq_clear(ratd); mpq_clear(one); 2989 2937 } 2990 2938 else 2991 2939 condCtr++; 2992 } 2993 if(condCtr==m-1) Why -1 ???2940 } 2941 if(condCtr==m-1) //Why -1 ??? 2994 2942 { 2995 2943 dimKer++; 2996 2944 d[k]=0; 2997 break;//goto _4;2998 } else{2945 // break;//goto _4; 2946 }//else{ 2999 2947 /*Eliminate*/ 3000 } for(k3001 /*Output kernel, i.e. set gcone::dd_LinealitySpace here*/ 3002 gcone::dd_LinealitySpace = dd_CreateMatrix(dimKer,this->numVars+1);2948 }//for(k 2949 /*Output kernel, i.e. set gcone::dd_LinealitySpace here*/ 2950 // gcone::dd_LinealitySpace = dd_CreateMatrix(dimKer,this->numVars+1); 3003 2951 res = dd_CreateMatrix(dimKer,this->numVars+1); 3004 2952 int row=-1; … … 3012 2960 if(d[ii]>0) 3013 2961 mpq_set(res->matrix[row][ii],ddineq->matrix[d[ii]][kk]); 3014 else if(ii==kk) 2962 else if(ii==kk) 3015 2963 mpq_set_str(res->matrix[row][ii],"1",10); 3016 2964 mpq_canonicalize(res->matrix[row][ii]); … … 3020 2968 dd_FreeMatrix(ddineq); 3021 2969 return(res); 3022 Better safe than sorry:3023 NOTE dd_LinealitySpace contains RATIONAL ENTRIES3024 Therefore if you need integer ones: CALL gcone::makeInt(...) method3025 } 2970 //Better safe than sorry: 2971 //NOTE dd_LinealitySpace contains RATIONAL ENTRIES 2972 //Therefore if you need integer ones: CALL gcone::makeInt(...) method 2973 } 3026 2974 3027 2975 … … 3034 2982 */ 3035 2983 void gcone::noRevS(gcone &gcRoot, bool usingIntPoint) 3036 { 3037 facet *SearchListRoot = new facet(); The list containing ALL facets we come across2984 { 2985 facet *SearchListRoot = new facet(); //The list containing ALL facets we come across 3038 2986 facet *SearchListAct; 3039 2987 SearchListAct = NULL; 3040 SearchListAct = SearchListRoot;2988 //SearchListAct = SearchListRoot; 3041 2989 gcone *gcAct; 3042 2990 gcAct = &gcRoot; 3043 gcone *gcPtr; Pointer to end of linked list of cones2991 gcone *gcPtr; //Pointer to end of linked list of cones 3044 2992 gcPtr = &gcRoot; 3045 gcone *gcNext; Pointer to next cone to be visited2993 gcone *gcNext; //Pointer to next cone to be visited 3046 2994 gcNext = &gcRoot; 3047 2995 gcone *gcHead; 3048 gcHead = &gcRoot; 2996 gcHead = &gcRoot; 3049 2997 facet *fAct; 3050 fAct = gcAct->facetPtr; 2998 fAct = gcAct->facetPtr; 3051 2999 ring rAct; 3052 3000 rAct = currRing; 3053 int UCNcounter=gcAct->getUCN(); 3001 int UCNcounter=gcAct->getUCN(); 3054 3002 #ifdef gfan_DEBUG 3055 3003 printf("NoRevs\n"); 3056 3004 printf("Facets are:\n"); 3057 3005 gcAct->showFacets(); 3058 #endif 3006 #endif 3059 3007 /*Compute lineality space here 3060 3008 * Afterwards static dd_MatrixPtr gcone::dd_LinealitySpace is set*/ 3061 3009 if(dd_LinealitySpace==NULL) 3062 3010 dd_LinealitySpace = gcAct->computeLinealitySpace(); 3063 /*End of lineality space computation*/ 3064 gcAct->getCodim2Normals(*gcAct);3011 /*End of lineality space computation*/ 3012 //gcAct->getCodim2Normals(*gcAct); 3065 3013 if(fAct->codim2Ptr==NULL) 3066 gcAct->getExtremalRays(*gcAct); 3014 gcAct->getExtremalRays(*gcAct); 3067 3015 /* Make a copy of the facet list of first cone 3068 3016 Since the operations getCodim2Normals and normalize affect the facets 3069 we must not memcpy them before these ops! */ 3070 /*facet *codim2Act; codim2Act = NULL; 3017 we must not memcpy them before these ops! */ 3018 /*facet *codim2Act; codim2Act = NULL; 3071 3019 facet *sl2Root; 3072 facet *sl2Act;*/ 3020 facet *sl2Act;*/ 3073 3021 for(int ii=0;ii<this->numFacets;ii++) 3074 3022 { 3075 only copy flippable facets! NOTE: We do not need flipRing or any such information.3023 //only copy flippable facets! NOTE: We do not need flipRing or any such information. 3076 3024 if(fAct->isFlippable==TRUE) 3077 3025 { 3078 3026 /*Using shallow copy here*/ 3079 3027 #ifdef SHALLOW 3080 if( ii==0 || (ii>0 && SearchListAct==NULL) ) 1st facet may be non-flippable3028 if( ii==0 || (ii>0 && SearchListAct==NULL) ) //1st facet may be non-flippable 3081 3029 { 3082 3030 if(SearchListRoot!=NULL) delete(SearchListRoot); 3083 3031 SearchListRoot = fAct->shallowCopy(*fAct); 3084 SearchListAct = SearchListRoot; SearchListRoot is already 'new'ed at beginning of method!3032 SearchListAct = SearchListRoot; //SearchListRoot is already 'new'ed at beginning of method! 3085 3033 } 3086 3034 else 3087 { 3035 { 3088 3036 SearchListAct->next = fAct->shallowCopy(*fAct); 3089 SearchListAct = SearchListAct->next; 3037 SearchListAct = SearchListAct->next; 3090 3038 } 3091 3039 fAct=fAct->next; … … 3094 3042 int64vec *fNormal; 3095 3043 fNormal = fAct->getFacetNormal(); 3096 if( ii==0 || (ii>0 && SearchListAct==NULL) ) 1st facet may be non-flippable3097 { 3098 SearchListAct = SearchListRoot; SearchListRoot is already 'new'ed at beginning of method!3044 if( ii==0 || (ii>0 && SearchListAct==NULL) ) //1st facet may be non-flippable 3045 { 3046 SearchListAct = SearchListRoot; //SearchListRoot is already 'new'ed at beginning of method! 3099 3047 } 3100 3048 else 3101 { 3049 { 3102 3050 SearchListAct->next = new facet(); 3103 SearchListAct = SearchListAct->next; 3051 SearchListAct = SearchListAct->next; 3104 3052 } 3105 3053 SearchListAct->setFacetNormal(fNormal); … … 3107 3055 SearchListAct->numCodim2Facets=fAct->numCodim2Facets; 3108 3056 SearchListAct->isFlippable=TRUE; 3109 Copy int point as well3057 //Copy int point as well 3110 3058 int64vec *ivIntPt; 3111 3059 ivIntPt = fAct->getInteriorPoint(); 3112 3060 SearchListAct->setInteriorPoint(ivIntPt); 3113 3061 delete(ivIntPt); 3114 Copy codim2-facets3062 //Copy codim2-facets 3115 3063 facet *codim2Act; 3116 codim2Act = NULL; 3064 codim2Act = NULL; 3117 3065 facet *sl2Root; 3118 facet *sl2Act; 3066 facet *sl2Act; 3119 3067 codim2Act=fAct->codim2Ptr; 3120 3068 SearchListAct->codim2Ptr = new facet(2); 3121 3069 sl2Root = SearchListAct->codim2Ptr; 3122 sl2Act = sl2Root; 3070 sl2Act = sl2Root; 3123 3071 for(int jj=0;jj<fAct->numCodim2Facets;jj++) 3124 for(int jj=0;jj<fAct->numRays-1;jj++)3072 // for(int jj=0;jj<fAct->numRays-1;jj++) 3125 3073 { 3126 3074 int64vec *f2Normal; 3127 3075 f2Normal = codim2Act->getFacetNormal(); 3128 3076 if(jj==0) 3129 { 3077 { 3130 3078 sl2Act = sl2Root; 3131 3079 sl2Act->setFacetNormal(f2Normal); … … 3137 3085 sl2Act->setFacetNormal(f2Normal); 3138 3086 } 3139 delete f2Normal; 3087 delete f2Normal; 3140 3088 codim2Act = codim2Act->next; 3141 3089 } … … 3143 3091 delete fNormal; 3144 3092 #endif 3145 } if(fAct->isFlippable==TRUE)3093 }//if(fAct->isFlippable==TRUE) 3146 3094 else {fAct = fAct->next;} 3147 } End of copying facets into SLA3148 3149 SearchListAct = SearchListRoot; Set to beginning of list3095 }//End of copying facets into SLA 3096 3097 SearchListAct = SearchListRoot; //Set to beginning of list 3150 3098 /*Make SearchList doubly linked*/ 3151 3099 #ifndef NDEBUG … … 3164 3112 if(SearchListAct->next!=NULL){ 3165 3113 #endif 3166 SearchListAct->next->prev = SearchListAct; 3114 SearchListAct->next->prev = SearchListAct; 3167 3115 } 3168 3116 SearchListAct = SearchListAct->next; 3169 3117 } 3170 SearchListAct = SearchListRoot; Set to beginning of List3171 3172 fAct = gcAct->facetPtr;//???3173 gcAct->writeConeToFile(*gcAct); 3118 SearchListAct = SearchListRoot; //Set to beginning of List 3119 3120 // fAct = gcAct->facetPtr;//??? 3121 gcAct->writeConeToFile(*gcAct); 3174 3122 /*End of initialisation*/ 3175 3123 3176 3124 fAct = SearchListAct; 3177 3125 /*2nd step 3178 3126 Choose a facet from SearchList, flip it and forget the previous cone 3179 3127 We always choose the first facet from SearchList as facet to be flipped 3180 */ 3181 while( (SearchListAct!=NULL)) && counter<490)3182 { NOTE See to it that the cone is only changed after ALL facets have been flipped!3183 fAct = SearchListAct; 3128 */ 3129 while( (SearchListAct!=NULL))//&& counter<490) 3130 {//NOTE See to it that the cone is only changed after ALL facets have been flipped! 3131 fAct = SearchListAct; 3184 3132 while(fAct!=NULL) 3185 while( (fAct->getUCN() == fAct->next->getUCN()) ) 3186 { Since SLA should only contain flippables there should be no need to check for that3133 // while( (fAct->getUCN() == fAct->next->getUCN()) ) 3134 { //Since SLA should only contain flippables there should be no need to check for that 3187 3135 gcAct->flip2(gcAct->gcBasis,fAct); 3188 NOTE rCopy needed?3136 //NOTE rCopy needed? 3189 3137 ring rTmp=rCopy(fAct->flipRing); 3190 3138 rComplete(rTmp); 3191 3139 rChangeCurrRing(rTmp); 3192 gcone *gcTmp = new gcone::gcone(*gcAct,*fAct); copy constructor!3140 gcone *gcTmp = new gcone::gcone(*gcAct,*fAct);//copy constructor! 3193 3141 /* Now gcTmp->gcBasis and gcTmp->baseRing are set from fAct->flipGB and fAct->flipRing. 3194 3142 * Since we come at most once across a given facet from gcAct->facetPtr we can delete them. … … 3200 3148 */ 3201 3149 idDelete((ideal *)&fAct->flipGB); 3202 rDelete(fAct->flipRing); 3150 rDelete(fAct->flipRing); 3203 3151 gcTmp->getConeNormals(gcTmp->gcBasis/*, FALSE*/); 3204 gcTmp->getCodim2Normals(*gcTmp);3152 // gcTmp->getCodim2Normals(*gcTmp); 3205 3153 gcTmp->getExtremalRays(*gcTmp); 3206 NOTE Order rays lex here3207 gcTmp->orderRays(); 3208 //NOTE If flip2 is used we need to get an interior point of gcTmp3209 // and replace gcTmp->baseRing with an appropriate ring with only3210 // one weight3211 gcTmp->interiorPoint2();3154 //NOTE Order rays lex here 3155 gcTmp->orderRays(); 3156 // //NOTE If flip2 is used we need to get an interior point of gcTmp 3157 // // and replace gcTmp->baseRing with an appropriate ring with only 3158 // // one weight 3159 // gcTmp->interiorPoint2(); 3212 3160 gcTmp->replaceDouble_ringorder_a_ByASingleOne(); 3213 gcTmp->ddFacets should not be needed anymore, so3161 //gcTmp->ddFacets should not be needed anymore, so 3214 3162 dd_FreeMatrix(gcTmp->ddFacets); 3215 3163 #ifdef gfan_DEBUG 3216 gcTmp->showFacets(1);3164 // gcTmp->showFacets(1); 3217 3165 #endif 3218 3166 /*add facets to SLA here*/ … … 3228 3176 #endif 3229 3177 SearchListRoot=tmp; 3230 SearchListRoot=gcTmp->enqueue2/*NewFacets*/(SearchListRoot);3231 #else 3178 //SearchListRoot=gcTmp->enqueue2/*NewFacets*/(SearchListRoot); 3179 #else 3232 3180 SearchListRoot=gcTmp->enqueueNewFacets(SearchListRoot); 3233 #endif ifdef SHALLOW3234 gcTmp->writeConeToFile(*gcTmp);3181 #endif //ifdef SHALLOW 3182 // gcTmp->writeConeToFile(*gcTmp); 3235 3183 if(gfanHeuristic==1) 3236 3184 { 3237 3185 gcTmp->writeConeToFile(*gcTmp); 3238 idDelete((ideal*)&gcTmp->gcBasis); Whonder why?3186 idDelete((ideal*)&gcTmp->gcBasis);//Whonder why? 3239 3187 rDelete(gcTmp->baseRing); 3240 } 3188 } 3241 3189 #ifdef gfan_DEBUG 3242 3190 if(SearchListRoot!=NULL) 3243 3191 showSLA(*SearchListRoot); 3244 #endif 3192 #endif 3245 3193 rChangeCurrRing(gcAct->baseRing); 3246 3194 rDelete(rTmp); 3247 doubly linked for easier removal3195 //doubly linked for easier removal 3248 3196 gcTmp->prev = gcPtr; 3249 3197 gcPtr->next=gcTmp; 3250 3198 gcPtr=gcPtr->next; 3251 Cleverly disguised exit condition follows3199 //Cleverly disguised exit condition follows 3252 3200 if(fAct->getUCN() == fAct->next->getUCN()) 3253 3201 { 3254 3202 printf("Switching UCN from %i to %i\n",fAct->getUCN(),fAct->next->getUCN()); 3255 fAct=fAct->next; 3203 fAct=fAct->next; 3256 3204 } 3257 3205 else 3258 3206 { 3259 rDelete(gcAct->baseRing);3260 printf("break\n");3207 //rDelete(gcAct->baseRing); 3208 // printf("break\n"); 3261 3209 break; 3262 3210 } 3263 fAct=fAct->next;3264 } while( ( (fAct->next!=NULL) && (fAct->getUCN()==fAct->next->getUCN() ) ) );3265 Search for cone with smallest UCN3211 // fAct=fAct->next; 3212 }//while( ( (fAct->next!=NULL) && (fAct->getUCN()==fAct->next->getUCN() ) ) ); 3213 //Search for cone with smallest UCN 3266 3214 #ifndef NDEBUG 3267 #if SIZEOF_LONG==8 64 bit3215 #if SIZEOF_LONG==8 //64 bit 3268 3216 while(gcNext!=(gcone * const)0xfbfbfbfbfbfbfbfb && SearchListRoot!=NULL) 3269 3217 #elif SIZEOF_LONG == 4 … … 3272 3220 #endif 3273 3221 #ifdef NDEBUG 3274 while(gcNext!=NULL && SearchListRoot!=NULL) 3275 #endif 3276 { 3222 while(gcNext!=NULL && SearchListRoot!=NULL) 3223 #endif 3224 { 3277 3225 if( gcNext->getUCN() == SearchListRoot->getUCN() ) 3278 3226 { … … 3280 3228 { 3281 3229 gcAct = gcNext; 3282 Seems better to not to use rCopy here3283 rAct=rCopy(gcAct->baseRing);3230 //Seems better to not to use rCopy here 3231 // rAct=rCopy(gcAct->baseRing); 3284 3232 rAct=gcAct->baseRing; 3285 3233 rComplete(rAct); 3286 rChangeCurrRing(rAct); 3234 rChangeCurrRing(rAct); 3287 3235 break; 3288 3236 } … … 3290 3238 { 3291 3239 gcone *gcDel; 3292 gcDel = gcAct; 3240 gcDel = gcAct; 3293 3241 gcAct = gcNext; 3294 Read st00f from file &3295 implant the GB into gcAct3242 //Read st00f from file & 3243 //implant the GB into gcAct 3296 3244 readConeFromFile(gcAct->getUCN(), gcAct); 3297 Kill the baseRing but ONLY if it is not the ring the computation started in!3298 if(gcDel->getUCN()!=1)//WTF!? This causes the Mandelbug in gcone::areEqual(facet, facet)3299 rDelete(gcDel->baseRing);3300 rAct=rCopy(gcAct->baseRing);3301 /*The ring change occurs in readConeFromFile, so as to 3245 //Kill the baseRing but ONLY if it is not the ring the computation started in! 3246 // if(gcDel->getUCN()!=1)//WTF!? This causes the Mandelbug in gcone::areEqual(facet, facet) 3247 // rDelete(gcDel->baseRing); 3248 // rAct=rCopy(gcAct->baseRing); 3249 /*The ring change occurs in readConeFromFile, so as to 3302 3250 assure that gcAct->gcBasis belongs to the right ring*/ 3303 3251 rAct=gcAct->baseRing; … … 3305 3253 rChangeCurrRing(rAct); 3306 3254 break; 3307 } 3255 } 3308 3256 } 3309 3257 else if(gcNext->getUCN() < SearchListRoot->getUCN() ) 3310 3258 { 3311 idDelete( (ideal*)&gcNext->gcBasis ); 3312 rDelete(gcNext->baseRing);//TODO Why does this crash?3259 idDelete( (ideal*)&gcNext->gcBasis ); 3260 // rDelete(gcNext->baseRing);//TODO Why does this crash? 3313 3261 } 3314 3262 /*else … … 3320 3268 if(gcDel->getUCN()!=1) 3321 3269 rDelete(gcDel->baseRing); 3322 } 3323 }*/ 3270 } 3271 }*/ 3324 3272 gcNext = gcNext->next; 3325 3273 } 3326 3274 UCNcounter++; 3327 SearchListAct = SearchListRoot; 3275 SearchListAct = SearchListRoot; 3328 3276 } 3329 3277 printf("\nFound %i cones - terminating\n", counter); 3330 } void noRevS(gcone &gc)3331 3332 3278 }//void noRevS(gcone &gc) 3279 3280 3333 3281 /** \brief Make a set of rational vectors into integers 3334 3282 * … … 3339 3287 */ 3340 3288 void gcone::makeInt(const dd_MatrixPtr &M, const int line, int64vec &n) 3341 { 3289 { 3342 3290 mpz_t *denom = new mpz_t[this->numVars]; 3343 3291 for(int ii=0;ii<this->numVars;ii++) … … 3345 3293 mpz_init_set_str(denom[ii],"0",10); 3346 3294 } 3347 3295 3348 3296 mpz_t kgV,tmp; 3349 3297 mpz_init(kgV); 3350 3298 mpz_init(tmp); 3351 3299 3352 3300 for (int ii=0;ii<(M->colsize)-1;ii++) 3353 3301 { … … 3356 3304 mpq_get_den(z,M->matrix[line-1][ii+1]); 3357 3305 mpz_set( denom[ii], z); 3358 mpz_clear(z); 3359 } 3360 3306 mpz_clear(z); 3307 } 3308 3361 3309 /*Compute lcm of the denominators*/ 3362 3310 mpz_set(tmp,denom[0]); … … 3364 3312 { 3365 3313 mpz_lcm(kgV,tmp,denom[ii]); 3366 mpz_set(tmp,kgV); 3367 } 3368 mpz_clear(tmp); 3314 mpz_set(tmp,kgV); 3315 } 3316 mpz_clear(tmp); 3369 3317 /*Multiply the nominators by kgV*/ 3370 3318 mpq_t qkgV,res; … … 3372 3320 mpq_set_str(qkgV,"1",10); 3373 3321 mpq_canonicalize(qkgV); 3374 3322 3375 3323 mpq_init(res); 3376 3324 mpq_set_str(res,"1",10); 3377 3325 mpq_canonicalize(res); 3378 3326 3379 3327 mpq_set_num(qkgV,kgV); 3380 3381 mpq_canonicalize(qkgV);3382 int ggT=1;3328 3329 // mpq_canonicalize(qkgV); 3330 // int ggT=1; 3383 3331 for (int ii=0;ii<(M->colsize)-1;ii++) 3384 3332 { 3385 3333 mpq_mul(res,qkgV,M->matrix[line-1][ii+1]); 3386 3334 n[ii]=(int64)mpz_get_d(mpq_numref(res)); 3387 ggT=int64gcd(ggT,n[ii]);3335 // ggT=int64gcd(ggT,n[ii]); 3388 3336 } 3389 3337 int64 ggT=n[0]; 3390 3338 for(int ii=0;ii<this->numVars;ii++) 3391 ggT=int64gcd(ggT,n[ii]); 3392 Normalisation3339 ggT=int64gcd(ggT,n[ii]); 3340 //Normalisation 3393 3341 if(ggT>1) 3394 3342 { … … 3398 3346 delete [] denom; 3399 3347 mpz_clear(kgV); 3400 mpq_clear(qkgV); mpq_clear(res); 3401 3348 mpq_clear(qkgV); mpq_clear(res); 3349 3402 3350 } 3403 3351 /** 3404 * For all codim-2-facets we compute the gcd of the components of the facet normal and 3352 * For all codim-2-facets we compute the gcd of the components of the facet normal and 3405 3353 * divide it out. Thus we get a normalized representation of each 3406 3354 * (codim-2)-facet normal, i.e. a primitive vector 3407 3355 * Actually we now also normalize the facet normals. 3408 3356 */ 3409 void gcone::normalize()3410 {3411 int *ggT = new int;3412 *ggT=1;3413 facet *fAct;3414 facet *codim2Act;3415 fAct = this->facetPtr;3416 codim2Act = fAct->codim2Ptr;3417 while(fAct!=NULL)3418 {3419 int64vec *fNormal;3420 fNormal = fAct->getFacetNormal();3421 int *ggT = new int;3422 *ggT=1;3423 for(int ii=0;ii<this->numVars;ii++)3424 {3425 *ggT=intgcd((*ggT),(*fNormal)[ii]);3426 }3427 if(*ggT>1)//We only need to do this if the ggT is non-trivial3428 {3429 // int64vec *fCopy = fAct->getFacetNormal();3430 for(int ii=0;ii<this->numVars;ii++)3431 (*fNormal)[ii] = ((*fNormal)[ii])/(*ggT);3432 fAct->setFacetNormal(fNormal);3433 } 3434 delete fNormal;3435 delete ggT;3436 /*And now for the codim2*/3437 while(codim2Act!=NULL)3438 { 3439 int64vec *n;3440 n=codim2Act->getFacetNormal();3441 int *ggT=new int;3442 *ggT=1;3443 for(int ii=0;ii<this->numVars;ii++)3444 {3445 *ggT = intgcd((*ggT),(*n)[ii]);3446 }3447 if(*ggT>1)3448 {3449 for(int ii=0;ii<this->numVars;ii++)3450 {3451 (*n)[ii] = ((*n)[ii])/(*ggT);3452 }3453 codim2Act->setFacetNormal(n);3454 }3455 codim2Act = codim2Act->next;3456 delete n;3457 delete ggT;3458 }3459 fAct = fAct->next;3460 }3461 }3462 3463 /** \brief Enqueue new facets into the searchlist 3357 // void gcone::normalize() 3358 // { 3359 // int *ggT = new int; 3360 // *ggT=1; 3361 // facet *fAct; 3362 // facet *codim2Act; 3363 // fAct = this->facetPtr; 3364 // codim2Act = fAct->codim2Ptr; 3365 // while(fAct!=NULL) 3366 // { 3367 // int64vec *fNormal; 3368 // fNormal = fAct->getFacetNormal(); 3369 // int *ggT = new int; 3370 // *ggT=1; 3371 // for(int ii=0;ii<this->numVars;ii++) 3372 // { 3373 // *ggT=intgcd((*ggT),(*fNormal)[ii]); 3374 // } 3375 // if(*ggT>1)//We only need to do this if the ggT is non-trivial 3376 // { 3377 // // int64vec *fCopy = fAct->getFacetNormal(); 3378 // for(int ii=0;ii<this->numVars;ii++) 3379 // (*fNormal)[ii] = ((*fNormal)[ii])/(*ggT); 3380 // fAct->setFacetNormal(fNormal); 3381 // } 3382 // delete fNormal; 3383 // delete ggT; 3384 // /*And now for the codim2*/ 3385 // while(codim2Act!=NULL) 3386 // { 3387 // int64vec *n; 3388 // n=codim2Act->getFacetNormal(); 3389 // int *ggT=new int; 3390 // *ggT=1; 3391 // for(int ii=0;ii<this->numVars;ii++) 3392 // { 3393 // *ggT = intgcd((*ggT),(*n)[ii]); 3394 // } 3395 // if(*ggT>1) 3396 // { 3397 // for(int ii=0;ii<this->numVars;ii++) 3398 // { 3399 // (*n)[ii] = ((*n)[ii])/(*ggT); 3400 // } 3401 // codim2Act->setFacetNormal(n); 3402 // } 3403 // codim2Act = codim2Act->next; 3404 // delete n; 3405 // delete ggT; 3406 // } 3407 // fAct = fAct->next; 3408 // } 3409 // } 3410 3411 /** \brief Enqueue new facets into the searchlist 3464 3412 * The searchlist (SLA for short) is implemented as a FIFO 3465 3413 * Checks are done as follows: 3466 3414 * 1) Check facet fAct against all facets in SLA for parallelity. If it is not parallel to any one add it. 3467 * 2) If it is parallel compare the codim2 facets. If they coincide the facets are equal and we delete the 3415 * 2) If it is parallel compare the codim2 facets. If they coincide the facets are equal and we delete the 3468 3416 * facet from SLA and do not add fAct. 3469 3417 * It may very well happen, that SLA=\f$ \emptyset \f$ but we do not have checked all fActs yet. In this case we … … 3480 3428 facet *slHead; 3481 3429 slHead = f; 3482 facet *slAct; called with f=SearchListRoot3430 facet *slAct; //called with f=SearchListRoot 3483 3431 slAct = f; 3484 facet *slEnd; Pointer to end of SLA3432 facet *slEnd; //Pointer to end of SLA 3485 3433 slEnd = f; 3486 facet *slEndStatic; //marks the end before a new facet is added 3434 // facet *slEndStatic; //marks the end before a new facet is added 3487 3435 facet *fAct; 3488 3436 fAct = this->facetPtr; … … 3494 3442 volatile facet *deleteMarker; 3495 3443 deleteMarker = NULL; 3496 3444 3497 3445 /** \brief Flag to mark a facet that might be added 3498 3446 * The following case may occur: … … 3500 3448 * This does however not mean that there does not exist a facet behind the current slAct that is actually equal 3501 3449 * to fAct. In this case we set the boolean flag maybe to TRUE. If we encounter an equality lateron, it is reset to 3502 * FALSE and the according slAct is deleted. 3450 * FALSE and the according slAct is deleted. 3503 3451 * If slAct->next==NULL AND maybe==TRUE we know, that fAct must be added 3504 3452 */ 3505 3453 3506 /**A facet was removed, lengthOfSearchlist-- thus we must not rely on 3454 /**A facet was removed, lengthOfSearchlist-- thus we must not rely on 3507 3455 * if(notParallelCtr==lengthOfSearchList) but rather 3508 3456 * if( (notParallelCtr==lengthOfSearchList && removalOccured==FALSE) … … 3513 3461 slEnd=slEnd->next; 3514 3462 } 3515 /*1st step: compare facetNormals*/ 3463 /*1st step: compare facetNormals*/ 3516 3464 while(fAct!=NULL) 3517 { 3465 { 3518 3466 if(fAct->isFlippable==TRUE) 3519 3467 { 3520 3468 int64vec *fNormal=NULL; 3521 fNormal=fAct->getFacetNormal(); 3469 fNormal=fAct->getFacetNormal(); 3522 3470 slAct = slHead; 3523 /*If slAct==NULL and fAct!=NULL 3471 /*If slAct==NULL and fAct!=NULL 3524 3472 we just copy all remaining facets into SLA*/ 3525 3473 if(slAct==NULL) … … 3529 3477 while(fCopy!=NULL) 3530 3478 { 3531 if(fCopy->isFlippable==TRUE) We must assure fCopy is also flippable3479 if(fCopy->isFlippable==TRUE)//We must assure fCopy is also flippable 3532 3480 { 3533 3481 if(slAct==NULL) 3534 3482 { 3535 slAct = new facet(*fCopy/*,TRUE*/); copy constructor3536 slHead = slAct; 3483 slAct = new facet(*fCopy/*,TRUE*/);//copy constructor 3484 slHead = slAct; 3537 3485 } 3538 3486 else … … 3544 3492 fCopy = fCopy->next; 3545 3493 } 3546 break; Where does this lead to?3494 break;//Where does this lead to? 3547 3495 } 3548 3496 /*End of dumping into SLA*/ … … 3554 3502 #ifdef gfan_DEBUG 3555 3503 printf("Checking facet (");fNormal->show(1,1);printf(") against (");slNormal->show(1,1);printf(")\n"); 3556 #endif 3557 if( (areEqual(fAct,slAct) && (!areEqual2(fAct,slAct)) ))3558 exit(-1);3504 #endif 3505 // if( (areEqual(fAct,slAct) && (!areEqual2(fAct,slAct)) )) 3506 // exit(-1); 3559 3507 if(areEqual2(fAct,slAct)) 3560 { 3508 { 3561 3509 deleteMarker = slAct; 3562 3510 if(slAct==slHead) 3563 { 3564 slHead = slAct->next; 3511 { 3512 slHead = slAct->next; 3565 3513 if(slHead!=NULL) 3566 3514 slHead->prev = NULL; … … 3570 3518 slEnd=slEnd->prev; 3571 3519 slEnd->next = NULL; 3572 } 3520 } 3573 3521 else 3574 3522 { … … 3580 3528 if(deleteMarker!=NULL) 3581 3529 { 3582 delete deleteMarker;3583 deleteMarker=NULL;3530 // delete deleteMarker; 3531 // deleteMarker=NULL; 3584 3532 } 3585 3533 #ifdef gfan_DEBUG … … 3587 3535 #endif 3588 3536 delete slNormal; 3589 break; leave the while loop, since we found fAct=slAct thus delete slAct and do not add fAct3537 break;//leave the while loop, since we found fAct=slAct thus delete slAct and do not add fAct 3590 3538 } 3591 3539 slAct = slAct->next; … … 3596 3544 slAct = slAct->next;*/ 3597 3545 if(deleteMarker!=NULL) 3598 { 3599 delete deleteMarker;3600 deleteMarker=NULL;3546 { 3547 // delete deleteMarker; 3548 // deleteMarker=NULL; 3601 3549 } 3602 3550 delete slNormal; 3603 if slAct was marked as to be deleted, delete it here!3604 } while(slAct!=NULL)3551 //if slAct was marked as to be deleted, delete it here! 3552 }//while(slAct!=NULL) 3605 3553 if(removalOccured==FALSE) 3606 3554 { 3607 3555 #ifdef gfan_DEBUG 3608 cout << "Adding facet (";fNormal->show(1,0);cout << ") to SLA " << endl;3609 #endif 3610 Add fAct to SLA3556 // cout << "Adding facet (";fNormal->show(1,0);cout << ") to SLA " << endl; 3557 #endif 3558 //Add fAct to SLA 3611 3559 facet *marker; 3612 3560 marker = slEnd; … … 3615 3563 3616 3564 slEnd->next = new facet(); 3617 slEnd = slEnd->next; Update slEnd3565 slEnd = slEnd->next;//Update slEnd 3618 3566 facet *slEndCodim2Root; 3619 3567 facet *slEndCodim2Act; 3620 3568 slEndCodim2Root = slEnd->codim2Ptr; 3621 3569 slEndCodim2Act = slEndCodim2Root; 3622 3570 3623 3571 slEnd->setUCN(this->getUCN()); 3624 3572 slEnd->isFlippable = TRUE; 3625 3573 slEnd->setFacetNormal(fNormal); 3626 NOTE Add interior point here3627 This is ugly but needed for flip23628 Better: have slEnd->interiorPoint point to fAct->interiorPoint3629 NOTE Only reference -> c.f. copy constructor3630 slEnd->setInteriorPoint(fAct->getInteriorPoint());3574 //NOTE Add interior point here 3575 //This is ugly but needed for flip2 3576 //Better: have slEnd->interiorPoint point to fAct->interiorPoint 3577 //NOTE Only reference -> c.f. copy constructor 3578 //slEnd->setInteriorPoint(fAct->getInteriorPoint()); 3631 3579 slEnd->interiorPoint = fAct->interiorPoint; 3632 3580 slEnd->prev = marker; 3633 Copy codim2-facets3634 int64vec *f2Normal=new int64vec(this->numVars);3581 //Copy codim2-facets 3582 //int64vec *f2Normal=new int64vec(this->numVars); 3635 3583 while(f2Act!=NULL) 3636 3584 { … … 3640 3588 { 3641 3589 slEndCodim2Root = new facet(2); 3642 slEnd->codim2Ptr = slEndCodim2Root; 3590 slEnd->codim2Ptr = slEndCodim2Root; 3643 3591 slEndCodim2Root->setFacetNormal(f2Normal); 3644 3592 slEndCodim2Act = slEndCodim2Root; 3645 3593 } 3646 else 3594 else 3647 3595 { 3648 3596 slEndCodim2Act->next = new facet(2); … … 3653 3601 delete f2Normal; 3654 3602 } 3655 gcone::lengthOfSearchList++; 3656 } if( (notParallelCtr==lengthOfSearchList && removalOccured==FALSE) ||3603 gcone::lengthOfSearchList++; 3604 }//if( (notParallelCtr==lengthOfSearchList && removalOccured==FALSE) || 3657 3605 fAct = fAct->next; 3658 3606 delete fNormal; 3659 delete slNormal;3660 } if(fAct->isFlippable==TRUE)3607 // delete slNormal; 3608 }//if(fAct->isFlippable==TRUE) 3661 3609 else 3662 3610 { … … 3665 3613 if(gcone::maxSize<gcone::lengthOfSearchList) 3666 3614 gcone::maxSize= gcone::lengthOfSearchList; 3667 } while(fAct!=NULL)3615 }//while(fAct!=NULL) 3668 3616 #ifdef gfanp 3669 3617 gettimeofday(&end, 0); 3670 3618 time_enqueue += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec)); 3671 #endif 3619 #endif 3672 3620 return slHead; 3673 } addC2N3621 }//addC2N 3674 3622 3675 3623 /** Enqueuing using shallow copies*/ … … 3683 3631 facet *slHead; 3684 3632 slHead = f; 3685 facet *slAct; called with f=SearchListRoot3633 facet *slAct; //called with f=SearchListRoot 3686 3634 slAct = f; 3687 static facet *slEnd; Pointer to end of SLA3635 static facet *slEnd; //Pointer to end of SLA 3688 3636 if(slEnd==NULL) 3689 3637 slEnd = f; 3690 3638 3691 3639 facet *fAct; 3692 fAct = this->facetPtr; New facets to compare3640 fAct = this->facetPtr;//New facets to compare 3693 3641 facet *codim2Act; 3694 3642 codim2Act = this->facetPtr->codim2Ptr; … … 3697 3645 { 3698 3646 slEnd=slEnd->next; 3699 } 3647 } 3700 3648 while(fAct!=NULL) 3701 3649 { … … 3708 3656 printf("Zero length SLA\n"); 3709 3657 facet *fCopy; 3710 fCopy = fAct; 3658 fCopy = fAct; 3711 3659 while(fCopy!=NULL) 3712 3660 { 3713 if(fCopy->isFlippable==TRUE) We must assure fCopy is also flippable3661 if(fCopy->isFlippable==TRUE)//We must assure fCopy is also flippable 3714 3662 { 3715 3663 if(slAct==NULL) 3716 3664 { 3717 slAct = slAct->shallowCopy(*fCopy); shallow copy constructor3718 slHead = slAct; 3665 slAct = slAct->shallowCopy(*fCopy);//shallow copy constructor 3666 slHead = slAct; 3719 3667 } 3720 3668 else … … 3726 3674 fCopy = fCopy->next; 3727 3675 } 3728 break; WTF?3676 break; //WTF? 3729 3677 } 3730 3678 /*Comparison starts here*/ … … 3734 3682 #ifdef gfan_DEBUG 3735 3683 printf("Checking facet (");fAct->fNormal->show(1,1);printf(") against (");slAct->fNormal->show(1,1);printf(")\n"); 3736 #endif 3684 #endif 3737 3685 if(areEqual2(fAct,slAct)) 3738 3686 { … … 3740 3688 if(slAct==slHead) 3741 3689 { 3742 fDeleteMarker=slHead;3743 printf("headUCN@enq=%i\n",slHead->getUCN());3744 slHead = slAct->next; 3745 printf("headUCN@enq=%i\n",slHead->getUCN());3690 // fDeleteMarker=slHead; 3691 // printf("headUCN@enq=%i\n",slHead->getUCN()); 3692 slHead = slAct->next; 3693 // printf("headUCN@enq=%i\n",slHead->getUCN()); 3746 3694 if(slHead!=NULL) 3747 3695 { … … 3749 3697 } 3750 3698 fDeleteMarker->shallowDelete(); 3751 delete fDeleteMarker;//NOTE this messes up fAct in noRevS!3752 printf("headUCN@enq=%i\n",slHead->getUCN());3699 //delete fDeleteMarker;//NOTE this messes up fAct in noRevS! 3700 // printf("headUCN@enq=%i\n",slHead->getUCN()); 3753 3701 } 3754 3702 else if (slAct==slEnd) … … 3758 3706 fDeleteMarker->shallowDelete(); 3759 3707 delete(fDeleteMarker); 3760 } 3708 } 3761 3709 else 3762 3710 { … … 3771 3719 printf("Removing (");fAct->fNormal->show(1,1);printf(") from list\n"); 3772 3720 #endif 3773 break; leave the while loop, since we found fAct=slAct thus delete slAct and do not add fAct3721 break;//leave the while loop, since we found fAct=slAct thus delete slAct and do not add fAct 3774 3722 } 3775 slAct = slAct->next; 3776 } while(slAct!=NULL)3723 slAct = slAct->next; 3724 }//while(slAct!=NULL) 3777 3725 if(removalOccured==FALSE) 3778 3726 { … … 3784 3732 } 3785 3733 fAct = fAct->next; 3786 if(fDeleteMarker!=NULL)3787 {3788 fDeleteMarker->shallowDelete();3789 delete(fDeleteMarker);3790 fDeleteMarker=NULL;3791 }3734 // if(fDeleteMarker!=NULL) 3735 // { 3736 // fDeleteMarker->shallowDelete(); 3737 // delete(fDeleteMarker); 3738 // fDeleteMarker=NULL; 3739 // } 3792 3740 } 3793 3741 else 3794 3742 fAct = fAct->next; 3795 } while(fAct!=NULL)3796 3743 }//while(fAct!=NULL) 3744 3797 3745 #ifdef gfanp 3798 3746 gettimeofday(&end, 0); 3799 3747 time_enqueue += (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec)); 3800 #endif 3801 printf("headUCN@enq=%i\n",slHead->getUCN());3748 #endif 3749 // printf("headUCN@enq=%i\n",slHead->getUCN()); 3802 3750 return slHead; 3803 3751 } 3804 3752 3805 /** 3753 /** 3806 3754 * During flip2 every gc->baseRing gets two ringorder_a 3807 3755 * To avoid having an awful lot of those in the end we endow … … 3824 3772 omfree(replacementRing->wvhdl); 3825 3773 replacementRing->wvhdl =(int **)omAlloc0(4*sizeof(int/*64*/**)); 3826 3774 3827 3775 replacementRing->order[0]=ringorder_a/*64*/; 3828 3776 replacementRing->block0[0]=1; 3829 3777 replacementRing->block1[0]=replacementRing->N; 3830 3778 3831 3779 replacementRing->order[1]=ringorder_dp; 3832 3780 replacementRing->block0[1]=1; 3833 3781 replacementRing->block1[1]=replacementRing->N; 3834 3782 3835 3783 replacementRing->order[2]=ringorder_C; 3836 3784 3837 int64vec *ivw = this->getIntPoint(TRUE); returns a reference3838 assert(this->ivIntPt); 3839 int length=ivw->length(); 3785 int64vec *ivw = this->getIntPoint(TRUE);//returns a reference 3786 // assert(this->ivIntPt); 3787 int length=ivw->length(); 3840 3788 int/*64*/ *A=(int/*64*/ *)omAlloc0(length*sizeof(int/*64*/)); 3841 3789 for (int jj=0;jj<length;jj++) … … 3843 3791 A[jj]=(*ivw)[jj]; 3844 3792 if((*ivw)[jj]>=INT_MAX) WarnS("A[jj] exceeds INT_MAX in gcone::replaceDouble_ringorder_a_ByASingleOne!\n"); 3845 } 3846 delete ivw; //Not needed if this->getIntPoint(TRUE)3793 } 3794 //delete ivw; //Not needed if this->getIntPoint(TRUE) 3847 3795 replacementRing->wvhdl[0]=(int *)A; 3848 3796 replacementRing->block1[0]=length; … … 3853 3801 rDelete(this->baseRing); 3854 3802 this->baseRing=rCopy(replacementRing); 3855 this->gcBasis=idCopy(temporaryGroebnerBasis); 3803 this->gcBasis=idCopy(temporaryGroebnerBasis); 3856 3804 /*And back to where we came from*/ 3857 3805 rChangeCurrRing(srcRing); 3858 3806 idDelete( (ideal*)&temporaryGroebnerBasis ); 3859 rDelete(replacementRing); 3807 rDelete(replacementRing); 3860 3808 } 3861 3809 … … 3877 3825 return p; 3878 3826 } 3879 3827 3828 static int intgcd(const int &a, const int &b) 3829 { 3830 int r, p=a, q=b; 3831 if(p < 0) 3832 p = -p; 3833 if(q < 0) 3834 q = -q; 3835 while(q != 0) 3836 { 3837 r = p % q; 3838 p = q; 3839 q = r; 3840 } 3841 return p; 3842 } 3843 3880 3844 /** \brief Construct a dd_MatrixPtr from a cone's list of facets 3881 3845 * NO LONGER USED 3882 3846 */ 3883 inline dd_MatrixPtr gcone::facets2Matrix(const gcone &gc)3884 {3885 facet *fAct;3886 fAct = gc.facetPtr;3887 3888 dd_MatrixPtr M;3889 dd_rowrange ddrows;3890 dd_colrange ddcols;3891 ddcols=(this->numVars)+1;3892 ddrows=this->numFacets;3893 dd_NumberType numb = dd_Integer;3894 M=dd_CreateMatrix(ddrows,ddcols); 3895 3896 int jj=0;3897 3898 while(fAct!=NULL)3899 {3900 int64vec *comp;3901 comp = fAct->getFacetNormal();3902 for(int ii=0;ii<this->numVars;ii++)3903 {3904 dd_set_si(M->matrix[jj][ii+1],(*comp)[ii]);3905 }3906 jj++;3907 delete comp;3908 fAct=fAct->next; 3909 } 3910 return M;3911 }3912 3847 // inline dd_MatrixPtr gcone::facets2Matrix(const gcone &gc) 3848 // { 3849 // facet *fAct; 3850 // fAct = gc.facetPtr; 3851 // 3852 // dd_MatrixPtr M; 3853 // dd_rowrange ddrows; 3854 // dd_colrange ddcols; 3855 // ddcols=(this->numVars)+1; 3856 // ddrows=this->numFacets; 3857 // dd_NumberType numb = dd_Integer; 3858 // M=dd_CreateMatrix(ddrows,ddcols); 3859 // 3860 // int jj=0; 3861 // 3862 // while(fAct!=NULL) 3863 // { 3864 // int64vec *comp; 3865 // comp = fAct->getFacetNormal(); 3866 // for(int ii=0;ii<this->numVars;ii++) 3867 // { 3868 // dd_set_si(M->matrix[jj][ii+1],(*comp)[ii]); 3869 // } 3870 // jj++; 3871 // delete comp; 3872 // fAct=fAct->next; 3873 // } 3874 // return M; 3875 // } 3876 3913 3877 /** \brief Write information about a cone into a file on disk 3914 3878 * … … 3926 3890 stringstream ss; 3927 3891 ss << UCN; 3928 string UCNstr = ss.str(); 3929 3892 string UCNstr = ss.str(); 3893 3930 3894 string prefix="/tmp/Singular/cone"; 3931 string prefix="./"; //crude hack -> run tests in separate directories3895 // string prefix="./"; //crude hack -> run tests in separate directories 3932 3896 string suffix=".sg"; 3933 3897 string filename; … … 3935 3899 filename.append(UCNstr); 3936 3900 filename.append(suffix); 3937 3938 int thisPID = getpid();3939 ss << thisPID;3940 string strPID = ss.str();3941 string prefix="./";3942 3901 3902 // int thisPID = getpid(); 3903 // ss << thisPID; 3904 // string strPID = ss.str(); 3905 // string prefix="./"; 3906 3943 3907 ofstream gcOutputFile(filename.c_str()); 3944 3908 assert(gcOutputFile); 3945 3909 facet *fAct; 3946 fAct = gc.facetPtr; 3910 fAct = gc.facetPtr; 3947 3911 facet *f2Act; 3948 3912 f2Act=fAct->codim2Ptr; 3949 3913 3950 3914 char *ringString = rString(gc.baseRing); 3951 3915 3952 3916 if (!gcOutputFile) 3953 3917 { … … 3955 3919 } 3956 3920 else 3957 { 3921 { 3958 3922 gcOutputFile << "UCN" << endl; 3959 3923 gcOutputFile << this->UCN << endl; 3960 gcOutputFile << "RING" << endl; 3924 gcOutputFile << "RING" << endl; 3961 3925 gcOutputFile << ringString << endl; 3962 3926 gcOutputFile << "GCBASISLENGTH" << endl; 3963 gcOutputFile << IDELEMS(gc.gcBasis) << endl; 3964 Write this->gcBasis into file3965 gcOutputFile << "GCBASIS" << endl; 3927 gcOutputFile << IDELEMS(gc.gcBasis) << endl; 3928 //Write this->gcBasis into file 3929 gcOutputFile << "GCBASIS" << endl; 3966 3930 for (int ii=0;ii<IDELEMS(gc.gcBasis);ii++) 3967 { 3931 { 3968 3932 gcOutputFile << p_String((poly)gc.gcBasis->m[ii],gc.baseRing) << endl; 3969 } 3970 3971 gcOutputFile << "FACETS" << endl; 3972 3933 } 3934 3935 gcOutputFile << "FACETS" << endl; 3936 3973 3937 while(fAct!=NULL) 3974 { 3938 { 3975 3939 const int64vec *iv=fAct->getRef2FacetNormal(); 3976 iv=fAct->getRef2FacetNormal();//->getFacetNormal();