#ifndef PIECEWISEFIXOP_FLOAT_H_ #define PIECEWISEFIXOP_FLOAT_H_ #include "common.h" #include "codecs.h" #include "bit_read.h" #include "bit_write.h" #include "lr.h" #define INF 0x7f7fffff namespace Codecset { class piecewise_fix_op_float : public IntegerCODEC { public: using IntegerCODEC::encodeArray; using IntegerCODEC::decodeArray; using IntegerCODEC::randomdecodeArray; using IntegerCODEC::encodeArray8; using IntegerCODEC::decodeArray8; using IntegerCODEC::randomdecodeArray8; using IntegerCODEC::init; using IntegerCODEC::summation; int block_num; int block_size; //double * models; void init(int blocks, int blocksize,int extra){ block_num=blocks; block_size=blocksize; //models = new double [block_num*2]; } int random(int m){ return rand()%m; } // bit + theta0 + theta1 + delta uint8_t * encodeArray8(uint32_t *in, const size_t length,uint8_t *res, size_t nvalue) { //double *keys_sample = new double [length]; //double *indexes_sample = new double[length]; uint8_t *out = res; std::vector indexes; std::vector keys; for(uint32_t i = 0; i < length; i++){ indexes.emplace_back((double) i); keys.emplace_back((double) in[i]); } int *delta = new int[length]; lr mylr; //mylr.caltheta_LOO(indexes,keys,length); mylr.caltheta(indexes,keys,length); float theta0 = mylr.theta0; float theta1 = mylr.theta1; int max_error =0; for(int i=0;i<(long long)length;i++){ int tmp = (long long) in[i] - (long long)(theta0+theta1*(float)i); delta[i]=tmp; if(abs(tmp)>max_error){ max_error = abs(tmp); } } /* if(nvalue==0){ std::cout<=31){ out = write_delta_default(in,out,32,length); } else{ out = write_delta_T(delta, out, tmp_bit, length); } } free(delta); return out; } uint32_t *decodeArray8( uint8_t *in, const size_t length, uint32_t *out, size_t nvalue) { float theta0; float theta1; uint8_t maxerror; uint8_t * tmpin=in; memcpy(&maxerror,tmpin,1); tmpin++; memcpy(&theta0,tmpin,sizeof(theta0)); tmpin+=sizeof(theta0); memcpy(&theta1,tmpin,sizeof(theta1)); tmpin+=sizeof(theta1); if(maxerror){ if(maxerror>=31){ read_all_default(tmpin ,0,0, length, maxerror,theta1,theta0, out); } else{ read_all_bit_fix_float(tmpin ,0,0, length, maxerror,theta1,theta0, out); } } else{ for(int i=0;i(tmpin)[0]; theta1 = reinterpret_cast(tmpin)[1]; tmpin+=sizeof(float) * 2; uint32_t tmp=0; if(maxerror){ if(maxerror>=31){ //uint32_t * interpret = reinterpret_cast(tmpin); tmp = read_bit_default(tmpin ,maxerror, l, theta1,theta0, 0); //return interpret[l]; } else{ tmp = read_bit_fix_float_T(tmpin ,maxerror, l, theta1,theta0, 0); } } else{ tmp = (long long)(theta0+theta1*(float)l); } return tmp; } /* uint64_t summation( uint8_t *in, const size_t l, size_t nvalue){ long long sum =0; double theta0; double theta1; uint8_t maxerror; uint8_t * tmpin=in; memcpy(&maxerror,tmpin,1); tmpin++; memcpy(&theta0,tmpin,8); tmpin+=8; memcpy(&theta1,tmpin,8); tmpin+=8; if(maxerror>=31){ sum = sum_all_default(tmpin ,0,0, nvalue, maxerror); } else{ //uint32_t total = nvalue *(nvalue-1)/2; sum = sum_all_bit_fix(tmpin ,0,0, nvalue, maxerror,theta1); sum +=((long long) theta0 )*nvalue; //sum +=(long long)(theta1*total); } return (uint64_t)sum; } */ uint64_t summation( uint8_t *in, const size_t l, size_t nvalue){ return 0; } uint32_t* encodeArray( uint32_t *in, const size_t length, uint32_t *out, size_t nvalue) { std::cout<<"Haven't implement. Please try uint8_t one..."<