Changeset 421e42 in git for kernel/tgb.cc


Ignore:
Timestamp:
Feb 20, 2007, 4:11:04 PM (17 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
82244545f2799f63a8fa69c4b3834e3c23f6121c
Parents:
e01da414af20c998b1409ca8f11bd4ff098033bc
Message:
*bricken: noro cached without too much polys


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

Legend:

Unmodified
Added
Removed
  • kernel/tgb.cc

    re01da4 r421e42  
    55*  Computer Algebra System SINGULAR     *
    66****************************************/
    7 /* $Id: tgb.cc,v 1.140 2007-02-20 10:47:45 bricken Exp $ */
     7/* $Id: tgb.cc,v 1.141 2007-02-20 15:11:03 bricken Exp $ */
    88/*
    99* ABSTRACT: slimgb and F4 implementation
     
    3232#define BUCKETS_FOR_NORO_RED 1
    3333#define SR_HDL(A) ((long)(A))
    34 static const int bundle_size=1000;
     34static const int bundle_size=100;
    3535static const int bundle_size_noro=1000;
    3636static const int delay_factor=3;
     
    19331933          }
    19341934      }else {
    1935           assume(FALSE);
     1935          //assume(FALSE);
    19361936          for(i=start;i<=lastIndex;i++){
    19371937            other_row_array[i]=npAdd(npMult(coef2,row_array[i]),other_row_array[i]);
     
    23122312    term_index=-1;
    23132313  }
    2314   ~DataNoroCacheNode(){
     2314  #ifdef NORO_SPARSE_ROWS_PRE
     2315  DataNoroCacheNode(SparseRow* row){
     2316    if (row!=NULL)
     2317      value_len=row->len;
     2318    else
     2319      value_len=0;
     2320    value_poly=NULL;
     2321    this->row=row;
     2322    term_index=-1;
     2323  }
     2324  #endif
     2325  ~DataNoroCacheNode(
     2326  ){
    23152327    //p_Delete(&value_poly,currRing);
    23162328    if (row) delete row;
     
    23542366    //impl[term]=std::pair<PolySimple,int> (nf,len);
    23552367  }
     2368  #ifdef NORO_SPARSE_ROWS_PRE
     2369  DataNoroCacheNode* insert(poly term, SparseRow* srow){
     2370    //assume(impl.find(p_Copy(term,currRing))==impl.end());
     2371    //assume(len==pLength(nf));
     2372
     2373      return treeInsert(term,srow);
     2374     
     2375 
     2376    //impl[term]=std::pair<PolySimple,int> (nf,len);
     2377  }
     2378  #endif
    23562379  DataNoroCacheNode* insertAndTransferOwnerShip(poly t, ring r){
     2380   
     2381    ressources.push_back(t);
     2382    DataNoroCacheNode* res=treeInsertBackLink(t);
     2383    res->term_index=nIrreducibleMonomials;
    23572384    nIrreducibleMonomials++;
    2358     ressources.push_back(t);
    2359     return treeInsertBackLink(t);
     2385    return res;
    23602386  }
    23612387  poly lookup(poly term, BOOLEAN& succ, int & len);
     
    24062432    return (DataNoroCacheNode*) parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(nf,len));
    24072433  }
     2434  #ifdef NORO_SPARSE_ROWS_PRE
     2435  DataNoroCacheNode* treeInsert(poly term,SparseRow* srow){
     2436    int i;
     2437    nReducibleMonomials++;
     2438    int nvars=pVariables;
     2439    NoroCacheNode* parent=&root;
     2440    for(i=1;i<nvars;i++){
     2441      parent=parent->getOrInsertBranch(p_GetExp(term,i,currRing));
     2442    }
     2443    return (DataNoroCacheNode*) parent->setNode(p_GetExp(term,nvars,currRing),new DataNoroCacheNode(srow));
     2444  }
     2445  #endif
    24082446  DataNoroCacheNode* treeInsertBackLink(poly term){
    24092447    int i;
     
    26452683        return res_holder;
    26462684      }
    2647     //poly t_new=ppMult_nn(cache_lookup,pGetCoeff(t));
     2685
    26482686      res_holder.coef=p_GetCoeff(t,c->r);
    26492687      p_Delete(&t,c->r);
    2650     //res_holder.len=1;
    2651     //res_holder.changed=TRUE;
     2688
    26522689      res_holder.p=cache_lookup;
    26532690
    26542691      res_holder.onlyBorrowed=TRUE;
    26552692      return res_holder;
    2656     //return t_new;
     2693
    26572694    }
    26582695  }
     
    27282765    if (ref!=NULL){
    27292766
    2730       /*if (res_holder.len==NoroCache::backLinkCode){
    2731         res_holder.len=1;
    2732 
    2733 
    2734       }*/
     2767
    27352768      res_holder.coef=p_GetCoeff(t,c->r);
    27362769     
     
    27492782    number coefstrat=p_GetCoeff(c->strat->S[i],c->r);
    27502783
    2751       //poly t_copy_mon=p_Copy(t,c->r);
     2784
    27522785    poly exp_diff=cache->temp_term;
    27532786    p_ExpVectorDiff(exp_diff,t,c->strat->S[i],c->r);
     
    27552788    p_Setm(exp_diff,c->r);
    27562789    assume(c->strat->S[i]!=NULL);
    2757       //poly t_to_del=t;
     2790
    27582791    poly res;
    27592792    res=pp_Mult_mm(pNext(c->strat->S[i]),exp_diff,c->r);
     
    27622795    SparseRow* srow;
    27632796    srow=noro_red_to_non_poly(res,len,cache,c);
    2764    
    2765     //DataNoroCacheNode* ref=cache->insert(t,srow);
     2797    ref=cache->insert(t,srow);
    27662798    p_Delete(&t,c->r);
    2767       //p_Delete(&t_copy_mon,c->r);
    2768       //res=pMult_nn(res,coef_bak);
    27692799
    27702800
     
    27792809 
    27802810    res_holder.ref=cache->insertAndTransferOwnerShip(t,c->r);
     2811    assume(res_holder.ref!=NULL);
    27812812    res_holder.coef=coef_bak;
    27822813   
     
    28712902    return NULL;
    28722903  }
    2873   number* temp_array=(number*) omalloc(cache->nIrreducibleMonomials*sizeof(number));
    2874   memset(temp_array,0,sizeof(number)*cache->nIrreducibleMonomials);
     2904 
    28752905 
    28762906  MonRedResNP* mon=(MonRedResNP*) omalloc(len*sizeof(MonRedResNP));
     
    28902920    i++;
    28912921  }
     2922 
    28922923  assume(i==len);
    28932924  len=i;
     2925  //in the loop before nIrreducibleMonomials increases, so position here is important
     2926  number* temp_array=(number*) omalloc(cache->nIrreducibleMonomials*sizeof(number));
     2927  int temp_size=cache->nIrreducibleMonomials;
     2928  memset(temp_array,0,sizeof(number)*cache->nIrreducibleMonomials);
    28942929  for(i=0;i<len;i++){
    28952930    MonRedResNP red=mon[i];
     
    28982933        SparseRow* row=red.ref->row;
    28992934        number coef=red.coef;
    2900         for(i=0;i<row->len;i++){
    2901           int idx=row->idx_array[i];
    2902           temp_array[idx]=npAdd(temp_array[idx],npMult(row->coef_array[i],coef));
     2935        int j;
     2936        for(j=0;j<row->len;j++){
     2937          int idx=row->idx_array[j];
     2938          temp_array[idx]=npAdd(temp_array[idx],npMult(row->coef_array[j],coef));
     2939          assume(idx<temp_size);
    29032940        }
    29042941      }
    29052942      else{
    29062943        if (red.ref->value_len==NoroCache::backLinkCode){
    2907           temp_array[red.ref->term_index]=red.coef;
     2944          temp_array[red.ref->term_index]=npAdd(temp_array[red.ref->term_index],red.coef);
    29082945        } else {
    2909           PrintS("third case\n");
     2946          //PrintS("third case\n");
    29102947        }
    29112948      }
    29122949    }
    29132950  }
    2914  
    2915 
    2916 
    2917 
    2918 
    2919   //TODO:return res;
     2951  int non_zeros=0;
     2952  for(i=0;i<cache->nIrreducibleMonomials;i++){
     2953    if (!(npIsZero(temp_array[i]))){
     2954      non_zeros++;
     2955    }
     2956  }
     2957  SparseRow* res=new SparseRow(non_zeros);
     2958  int pos=0;
     2959  for(i=0;i<cache->nIrreducibleMonomials;i++){
     2960    if (!(npIsZero(temp_array[i]))){
     2961   
     2962      res->idx_array[pos]=i;
     2963      res->coef_array[pos]=temp_array[i];
     2964
     2965      pos++; 
     2966    }
     2967   
     2968  }
     2969  omfree(temp_array);
     2970
     2971  omfree(mon);
     2972  return res;
    29202973}
    29212974#endif
     
    30373090
    30383091  NoroCache cache;
    3039 
     3092#ifndef NORO_NON_POLY
    30403093  std::vector<std::vector<NoroPlaceHolder> > place_holders(pn);
     3094#else
     3095  SparseRow** srows=(SparseRow**) omalloc(pn*sizeof(SparseRow*));
     3096#endif
    30413097  for(j=0;j<pn;j++){
    30423098   
     
    30443100    int h_len=pLength(h);
    30453101
    3046     number coef;
    3047 
    3048    
     3102    //number coef;
     3103
     3104    #ifndef NORO_NON_POLY
    30493105    std::vector<NoroPlaceHolder> ph=noro_red(h,h_len,&cache,c);
    30503106    place_holders[j]=ph;
     3107    #else
     3108    srows[j]=noro_red_to_non_poly(h,h_len,&cache,c);
     3109    #endif
    30513110  }
    30523111  std::vector<DataNoroCacheNode*> irr_nodes;
     
    30733132  qsort(term_nodes,n,sizeof(TermNoroDataNode),term_nodes_sort_crit);
    30743133  poly* terms=(poly*) omalloc(n*sizeof(poly));
     3134  #ifndef NORO_NON_POLY
    30753135  for(j=0;j<n;j++){
    30763136    term_nodes[j].node->term_index=j;
    30773137    terms[j]=term_nodes[j].t;
    30783138  }
     3139  #else
     3140  int* old_to_new_indices=(int*) omalloc(cache.nIrreducibleMonomials*sizeof(int));
     3141  for(j=0;j<n;j++){
     3142    old_to_new_indices[term_nodes[j].node->term_index]=j;
     3143    term_nodes[j].node->term_index=j;
     3144    terms[j]=term_nodes[j].t;
     3145  }
     3146  #endif
    30793147  if (TEST_OPT_PROT)
    30803148    Print("Evaluate Rows \n");
     3149  #ifndef NORO_NON_POLY
    30813150  cache.evaluateRows();
     3151  #endif
    30823152  number* number_array=(number*) omalloc(n*pn*sizeof(number));
     3153  memset(number_array,0,sizeof(number)*n*pn);
    30833154  number zero=npInit(0);
    30843155  if (TEST_OPT_PROT)
     
    30873158    int i;
    30883159    number* row=number_array+n*j;
    3089     for(i=0;i<n;i++){
     3160    /*for(i=0;i<n;i++){
    30903161      row[i]=zero;
    3091     }
     3162    }*/
     3163    #ifndef NORO_NON_POLY
    30923164    cache.evaluatePlaceHolder(row,place_holders[j]);
     3165    #else
     3166    SparseRow* srow=srows[j];
     3167    for(i=0;i<srow->len;i++){
     3168      int idx=old_to_new_indices[srow->idx_array[i]];
     3169      row[idx]=srow->coef_array[i];
     3170    }
     3171    delete srow;
     3172    #endif
    30933173  }
    30943174 
     
    31083188  omfree(term_nodes);
    31093189  omfree(number_array);
     3190  #ifdef NORO_NON_POLY
     3191  omfree(srows);
     3192  omfree(old_to_new_indices);
     3193  #endif
    31103194  //don't forget the rank
    31113195 
Note: See TracChangeset for help on using the changeset viewer.