Learn-to-Compress / headers / piecewise_fix_delta.h
piecewise_fix_delta.h
Raw
#ifndef PIECEWISEFIX_DELTA_H_
#define PIECEWISEFIX_DELTA_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_delta : 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 block_num;
  int block_size;
  
void init(int blocks, int blocksize,int extra){
      block_num=blocks;
      block_size=blocksize;
      
}

// bit + theta0 + theta1 + delta[0]+ delta(after delta)
uint8_t * encodeArray8(uint32_t *in, const size_t length,uint8_t *res, size_t nvalue) {
    uint8_t *out = res;

    std::vector<double> indexes;
    std::vector<double> 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(indexes,keys,length);

    for(int i=0;i<(long long)length;i++){
        int tmp = (long long) in[i] - (long long)(mylr.theta0+mylr.theta1*(double)i);
        delta[i]=tmp;
        
    }
    
    int *delta2 = new int[length];
    uint32_t max_error =abs(delta[0]); //delta[0], delta[1]-delta[0],....
    delta2[0]=delta[0];
    for(int i=1;i<(long long) length;i++){
        delta2[i]=delta[i]-delta[i-1]; 
        if(abs(delta2[i])>max_error){
            max_error = abs(delta2[i]);
        }
    }
    int tmp_bit = bits(max_error)+1;
    if(max_error==0){
            tmp_bit=0;
    }
    //std::cout<<"tmp_bit you need is "<<tmp_bit<<std::endl;

    out[0]=(uint8_t)tmp_bit;
    out++;
    double theta0 = mylr.theta0;
    double theta1 = mylr.theta1;
    memcpy(out,&theta0,sizeof(theta0));
    out+=sizeof(theta0);
    memcpy(out,&theta1,sizeof(theta1));
    out+=sizeof(theta1);
    free(delta);

    if(tmp_bit==0){
        free(delta2);
        return out;
    }

    else if(tmp_bit>=31){
        out = write_delta_default(in,out,32,length);
    }
    else{
        out = write_delta(delta2, out, tmp_bit, length);
    }
    

    free(delta2);
    return out;
    
}
    
uint32_t *decodeArray8( uint8_t *in, const size_t length, uint32_t *out, size_t nvalue) {
    //std::cout<<"decompressing all!"<<std::endl;
    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==0){
        for(uint32_t i=0;i<length;i++){
            out[i] = (long long) (theta0 +((double)i*theta1));
        }
        return out;
    }
    if(maxerror>=31){
        read_all_default(tmpin ,0,0, length, maxerror,theta1,theta0, out);
        return out;
    }
    else{
        int * delta = (int*)malloc(block_size * sizeof(int));
        read_all_bit_only(tmpin ,length, maxerror, delta);
        for(int i=1;i<block_size;i++){
            delta[i] = delta[i-1]+delta[i];
        }
        for(int i=0;i<block_size;i++){
            out[i]=delta[i]+(long long) (theta0 +((double)i*theta1));
        }
        delete [] delta;
        return out;
    }
    
}
uint32_t randomdecodeArray8( uint8_t *in, const size_t l, uint32_t *out, size_t nvalue){
    
    std::cout<<"Piecewise_fix_delta doesn't support random access..."<<std::endl;
    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..."<<std::endl;
    return out;
}
uint32_t *decodeArray( uint32_t *in, const size_t length,
                              uint32_t *out, size_t nvalue) {
    std::cout<<"Haven't implement. Please try uint8_t one..."<<std::endl;
    return out;
}
uint32_t randomdecodeArray(uint32_t *in, const size_t l,uint32_t *out, size_t nvalue){
    std::cout<<"Haven't implement. Please try uint8_t one..."<<std::endl;
    return 1;
}
uint32_t get_block_nums(){
      return 1;
}    
std::string name() const {
    return "piecewise_fix_delta"; 
}    
 void destroy(){} 
};



} // namespace FastPFor

#endif /* SIMDFASTPFOR_H_ */