#ifndef PIECEWISE_H_ #define PIECEWISE_H_ #include "common.h" #include "codecs.h" #include "time.h" #include "bit_read.h" #include "bit_write.h" #include "caltime.h" #define INF 0x7f7fffff namespace Codecset { double cal_score_tmp(uint32_t* a, int N){ int * b = (int*)malloc(N * sizeof(int)); uint32_t amax = a[N-1]; uint32_t amin = a[N-1]; for(int i=0;ia[i]){ amin = a[i]; } b[i] = a[i+1]-a[i]; } int best_delta = (amax-amin)/(N-1); long long sum =0; for(int i=0;i block_start_vec; std::vector segment_index; uint32_t counter = 0; uint32_t total_byte =0; int maxerror =(1U<<10)-1; int block_num; int block_size; //start_index + bit + theta0 + theta1 + numbers + delta void init( int blocks, int blocksize,int delta){ block_num=blocks; block_size=blocksize; maxerror = delta; } float epsilon = 0.; bool gt(float a, float b){ // greater than return (a > b + epsilon); } uint32_t lower_bound( uint32_t v,uint32_t len) { uint32_t m; uint32_t x=0; uint32_t y=len-1; while(x <= y) { m = x+(y-x)/2; if(v indexes; for(uint32_t i = 0; i < nvalue; i++){ indexes.push_back(i); } double high_slope = (double)INF; double low_slope = 0.; long long origin_key = in[0]; int origin_index = indexes[0]; int end_index = indexes[0]; int total_index =0; for (int i = 1; i < (long long)nvalue; i++){ long long key = in[i]; int id = indexes[i]; double tmp_point_slope = ((key - origin_key)+0.0) / ((id - origin_index)+0.0); if (tmp_point_slope >= low_slope && tmp_point_slope <= high_slope ){ //if (gt(tmp_point_slope, low_slope) && gt(high_slope, tmp_point_slope)){ double tmp_high_slope = ((key + maxerror - origin_key)+0.0) / ((id - origin_index)+0.0); double tmp_low_slope = ((key - maxerror - origin_key)+0.0) /((id - origin_index)+0.0); if (tmp_low_slope<0.0){ //std::cout<<"zero!"<(malloc(seg_len * sizeof(int))); for (int j = origin_index; j <= end_index; j++ ){ long long predict = (long long)(in[origin_index]+slope*(double)(j-origin_index)); long long truth = (long long)in[j]; int tmp = abs(predict-truth); delta[j-origin_index] = (int) truth-predict; total_index++; if (tmp > max_error){ max_error = tmp; } } //std::cout<(malloc(seg_len * sizeof(int))); int max_error = 0; for (int j = origin_index; j <= end_index; j++ ){ long long predict = (long long)in[origin_index] + (long long)(slope*(double)(j-origin_index)); long long truth = (long long)in[j]; int tmp = abs(predict-truth); delta[j-origin_index] = (int) truth-predict; total_index++; if (tmp > max_error){ max_error = tmp; } } uint8_t tmp_bit = 0; if(max_error){ tmp_bit = bits(max_error)+1; } uint8_t * descriptor = (uint8_t*)malloc((end_index - origin_index + 1) * sizeof(uint64_t)+30); uint8_t *out = descriptor; uint32_t start_ind = origin_index; memcpy(out,&start_ind,sizeof(start_ind)); out+=sizeof(start_ind); out[0]=(uint8_t)tmp_bit; out++; uint32_t theta0 = (long long)in[origin_index] ; uint32_t numbers = (end_index - origin_index + 1); memcpy(out,&theta0,sizeof(theta0)); out+=sizeof(theta0); memcpy(out,&slope,sizeof(slope)); out+=sizeof(slope); if(tmp_bit){ out = write_delta_T(delta, out, tmp_bit, seg_len); } free(delta); descriptor=(uint8_t*)realloc(descriptor, (out-descriptor)); block_start_vec.push_back(descriptor); segment_index.push_back(start_ind); total_byte +=(out - descriptor); // std::cout<<"small frag number "<< counter<