Changeset b16a613 in git for kernel/tgb.cc
- Timestamp:
- Feb 9, 2007, 1:30:50 PM (17 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- beb7f8984d9e30f2ef6b1c0e5e9a1787b15d8a1f
- Parents:
- e58e4b929313ae6aef93501460b4f9fce73a2c18
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/tgb.cc
re58e4b rb16a613 5 5 * Computer Algebra System SINGULAR * 6 6 ****************************************/ 7 /* $Id: tgb.cc,v 1.12 6 2007-02-08 13:13:45bricken Exp $ */7 /* $Id: tgb.cc,v 1.127 2007-02-09 12:30:49 bricken Exp $ */ 8 8 /* 9 9 * ABSTRACT: slimgb and F4 implementation … … 29 29 #include <stdlib.h> 30 30 #include <stdio.h> 31 31 #include <queue> 32 32 #define BUCKETS_FOR_NORO_RED 1 33 33 #define SR_HDL(A) ((long)(A)) … … 2200 2200 if (branches==NULL){ 2201 2201 branches_len=branch+1; 2202 branches_len=si_max(branches_len,3); 2202 2203 branches=(NoroCacheNode**) omalloc(branches_len*sizeof(NoroCacheNode*)); 2203 2204 int i; … … 2238 2239 } 2239 2240 }; 2241 class DenseRow{ 2242 public: 2243 number* array; 2244 int start; 2245 int end; 2246 }; 2240 2247 class DataNoroCacheNode:public NoroCacheNode{ 2241 2248 public: … … 2243 2250 int value_len; 2244 2251 poly value_poly; 2252 DenseRow* row; 2245 2253 DataNoroCacheNode(poly p, int len){ 2246 2254 value_len=len; 2247 2255 value_poly=p; 2256 row=NULL; 2248 2257 } 2249 2258 }; … … 2256 2265 #endif 2257 2266 static const int backLinkCode=-222; 2258 voidinsert(poly term, poly nf, int len){2267 DataNoroCacheNode* insert(poly term, poly nf, int len){ 2259 2268 //assume(impl.find(p_Copy(term,currRing))==impl.end()); 2260 2269 //assume(len==pLength(nf)); 2261 2270 if (term==nf){ 2262 2263 treeInsertBackLink(term); 2264 return; 2271 term=p_Copy(term,currRing); 2272 2273 ressources.push_back(term); 2274 return treeInsertBackLink(term); 2275 2265 2276 } else{ 2266 //term=p_Copy(term,currRing); 2267 2268 //ressources.push_back(term); 2277 2269 2278 if (nf){ 2270 nf=p_Copy(nf,currRing);2279 //nf=p_Copy(nf,currRing); 2271 2280 ressources.push_back(nf); 2272 2281 } 2273 treeInsert(term,nf,len);2274 return;2282 return treeInsert(term,nf,len); 2283 2275 2284 } 2276 2285 2277 2286 //impl[term]=std::pair<PolySimple,int> (nf,len); 2278 2287 } 2279 2288 DataNoroCacheNode* insertAndTransferOwnerShip(poly t, ring r){ 2289 return treeInsertBackLink(t); 2290 } 2280 2291 poly lookup(poly term, BOOLEAN& succ, int & len); 2292 DataNoroCacheNode* getCacheReference(poly term); 2281 2293 NoroCache(){ 2282 2294 #ifdef NORO_RED_ARRAY_RESERVER … … 2308 2320 } 2309 2321 protected: 2310 voidtreeInsert(poly term,poly nf,int len){2322 DataNoroCacheNode* treeInsert(poly term,poly nf,int len){ 2311 2323 int i; 2312 2324 int nvars=pVariables; … … 2315 2327 parent=parent->getOrInsertBranch(p_GetExp(term,i,currRing)); 2316 2328 } 2317 parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(nf,len));2318 } 2319 voidtreeInsertBackLink(poly term){2329 return (DataNoroCacheNode*) parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(nf,len)); 2330 } 2331 DataNoroCacheNode* treeInsertBackLink(poly term){ 2320 2332 int i; 2321 2333 int nvars=pVariables; … … 2324 2336 parent=parent->getOrInsertBranch(p_GetExp(term,i,currRing)); 2325 2337 } 2326 parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(NULL,backLinkCode));2338 return (DataNoroCacheNode*) parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(NULL,backLinkCode)); 2327 2339 } 2328 2340 … … 2334 2346 NoroCacheNode root; 2335 2347 }; 2348 DataNoroCacheNode* NoroCache::getCacheReference(poly term){ 2349 int i; 2350 NoroCacheNode* parent=&root; 2351 for(i=1;i<pVariables;i++){ 2352 parent=parent->getBranch(p_GetExp(term,i,currRing)); 2353 if (!(parent)){ 2354 return NULL; 2355 } 2356 } 2357 DataNoroCacheNode* res_holder=(DataNoroCacheNode*) parent->getBranch(p_GetExp(term,i,currRing)); 2358 return res_holder; 2359 } 2336 2360 poly NoroCache::lookup(poly term, BOOLEAN& succ, int & len){ 2337 2361 int i; … … 2347 2371 if (res_holder){ 2348 2372 succ=TRUE; 2349 if ((res_holder->value_ poly==0) &&(res_holder->value_len==backLinkCode)){2373 if ((res_holder->value_len==backLinkCode)){ 2350 2374 len=1; 2351 2375 return term; … … 2358 2382 } 2359 2383 } 2360 poly noro_red(poly p, int &len, NoroCache* cache,slimgb_alg* c); 2361 2362 class MonRedRes{ 2363 public: 2364 poly p; 2365 number coef; 2366 BOOLEAN changed; 2367 int len; 2368 BOOLEAN onlyBorrowed; 2369 bool operator<(const MonRedRes& other) const{ 2370 int cmp=p_LmCmp(p,other.p,currRing); 2371 if ((cmp<0)||((cmp==0)&&((onlyBorrowed)&&(!(other.onlyBorrowed))))){ 2372 return true; 2373 } else return false; 2374 } 2375 }; 2376 2377 MonRedRes noro_red_mon(poly t, NoroCache* cache,slimgb_alg* c){ 2384 poly noro_red_non_unique(poly p, int &len, NoroCache* cache,slimgb_alg* c); 2385 2386 2387 2388 MonRedRes noro_red_mon(poly t, BOOLEAN force_unique, NoroCache* cache,slimgb_alg* c){ 2378 2389 MonRedRes res_holder; 2379 BOOLEAN succ;2390 2380 2391 //wrp(t); 2381 2392 res_holder.changed=TRUE; 2393 if (force_unique){ 2394 DataNoroCacheNode* ref=cache->getCacheReference(t); 2395 if (ref!=NULL){ 2396 res_holder.len=ref->value_len; 2397 if (res_holder.len==NoroCache::backLinkCode){ 2398 res_holder.len=1; 2399 2400 2401 } 2402 res_holder.p=ref->value_poly; 2403 res_holder.ref=ref; 2404 res_holder.onlyBorrowed=TRUE; 2405 res_holder.changed=TRUE; 2406 return res_holder; 2407 } 2408 } else{ 2409 BOOLEAN succ; 2382 2410 poly cache_lookup=cache->lookup(t,succ, res_holder.len);//don't own this yet 2383 2411 if (succ){ … … 2392 2420 return res_holder; 2393 2421 } 2394 poly t_new=ppMult_nn(cache_lookup,pGetCoeff(t)); 2422 //poly t_new=ppMult_nn(cache_lookup,pGetCoeff(t)); 2423 res_holder.coef=p_GetCoeff(t,c->r); 2395 2424 p_Delete(&t,c->r); 2396 2425 //res_holder.len=1; 2397 2426 //res_holder.changed=TRUE; 2398 res_holder.p= t_new;2399 res_holder.coef=npInit(1);2400 res_holder.onlyBorrowed= FALSE;2427 res_holder.p=cache_lookup; 2428 2429 res_holder.onlyBorrowed=TRUE; 2401 2430 return res_holder; 2402 2431 //return t_new; 2403 } else { 2432 } 2433 } 2434 2404 2435 unsigned long sev=p_GetShortExpVector(t,currRing); 2405 2436 int i=kFindDivisibleByInS_easy(c->strat,t,sev); 2406 2437 if (i>=0){ 2407 number coef_bak=p GetCoeff(t);2438 number coef_bak=p_GetCoeff(t,c->r); 2408 2439 2409 2440 p_SetCoeff(t,npInit(1),c->r); … … 2422 2453 2423 2454 res_holder.len=c->strat->lenS[i]-1; 2424 res=noro_red (res,res_holder.len,cache,c);2455 res=noro_red_non_unique(res,res_holder.len,cache,c); 2425 2456 2426 cache->insert(t,res,pLength(res));2457 DataNoroCacheNode* ref=cache->insert(t,res,pLength(res)); 2427 2458 p_Delete(&t,c->r); 2428 2459 //p_Delete(&t_copy_mon,c->r); 2429 res=pMult_nn(res,coef_bak); 2460 //res=pMult_nn(res,coef_bak); 2461 2430 2462 res_holder.changed=TRUE; 2431 2463 res_holder.p=res; 2432 res_holder.coef=npInit(1); 2433 res_holder.onlyBorrowed=FALSE; 2464 res_holder.coef=coef_bak; 2465 res_holder.onlyBorrowed=TRUE; 2466 res_holder.ref=ref; 2434 2467 return res_holder; 2435 2468 … … 2439 2472 p_SetCoeff(t,one,c->r); 2440 2473 res_holder.len=1; 2441 cache->insert(t,t,res_holder.len); 2474 if (!(force_unique)){ 2475 res_holder.ref=cache->insert(t,t,res_holder.len); 2442 2476 p_SetCoeff(t,coef_bak,c->r); 2443 2477 //return t; 2478 2479 //we need distinction 2444 2480 res_holder.changed=FALSE; 2445 2481 res_holder.p=t; … … 2448 2484 res_holder.onlyBorrowed=FALSE; 2449 2485 return res_holder; 2450 } 2451 } 2486 } else { 2487 res_holder.ref=cache->insertAndTransferOwnerShip(t,c->r); 2488 res_holder.coef=coef_bak; 2489 res_holder.onlyBorrowed=TRUE; 2490 res_holder.changed=FALSE; 2491 res_holder.p=t; 2492 return res_holder; 2493 } 2494 } 2495 2452 2496 } 2453 2497 poly tree_add(poly* a,int begin, int end,ring r){ … … 2467 2511 2468 2512 //len input and out: Idea: reverse addition 2469 poly noro_red (poly p, int &len, NoroCache* cache,slimgb_alg* c){2513 poly noro_red_non_unique(poly p, int &len, NoroCache* cache,slimgb_alg* c){ 2470 2514 assume(len==pLength(p)); 2471 2515 poly orig_p=p; 2472 //poly* pre_buckets=(poly*) omalloc(len*sizeof(poly));2473 //int* pre_buckets_len=(int*) omalloc(len*sizeof(int));2474 //wrp(p);2475 2516 if (p==NULL) { 2476 2517 len=0; 2477 2518 return NULL; 2478 2519 } 2479 2480 #ifdef BUCKETS_FOR_NORO_RED2481 2520 kBucket_pt bucket=kBucketCreate(currRing); 2482 2521 kBucketInit(bucket,NULL,0); 2483 #endif2484 //int pos=0;2485 2522 poly unchanged_head=NULL; 2486 2523 poly unchanged_tail=NULL; 2487 2524 int unchanged_size=0; 2488 #ifndef BUCKETS_FOR_NORO_RED 2489 poly * pre_buckets=cache->reserve(len); 2490 #endif 2491 int reserved=len;//(poly*) omalloc(len*sizeof(poly)); 2492 int pos=0; 2525 2493 2526 while(p){ 2494 2527 poly t=p; 2495 2528 pIter(p); 2496 2529 pNext(t)=NULL; 2497 //int l; 2498 //poly reference=p_Head(t,c->r); 2499 //BOOLEAN changed; 2500 MonRedRes red=noro_red_mon(t,cache,c); 2501 if (!(red.changed)){ 2530 2531 MonRedRes red=noro_red_mon(t,FALSE,cache,c); 2532 if ((!(red.changed))&&(!(red.onlyBorrowed))){ 2502 2533 unchanged_size++; 2503 2534 if (unchanged_head){ … … 2510 2541 } else{ 2511 2542 assume(red.len==pLength(red.p)); 2512 #ifdef BUCKETS_FOR_NORO_RED2513 2543 kBucket_Add_q(bucket,red.p,&red.len); 2514 #else 2515 pre_buckets[pos++]=red.p; 2516 #endif 2517 } 2518 //pre_buckets[pos]=t; 2519 //pre_buckets_len[pos++]=l; 2520 } 2521 //todo catch in general the length from cache 2522 2523 //assume(pos==len); 2524 int i; 2525 //for(i=pos-1;i>=0;i--){ 2526 // kBucket_Add_q(bucket,pre_buckets[i],&pre_buckets_len[i]); 2527 //} 2528 poly res; 2544 } 2545 } 2546 poly res=NULL; 2529 2547 len=0; 2530 2531 #ifdef BUCKETS_FOR_NORO_RED2532 2548 kBucket_Add_q(bucket,unchanged_head,&unchanged_size); 2533 2549 kBucketClear(bucket,&res,&len); 2534 2550 kBucketDestroy(&bucket); 2535 #else 2536 res=tree_add(pre_buckets,0,pos,c->r); 2537 res=p_Add_q(unchanged_head,res,c->r); 2538 len=pLength(res); 2539 cache->free(reserved); 2540 //omfree(pre_buckets); 2541 #endif 2542 //omfree(pre_buckets); 2543 //omfree(pre_buckets_len); 2551 2552 2553 2554 2544 2555 return res; 2545 2556 } 2557 2558 2559 //len input and out: Idea: reverse addition 2560 std::vector<NoroPlaceHolder> noro_red(poly p, int &len, NoroCache* cache,slimgb_alg* c){ 2561 std::vector<NoroPlaceHolder> res; 2562 while(p){ 2563 poly t=p; 2564 pIter(p); 2565 pNext(t)=NULL; 2566 2567 MonRedRes red=noro_red_mon(t,TRUE,cache,c); 2568 assume(red.onlyBorrowed); 2569 assume(red.coef); 2570 assume(red.ref); 2571 NoroPlaceHolder h; 2572 h.ref=red.ref; 2573 h.coef=red.coef; 2574 if (h.ref->value_poly) 2575 res.push_back(h); 2576 } 2577 return res; 2578 } 2579 2580 2546 2581 #endif 2547 2582 2583 2584 2585 2586 2587 #ifndef NORO_CACHE 2548 2588 void noro_step(poly*p,int &pn,slimgb_alg* c){ 2549 2589 poly* reduced=(poly*) omalloc(pn*sizeof(poly)); … … 2616 2656 PrintS("\n"); 2617 2657 } 2658 #else 2659 void noro_step(poly*p,int &pn,slimgb_alg* c){ 2660 poly* reduced=(poly*) omalloc(pn*sizeof(poly)); 2661 int j; 2662 int* reduced_len=(int*) omalloc(pn*sizeof(int)); 2663 int reduced_c=0; 2664 //if (TEST_OPT_PROT) 2665 // PrintS("reduced system:\n"); 2666 #ifdef NORO_CACHE 2667 NoroCache cache; 2668 #endif 2669 for(j=0;j<pn;j++){ 2670 2671 poly h=p[j]; 2672 int h_len=pLength(h); 2673 2674 number coef; 2675 2676 2677 std::vector<NoroPlaceHolder> ph=noro_red(p_Copy(h,c->r),h_len,&cache,c); 2678 assume(pLength(h)==h_len); 2679 2680 if (h!=NULL){ 2681 2682 2683 2684 reduced[reduced_c]=h; 2685 reduced_len[reduced_c]=h_len; 2686 reduced_c++; 2687 if (TEST_OPT_PROT) 2688 Print("%d ",h_len); 2689 } 2690 } 2691 PrintS("blupper\n"); 2692 int reduced_sum=0; 2693 for(j=0;j<reduced_c;j++){ 2694 reduced_sum+=reduced_len[j]; 2695 } 2696 poly* terms=(poly*) omalloc(reduced_sum*sizeof(poly)); 2697 int tc=0; 2698 for(j=0;j<reduced_c;j++){ 2699 poly h=reduced[j]; 2700 2701 while(h!=NULL){ 2702 terms[tc++]=h; 2703 pIter(h); 2704 assume(tc<=reduced_sum); 2705 } 2706 } 2707 assume(tc==reduced_sum); 2708 qsort(terms,reduced_sum,sizeof(poly),terms_sort_crit); 2709 int nterms=reduced_sum; 2710 if (TEST_OPT_PROT) 2711 Print("orig estimation:%i\n",reduced_sum); 2712 unify_terms(terms,nterms); 2713 if (TEST_OPT_PROT) 2714 Print("actual number of columns:%i\n",nterms); 2715 int rank=reduced_c; 2716 linalg_step_modp(reduced, p,rank,terms,nterms,c); 2717 omfree(terms); 2718 2719 pn=rank; 2720 omfree(reduced); 2721 2722 if (TEST_OPT_PROT) 2723 PrintS("\n"); 2724 } 2725 #endif 2618 2726 2619 2727 static void go_on (slimgb_alg* c){
Note: See TracChangeset
for help on using the changeset viewer.