Changeset 3a2985 in git


Ignore:
Timestamp:
Feb 27, 2007, 11:12:14 AM (16 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
Children:
cb1222e9d011def1f666d962b393df0671f6b3d5
Parents:
b66eebb6e0a7103993fe517afda97ee69c1a82a1
Message:
*bricken: play with density


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

Legend:

Unmodified
Added
Removed
  • kernel/tgb_internal.h

    rb66eeb r3a2985  
    55*  Computer Algebra System SINGULAR     *
    66****************************************/
    7 /* $Id: tgb_internal.h,v 1.67 2007-02-27 08:03:44 bricken Exp $ */
     7/* $Id: tgb_internal.h,v 1.68 2007-02-27 10:12:14 bricken Exp $ */
    88/*
    99 * ABSTRACT: tgb internal .h file
     
    482482    coef_array=(number_type*) omalloc(n*sizeof(number_type));
    483483  }
     484  SparseRow<number_type>(int n, const number_type* source){
     485    len=n;
     486    idx_array=NULL;
     487    coef_array=(number_type*) omalloc(n*sizeof(number_type));
     488    memcpy(coef_array,source,n*sizeof(number_type));
     489  }
    484490  ~SparseRow<number_type>(){
    485491    omfree(idx_array);
     
    856862  }
    857863}
     864template <class number_type> void add_coef_times_dense(number_type* const temp_array,
     865int temp_size,const number_type* row, int len,number coef){
     866  int j;
     867  const number_type* const coef_array=row;
     868  //int* const idx_array=row->idx_array;
     869  //const int len=temp_size;
     870  tgb_uint32 buffer[256];
     871  const tgb_uint32 prime=npPrimeM;
     872  const tgb_uint32 c=F4mat_to_number_type(coef);
     873  assume(!(npIsZero(coef)));
     874  for(j=0;j<len;j=j+256){
     875    const int bound=std::min(j+256,len);
     876    int i;
     877    int bpos=0;
     878    for(i=j;i<bound;i++){
     879      buffer[bpos++]=coef_array[i];
     880    }
     881    int bpos_bound=bound-j;
     882    for(i=0;i<bpos_bound;i++){
     883       buffer[i]*=c;
     884     }
     885    for(i=0;i<bpos_bound;i++){
     886       buffer[i]=buffer[i]%prime;
     887    }
     888    bpos=0;
     889    for(i=j;i<bound;i++){
     890      //int idx=idx_array[i];
     891      assume(bpos<256);
     892      //assume(!(npIsZero((number) buffer[bpos])));
     893      temp_array[i]=F4mat_to_number_type(npAddM((number) temp_array[i], (number) buffer[bpos++]));
     894      assume(i<temp_size);
     895    }
     896   
     897  }
     898}
     899template <class number_type> void add_dense(number_type* const temp_array,
     900int temp_size,const number_type* row, int len){
     901  //int j;
     902  const number_type* const coef_array=row;
     903  //int* const idx_array=row->idx_array;
     904  //const int len=temp_size;
     905  tgb_uint32 buffer[256];
     906  const tgb_uint32 prime=npPrimeM;
     907  //const tgb_uint32 c=F4mat_to_number_type(coef);
     908 
     909  int i;
     910  for(i=0;i<len;i++){
     911   
     912      temp_array[i]=F4mat_to_number_type(npAddM((number) temp_array[i], (number) row[i]));
     913      assume(i<temp_size);
     914    }
     915   
     916  }
     917template <class number_type> void sub_dense(number_type* const temp_array,
     918int temp_size,const number_type* row, int len){
     919  //int j;
     920  const number_type* const coef_array=row;
     921  //int* const idx_array=row->idx_array;
     922  //const int len=temp_size;
     923  tgb_uint32 buffer[256];
     924  const tgb_uint32 prime=npPrimeM;
     925  //const tgb_uint32 c=F4mat_to_number_type(coef);
     926 
     927  int i;
     928  for(i=0;i<len;i++){
     929   
     930      temp_array[i]=F4mat_to_number_type(npSubM((number) temp_array[i], (number) row[i]));
     931      assume(i<temp_size);
     932    }
     933   
     934  }
     935
    858936template <class number_type> void add_sparse(number_type* const temp_array,int temp_size,SparseRow<number_type>* row){
    859937  int j;
     
    896974         number coef=red.coef;
    897975         int j;
     976         if (row->idx_array){
    898977         if (!((coef==(number) 1)||(coef==minus_one))){
    899978           add_coef_times_sparse(temp_array,temp_size,row,coef);
     
    909988           }
    910989         }
     990       } else
     991       //TODO: treat, 1,-1
     992       if (!((coef==(number) 1)||(coef==minus_one))){
     993         add_coef_times_dense(temp_array,temp_size,row->coef_array,row->len,coef);
     994       } else {
     995         if (coef==(number)1)
     996           add_dense(temp_array,temp_size,row->coef_array,row->len);
     997         else{
     998           assume(coef==minus_one);
     999           sub_dense(temp_array,temp_size,row->coef_array,row->len);
     1000           //add_coef_times_dense(temp_array,temp_size,row->coef_array,row->len,coef);
     1001         }
    9111002       }
     1003       }
     1004       
    9121005       else{
    9131006         if (red.ref->value_len==NoroCache<number_type>::backLinkCode){
     
    9321025     return NULL;
    9331026   }
    934    SparseRow<number_type>* res=convert_to_sparse_row(temp_array,temp_size, non_zeros);
     1027   SparseRow<number_type>* res=new SparseRow<number_type>(temp_size,temp_array);//convert_to_sparse_row(temp_array,temp_size, non_zeros);
    9351028
    9361029   //omfree(temp_array);
     
    9571050  }
    9581051}
     1052template<class number_type> void write_coef_times_xx_idx_to_buffer_dense(CoefIdx<number_type>* const pairs,int& pos, number_type* const coef_array,const int rlen, const number coef){
     1053  int j;
     1054 
     1055  for(j=0;j<rlen;j++){
     1056    if (coef_array[j]!=0){
     1057    assume(coef_array[j]!=0);
     1058    CoefIdx<number_type> ci;
     1059    ci.coef=F4mat_to_number_type(npMultM((number) coef,(number) coef_array[j]));
     1060    assume(ci.coef!=0);
     1061    ci.idx=j;
     1062    pairs[pos++]=ci;
     1063  }
     1064  }
     1065}
    9591066template<class number_type> void write_coef_idx_to_buffer(CoefIdx<number_type>* const pairs,int& pos,int* const idx_array, number_type* const coef_array,const int rlen){
    9601067  int j;
     
    9801087template <class number_type> SparseRow<number_type>* noro_red_to_non_poly_sparse(MonRedResNP<number_type>* mon, int len,NoroCache<number_type>* cache){
    9811088  int i;
    982   int together=0;
    983   for(i=0;i<len;i++){
    984     MonRedResNP<number_type> red=mon[i];
    985     if ((red.ref) &&( red.ref->row)){
    986       together+=red.ref->row->len;
    987     } else {if ((red.ref) &&(red.ref->value_len==NoroCache<number_type>::backLinkCode))
     1089int together=0;
     1090for(i=0;i<len;i++){
     1091  MonRedResNP<number_type> red=mon[i];
     1092  if ((red.ref) &&( red.ref->row)){
     1093    together+=red.ref->row->len;
     1094    } else {
     1095      if ((red.ref) &&(red.ref->value_len==NoroCache<number_type>::backLinkCode))
    9881096      together++;
     1097  }
     1098
     1099}
     1100  //PrintS("here\n");
     1101if (together==0) return 0;
     1102  //PrintS("there\n");
     1103cache->ensureTempBufferSize(together*sizeof(CoefIdx<number_type>));
     1104CoefIdx<number_type>* pairs=(CoefIdx<number_type>*) cache->tempBuffer; //omalloc(together*sizeof(CoefIdx<number_type>));
     1105int pos=0;
     1106int j;
     1107const number one=npInit(1);
     1108const number minus_one=npInit(-1);
     1109for(i=0;i<len;i++){
     1110  MonRedResNP<number_type> red=mon[i];
     1111  if ((red.ref) &&( red.ref->row)){
     1112      //together+=red.ref->row->len;
     1113    int* idx_array=red.ref->row->idx_array;
     1114    number_type* coef_array=red.ref->row->coef_array;
     1115    int rlen=red.ref->row->len;
     1116    number coef=red.coef;
     1117    if (idx_array){
     1118      if ((coef!=one)&&(coef!=minus_one)){
     1119        write_coef_times_xx_idx_to_buffer(pairs,pos,idx_array, coef_array,rlen, coef);
     1120        } else
     1121        {
     1122          if (coef==one){
     1123            write_coef_idx_to_buffer(pairs,pos,idx_array, coef_array,rlen);
     1124          } else {
     1125            assume(coef==minus_one);
     1126            write_minus_coef_idx_to_buffer(pairs,pos,idx_array, coef_array,rlen);
     1127          }
     1128        }
     1129      } else{
     1130        write_coef_times_xx_idx_to_buffer_dense(pairs,pos,coef_array,rlen,coef);
    9891131      }
    990    
    991   }
    992   //PrintS("here\n");
    993   if (together==0) return 0;
    994   //PrintS("there\n");
    995   cache->ensureTempBufferSize(together*sizeof(CoefIdx<number_type>));
    996   CoefIdx<number_type>* pairs=(CoefIdx<number_type>*) cache->tempBuffer; //omalloc(together*sizeof(CoefIdx<number_type>));
    997   int pos=0;
    998   int j;
    999   const number one=npInit(1);
    1000   const number minus_one=npInit(-1);
    1001   for(i=0;i<len;i++){
    1002     MonRedResNP<number_type> red=mon[i];
    1003     if ((red.ref) &&( red.ref->row)){
    1004       //together+=red.ref->row->len;
    1005       int* idx_array=red.ref->row->idx_array;
    1006       number_type* coef_array=red.ref->row->coef_array;
    1007       int rlen=red.ref->row->len;
    1008       number coef=red.coef;
    1009       if ((coef!=one)&&(coef!=minus_one)){
    1010       write_coef_times_xx_idx_to_buffer(pairs,pos,idx_array, coef_array,rlen, coef);
    1011     } else
    1012     {
    1013       if (coef==one){
    1014         write_coef_idx_to_buffer(pairs,pos,idx_array, coef_array,rlen);
    1015       } else {
    1016         assume(coef==minus_one);
    1017         write_minus_coef_idx_to_buffer(pairs,pos,idx_array, coef_array,rlen);
    1018       }
    1019     }
    1020     } else {
     1132    }
     1133    else {
    10211134      if ((red.ref) &&(red.ref->value_len==NoroCache<number_type>::backLinkCode)){
    10221135        CoefIdx<number_type> ci;
     
    10271140    }
    10281141  }
    1029   assume(pos==together);
     1142  assume(pos<=together);
     1143  together=pos;
     1144
    10301145  std::sort(pairs,pairs+together);
    1031  
     1146
    10321147  int act=0;
    1033  
     1148
    10341149  assume(pairs[0].coef!=0);
    10351150  for(i=1;i<together;i++){
     
    10431158    }
    10441159  }
    1045  
     1160
    10461161  if (pairs[act].coef==0){
    1047    
     1162
    10481163    act--;
    10491164  }
     
    10611176  }
    10621177  //omfree(pairs);
    1063  
     1178
    10641179  return res;
    10651180}
     
    10981213  len=i;
    10991214  bool dense=true;
    1100   if (max_density<0.05) dense=false;
     1215  if (max_density<0.2) dense=false;
    11011216  if (dense){
    11021217    SparseRow<number_type>* res=noro_red_to_non_poly_dense(mon,len,cache);
     
    14681583      number_type* const coef_array=srow->coef_array;
    14691584      const int len=srow->len;
    1470     for(i=0;i<len;i++){
    1471       int idx=old_to_new_indices[idx_array[i]];
    1472       row[idx]=F4mat_to_number_type(coef_array[i]);
    1473     }
    1474     delete srow;
     1585      if (srow->idx_array){
     1586        for(i=0;i<len;i++){
     1587         int idx=old_to_new_indices[idx_array[i]];
     1588         row[idx]=F4mat_to_number_type(coef_array[i]);
     1589        }
     1590      }
     1591      else {
     1592        for(i=0;i<len;i++){
     1593          row[old_to_new_indices[i]]=F4mat_to_number_type(coef_array[i]);
     1594        }
     1595      }
     1596      delete srow;
    14751597    }
    14761598  }
Note: See TracChangeset for help on using the changeset viewer.