Changeset b16a613 in git for kernel/tgb.cc


Ignore:
Timestamp:
Feb 9, 2007, 1:30:50 PM (17 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
beb7f8984d9e30f2ef6b1c0e5e9a1787b15d8a1f
Parents:
e58e4b929313ae6aef93501460b4f9fce73a2c18
Message:
*bricken: continue work on noro


git-svn-id: file:///usr/local/Singular/svn/trunk@9837 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/tgb.cc

    re58e4b rb16a613  
    55*  Computer Algebra System SINGULAR     *
    66****************************************/
    7 /* $Id: tgb.cc,v 1.126 2007-02-08 13:13:45 bricken Exp $ */
     7/* $Id: tgb.cc,v 1.127 2007-02-09 12:30:49 bricken Exp $ */
    88/*
    99* ABSTRACT: slimgb and F4 implementation
     
    2929#include <stdlib.h>
    3030#include <stdio.h>
    31 
     31#include <queue>
    3232#define BUCKETS_FOR_NORO_RED 1
    3333#define SR_HDL(A) ((long)(A))
     
    22002200      if (branches==NULL){
    22012201        branches_len=branch+1;
     2202        branches_len=si_max(branches_len,3);
    22022203        branches=(NoroCacheNode**) omalloc(branches_len*sizeof(NoroCacheNode*));
    22032204        int i;
     
    22382239  }
    22392240};
     2241class DenseRow{
     2242public:
     2243  number* array;
     2244  int start;
     2245  int end;
     2246};
    22402247class DataNoroCacheNode:public NoroCacheNode{
    22412248public:
     
    22432250  int value_len;
    22442251  poly value_poly;
     2252  DenseRow* row;
    22452253  DataNoroCacheNode(poly p, int len){
    22462254    value_len=len;
    22472255    value_poly=p;
     2256    row=NULL;
    22482257  }
    22492258};
     
    22562265#endif
    22572266  static const int backLinkCode=-222;
    2258   void insert(poly term, poly nf, int len){
     2267  DataNoroCacheNode* insert(poly term, poly nf, int len){
    22592268    //assume(impl.find(p_Copy(term,currRing))==impl.end());
    22602269    //assume(len==pLength(nf));
    22612270    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     
    22652276    } else{
    2266       //term=p_Copy(term,currRing);
    2267 
    2268       //ressources.push_back(term);
     2277
    22692278      if (nf){
    2270         nf=p_Copy(nf,currRing);
     2279        //nf=p_Copy(nf,currRing);
    22712280        ressources.push_back(nf);
    22722281      }
    2273       treeInsert(term,nf,len);
    2274       return;
     2282      return treeInsert(term,nf,len);
     2283     
    22752284    }
    22762285   
    22772286    //impl[term]=std::pair<PolySimple,int> (nf,len);
    22782287  }
    2279 
     2288  DataNoroCacheNode* insertAndTransferOwnerShip(poly t, ring r){
     2289    return treeInsertBackLink(t);
     2290  }
    22802291  poly lookup(poly term, BOOLEAN& succ, int & len);
     2292  DataNoroCacheNode* getCacheReference(poly term);
    22812293  NoroCache(){
    22822294#ifdef NORO_RED_ARRAY_RESERVER
     
    23082320  }
    23092321protected:
    2310   void treeInsert(poly term,poly nf,int len){
     2322  DataNoroCacheNode* treeInsert(poly term,poly nf,int len){
    23112323    int i;
    23122324    int nvars=pVariables;
     
    23152327      parent=parent->getOrInsertBranch(p_GetExp(term,i,currRing));
    23162328    }
    2317     parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(nf,len));
    2318   }
    2319   void treeInsertBackLink(poly term){
     2329    return (DataNoroCacheNode*) parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(nf,len));
     2330  }
     2331  DataNoroCacheNode* treeInsertBackLink(poly term){
    23202332    int i;
    23212333    int nvars=pVariables;
     
    23242336      parent=parent->getOrInsertBranch(p_GetExp(term,i,currRing));
    23252337    }
    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));
    23272339  }
    23282340 
     
    23342346  NoroCacheNode root;
    23352347};
     2348DataNoroCacheNode* 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}
    23362360poly NoroCache::lookup(poly term, BOOLEAN& succ, int & len){
    23372361  int i;
     
    23472371  if (res_holder){
    23482372    succ=TRUE;
    2349     if ((res_holder->value_poly==0) &&(res_holder->value_len==backLinkCode)){
     2373    if ((res_holder->value_len==backLinkCode)){
    23502374      len=1;
    23512375      return term;
     
    23582382  }
    23592383}
    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){
     2384poly noro_red_non_unique(poly p, int &len, NoroCache* cache,slimgb_alg* c);
     2385
     2386
     2387
     2388MonRedRes noro_red_mon(poly t, BOOLEAN force_unique, NoroCache* cache,slimgb_alg* c){
    23782389  MonRedRes res_holder;
    2379   BOOLEAN succ;
     2390 
    23802391  //wrp(t);
    23812392  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;
    23822410  poly cache_lookup=cache->lookup(t,succ, res_holder.len);//don't own this yet
    23832411  if (succ){
     
    23922420      return res_holder;
    23932421    }
    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);
    23952424    p_Delete(&t,c->r);
    23962425    //res_holder.len=1;
    23972426    //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;
    24012430    return res_holder;
    24022431    //return t_new;
    2403   } else {
     2432  }
     2433}
     2434 
    24042435    unsigned long sev=p_GetShortExpVector(t,currRing);
    24052436    int i=kFindDivisibleByInS_easy(c->strat,t,sev);
    24062437    if (i>=0){
    2407       number coef_bak=pGetCoeff(t);
     2438      number coef_bak=p_GetCoeff(t,c->r);
    24082439
    24092440      p_SetCoeff(t,npInit(1),c->r);
     
    24222453
    24232454      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);
    24252456     
    2426       cache->insert(t,res,pLength(res));
     2457      DataNoroCacheNode* ref=cache->insert(t,res,pLength(res));
    24272458      p_Delete(&t,c->r);
    24282459      //p_Delete(&t_copy_mon,c->r);
    2429       res=pMult_nn(res,coef_bak);
     2460      //res=pMult_nn(res,coef_bak);
     2461     
    24302462      res_holder.changed=TRUE;
    24312463      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;
    24342467      return res_holder;
    24352468
     
    24392472      p_SetCoeff(t,one,c->r);
    24402473      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);
    24422476      p_SetCoeff(t,coef_bak,c->r);
    24432477      //return t;
     2478     
     2479      //we need distinction
    24442480      res_holder.changed=FALSE;
    24452481      res_holder.p=t;
     
    24482484      res_holder.onlyBorrowed=FALSE;
    24492485      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 
    24522496}
    24532497poly tree_add(poly* a,int begin, int end,ring r){
     
    24672511
    24682512//len input and out: Idea: reverse addition
    2469 poly noro_red(poly p, int &len, NoroCache* cache,slimgb_alg* c){
     2513poly noro_red_non_unique(poly p, int &len, NoroCache* cache,slimgb_alg* c){
    24702514  assume(len==pLength(p));
    24712515  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);
    24752516  if (p==NULL) {
    24762517    len=0;
    24772518    return NULL;
    24782519  }
    2479 
    2480   #ifdef BUCKETS_FOR_NORO_RED
    24812520  kBucket_pt bucket=kBucketCreate(currRing);
    24822521  kBucketInit(bucket,NULL,0);
    2483   #endif
    2484   //int pos=0;
    24852522  poly unchanged_head=NULL;
    24862523  poly unchanged_tail=NULL;
    24872524  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
    24932526  while(p){
    24942527    poly t=p;
    24952528    pIter(p);
    24962529    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))){
    25022533      unchanged_size++;
    25032534      if (unchanged_head){
     
    25102541    } else{
    25112542      assume(red.len==pLength(red.p));
    2512 #ifdef BUCKETS_FOR_NORO_RED
    25132543      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;
    25292547  len=0;
    2530  
    2531   #ifdef BUCKETS_FOR_NORO_RED
    25322548  kBucket_Add_q(bucket,unchanged_head,&unchanged_size);
    25332549  kBucketClear(bucket,&res,&len);
    25342550  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
    25442555  return res;
    25452556}
     2557
     2558
     2559//len input and out: Idea: reverse addition
     2560std::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
    25462581#endif
    25472582
     2583
     2584
     2585
     2586
     2587#ifndef NORO_CACHE
    25482588void noro_step(poly*p,int &pn,slimgb_alg* c){
    25492589  poly* reduced=(poly*) omalloc(pn*sizeof(poly));
     
    26162656    PrintS("\n");
    26172657}
     2658#else
     2659void 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
    26182726
    26192727static void go_on (slimgb_alg* c){
Note: See TracChangeset for help on using the changeset viewer.