#ifndef PIECEWISERANSAC_H_ #define PIECEWISERANSAC_H_ #include "common.h" #include "codecs.h" #include "bit_read.h" #include "bit_write.h" #include "lr.h" #include "RANSAC.h" #include "rank.h" #define INF 0x7f7fffff namespace Codecset { class piecewise_ransac : public IntegerCODEC { public: using IntegerCODEC::encodeArray; using IntegerCODEC::decodeArray; using IntegerCODEC::randomdecodeArray; using IntegerCODEC::encodeArray8; using IntegerCODEC::decodeArray8; using IntegerCODEC::randomdecodeArray8; using IntegerCODEC::init; int temp; int total_usedData=0; int block_num; int block_size; int ransacdelta=20; void init( int blocks, int blocksize,int delta){ block_num=blocks; block_size=blocksize; temp = ceil((double)block_size/64.); ransacdelta = delta; } uint8_t* encodeArray8(uint32_t *in, const size_t length,uint8_t*res, size_t nvalue) { double *indexes = new double[length]; double *keys = new double[length]; uint8_t *out = res; uint64_t * writebitmap=new uint64_t[temp]; for(uint32_t i = 0; i < length; i++){ indexes[i] = (double) i; keys[i] = (double) in[i]; } bool *vote = new bool[length]; //lr.train(indexes, keys, length, 0.0001, 500); lr mylr; mylr.delta=ransacdelta; RANSAC myRansac; int usedData = myRansac.compute(mylr,indexes,keys,length,2,vote); total_usedData+=usedData; //std::cout<<"Theta: "<max_error){ max_error = abs(tmp); } } else{ tmpbit+= ((1L)<<(63-i%64)); deltax[k]= 1 ; k++; tmpoutlier[wtiteoutlier]=(long long)in[i]; wtiteoutlier++; } //if(nvalue==0){ //std::cout<<"i "<::iterator iter=tmpmap.begin(); while(iter!=tmpmap.end()){ std::cout<first<<" "<second<=31){ out = write_delta_default(in,out,32,length); } else{ out = write_delta(deltax, out, tmp_bit, length); } //delete[] deltax; int shift = out - res; //std::cout<<" delta length: "<(tmpin); tmpin+=8; theta1 = reinterpret_cast(tmpin); tmpin+=8; outlier_num = reinterpret_cast(tmpin); tmpin +=8; int* outlier_position; outlier_position = reinterpret_cast(tmpin); tmpin+=4; uint8_t * bitmap_pos = tmpin; tmpin+=temp*12; //std::cout<<"maxerror "<=31){ read_all_default(tmpin ,0,0, length, maxerror,theta1[0],theta0[0], out); } else{ /* for(int i=0;i(tmpin); tmpin+=8; theta1 = reinterpret_cast(tmpin); tmpin+=12; basic_block_size_ = reinterpret_cast(tmpin); tmpin+=4; int* outlier_position; outlier_position = reinterpret_cast(tmpin); tmpin+=4; uint8_t * bitmap_pos = tmpin; tmpin+=temp*8; uint8_t * lookup_pos = tmpin; tmpin+=temp*4; uint8_t * outlier_pos = in + outlier_position[0]; /* uint64_t * bitmap = new uint64_t[temp]; memcpy(bitmap,bitmap_pos,temp*8); int * lookup = new int[temp]; memcpy(lookup,lookup_pos,temp*4); */ //std::cout<<"maxerror "<=31){ tmp = read_bit_default(tmpin ,maxerror , l, theta1[0],theta0[0], 0); return tmp; } else{ //std::cout<<"num "<>(63-l%64))&1)<(lookup_pos + 4 * fetch_pos); uint64_t * tempbitmap; tempbitmap = reinterpret_cast(bitmap_pos + 8 * fetch_pos); int rankval =lookup_num[0] + popcountLinear(tempbitmap, 0 , (l&(basic_block_size_[0] - 1))+1); //int rankval = rank(l,bitmap,lookup,basic_block_size_); //std::cout<<"l "<>(63-l%64))&1)<<" rankval "<>(63-l%64))&1)){ uint32_t * tmppoint = reinterpret_cast(outlier_pos + (rankval-1) * 4); return tmppoint[0]; } else{ tmp = read_bit_ransac(tmpin ,maxerror , l, theta1[0],theta0[0], 0,rankval); return tmp; } } //double end2 = getNow(); //std::cout<<"find lower bound time: "<<(end-start)*1000000000<<" read bit time: "<<(end2-start2)*1000000000<<" rate is: "<<(end-start)/(end2-start2)<