update
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/EncodeTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/EncodeTest.java
index 3de1682..8184139 100644
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/EncodeTest.java
+++ b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/EncodeTest.java
@@ -25,26 +25,15 @@
 public class EncodeTest {
 
   public static void main(@NotNull String[] args) throws IOException {
-    //    String parent_dir =
-    //
-    // "C:\\Users\\xiaoj\\Documents\\GitHub\\encoding-reorder\\vldb\\compression_ratio\\sota_ratio";
-    //
-    // String parent_dir = "C:\\Users\\Jinnsjao Shawl\\Documents\\GitHub\\encoding-reorder\\";
-//    String parent_dir = "E:\\vldb-reorder\\encoding-reorder\\";
-//    String output_parent_dir = parent_dir + "vldb\\compression_ratio\\sota_ratio";
 
     String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
     String output_parent_dir = "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/sota_ratio";
     String input_parent_dir = parent_dir + "trans_data/";
 
-//    String parent_dir = "E:\\encoding-reorder-icde\\vldb\\iotdb_datasets_lists\\";
-//    String output_parent_dir = "E:\\encoding-reorder-icde\\compression_ratio\\sota_ratio";
-//    String input_parent_dir = parent_dir;
 
     ArrayList<String> input_path_list = new ArrayList<>();
     ArrayList<String> output_path_list = new ArrayList<>();
     ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
 
     dataset_name.add("CS-Sensors");
     dataset_name.add("Metro-Traffic");
@@ -61,47 +50,30 @@
     dataset_name.add("FANYP-Sensors");
     dataset_name.add("TRAJET-Transport");
 
-    for (int i = 0; i < dataset_name.size(); i++) {
-      input_path_list.add(input_parent_dir + dataset_name.get(i));
+    for (String item : dataset_name) {
+      input_path_list.add(input_parent_dir + item);
     }
 
     output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-//        dataset_block_size.add(128);
-
     output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-//        dataset_block_size.add(4096);
     output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-//        dataset_block_size.add(8192);
     output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
     output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
     output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-//        dataset_block_size.add(8192);
     output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-//        dataset_block_size.add(2048);
     output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-//        dataset_block_size.add(2048);
     output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-//        dataset_block_size.add(128);
     output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-//        dataset_block_size.add(64);
     output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-//        dataset_block_size.add(64);
     output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-//        dataset_block_size.add(256);
     output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
     output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
 
-//            for(int file_i=4;file_i<5;file_i++){
     for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
       String inputPath = input_path_list.get(file_i);
       String Output = output_path_list.get(file_i);
-      //      String Output = "C:\\Users\\xiaoj\\Desktop\\test_ratio_ts_2diff.csv";
 
-      // speed
       int repeatTime = 1; // set repeat time
-      String dataTypeName = "int"; // set dataType
-      //    if (args.length >= 2) inputPath = args[1];
-      //    if (args.length >= 3) Output = args[2];
 
       File file = new File(inputPath);
       File[] tempList = file.listFiles();
@@ -143,7 +115,6 @@
       writer.writeRecord(head); // write header to output file
 
       assert tempList != null;
-      int fileRepeat = 0;
       ArrayList<Integer> columnIndexes = new ArrayList<>(); // set the column indexes of compressed
       for (int i = 0; i < 2; i++) {
         columnIndexes.add(i, i);
@@ -153,434 +124,102 @@
         System.out.println(count_csv);
         count_csv ++;
         System.out.println(f);
-        fileRepeat += 1;
         InputStream inputStream = Files.newInputStream(f.toPath());
         CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        String fileName = f.getAbsolutePath();
         ArrayList<String> data = new ArrayList<>();
 
         for (int index : columnIndexes) {
-          // add a column to "data"
-          //        System.out.println(index);
-          int max_precision = 0;
+
           loader.readHeaders();
           data.clear();
           while (loader.readRecord()) {
             String v = loader.getValues()[index];
-            //          int ind = v.indexOf(".");
-            //          if (ind > -1) {
-            //            int len = v.substring(ind + 1).length();
-            //            if (len > max_precision) {
-            //              max_precision = len;
-            //            }
-            //          }
             data.add(v);
           }
-          //        System.out.println(max_precision);
           inputStream.close();
 
-          switch (dataTypeName) {
-            case "int":
-              {
-                TSDataType dataType = TSDataType.INT32; // set TSDataType
-                ArrayList<Integer> tmp = new ArrayList<>();
-                for (String value : data) {
-                  tmp.add(Integer.valueOf(value));
+          TSDataType dataType = TSDataType.INT32; // set TSDataType
+          ArrayList<Integer> tmp = new ArrayList<>();
+          for (String value : data) {
+            tmp.add(Integer.valueOf(value));
+          }
+          // Iterate over each encoding algorithm
+          for (TSEncoding encoding : encodingList) {
+            Encoder encoder =
+                    TSEncodingBuilder.getEncodingBuilder(encoding).getEncoder(dataType);
+            Decoder decoder = Decoder.getDecoderByType(encoding, dataType);
+            long encodeTime = 0;
+            long decodeTime = 0;
+
+            // Iterate over each compression algorithm
+            for (CompressionType comp : compressList) {
+              ICompressor compressor = ICompressor.getCompressor(comp);
+              IUnCompressor unCompressor = IUnCompressor.getUnCompressor(comp);
+
+              double ratio = 0;
+              double compressed_size = 0;
+
+              for (int i = 0; i < repeatTime; i++) {
+                ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+
+                // test encode time
+                long s = System.nanoTime();
+                for (int val : tmp) {
+                  encoder.encode(val, buffer);
                 }
-                // Iterate over each encoding algorithm
-                for (TSEncoding encoding : encodingList) {
-                  Encoder encoder =
-                      TSEncodingBuilder.getEncodingBuilder(encoding).getEncoder(dataType);
-                  Decoder decoder = Decoder.getDecoderByType(encoding, dataType);
-                  long encodeTime = 0;
-                  long decodeTime = 0;
 
-                  // Iterate over each compression algorithm
-                  for (CompressionType comp : compressList) {
-                    ICompressor compressor = ICompressor.getCompressor(comp);
-                    IUnCompressor unCompressor = IUnCompressor.getUnCompressor(comp);
 
-                    double ratio = 0;
-                    double compressed_size = 0;
+                encoder.flush(buffer);
+                long e = System.nanoTime();
+                encodeTime += (e - s);
 
-                    long compressTime = 0;
-                    long uncompressTime = 0;
+                // test compress time
+                byte[] elems = buffer.toByteArray();
+                byte[] compressed = compressor.compress(elems);
 
-                    // repeat many times to test time
-                    for (int i = 0; i < repeatTime; i++) {
-                      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+                // test compression ratio and compressed size
+                compressed_size += compressed.length;
+                double ratioTmp =
+                        (double) compressed.length / (double) (tmp.size() * Integer.BYTES);
+                ratio += ratioTmp;
 
-                      // test encode time
-                      long s = System.nanoTime();
-                      for (int val : tmp) {
-                        encoder.encode(val, buffer);
-                      }
+                // test uncompress time
+                unCompressor.uncompress(compressed);
 
-                      //                    byte[] elems = buffer.toByteArray();
-                      encoder.flush(buffer);
-                      long e = System.nanoTime();
-                      encodeTime += (e - s);
+                // test decode time
+                ByteBuffer ebuffer = ByteBuffer.wrap(buffer.toByteArray());
+                s = System.nanoTime();
+                while (decoder.hasNext(ebuffer)) {
+                  decoder.readInt(ebuffer);
+                }
+                e = System.nanoTime();
+                decodeTime += (e - s);
 
-                      // test compress time
-                      byte[] elems = buffer.toByteArray();
-                      s = System.nanoTime();
-                      byte[] compressed = compressor.compress(elems);
-                      e = System.nanoTime();
-                      compressTime += (e - s);
+                buffer.close();
+              }
 
-                      // test compression ratio and compressed size
-                      compressed_size += compressed.length;
-                      double ratioTmp =
-                          (double) compressed.length / (double) (tmp.size() * Integer.BYTES);
-                      ratio += ratioTmp;
+              ratio /= repeatTime;
+              compressed_size /= repeatTime;
 
-                      // test uncompress time
-                      s = System.nanoTime();
-                      byte[] x = unCompressor.uncompress(compressed);
-                      e = System.nanoTime();
-                      uncompressTime += (e - s);
-
-                      // test decode time
-                      ByteBuffer ebuffer = ByteBuffer.wrap(buffer.toByteArray());
-                      s = System.nanoTime();
-                      int i_tmp = 0;
-                      while (decoder.hasNext(ebuffer)) {
-                        //                      decoder.readInt(ebuffer);
-                        decoder.readInt(ebuffer);
-                        //                      if(tmp.get(i_tmp) == tmp_tmp)
-                        //                        System.out.println("equal");
-                        //                      i_tmp += 1;
-                      }
-                      e = System.nanoTime();
-                      decodeTime += (e - s);
-
-                      buffer.close();
-                    }
-
-                    ratio /= repeatTime;
-                    compressed_size /= repeatTime;
-                    encodeTime /= repeatTime;
-                    decodeTime /= repeatTime;
-                    compressTime /= repeatTime;
-                    uncompressTime /= repeatTime;
-
-                    String[] record = {
+              String[] record = {
                       f.toString(),
                       String.valueOf(index),
                       encoding.toString(),
                       comp.toString(),
                       String.valueOf(encodeTime),
                       String.valueOf(decodeTime),
-                      //                      String.valueOf(compressTime),
-                      //                      String.valueOf(uncompressTime),
                       String.valueOf(data.size()),
                       String.valueOf(compressed_size),
                       String.valueOf(ratio)
-                    };
-                    System.out.println(ratio);
-                    writer.writeRecord(record);
-                  }
-                }
-                tmp.clear();
-                break;
-              }
-            case "long":
-              {
-                TSDataType dataType = TSDataType.INT64;
-                ArrayList<Long> tmp = new ArrayList<>();
-                for (String value : data) {
-                  tmp.add(Long.valueOf(value));
-                }
-                // Iterate over each encoding algorithm
-                for (TSEncoding encoding : encodingList) {
-                  Encoder encoder =
-                      TSEncodingBuilder.getEncodingBuilder(encoding).getEncoder(dataType);
-                  Decoder decoder = Decoder.getDecoderByType(encoding, dataType);
-                  long encodeTime = 0;
-                  long decodeTime = 0;
-
-                  // Iterate over each compression algorithm
-                  for (CompressionType comp : compressList) {
-                    ICompressor compressor = ICompressor.getCompressor(comp);
-                    IUnCompressor unCompressor = IUnCompressor.getUnCompressor(comp);
-                    double ratio = 0;
-                    double compressed_size = 0;
-
-                    long compressTime = 0;
-                    long uncompressTime = 0;
-                    for (int i = 0; i < repeatTime; i++) {
-                      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-
-                      // test encode time
-                      long s = System.nanoTime();
-                      for (long val : tmp) encoder.encode(val, buffer);
-                      encoder.flush(buffer);
-                      long e = System.nanoTime();
-                      encodeTime += (e - s);
-
-                      // test compress time
-                      byte[] elems = buffer.toByteArray();
-                      s = System.nanoTime();
-                      byte[] compressed = compressor.compress(elems);
-                      e = System.nanoTime();
-                      compressTime += (e - s);
-
-                      // test compression ratio and compressed size
-                      compressed_size = compressed.length;
-                      double ratioTmp =
-                          (double) compressed.length / (double) (tmp.size() * Long.BYTES);
-                      ratio += ratioTmp;
-
-                      // test uncompress time
-                      s = System.nanoTime();
-                      byte[] x = unCompressor.uncompress(compressed);
-                      e = System.nanoTime();
-                      uncompressTime += (e - s);
-
-                      // test decode time
-                      ByteBuffer ebuffer = ByteBuffer.wrap(buffer.toByteArray());
-                      s = System.nanoTime();
-                      while (decoder.hasNext(ebuffer)) {
-                        decoder.readInt(ebuffer);
-                      }
-                      e = System.nanoTime();
-                      decodeTime += (e - s);
-
-                      buffer.close();
-                    }
-
-                    ratio /= repeatTime;
-                    compressed_size /= repeatTime;
-                    encodeTime /= repeatTime;
-                    decodeTime /= repeatTime;
-                    compressTime /= repeatTime;
-                    uncompressTime /= repeatTime;
-
-                    // write info to file
-                    String[] record = {
-                      f.toString(),
-                      String.valueOf(index),
-                      encoding.toString(),
-                      comp.toString(),
-                      String.valueOf(encodeTime),
-                      String.valueOf(decodeTime),
-                      String.valueOf(compressTime),
-                      String.valueOf(uncompressTime),
-                      String.valueOf(compressed_size),
-                      String.valueOf(ratio)
-                    };
-                    writer.writeRecord(record);
-                  }
-                }
-                break;
-              }
-            case "double":
-              {
-                TSDataType dataType = TSDataType.DOUBLE;
-                ArrayList<Double> tmp = new ArrayList<>();
-                data.removeIf(String::isEmpty);
-                for (String value : data) {
-                  tmp.add(Double.valueOf(value));
-                }
-                // Iterate over each encoding algorithm
-                for (TSEncoding encoding : encodingList) {
-                  Encoder encoder =
-                      TSEncodingBuilder.getEncodingBuilder(encoding).getEncoder(dataType);
-                  Decoder decoder = Decoder.getDecoderByType(encoding, dataType);
-                  long encodeTime = 0;
-                  long decodeTime = 0;
-
-                  // Iterate over each compression algorithm
-                  for (CompressionType comp : compressList) {
-                    ICompressor compressor = ICompressor.getCompressor(comp);
-                    IUnCompressor unCompressor = IUnCompressor.getUnCompressor(comp);
-                    long compressTime = 0;
-                    long uncompressTime = 0;
-                    double ratio = 0;
-                    double compressed_size = 0;
-
-                    // repeat many times to test time
-                    for (int i = 0; i < repeatTime; i++) {
-                      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-
-                      // test encode time
-                      long s = System.nanoTime();
-                      for (double val : tmp) encoder.encode(val, buffer);
-                      encoder.flush(buffer);
-                      long e = System.nanoTime();
-                      encodeTime += (e - s);
-
-                      // test compress time
-                      byte[] elems = buffer.toByteArray();
-                      s = System.nanoTime();
-                      byte[] compressed = compressor.compress(elems);
-                      e = System.nanoTime();
-                      compressTime += (e - s);
-
-                      // test compression ratio and compressed size
-                      compressed_size = compressed.length;
-                      double ratioTmp =
-                          (double) compressed.length / (double) (tmp.size() * Double.BYTES);
-                      ratio += ratioTmp;
-
-                      // test uncompress time
-                      s = System.nanoTime();
-                      byte[] x = unCompressor.uncompress(compressed);
-                      e = System.nanoTime();
-                      uncompressTime += (e - s);
-
-                      // test decode time
-                      ByteBuffer ebuffer = ByteBuffer.wrap(buffer.toByteArray());
-                      s = System.nanoTime();
-                      int i_de = 0;
-                      while (decoder.hasNext(ebuffer)) {
-                        double v = decoder.readDouble(ebuffer);
-                        //                      if(v!=Double.parseDouble(data.get(i_de))){
-                        //                        System.out.println(v);
-                        //                        System.out.println(data.get(i_de));
-                        //                        System.out.println("noequal");
-                        //                        System.out.println(encoding);
-                        //                      };
-                        //                      i_de++;
-                      }
-                      e = System.nanoTime();
-                      decodeTime += (e - s);
-
-                      buffer.close();
-                    }
-
-                    ratio /= repeatTime;
-                    compressed_size /= repeatTime;
-                    encodeTime /= repeatTime;
-                    decodeTime /= repeatTime;
-                    compressTime /= repeatTime;
-                    uncompressTime /= repeatTime;
-
-                    // write info to file
-                    String[] record = {
-                      f.toString(),
-                      String.valueOf(index),
-                      encoding.toString(),
-                      comp.toString(),
-                      String.valueOf(encodeTime),
-                      String.valueOf(decodeTime),
-                      String.valueOf(compressTime),
-                      String.valueOf(uncompressTime),
-                      String.valueOf(compressed_size),
-                      String.valueOf(ratio)
-                    };
-                    writer.writeRecord(record);
-                    System.out.println(ratio);
-                  }
-                }
-                break;
-              }
-            case "float":
-              {
-                TSDataType dataType = TSDataType.FLOAT;
-                ArrayList<Float> tmp = new ArrayList<>();
-                data.removeIf(String::isEmpty);
-                for (int i = 0; i < data.size(); i++) {
-                  tmp.add(Float.valueOf(data.get(i)));
-                }
-
-                // Iterate over each encoding algorithm
-                for (TSEncoding encoding : encodingList) {
-                  Encoder encoder;
-                  //                if(encoding == TSEncoding.TS_2DIFF){
-                  //                  Map<String, String> props = null;
-                  //                  props.put(Encoder.MAX_POINT_NUMBER,
-                  // String.valueOf(max_precision));
-                  //                  TSEncodingBuilder.Ts2Diff.setMaxPointNumber(max_precision);
-                  //                }
-                  encoder = TSEncodingBuilder.getEncodingBuilder(encoding).getEncoder(dataType);
-
-                  Decoder decoder = Decoder.getDecoderByType(encoding, dataType);
-
-                  long encodeTime = 0;
-                  long decodeTime = 0;
-                  // Iterate over each compression algorithm
-                  for (CompressionType comp : compressList) {
-                    ICompressor compressor = ICompressor.getCompressor(comp);
-                    IUnCompressor unCompressor = IUnCompressor.getUnCompressor(comp);
-                    long compressTime = 0;
-                    long uncompressTime = 0;
-                    double ratio = 0;
-                    double compressed_size = 0;
-
-                    // repeat many times to test time
-                    for (int i = 0; i < repeatTime; i++) {
-                      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-
-                      // test encode time
-                      long s = System.nanoTime();
-                      for (float val : tmp) {
-                        encoder.encode(val, buffer);
-                      }
-                      encoder.flush(buffer);
-                      long e = System.nanoTime();
-                      encodeTime += (e - s);
-
-                      // test compress time
-                      byte[] elems = buffer.toByteArray();
-                      s = System.nanoTime();
-                      byte[] compressed = compressor.compress(elems);
-                      e = System.nanoTime();
-                      compressTime += (e - s);
-
-                      // test compression ratio and compressed size
-                      compressed_size += compressed.length;
-                      double ratioTmp =
-                          (double) compressed.length / (double) (tmp.size() * Float.BYTES);
-                      ratio += ratioTmp;
-
-                      // test uncompress time
-                      s = System.nanoTime();
-                      byte[] x = unCompressor.uncompress(compressed);
-                      e = System.nanoTime();
-                      uncompressTime += (e - s);
-
-                      // test decode time
-                      ByteBuffer ebuffer = ByteBuffer.wrap(buffer.toByteArray());
-                      while (decoder.hasNext(ebuffer)) {
-                        decoder.readFloat(ebuffer);
-                      }
-                      e = System.nanoTime();
-                      decodeTime += (e - s);
-
-                      buffer.close();
-                    }
-                    ratio /= repeatTime;
-                    compressed_size /= repeatTime;
-                    encodeTime /= repeatTime;
-                    decodeTime /= repeatTime;
-                    compressTime /= repeatTime;
-                    uncompressTime /= repeatTime;
-
-                    // write info to file
-                    String[] record = {
-                      f.toString(),
-                      String.valueOf(index),
-                      encoding.toString(),
-                      comp.toString(),
-                      String.valueOf(encodeTime),
-                      String.valueOf(decodeTime),
-                      String.valueOf(compressTime),
-                      String.valueOf(uncompressTime),
-                      String.valueOf(compressed_size),
-                      String.valueOf(ratio)
-                    };
-                    writer.writeRecord(record);
-                  }
-                }
-                break;
-              }
+              };
+              System.out.println(ratio);
+              writer.writeRecord(record);
+            }
           }
+          tmp.clear();
           inputStream = Files.newInputStream(f.toPath());
           loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
         }
-        //        if (fileRepeat > repeatTime) break;
-        //      break;
       }
       writer.close();
     }
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompress1ArrayTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompress1ArrayTest.java
deleted file mode 100644
index 9f85891..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompress1ArrayTest.java
+++ /dev/null
@@ -1,3279 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-
-import static java.lang.Math.abs;
-
-public class REGERCompress1ArrayTest {
-    public static int getBitWith(int num) {
-        if (num == 0) return 1;
-        else return 32 - Integer.numberOfLeadingZeros(num);
-    }
-
-    public static boolean containsValue(int[] array, int targetValue) {
-        for (int value : array) {
-            if (value == targetValue) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static int[] removeElement(int[] array, int position) {
-        if (position < 0 || position >= array.length) {
-            return array;
-        }
-
-        int[] newArray = new int[array.length - 1];
-        int newIndex = 0;
-
-        for (int i = 0; i < array.length; i++) {
-            if (i != position) {
-                newArray[newIndex] = array[i];
-                newIndex++;
-            }
-        }
-
-        return newArray;
-    }
-
-    public static int min3(int a, int b, int c) {
-        if (a < b && a < c) {
-            return 0;
-        } else if (b < c) {
-            return 1;
-        } else {
-            return 2;
-        }
-    }
-
-    public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 24);
-        cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-        cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 3] = (byte) (integer);
-    }
-
-    public static void long2Bytes(long integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 56);
-        cur_byte[encode_pos + 1] = (byte) (integer >> 48);
-        cur_byte[encode_pos + 2] = (byte) (integer >> 40);
-        cur_byte[encode_pos + 3] = (byte) (integer >> 32);
-        cur_byte[encode_pos + 4] = (byte) (integer >> 24);
-        cur_byte[encode_pos + 5] = (byte) (integer >> 16);
-        cur_byte[encode_pos + 6] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 7] = (byte) (integer);
-    }
-
-
-    public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer);
-    }
-
-    public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 1] = (byte) (integer);
-    }
-
-    public static int bytes2Integer(byte[] encoded, int start, int num) {
-        int value = 0;
-        if (num > 4) {
-            System.out.println("bytes2Integer error");
-            return 0;
-        }
-        for (int i = 0; i < num; i++) {
-            value <<= 8;
-            int b = encoded[i + start] & 0xFF;
-            value |= b;
-        }
-        return value;
-    }
-
-    private static int byte2Integer(byte[] encoded, int decode_pos) {
-        int value = 0;
-        int b = encoded[decode_pos] & 0xFF;
-        value |= b;
-        if (value == 0)
-            return 256;
-        return value % 256;
-    }
-
-    public static void pack8Values(ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-        int bufIdx = 0;
-        int valueIdx = offset;
-        // remaining bits for the current unfinished Integer
-        int leftBit = 0;
-
-        while (valueIdx < 8 + offset) {
-            // buffer is used for saving 32 bits as a part of result
-            int buffer = 0;
-            // remaining size of bits in the 'buffer'
-            int leftSize = 32;
-
-            // encode the left bits of current Integer to 'buffer'
-            if (leftBit > 0) {
-                buffer |= (values.get(valueIdx) << (32 - leftBit));
-                leftSize -= leftBit;
-                leftBit = 0;
-                valueIdx++;
-            }
-
-            while (leftSize >= width && valueIdx < 8 + offset) {
-                // encode one Integer to the 'buffer'
-                buffer |= (values.get(valueIdx) << (leftSize - width));
-                leftSize -= width;
-                valueIdx++;
-            }
-            // If the remaining space of the buffer can not save the bits for one Integer,
-            if (leftSize > 0 && valueIdx < 8 + offset) {
-                // put the first 'leftSize' bits of the Integer into remaining space of the
-                // buffer
-                buffer |= (values.get(valueIdx) >>> (width - leftSize));
-                leftBit = width - leftSize;
-            }
-
-            // put the buffer into the final result
-            for (int j = 0; j < 4; j++) {
-                encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-                encode_pos++;
-                bufIdx++;
-                if (bufIdx >= width) {
-                    return;
-                }
-            }
-        }
-//        return encode_pos;
-    }
-
-    public static void pack8Values(long[] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-        int bufIdx = 0;
-        int valueIdx = offset;
-        // remaining bits for the current unfinished Integer
-        int leftBit = 0;
-
-        while (valueIdx < 8 + offset) {
-            // buffer is used for saving 32 bits as a part of result
-            int buffer = 0;
-            // remaining size of bits in the 'buffer'
-            int leftSize = 32;
-
-            // encode the left bits of current Integer to 'buffer'
-            if (leftBit > 0) {
-
-                buffer |= (getInt(values[valueIdx],index) << (32 - leftBit));
-                leftSize -= leftBit;
-                leftBit = 0;
-                valueIdx++;
-            }
-
-            while (leftSize >= width && valueIdx < 8 + offset) {
-                // encode one Integer to the 'buffer'
-                buffer |= (getInt(values[valueIdx],index) << (leftSize - width));
-                leftSize -= width;
-                valueIdx++;
-            }
-            // If the remaining space of the buffer can not save the bits for one Integer,
-            if (leftSize > 0 && valueIdx < 8 + offset) {
-                // put the first 'leftSize' bits of the Integer into remaining space of the
-                // buffer
-                buffer |= (getInt(values[valueIdx],index) >>> (width - leftSize));
-                leftBit = width - leftSize;
-            }
-
-            // put the buffer into the final result
-            for (int j = 0; j < 4; j++) {
-                encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-                encode_pos++;
-                bufIdx++;
-                if (bufIdx >= width) {
-                    return;
-                }
-            }
-        }
-//        return encode_pos;
-    }
-
-    public static int unpack8Values(byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-        int byteIdx = offset;
-//        int pos_encode = 0;
-        long buffer = 0;
-        // total bits which have read from 'buf' to 'buffer'. i.e.,
-        // number of available bits to be decoded.
-        int totalBits = 0;
-        int valueIdx = 0;
-
-        while (valueIdx < 8) {
-            // If current available bits are not enough to decode one Integer,
-            // then add next byte from buf to 'buffer' until totalBits >= width
-            while (totalBits < width) {
-                buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-                byteIdx++;
-                totalBits += 8;
-            }
-
-            // If current available bits are enough to decode one Integer,
-            // then decode one Integer one by one until left bits in 'buffer' is
-            // not enough to decode one Integer.
-            while (totalBits >= width && valueIdx < 8) {
-                result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-                value_pos++;
-                valueIdx++;
-                totalBits -= width;
-                buffer = buffer & ((1L << totalBits) - 1);
-            }
-        }
-        return value_pos;
-    }
-
-    public static int bitPacking(long[] numbers, int index, int start, int block_size, int bit_width, int encode_pos, byte[] encoded_result) {
-        int block_num = block_size / 8;
-        for (int i = 0; i < block_num; i++) {
-            pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-            encode_pos += bit_width;
-        }
-
-        return encode_pos;
-
-    }
-
-    public static int decodeBitPacking(
-            byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-        int block_num = block_size / 8;
-        int value_pos = 0;
-
-        for (int i = 0; i < block_num; i++) { // bitpacking
-            value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-            decode_pos += bit_width;
-        }
-        return decode_pos;
-    }
-
-
-    public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-        int fbit = Float.floatToIntBits(f);
-        byte[] b = new byte[4];
-        for (int i = 0; i < 4; i++) {
-            b[i] = (byte) (fbit >> (24 - i * 8));
-        }
-        int len = b.length;
-
-        System.arraycopy(b, 0, encode_result, pos_encode, len);
-        byte temp;
-        for (int i = 0; i < len / 2; ++i) {
-            temp = encode_result[i + pos_encode];
-            encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-            encode_result[len - i - 1 + pos_encode] = temp;
-        }
-    }
-
-    public static float bytes2float(byte[] b, int index) {
-        int l;
-        l = b[index];
-        l &= 0xff;
-        l |= ((long) b[index + 1] << 8);
-        l &= 0xffff;
-        l |= ((long) b[index + 2] << 16);
-        l &= 0xffffff;
-        l |= ((long) b[index + 3] << 24);
-        return Float.intBitsToFloat(l);
-    }
-
-    public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-        int value = 0;
-        if (num > 4) {
-            System.out.println("bytes2Integer error");
-            return 0;
-        }
-        for (int i = 0; i < num; i++) {
-            value <<= 8;
-            int b = encoded.get(i + start) & 0xFF;
-            value |= b;
-        }
-        return value;
-    }
-
-    public static int part(int[][] arr, int index, int low, int high) {
-        int[] tmp = arr[low];
-        while (low < high) {
-            while (low < high
-                    && (arr[high][index] > tmp[index]
-                    || (Objects.equals(arr[high][index], tmp[index])
-                    && arr[high][index ^ 1] >= tmp[index ^ 1]))) {
-                high--;
-            }
-            arr[low][0] = arr[high][0];
-            arr[low][1] = arr[high][1];
-            while (low < high
-                    && (arr[low][index] < tmp[index]
-                    || (Objects.equals(arr[low][index], tmp[index])
-                    && arr[low][index ^ 1] <= tmp[index ^ 1]))) {
-                low++;
-            }
-            arr[high][0] = arr[low][0];
-            arr[high][1] = arr[low][1];
-        }
-        arr[low][0] = tmp[0];
-        arr[low][1] = tmp[1];
-        return low;
-    }
-
-    public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-        ArrayList<Integer> tmp = arr.get(low);
-        while (low < high) {
-            while (low < high
-                    && (arr.get(high).get(index) > tmp.get(index)
-                    || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                    && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-                high--;
-            }
-            arr.set(low, arr.get(high));
-            while (low < high
-                    && (arr.get(low).get(index) < tmp.get(index)
-                    || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                    && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-                low++;
-            }
-            arr.set(high, arr.get(low));
-        }
-        arr.set(low, tmp);
-        return low;
-    }
-
-    public static long combine2Int(int int1, int int2){
-        return  ((long) int1 << 32) | (int2 & 0xFFFFFFFFL);
-    }
-
-    public static int getTime(long long1){
-        return  ((int) (long1 >> 32)) ;
-    }
-    public static int getValue(long long1){
-        return  ((int) (long1)) ;
-    }
-    public static int getInt(long long1, int index){
-        if(index==0) return (int) (long1 >> 32);
-        else return (int) (long1);
-    }
-
-    public static int getCommon(int m, int n) {
-        int z;
-        while (m % n != 0) {
-            z = m % n;
-            m = n;
-            n = z;
-        }
-        return n;
-    }
-
-//    public static void splitTimeStamp3(
-//            ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-//        int td_common = 0;
-//        for (int i = 1; i < ts_block.size(); i++) {
-//            int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-//            if (td_common == 0) {
-//                if (time_diffi != 0) {
-//                    td_common = time_diffi;
-//                }
-//                continue;
-//            }
-//            if (time_diffi != 0) {
-//                td_common = getCommon(time_diffi, td_common);
-//                if (td_common == 1) {
-//                    break;
-//                }
-//            }
-//        }
-//        if (td_common == 0) {
-//            td_common = 1;
-//        }
-//
-//        int t0 = ts_block.get(0).get(0);
-//        for (int i = 0; i < ts_block.size(); i++) {
-//            ArrayList<Integer> tmp = new ArrayList<>();
-//            int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-//            tmp.add(t0 + interval_i);
-//            tmp.add(ts_block.get(i).get(1));
-//            ts_block.set(i, tmp);
-//        }
-//        result.add(td_common);
-//    }
-    public static void splitTimeStamp3(
-            ArrayList<Long> ts_block, ArrayList<Integer> result) {
-        int td_common = 0;
-
-        for (int i = 1; i < ts_block.size(); i++) {
-            int cur_value =  getTime(ts_block.get(i));
-            int pre_value = getTime(ts_block.get(i-1));
-            int time_diffi = cur_value  - pre_value;
-
-            if (td_common == 0) {
-                if (time_diffi != 0) {
-                    td_common = time_diffi;
-                }
-                continue;
-            }
-            if (time_diffi != 0) {
-                td_common = getCommon(time_diffi, td_common);
-                if (td_common == 1) {
-                    break;
-                }
-            }
-        }
-        if (td_common == 0) {
-            td_common = 1;
-        }
-
-        int t0 =  getTime(ts_block.get(0));
-        for (int i = 0; i < ts_block.size(); i++) {
-//            ArrayList<Integer> tmp = new ArrayList<>();
-            int cur_value =getTime(ts_block.get(i));
-            int interval_i = ((cur_value - t0) / td_common);
-            ts_block.set(i, combine2Int(t0 + interval_i, getValue(ts_block.get(i))));
-//            tmp.add(t0 + interval_i);
-//            tmp.add(ts_block.get(i).get(1));
-//            ts_block.set(i, tmp);
-        }
-        result.add(td_common);
-    }
-
-    private static void adjust1TimeCost(long[] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-
-        int block_size = ts_block.length;
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        long tmp_i = ts_block[i];
-        long tmp_i_1 = ts_block[i-1];
-
-        int min_delta_time = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-        int min_delta_time_i = min_delta_time;
-        int min_delta_time_index = i;
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-
-            if (epsilon_r_j < min_delta_time) {
-                min_delta_time_index = j;
-                min_delta_time = epsilon_r_j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        for (int j = 1; j < block_size; j++) {
-//            int timestamp_delta_i = getTime(ts_block[j]) - (int) (theta0_t + theta1_t * (float) getTime(ts_block[j - 1]));
-//            if (timestamp_delta_i < min_delta_time) {
-//                min_delta_time_index = j;
-//                min_delta_time = timestamp_delta_i;
-//            }
-//        }
-        raw_length[0] += (getBitWith(min_delta_time_i - min_delta_time) * (block_size - 1));
-        raw_length[3] = min_delta_time;
-        min_index.set(0, min_delta_time_index);
-
-
-    }
-
-    private static void adjust1ValueCost(long[] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-        int block_size = ts_block.length;
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-
-        int min_delta_value = getValue(ts_block[i]) - (int) (theta0_v + theta1_v * (float) getValue(ts_block[i - 1]));
-        int min_delta_value_i = min_delta_value;
-        int min_delta_value_index = i;
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < min_delta_value) {
-                min_delta_value_index = j;
-                min_delta_value = epsilon_r_j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-
-//        for (int j = 1; j < block_size; j++) {
-//            int value_delta_i = getValue(ts_block[j]) - (int) (theta0_v + theta1_v * (float) getValue(ts_block[j - 1]));
-//            if (value_delta_i < min_delta_value) {
-//                min_delta_value_index = j;
-//                min_delta_value = value_delta_i;
-//            }
-//        }
-        raw_length[0] += (getBitWith(min_delta_value_i - min_delta_value) * (block_size - 1));
-        raw_length[3] = min_delta_value;
-        min_index.set(0, min_delta_value_index);
-
-
-    }
-
-    private static int[] adjust0MinChange(
-            long[] ts_block, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != block_size;
-
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        long[] ts_block_delta = new long[block_size - 1];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-
-        int pos_ts_block_delta = 0;
-        for (int i = 2; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i != j) {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i =
-                        getTime(tmp_i)
-                                - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i =
-                        getValue(tmp_i)
-                                - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-
-            } else {
-                long tmp_j = ts_block[j];
-                long tmp_0 = ts_block[0];
-                long tmp_j_1 = ts_block[j-1];
-                timestamp_delta_i =
-                       getTime(tmp_j)
-                                - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-                value_delta_i =
-                        getValue(tmp_j)
-                                - (int) (theta0_v + theta1_v * (float) getValue(tmp_0));
-
-                long delta_i = combine2Int(timestamp_delta_i,value_delta_i);
-                ts_block_delta[pos_ts_block_delta] = delta_i;
-                pos_ts_block_delta++;
-
-                if (timestamp_delta_i > timestamp_delta_max) {
-                    timestamp_delta_max = timestamp_delta_i;
-                }
-                if (timestamp_delta_i < timestamp_delta_min) {
-                    timestamp_delta_min = timestamp_delta_i;
-                }
-                if (value_delta_i > value_delta_max) {
-                    value_delta_max = value_delta_i;
-                }
-                if (value_delta_i < value_delta_min) {
-                    value_delta_min = value_delta_i;
-                }
-                timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-                value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-            }
-            long delta_i = combine2Int(timestamp_delta_i,value_delta_i);
-            ts_block_delta[pos_ts_block_delta] = delta_i;
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i > timestamp_delta_max) {
-                timestamp_delta_max = timestamp_delta_i;
-            }
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i > value_delta_max) {
-                value_delta_max = value_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        int length = 0;
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjust0MinChangeNo(
-            long[] ts_block, int[] raw_length, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != block_size;
-
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_j_plus_1 = ts_block[j + 1];
-        long tmp_j_minus_1 = ts_block[j - 1];
-        long tmp_1 = ts_block[1];
-        long tmp_0 = ts_block[0];
-
-        timestamp_delta_i = getTime(tmp_j_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_j_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-        timestamp_delta_i = getTime(tmp_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-        value_delta_i = getValue(tmp_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_0));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_j_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-        value_delta_i = getValue(tmp_j_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_0));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust 0 to n
-    private static int[] adjust0n1MinChange(
-            long[] ts_block, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        long[] ts_block_delta = new long[block_size - 1];
-        int pos_ts_block_delta = 0;
-        int length = 0;
-        for (int i = 2; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            long tmp_i = ts_block[i];
-            long tmp_i_1 = ts_block[i-1];
-
-            timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-            value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-//            ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-//            ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-            pos_ts_block_delta++;
-
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-        }
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_0 = ts_block[0];
-        long tmp_block_size_1 = ts_block[block_size-1];
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-        ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-            value_delta_min = value_delta_i;
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjust0n1MinChangeNo(
-            long[] ts_block, int[] raw_length, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_1 = ts_block[1];
-        long tmp_0 = ts_block[1];
-        long tmp_block_size_1 = ts_block[1];
-
-
-        timestamp_delta_i = getTime(tmp_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-        value_delta_i = getValue(tmp_1) - (int) (theta0_v + theta1_v * (float)  getValue(tmp_0));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust n to no 0
-    private static int[] adjustnMinChange(
-            long[] ts_block, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        long[] ts_block_delta = new long[block_size - 1];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        int length = 0;
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size - 1; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i != j) {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i)- (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            } else {
-                long tmp_j = ts_block[j];
-                long tmp_block_size_1 = ts_block[block_size-1];
-                long tmp_j_1 = ts_block[j-1];
-
-                timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-                value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-                ts_block_delta[pos_ts_block_delta]= combine2Int(timestamp_delta_i,value_delta_i);
-                pos_ts_block_delta++;
-                if (timestamp_delta_i < timestamp_delta_min) {
-                    timestamp_delta_min = timestamp_delta_i;
-                }
-                if (value_delta_i < value_delta_min) {
-                    value_delta_min = value_delta_i;
-                }
-
-                timestamp_delta_i = getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-                value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            }
-            ts_block_delta[pos_ts_block_delta]= combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustnMinChangeNo(
-            long[] ts_block, int[] raw_length, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-
-        long tmp_j = ts_block[j];
-        long tmp_block_size_1 = ts_block[block_size-1];
-        long tmp_block_size_2 = ts_block[block_size-2];
-        long tmp_j_1 = ts_block[j-1];
-
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-        value_delta_i =  getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i =getTime(tmp_block_size_1)  - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_2) );
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_2));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i =  getTime(tmp_j)  - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1) );
-        value_delta_i =  getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-
-        timestamp_delta_i = getTime(tmp_block_size_1)  - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    // adjust n to 0
-    private static int[] adjustn0MinChange(long[] ts_block, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int length = 0;
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size - 1; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            long tmp_i = ts_block[i];
-            long tmp_i_1 = ts_block[i-1];
-            timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-            value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        long tmp_block_size_1 = ts_block[block_size-1];
-        long tmp_0 = ts_block[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-        ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-            value_delta_min = value_delta_i;
-        }
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustn0MinChangeNo(
-            long[] ts_block, int[] raw_length, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_block_size_1 = ts_block[block_size-1];
-        long tmp_block_size_2 = ts_block[block_size-2];
-        long tmp_0 = ts_block[0];
-
-
-        timestamp_delta_i =getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_2));
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_2) );
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0)  - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1) );
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust alpha to j
-
-    private static int[] adjustAlphaToJMinChange(
-            long[] ts_block, int alpha, int j, float[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        assert j != 0;
-        assert j != block_size;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        long tmp_j = ts_block[j];
-        long tmp_j_minus_1 = ts_block[j-1];
-
-        int length = 0;
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-
-
-            if (i == j) {
-                timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-                value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-            } else if (i == alpha) {
-                timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-                value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-            } else if (i == alpha + 1) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            }
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-
-        return b;
-    }
-
-    private static int[] adjustAlphaToJMinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, int j, float[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        assert j != 0;
-        assert j != block_size;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_j = ts_block[j];
-        long tmp_j_minus_1 = ts_block[j-1];
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // move alpha to 0
-    private static int[] adjustTo0MinChange(long[] ts_block, int alpha, float[] theta,
-                                            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i == (alpha + 1)) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-            } else if (i == alpha) {
-                long tmp_0 = ts_block[0];
-                timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-                value_delta_i =  getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            }
-
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        int length = 0;
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustTo0MinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, float[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        long tmp_0 = ts_block[0];
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // move alpha to n
-    private static int[] adjustTonMinChange(
-            long[] ts_block, int alpha, float[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int pos_ts_block_delta = 0;
-        int length = 0;
-
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i == (alpha + 1)) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-            } else if (i == alpha) {
-                long tmp_block_size_1 = ts_block[block_size - 1];
-                timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-                value_delta_i =  getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            }
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-
-        return b;
-    }
-
-    private static int[] adjustTonMinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, float[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-
-        int timestamp_delta_i;
-        int value_delta_i;
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        long tmp_block_size_1 = ts_block[block_size - 1];
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i =  getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    private static int getIstarClose(int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-        int min_i = 0;
-        int min_dis = Integer.MAX_VALUE;
-        for (int i = 0; i < j_star_list.size(); i++) {
-            if (abs(alpha - j_star_list.get(i)) < min_dis) {
-                min_i = j_star_list.get(i);
-                min_dis = abs(alpha - j_star_list.get(i));
-                raw_length[0] = new_length_list[i][0];
-                raw_length[3] = new_length_list[i][1];
-                raw_length[4] = new_length_list[i][2];
-            }
-        }
-        if (min_dis == 0) {
-            System.out.println("get IstarClose error");
-            return 0;
-        }
-        return min_i;
-    }
-
-    public static void trainParameter( long[] ts_block,int block_size,float[] theta){
-        long sum_X_r = 0;
-        long sum_Y_r = 0;
-        long sum_squ_X_r = 0;
-        long sum_squ_XY_r = 0;
-        long sum_X_v = 0;
-        long sum_Y_v = 0;
-        long sum_squ_X_v = 0;
-        long sum_squ_XY_v = 0;
-
-        for (int i = 1; i < block_size; i++) {
-            long ts_block_i_1 = ts_block[i - 1];
-            long ts_block_i = ts_block[i];
-            long ts_block_i_1_time = getTime(ts_block_i_1);
-            long ts_block_i_1_value = getValue(ts_block_i_1);
-            long ts_block_i_time = getTime(ts_block_i);
-            long ts_block_i_value = getValue(ts_block_i);
-
-
-            sum_X_r += (ts_block_i_1_time);
-            sum_X_v += (ts_block_i_1_value);
-            sum_Y_r += (ts_block_i_time);
-            sum_Y_v += (ts_block_i_value);
-            sum_squ_X_r += (ts_block_i_1_time * (ts_block_i_1_time));
-            sum_squ_X_v += (ts_block_i_1_value * ts_block_i_1_value);
-            sum_squ_XY_r += (ts_block_i_1_time * ts_block_i_time);
-            sum_squ_XY_v += (ts_block_i_1_value * ts_block_i_value);
-        }
-
-        int m_reg = block_size - 1;
-        float theta0_r = 0.0F;
-        float theta1_r = 1.0F;
-        if (m_reg * sum_squ_X_r != sum_X_r * sum_X_r) {
-            theta0_r =
-                    (float) (sum_squ_X_r * sum_Y_r - sum_X_r * sum_squ_XY_r)
-                            / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-            theta1_r =
-                    (float) (m_reg * sum_squ_XY_r - sum_X_r * sum_Y_r)
-                            / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-        }
-
-        float theta0_v = 0.0F;
-        float theta1_v = 1.0F;
-        if (m_reg * sum_squ_X_v != sum_X_v * sum_X_v) {
-            theta0_v =
-                    (float) (sum_squ_X_v * sum_Y_v - sum_X_v * sum_squ_XY_v)
-                            / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-            theta1_v =
-                    (float) (m_reg * sum_squ_XY_v - sum_X_v * sum_Y_v)
-                            / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-        }
-        theta[0] = theta0_r;
-        theta[1] = theta1_r;
-        theta[2] = theta0_v;
-        theta[3] = theta1_v;
-    }
-
-    public static long[] getEncodeBitsRegressionNoTrain(
-            long[] ts_block,
-            int block_size,
-            int[] raw_length,
-            float[] theta,
-            int segment_size) {
-
-        long[] ts_block_delta = new long[ts_block.length];
-
-        float theta0_r = theta[0];
-        float theta1_r = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        ts_block_delta[0] = ts_block[0];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_r + theta1_r * (float) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-            }
-            ts_block_delta[j] = combine2Int(epsilon_r_j,epsilon_v_j);
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        // delta to Regression
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r =
-//                    getTime(tmp_j) - (int) (theta0_r + theta1_r * (float) getTime(tmp_j_1));
-//            int epsilon_v =
-//                    getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-//
-//
-//            if (epsilon_r < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r;
-//            }
-//            if (epsilon_v < value_delta_min) {
-//                value_delta_min = epsilon_v;
-//            }
-//            ts_block_delta[j] = combine2Int(epsilon_r,epsilon_v);
-////            ts_block_delta[j][1] = epsilon_v;
-//        }
-
-
-        int max_interval = Integer.MIN_VALUE;
-        int max_value = Integer.MIN_VALUE;
-        int max_interval_segment = Integer.MIN_VALUE;
-        int max_value_segment = Integer.MIN_VALUE;
-        int length = 0;
-        long delta_time = combine2Int(timestamp_delta_min,value_delta_min);
-//        for (int i = block_size - 1; i > 0; i--) {
-        for (int i = 1; i < block_size; i++) {
-            tmp_j = ts_block_delta[i];
-            int epsilon_r = getTime(tmp_j) - timestamp_delta_min;
-            int epsilon_v = getValue(tmp_j) - value_delta_min;
-
-            ts_block_delta[i] = combine2Int(epsilon_r,epsilon_v);
-
-            if (epsilon_r > max_interval) {
-                max_interval = epsilon_r;
-            }
-            if (epsilon_v > max_value) {
-                max_value = epsilon_v;
-            }
-
-            if (epsilon_r > max_interval_segment) {
-                max_interval_segment = epsilon_r;
-            }
-            if (epsilon_v > max_value_segment) {
-                max_value_segment = epsilon_v;
-            }
-            if(i%segment_size==0){
-                length += getBitWith(max_interval_segment)*segment_size;
-                length += getBitWith(max_value_segment)*segment_size;
-                max_interval_segment = Integer.MIN_VALUE;
-                max_value_segment = Integer.MIN_VALUE;
-            }
-        }
-
-        int max_bit_width_interval = getBitWith(max_interval);
-        int max_bit_width_value = getBitWith(max_value);
-
-
-        raw_length[0] = length;
-        raw_length[1] = max_bit_width_interval;
-        raw_length[2] = max_bit_width_value;
-        raw_length[3] = timestamp_delta_min;
-        raw_length[4] = value_delta_min;
-
-//        printTSBlock(ts_block_delta);
-        return ts_block_delta;
-
-//        int[][] ts_block_delta_segment = new int[block_size][2];
-//        int pos_ts_block_delta_segment = 0;
-//        int[] tmp_segment = new int[2];
-//        int max_interval_segment = Integer.MIN_VALUE;
-//        int max_value_segment = Integer.MIN_VALUE;
-//        tmp_segment[0] = max_interval_segment;
-//        tmp_segment[1] = max_value_segment;
-//
-//
-//            if (epsilon_r > max_interval_segment) {
-//                max_interval_segment = epsilon_r;
-//                tmp_segment[0] = max_interval_segment;
-//            }
-//            if (epsilon_v > max_value_segment) {
-//                max_value_segment = epsilon_v;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//            if (j % segment_size == 0) {
-//                ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-//                ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-//                pos_ts_block_delta_segment++;
-//                tmp_segment = new int[2];
-//                max_interval_segment = Integer.MIN_VALUE;
-//                max_value_segment = Integer.MIN_VALUE;
-//                tmp_segment[0] = max_interval_segment;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//
-//
-//        for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-//            length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-//            length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-//        }
-
-
-    }
-
-    public static int getBeta(
-            long[] ts_block,
-            int alpha,
-            ArrayList<Integer> min_index,
-            int block_size,
-            int[] raw_length,
-            float[] theta) {
-
-        int raw_abs_sum = raw_length[0];
-        int[][] new_length_list = new int[block_size][3];
-        int pos_new_length_list = 0;
-        int range = block_size/16;
-
-        ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-        int j_star = -1;
-        int[] b;
-        if (alpha == -1) {
-            return j_star;
-        }
-
-        if (alpha == 0) {
-            if (min_index.get(0) == 1) {
-                adjust1TimeCost(ts_block, 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == 1) {
-                adjust1ValueCost(ts_block, 1, raw_length, min_index, theta);
-            }
-
-            for (int j = 2; j < range - 1; j++) {
-//            for (int j = 2; j < block_size - 1; j++) {
-                // if j, alpha+1, alpha points are min residuals, need to recalculate min residuals
-                if (min_index.contains(j)) { //|| min_index.contains(1)
-                    b = adjust0MinChange(ts_block, j, theta);
-                } else {
-                    b = adjust0MinChangeNo(ts_block, raw_length, j, theta);
-                }
-                if (b[0] < raw_abs_sum) {
-                    raw_abs_sum = b[0];
-                    j_star_list = new ArrayList<>();
-                    pos_new_length_list = 0;
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                } else if (b[0] == raw_abs_sum) {
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                }
-            }
-            if (min_index.contains(0)) {
-                b = adjust0n1MinChange(ts_block, theta);
-            } else {
-                b = adjust0n1MinChangeNo(ts_block, raw_length, theta);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-
-                j_star_list.add(block_size);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(block_size);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        } // alpha == n
-        else if (alpha == block_size - 1) {
-            if (min_index.get(0) == block_size - 1) {
-                adjust1TimeCost(ts_block, block_size - 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == block_size - 1) {
-                adjust1ValueCost(ts_block, block_size - 1, raw_length, min_index, theta);
-            }
-            for (int j = block_size - range; j < block_size - 1; j++) {
-//            for (int j = 1; j < block_size - 1; j++) {
-                if (min_index.contains(j)) { //min_index.contains(block_size - 1) ||
-                    b = adjustnMinChange(ts_block, j, theta);
-                } else {
-                    b = adjustnMinChangeNo(ts_block, raw_length, j, theta);
-                }
-                if (b[0] < raw_abs_sum) {
-                    raw_abs_sum = b[0];
-                    j_star_list = new ArrayList<>();
-                    j_star_list.add(j);
-                    pos_new_length_list = 0;
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                } else if (b[0] == raw_abs_sum) {
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                }
-            }
-            if (min_index.contains(0)) {//min_index.contains(block_size - 1) ||
-                b = adjustn0MinChange(ts_block, theta);
-            } else {
-                b = adjustn0MinChangeNo(ts_block, raw_length, theta);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list.clear();
-                j_star_list = new ArrayList<>();
-                j_star_list.add(0);
-
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(0);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        } // alpha != 1 and alpha != n
-        else {
-            if (min_index.get(0) == alpha) {
-                adjust1TimeCost(ts_block, alpha, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == alpha) {
-                adjust1ValueCost(ts_block, alpha, raw_length, min_index, theta);
-            }
-            if (min_index.get(0) == alpha + 1) {
-                adjust1TimeCost(ts_block, alpha + 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == alpha + 1) {
-                adjust1ValueCost(ts_block, alpha + 1, raw_length, min_index, theta);
-            }
-
-            long tmp_alpha = ts_block[alpha];
-            long tmp_alpha_plus_1 = ts_block[alpha+1];
-            long tmp_alpha_minus_1 = ts_block[alpha-1];
-
-            int start_j = Math.max(alpha-range/2,1);
-            int end_j = Math.min(alpha+range/2,block_size-1);
-            for (int j = start_j; j < end_j; j++) {
-//            for (int j = 1; j < block_size - 1; j++) {
-                if (alpha != j && (alpha + 1) != j) {
-                    if (min_index.contains(j)) { //|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                        b = adjustAlphaToJMinChange(ts_block, alpha, j, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-                    } else {
-                        b = adjustAlphaToJMinChangeNo(ts_block, raw_length, alpha, j, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-                    }
-                    if (b[0] < raw_abs_sum) {
-                        raw_abs_sum = b[0];
-                        j_star_list = new ArrayList<>();
-                        j_star_list.add(j);
-                        pos_new_length_list = 0;
-                        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                        pos_new_length_list++;
-                    } else if (b[0] == raw_abs_sum) {
-                        j_star_list.add(j);
-                        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                        pos_new_length_list++;
-                    }
-                }
-            }
-
-            if (min_index.contains(0)) {//|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                b = adjustTo0MinChange(ts_block, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            } else {
-                b = adjustTo0MinChangeNo(ts_block, raw_length, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-                j_star_list.add(0);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(0);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-            if (min_index.contains(block_size - 1)) {//|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                b = adjustTonMinChange(ts_block, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            } else {
-                b = adjustTonMinChangeNo(ts_block, raw_length, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            }
-
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-                j_star_list.add(block_size);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(block_size);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        }
-        int[][] new_new_length_list = new int[pos_new_length_list][5];
-        for (int i = 0; i < pos_new_length_list; i++) {
-            System.arraycopy(new_new_length_list[i], 0, new_length_list[i], 0, 3);
-        }
-
-        if (j_star_list.size() != 0) {
-            j_star = getIstarClose(alpha, j_star_list, new_new_length_list, raw_length);
-        }
-        return j_star;
-    }
-
-
-    public static int[] getIStar(
-            long[] ts_block, ArrayList<Integer> min_index, int block_size, int index, float[] theta) {
-
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_min_index = -1;
-        int value_delta_min_index = -1;
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        int timestamp_delta_max_index = -1;
-        int value_delta_max_index = -1;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-//        int[][] ts_block_delta = new int[block_size - 1][2];
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-                timestamp_delta_min_index = j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-                value_delta_min_index = j;
-            }
-            if (epsilon_r_j > timestamp_delta_max) {
-                timestamp_delta_max = epsilon_r_j;
-                timestamp_delta_max_index = j;
-            }
-            if (epsilon_v_j > value_delta_max) {
-                value_delta_max = epsilon_v_j;
-                value_delta_max_index = j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//
-//        }
-        min_index.add(timestamp_delta_min_index);
-        min_index.add(value_delta_min_index);
-
-
-        int[] alpha_list = new int[2];
-        if(index==0){
-            alpha_list[0] = value_delta_min_index;
-            alpha_list[1] = value_delta_max_index;
-        }else{
-            alpha_list[0] = timestamp_delta_min_index;
-            alpha_list[1] = timestamp_delta_max_index;
-        }
-
-        return alpha_list;
-    }
-
-    public static int[] getIStar(
-            long[] ts_block,
-            ArrayList<Integer> min_index,
-            int block_size,
-            float[] theta) {
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_min_index = -1;
-        int value_delta_min_index = -1;
-        int timestamp_delta_max_index = -1;
-        int value_delta_max_index = -1;
-
-        int[] alpha_list = new int[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-                timestamp_delta_min_index = j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-                value_delta_min_index = j;
-            }
-            if (epsilon_r_j > timestamp_delta_max) {
-                timestamp_delta_max = epsilon_r_j;
-                timestamp_delta_max_index = j;
-            }
-            if (epsilon_v_j > value_delta_max) {
-                value_delta_max = epsilon_v_j;
-                value_delta_max_index = j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r_j =
-//                    getTime(tmp_j)
-//                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-//            int epsilon_v_j =
-//                    getValue(tmp_j)
-//                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-//
-//            if (epsilon_v_j > value_delta_max) {
-//                value_delta_max = epsilon_v_j;
-//                value_delta_max_index = j;
-//            }
-//            if (epsilon_v_j < value_delta_min) {
-//                value_delta_min = epsilon_v_j;
-//                value_delta_min_index = j;
-//            }
-//            if (epsilon_r_j > timestamp_delta_max) {
-//                timestamp_delta_max = epsilon_r_j;
-//                timestamp_delta_max_index = j;
-//            }
-//            if (epsilon_r_j < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r_j;
-//                timestamp_delta_min_index = j;
-//            }
-//        }
-
-        min_index.add(timestamp_delta_min_index);
-        alpha_list[0] = timestamp_delta_min_index;
-        alpha_list[1] = timestamp_delta_max_index;
-
-
-        int pos_alpha_list = 2;
-        min_index.add(value_delta_min_index);
-        if (!containsValue(alpha_list, value_delta_min_index)) {
-            alpha_list[pos_alpha_list] = value_delta_min_index;
-            pos_alpha_list++;
-        }
-        if (!containsValue(alpha_list, value_delta_max_index)) {
-            alpha_list[pos_alpha_list] = value_delta_max_index;
-            pos_alpha_list++;
-        }
-
-
-        int[] new_alpha_list = new int[pos_alpha_list];
-        System.arraycopy(alpha_list, 0, new_alpha_list, 0, pos_alpha_list);
-
-        return new_alpha_list;
-    }
-
-
-    public static int encodeRLEBitWidth2Bytes(
-            long[] bit_width_segments) {
-        int encoded_result = 0;
-
-
-        int count_of_time = 1;
-        int count_of_value = 1;
-        long pre_bit_width_segments = bit_width_segments[0];
-        int pre_time = getTime(pre_bit_width_segments);
-        int pre_value = getValue(pre_bit_width_segments);
-        int size = bit_width_segments.length;
-
-
-        int pos_time = 0;
-        int pos_value = 0;
-
-        for (int i = 1; i < size; i++) {
-            long cur_bit_width_segments = bit_width_segments[i];
-            int cur_time = getTime(cur_bit_width_segments);
-            int cur_value = getValue(cur_bit_width_segments);
-            if (cur_time != pre_time && count_of_time != 0) {
-                pos_time++;
-                pre_time = cur_time;
-                count_of_time = 1;
-            } else {
-                count_of_time++;
-                pre_time = cur_time;
-                if (count_of_time == 256) {
-                    pos_time++;
-                    count_of_time = 1;
-                }
-            }
-
-            if (cur_value != pre_value && count_of_value != 0) {
-                pos_value++;
-
-                pre_value = cur_value;
-                count_of_value = 1;
-            } else {
-                count_of_value++;
-                pre_value = cur_value;
-                if (count_of_value == 256) {
-                    pos_value++;
-                    count_of_value = 0;
-                }
-            }
-
-        }
-        if (count_of_time != 0) {
-            pos_time++;
-        }
-        if (count_of_value != 0) {
-            pos_value++;
-        }
-
-        encoded_result += (pos_time * 2);
-        encoded_result += (pos_value * 2);
-
-        return encoded_result;
-    }
-
-    public static int encodeRLEBitWidth2Bytes(
-            long[] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-        int count_of_time = 1;
-        int count_of_value = 1;
-        long pre_bit_width_segments = bit_width_segments[0];
-        int pre_time = getTime(pre_bit_width_segments);
-        int pre_value = getValue(pre_bit_width_segments);
-
-        int size = bit_width_segments.length;
-        int[][] run_length_time = new int[size][2];
-        int[][] run_length_value = new int[size][2];
-
-        int pos_time = 0;
-        int pos_value = 0;
-
-        for (int i = 1; i < size; i++) {
-            long cur_bit_width_segments = bit_width_segments[i];
-            int cur_time = getTime(cur_bit_width_segments);
-            int cur_value = getValue(cur_bit_width_segments);
-            if (cur_time != pre_time && count_of_time != 0) {
-                run_length_time[pos_time][0] = count_of_time;
-                run_length_time[pos_time][1] = pre_time;
-                pos_time++;
-                pre_time = cur_time;
-                count_of_time = 1;
-            } else {
-                count_of_time++;
-                pre_time = cur_time;
-                if (count_of_time == 256) {
-                    run_length_time[pos_time][0] = count_of_time;
-                    run_length_time[pos_time][1] = pre_time;
-                    pos_time++;
-                    count_of_time = 0;
-                }
-            }
-
-            if (cur_value != pre_value && count_of_value != 0) {
-                run_length_value[pos_value][0] = count_of_value;
-                run_length_value[pos_value][1] = pre_value;
-                pos_value++;
-
-                pre_value = cur_value;
-                count_of_value = 1;
-            } else {
-                count_of_value++;
-                pre_value = cur_value;
-                if (count_of_value == 256) {
-                    run_length_value[pos_value][0] = count_of_value;
-                    run_length_value[pos_value][1] = pre_value;
-                    pos_value++;
-                    count_of_value = 0;
-                }
-            }
-
-        }
-        if (count_of_time != 0) {
-            run_length_time[pos_time][0] = count_of_time;
-            run_length_time[pos_time][1] = pre_time;
-            pos_time++;
-        }
-        if (count_of_value != 0) {
-            run_length_value[pos_value][0] = count_of_value;
-            run_length_value[pos_value][1] = pre_value;
-            pos_value++;
-        }
-        intWord2Bytes(pos_time, pos_encode, encoded_result);
-        pos_encode += 2;
-        intWord2Bytes(pos_value, pos_encode, encoded_result);
-        pos_encode += 2;
-
-        for (int i = 0; i < pos_time; i++) {
-            int[] bit_width_time = run_length_time[i];
-            intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-            pos_encode++;
-            intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-            pos_encode++;
-
-        }
-        for (int i = 0; i < pos_value; i++) {
-            int[] bit_width_value = run_length_value[i];
-            intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-            pos_encode++;
-            intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-            pos_encode++;
-
-        }
-
-        return pos_encode;
-    }
-
-    public static long[] segmentBitPacking(long[] ts_block_delta, int block_size, int segment_size) {
-
-        int segment_n = (block_size - 1) / segment_size;
-        long[] bit_width_segments = new long[segment_n];
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = Integer.MIN_VALUE;
-            int bit_width_value = Integer.MIN_VALUE;
-
-            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
-                long cur_data_i = ts_block_delta[data_i];
-//                System.out.println("cur_data_i: "+(cur_data_i));
-//                System.out.println("getTime(cur_data_i): "+getTime(cur_data_i));
-//                System.out.println("getValue(cur_data_i): "+getValue(cur_data_i));
-                int cur_bit_width_time = getBitWith(getTime(cur_data_i));
-                int cur_bit_width_value = getBitWith(getValue(cur_data_i));
-                if (cur_bit_width_time > bit_width_time) {
-                    bit_width_time = cur_bit_width_time;
-                }
-                if (cur_bit_width_value > bit_width_value) {
-                    bit_width_value = cur_bit_width_value;
-                }
-            }
-            bit_width_segments[segment_i] = combine2Int( bit_width_time, bit_width_value);
-        }
-        return bit_width_segments;
-    }
-
-    public static void moveAlphaToBeta(long[] ts_block, int alpha, int beta) {
-        long tmp_tv = ts_block[alpha];
-        if (beta < alpha) {
-            for (int u = alpha - 1; u >= beta; u--) {
-                ts_block[u + 1] = ts_block[u];
-            }
-        } else {
-            for (int u = alpha + 1; u < beta; u++) {
-                ts_block[u - 1] = ts_block[u];
-            }
-            beta--;
-        }
-        ts_block[beta] = tmp_tv;
-    }
-
-
-    private static int numberOfEncodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int segment_size) {
-        int block_size = delta_segments.length;
-        int segment_n = block_size / segment_size;
-        int result = 0;
-        result += 8; // encode interval0 and value0
-        result += 16; // encode theta
-        result += encodeRLEBitWidth2Bytes(bit_width_segments);
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            long cur_data_i = bit_width_segments[segment_i];
-            int bit_width_time = getTime(cur_data_i);
-            int bit_width_value =getValue(cur_data_i);
-            result += (segment_size * bit_width_time / 8);
-            result += (segment_size * bit_width_value / 8);
-        }
-
-        return result;
-    }
-
-    private static int encodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int[] raw_length, int segment_size, float[] theta, int pos_encode, byte[] encoded_result) {
-
-        int block_size = delta_segments.length;
-        int segment_n = block_size / segment_size;
-        long2Bytes(delta_segments[0], pos_encode, encoded_result);
-        pos_encode += 8;
-        float2bytes(theta[0] + raw_length[3], pos_encode, encoded_result);
-        pos_encode += 4;
-        float2bytes(theta[1], pos_encode, encoded_result);
-        pos_encode += 4;
-        float2bytes(theta[2] + raw_length[4], pos_encode, encoded_result);
-        pos_encode += 4;
-        float2bytes(theta[3], pos_encode, encoded_result);
-        pos_encode += 4;
-
-
-
-        pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-//        printTSBlock(bit_width_segments);
-//        System.out.println(pos_encode);
-//        System.out.println("theta:"+ Arrays.toString(theta));
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            long tmp_bit_width_segments = bit_width_segments[segment_i];
-            int bit_width_time = getTime(tmp_bit_width_segments);
-            int bit_width_value = getValue(tmp_bit_width_segments);
-//            System.out.println(bit_width_time);
-//            System.out.println(bit_width_value);
-            pos_encode = bitPacking(delta_segments, 0, segment_i * segment_size + 1, segment_size, bit_width_time, pos_encode, encoded_result);
-            pos_encode = bitPacking(delta_segments, 1, segment_i * segment_size + 1, segment_size, bit_width_value, pos_encode, encoded_result);
-        }
-
-        return pos_encode;
-    }
-    private static void printTSBlock(long[] ts_block){
-        for(long ts : ts_block){
-            System.out.println("["+getTime(ts)+","+getValue(ts)+"]");
-        }
-    }
-
-    private static long[] ReorderingTimeSeries(long[] ts_block, int[] raw_length, float[] theta, int segment_size) {
-
-
-        int block_size = ts_block.length;
-        long[] ts_block_delta = new long[block_size];
-
-        ArrayList<Integer> min_index = new ArrayList<>();
-        int index_alpha_list = 0;
-
-
-//        trainParameter(ts_block,block_size,theta);
-//        System.out.println(Arrays.toString(theta));
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta,segment_size);
-//        System.out.println(Arrays.toString(raw_length));
-        int[] alpha_list = getIStar(ts_block, min_index, block_size, 0, theta);
-        int[] beta_list = new int[alpha_list.length];
-        int[][] new_length_list = new int[alpha_list.length][5];
-        int pos_new_length_list = 0;
-        int[] new_alpha_list = new int[alpha_list.length];
-
-
-        for (int alpha : alpha_list) {
-            if (alpha == -1)
-                continue;
-            new_alpha_list[pos_new_length_list] = alpha;
-
-            ArrayList<Integer> new_min_index = (ArrayList<Integer>) min_index.clone();
-            int[] new_length = raw_length.clone();
-
-            beta_list[pos_new_length_list] = getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-            if (beta_list[pos_new_length_list] == -1)
-                continue;
-            System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-            pos_new_length_list++;
-        }
-
-        int adjust_count = 0;
-
-
-        while (pos_new_length_list != 0) {
-            if (adjust_count < block_size / 2 && adjust_count < 20) {
-                adjust_count++;
-            } else {
-                break;
-            }
-//            all_length = new int[pos_new_length_list][2];
-            int min_length_index = -1;
-            int min_length = Integer.MAX_VALUE;
-
-
-            for (int pos_new_length_list_j = 0; pos_new_length_list_j < pos_new_length_list; pos_new_length_list_j++) {
-                if(new_length_list[pos_new_length_list_j][0]<min_length){
-                    min_length = new_length_list[pos_new_length_list_j][0];
-                    min_length_index = pos_new_length_list_j;
-                }
-            }
-
-            if (min_length <= raw_length[0]) {
-                long[] new_ts_block = ts_block.clone();
-                moveAlphaToBeta(new_ts_block, new_alpha_list[min_length_index], beta_list[min_length_index]);
-                int[] new_length = raw_length.clone();
-                getEncodeBitsRegressionNoTrain(new_ts_block, block_size, new_length, theta, segment_size);
-                if(new_length[0] < raw_length[0]){
-                    System.arraycopy(new_length, 0, raw_length, 0, 5);
-                    ts_block = new_ts_block.clone();
-                }else{
-                    break;
-                }
-//                  moveAlphaToBeta(ts_block, new_alpha_list[min_length_index], beta_list[min_length_index]);
-//                  System.arraycopy(new_length_list[min_length_index], 0, raw_length, 0, 5);
-            } else {
-                break;
-            }
-
-            alpha_list = getIStar(ts_block, min_index, block_size, theta);
-
-            int alpha_size = alpha_list.length;
-            for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-                if (containsValue(beta_list, alpha_list[alpha_i])) {
-                    alpha_list = removeElement(alpha_list, alpha_i);
-                }
-            }
-            beta_list = new int[alpha_list.length];
-            new_length_list = new int[alpha_list.length][5];
-            pos_new_length_list = 0;
-            new_alpha_list = new int[alpha_list.length];
-
-            for (int alpha : alpha_list) {
-                if (alpha == -1)
-                    continue;
-                new_alpha_list[pos_new_length_list] = alpha;
-
-                int[] new_length = raw_length.clone();
-//            beta_list[j] = 0;
-                beta_list[pos_new_length_list] = getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-                if (beta_list[pos_new_length_list] == -1)
-                    continue;
-                System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-                pos_new_length_list++;
-            }
-
-        }
-
-//        System.out.println(adjust_count);
-//        printTSBlock(ts_block);
-        ts_block_delta = getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-//        printTSBlock(ts_block_delta);
-
-        return ts_block_delta;
-//        int segment_n = (block_size - 1) / segment_size;
-//        int[][] bit_width_segments = new int[segment_n][2];
-//        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-//            int bit_width_time = Integer.MIN_VALUE;
-//            int bit_width_value = Integer.MIN_VALUE;
-//
-//            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
-//                int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-//                int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-//                if (cur_bit_width_time > bit_width_time) {
-//                    bit_width_time = cur_bit_width_time;
-//                }
-//                if (cur_bit_width_value > bit_width_value) {
-//                    bit_width_value = cur_bit_width_value;
-//                }
-//            }
-//
-//            bit_width_segments[segment_i][0] = bit_width_time;
-//            bit_width_segments[segment_i][1] = bit_width_value;
-//        }
-//
-//
-//        encode_pos = encodeSegment2Bytes(ts_block_delta, bit_width_segments, raw_length, segment_size, theta, encode_pos, cur_byte);
-
-//        System.out.println("encode_pos="+encode_pos);
-//        return encode_pos;
-    }
-
-
-    private static int REGERBlockEncoder(long[] data, int i, int block_size, int supply_length, int[] third_value, int segment_size, int encode_pos, byte[] cur_byte) {
-
-
-        long min_time = (long) getTime(data[i * block_size]) <<32;
-        long[] ts_block;
-        long[] ts_block_value;
-        long[] ts_block_partition;
-
-        if (supply_length == 0) {
-            ts_block = new long[block_size];
-            ts_block_value = new long[block_size];
-            ts_block_partition = new long[block_size];
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-//            System.out.println((data[i * block_size+1]));
-//            System.out.println(getTime(data[i * block_size+1]));
-            for (int j = 0; j < block_size; j++) {
-                long tmp_j = data[j + i * block_size] - min_time;
-//                System.out.println(getTime(data[j + i * block_size]));
-//                System.out.println(getTime(data[i * block_size]));
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j),getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-//            for (int j = 0; j < block_size; j++) {
-//                ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-//                ts_block[j][1] = data[j + i * block_size][1];
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                int tmp_value = ts_block[j][1]-min_value;
-//                if(data_map.containsKey(tmp_value)){
-//                    int tmp = data_map.get(tmp_value);
-//                    tmp++;
-//                    data_map.put(tmp_value,tmp);
-//                }else{
-//                    data_map.put(tmp_value,1);
-//                }
-//                ts_block_value[j][0] =ts_block[j][0];
-//                ts_block_value[j][1] =ts_block[j][1];
-//            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-//
-//            third_value= findMinIndex(kernelDensity);
-//            for(int j=0;j<third_value.length;j++){
-//                third_value[j] += min_value;
-//            }
-//            System.out.println("Minimum point: x=" + (Arrays.toString(third_value)));
-        } else {
-            ts_block = new long[supply_length];
-            ts_block_value = new long[supply_length];
-            ts_block_partition = new long[supply_length];
-            int end = data.length - i * block_size;
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-            for (int j = 0; j < end; j++) {
-                long tmp_j = data[j + i * block_size] - min_time;
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j),getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-            for (int j = end; j < supply_length; j++) {
-                ts_block[j] = 0;
-                ts_block_value[j] = 0;
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] =0;
-            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-
-//            third_value= findMinIndex(kernelDensity);
-            block_size = supply_length;
-        }
-
-
-
-        int[] reorder_length = new int[5];
-        float[] theta_reorder = new float[4];
-        int[] time_length = new int[5];// length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        float[] theta_time = new float[4];
-        int[] partition_length = new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        float[] theta_partition = new float[4];
-
-        trainParameter(ts_block,block_size,theta_time);
-//printTSBlock(ts_block);
-
-        long[] ts_block_delta_time =  getEncodeBitsRegressionNoTrain(ts_block, block_size, time_length, theta_time,segment_size);
-
-
-        int pos_ts_block_partition = 0;
-        if(third_value.length>0){
-            for (long datum : ts_block) {
-                if (getValue(datum) > third_value[third_value.length - 1]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-            for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-                for (long datum : ts_block) {
-                    if (getValue(datum) <= third_value[third_i] && getValue(datum) > third_value[third_i - 1]) {
-                        ts_block_partition[pos_ts_block_partition] = datum;
-                        pos_ts_block_partition++;
-                    }
-                }
-            }
-            for (long datum : ts_block) {
-                if (getValue(datum) <= third_value[0]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-        }
-
-
-        trainParameter(ts_block_partition,block_size,theta_partition);
-        long[] ts_block_delta_partition = getEncodeBitsRegressionNoTrain(ts_block_partition, block_size, partition_length, theta_partition,segment_size);
-
-        Arrays.sort(ts_block_value);
-        trainParameter(ts_block_value,block_size,theta_reorder);
-        long[] ts_block_delta_reorder = getEncodeBitsRegressionNoTrain(ts_block_value, block_size, reorder_length, theta_reorder,segment_size);
-
-
-//       ReorderingTimeSeries(ts_block_value, reorder_length,  theta_reorder, segment_size);
-
-        int segment_n = (block_size - 1) / segment_size;
-        long[] bit_width_segments = new long[segment_n];
-
-
-        int choose = min3(time_length[0], partition_length[0], reorder_length[0]);
-        if(choose == 0){
-//            System.out.println("time");
-//            System.out.println(Arrays.toString(time_length));
-            ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length,  theta_time, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments, time_length, segment_size, theta_time, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(time_length));
-        }
-        else if(choose==1){
-//            System.out.println("partition");
-//            System.out.println(Arrays.toString(partition_length));
-            ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length,  theta_partition, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(partition_length));
-        } else if (choose ==2) {
-//            System.out.println("value");
-//            System.out.println(Arrays.toString(reorder_length));
-            ts_block_delta_reorder = ReorderingTimeSeries(ts_block_value, reorder_length,  theta_reorder, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments, reorder_length, segment_size, theta_reorder, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(reorder_length));
-        }
-
-
-//        int segment_n = (block_size - 1) / segment_size;
-//        long[] bit_width_segments = new long[segment_n];
-//
-//        if(time_length[0] > partition_length[0]){
-//
-//            ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length,  theta_partition, segment_size);
-//
-//            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-//            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-//
-//        }else{
-//            ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length,  theta_time, segment_size);
-//
-//            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-//            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments, time_length, segment_size, theta_time, encode_pos, cur_byte);
-//
-//        }
-
-//        System.out.println(encode_pos);
-
-        return encode_pos;
-    }
-
-    public static int ReorderingRegressionEncoder(long[] data, int block_size, int[] third_value, int segment_size, byte[] encoded_result) {
-        block_size++;
-//    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-        int length_all = data.length;
-//        System.out.println(length_all);
-        int encode_pos = 0;
-        int2Bytes(length_all, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int block_num = length_all / block_size;
-        int2Bytes(block_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int2Bytes(segment_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-//        for (int i = 44; i < 45; i++) {
-        for (int i = 0; i < block_num; i++) {
-//            System.out.println(i);
-            encode_pos = REGERBlockEncoder(data, i, block_size, 0, third_value, segment_size, encode_pos, encoded_result);
-        }
-
-        int remaining_length = length_all - block_num * block_size;
-        if (remaining_length == 1) {
-            long2Bytes(data[data.length - 1], encode_pos, encoded_result);
-            encode_pos += 8;
-        }
-        if (remaining_length != 0 && remaining_length != 1) {
-            int supple_length;
-            if (remaining_length % segment_size == 0) {
-                supple_length = 1;
-            } else if (remaining_length % segment_size == 1) {
-                supple_length = 0;
-            } else {
-                supple_length = segment_size + 1 - remaining_length % segment_size;
-            }
-            encode_pos = REGERBlockEncoder(data, block_num, block_size, supple_length + remaining_length, third_value, segment_size, encode_pos, encoded_result);
-
-        }
-        return encode_pos;
-    }
-
-    public static int REGERBlockDecoder(byte[] encoded, int decode_pos, int[][] value_list, int block_size, int segment_size, int[] value_pos_arr) {
-
-        int time0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = time0;
-        int value0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = value0;
-
-        value_pos_arr[0]++;
-
-        float theta_time0 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-        float theta_time1 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-
-        float theta_value0 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-        float theta_value1 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-
-        int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-        int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-
-        int count;
-        int num;
-        int segment_n = block_size / segment_size;
-        int[][] bit_width_segments = new int[segment_n][2];
-        int pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_time_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][0] = num;
-                pos_bit_width_segments++;
-            }
-
-        }
-
-        pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_value_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][1] = num;
-                pos_bit_width_segments++;
-            }
-        }
-
-        int pre_time = time0;
-        int pre_value = value0;
-
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = bit_width_segments[segment_i][0];
-            int bit_width_value = bit_width_segments[segment_i][1];
-            int[] decode_time_result = new int[segment_size];
-            int[] decode_value_result = new int[segment_size];
-
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-            int pos_time = value_pos_arr[0];
-            for (int delta_time : decode_time_result) {
-                pre_time = (int) (theta_time0 + theta_time1 * (double) delta_time) + pre_time;
-                value_list[pos_time][0] = pre_time;
-                pos_time++;
-            }
-            int pos_value = value_pos_arr[0];
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-            for (int delta_value : decode_value_result) {
-                pre_value = (int) (theta_value0 + theta_value1 * (double) delta_value) + pre_value;
-                value_list[pos_value][1] = pre_value;
-                pos_value++;
-            }
-            value_pos_arr[0] = pos_value;
-        }
-
-
-        return decode_pos;
-    }
-
-
-    public static void REGERDecoder(byte[] encoded) {
-
-        int decode_pos = 0;
-        int length_all = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        int block_size = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        int segment_size = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-
-
-        int block_num = length_all / block_size;
-        int remain_length = length_all - block_num * block_size;
-        int zero_number;
-        if (remain_length % segment_size == 0) {
-            zero_number = 1;
-        } else if (remain_length % segment_size == 1) {
-            zero_number = 0;
-        } else {
-            zero_number = segment_size + 1 - remain_length % segment_size;
-        }
-        int[][] value_list = new int[length_all + segment_size][2];
-
-        int[] value_pos_arr = new int[1];
-
-//        for (int k = 0; k < 2; k++) {
-        for (int k = 0; k < block_num; k++) {
-//            System.out.println("k="+k);
-            decode_pos = REGERBlockDecoder(encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-        }
-
-        if (remain_length == 1) {
-            for (int i = 0; i < remain_length; i++) {
-                int value_end = bytes2Integer(encoded, decode_pos, 4);
-                decode_pos += 4;
-                value_list[value_pos_arr[0]][0] = value_end;
-                value_end = bytes2Integer(encoded, decode_pos, 4);
-                decode_pos += 4;
-                value_list[value_pos_arr[0]][1] = value_end;
-                value_pos_arr[0]++;
-            }
-        } else {
-            REGERBlockDecoder(encoded, decode_pos, value_list, remain_length + zero_number, segment_size, value_pos_arr);
-        }
-    }
-
-    @Test
-    public void REGERRemoveOrderByValue() throws IOException {
-//        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-        String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-        String output_parent_dir = "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_remove_value";
-
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> output_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
-            dataset_block_size.add(128);
-        }
-
-        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-//        dataset_block_size.add(128);
-
-        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-//        dataset_block_size.add(4096);
-        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
-        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-//        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-//        dataset_block_size.add(256);
-
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-//        for (int file_i = 2; file_i < 3; file_i++) {
-            String inputPath = input_path_list.get(file_i);
-            String Output = output_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-            String[] head = {
-                    "Input Direction",
-                    "Encoding Algorithm",
-                    "Encoding Time",
-                    "Decoding Time",
-                    "Points",
-                    "Compressed Size",
-                    "Compression Ratio",
-            };
-            writer.writeRecord(head); // write header to output file
-
-            assert tempList != null;
-
-            for (File f : tempList) {
-//                f = tempList[2];
-
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-//                ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-                ArrayList<Long> data = new ArrayList<>();
-
-                // add a column to "data"
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-//                loader.readRecord();
-//                int time1 = Integer.parseInt(loader.getValues()[0]);
-//                int value1 = Integer.parseInt(loader.getValues()[1]);
-//                System.out.println(time0);
-//                System.out.println(time1);
-//                System.out.println(value1);
-//                data.add(combine2Int(time1-time0, value1));
-
-                while (loader.readRecord()) {
-//                    long time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-//                    time_tmp <<=32;
-//                    time_tmp +=  Integer.parseInt(loader.getValues()[1]);
-                    int time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-//                    System.out.println(time_tmp);
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-
-                    data.add(combine2Int(time_tmp,value_tmp));
-                }
-//                System.out.println(getTime(data.get(1)));
-//                System.out.println((data.get(1)));
-
-//                System.out.println(data);
-                inputStream.close();
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-//                System.out.println(data);
-
-                long[] data2_arr = new long[data.size()];
-//                int min_time = data.get(0).get(0);
-                for (int i = 0; i < data.size(); i++) {
-                    data2_arr[i] = data.get(i) ;
-                }
-//                System.out.println(data2_arr[0][0]);
-                byte[] encoded_result = new byte[data2_arr.length * 8];
-                long encodeTime = 0;
-                long decodeTime = 0;
-                double ratio = 0;
-                double compressed_size = 0;
-                int repeatTime2 = 200;
-                long s = System.nanoTime();
-                int[] best_order = new int[3];
-                int length = 0;
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    length = ReorderingRegressionEncoder(data2_arr, dataset_block_size.get(file_i), dataset_third.get(file_i), 8, encoded_result);
-                long e = System.nanoTime();
-                encodeTime += ((e - s) / repeatTime2);
-                compressed_size += length;
-                double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                ratio += ratioTmp;
-                s = System.nanoTime();
-//                for (int repeat = 0; repeat < repeatTime2; repeat++)
-//                    REGERDecoder(encoded_result);
-                e = System.nanoTime();
-                decodeTime += ((e - s) / repeatTime2);
-
-
-                String[] record = {
-                        f.toString(),
-                        "REGER-Remove-Value",
-                        String.valueOf(encodeTime),
-                        String.valueOf(decodeTime),
-                        String.valueOf(data.size()),
-                        String.valueOf(compressed_size),
-                        String.valueOf(ratio),
-//                        String.valueOf(best_order[0]),
-//                        String.valueOf(best_order[1]),
-//                        String.valueOf(best_order[2])
-                };
-                writer.writeRecord(record);
-//                System.out.println(Arrays.toString(best_order));
-                System.out.println(ratio);
-
-//                break;
-            }
-            writer.close();
-        }
-    }
-
-    @Test
-    public void REGERVaryBlockSize() throws IOException {
-        //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-        String parent_dir =
-                "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-        String output_parent_dir =
-                "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/block_size";
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> output_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
-        }
-
-        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-        //        dataset_block_size.add(1024);
-
-        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        //        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-        //        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-        //        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-        //        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-        //        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-        //        dataset_block_size.add(512);
-
-//        int[] file_lists = {0,2,11};
-//        for (int file_i : file_lists) {
-        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-            //        for (int file_i = 6; file_i < input_path_list.size(); file_i++) {
-            String inputPath = input_path_list.get(file_i);
-            String Output = output_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-            String[] head = {
-                    "Input Direction",
-                    "Encoding Algorithm",
-                    "Encoding Time",
-                    "Decoding Time",
-                    "Points",
-                    "Compressed Size",
-                    "Block Size",
-                    "Compression Ratio"
-            };
-            writer.writeRecord(head); // write header to output file
-
-            assert tempList != null;
-
-            for (File f : tempList) {
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-                ArrayList<Long> data = new ArrayList<>();
-
-                // add a column to "data"
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-//                loader.readRecord();
-//                int time1 = Integer.parseInt(loader.getValues()[0]);
-//                int value1 = Integer.parseInt(loader.getValues()[1]);
-//                System.out.println(time0);
-//                System.out.println(time1);
-//                System.out.println(value1);
-//                data.add(combine2Int(time1-time0, value1));
-
-                while (loader.readRecord()) {
-//                    long time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-//                    time_tmp <<=32;
-//                    time_tmp +=  Integer.parseInt(loader.getValues()[1]);
-                    int time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-//                    System.out.println(time_tmp);
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-
-                    data.add(combine2Int(time_tmp,value_tmp));
-                }
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-
-//                int[][] data2_arr = new int[data.size()][2];
-                long[] data2_arr = new long[data.size()];
-//                int min_time = data.get(0).get(0);
-                for (int i = 0; i < data.size(); i++) {
-                    data2_arr[i] = data.get(i) ;
-                }
-//                System.out.println(data2_arr[0][0]);
-                for (int block_size_exp = 13; block_size_exp >= 4; block_size_exp--) {
-                    int block_size = (int) Math.pow(2, block_size_exp);
-                    System.out.println(block_size);
-
-                    byte[] encoded_result = new byte[data2_arr.length * 12];
-                    long encodeTime = 0;
-                    long decodeTime = 0;
-                    double ratio = 0;
-                    double compressed_size = 0;
-                    int repeatTime2 = 1;
-                    long s = System.nanoTime();
-                    int length = 0;
-                    for (int repeat = 0; repeat < repeatTime2; repeat++)
-                        length =
-                                ReorderingRegressionEncoder(
-                                        data2_arr,
-                                        block_size,
-                                        dataset_third.get(file_i),
-                                        8,
-                                        encoded_result);
-                    long e = System.nanoTime();
-                    encodeTime += ((e - s) / repeatTime2);
-                    compressed_size += length;
-                    double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                    ratio += ratioTmp;
-                    s = System.nanoTime();
-                    for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-                    e = System.nanoTime();
-                    decodeTime += ((e - s) / repeatTime2);
-
-                    String[] record = {
-                            f.toString(),
-                            "REGER",
-                            String.valueOf(encodeTime),
-                            String.valueOf(decodeTime),
-                            String.valueOf(data.size()),
-                            String.valueOf(compressed_size),
-                            String.valueOf(block_size_exp),
-                            String.valueOf(ratio)
-                    };
-                    writer.writeRecord(record);
-                    System.out.println(ratio);
-                }
-            }
-            writer.close();
-        }
-    }
-
-
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompressTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompressTest.java
deleted file mode 100644
index eb9892c..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompressTest.java
+++ /dev/null
@@ -1,3621 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-
-import static java.lang.Math.abs;
-
-public class REGERCompressTest {
-  public static int getBitWith(int num) {
-    if (num == 0) return 1;
-    else return 32 - Integer.numberOfLeadingZeros(num);
-  }
-
-  public static boolean containsValue(int[] array, int targetValue) {
-    for (int value : array) {
-      if (value == targetValue) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static int[] removeElement(int[] array, int position) {
-    if (position < 0 || position >= array.length) {
-      return array;
-    }
-
-    int[] newArray = new int[array.length - 1];
-    int newIndex = 0;
-
-    for (int i = 0; i < array.length; i++) {
-      if (i != position) {
-        newArray[newIndex] = array[i];
-        newIndex++;
-      }
-    }
-
-    return newArray;
-  }
-
-  public static int min3(int a, int b, int c) {
-    if (a < b && a < c) {
-      return 0;
-    } else if (b < c) {
-      return 1;
-    } else {
-      return 2;
-    }
-  }
-
-  public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 24);
-    cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-    cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 3] = (byte) (integer);
-  }
-
-  public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer);
-  }
-
-  public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 1] = (byte) (integer);
-  }
-
-  public static int bytes2Integer(byte[] encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded[i + start] & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  private static int byte2Integer(byte[] encoded, int decode_pos) {
-    int value = 0;
-    int b = encoded[decode_pos] & 0xFF;
-    value |= b;
-    if (value == 0) return 256;
-    return value % 256;
-  }
-
-  public static void pack8Values(
-      ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values.get(valueIdx) << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values.get(valueIdx) << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values.get(valueIdx) >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static void pack8Values(
-      int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values[valueIdx][index] << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values[valueIdx][index] << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values[valueIdx][index] >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static int unpack8Values(
-      byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-    int byteIdx = offset;
-    //        int pos_encode = 0;
-    long buffer = 0;
-    // total bits which have read from 'buf' to 'buffer'. i.e.,
-    // number of available bits to be decoded.
-    int totalBits = 0;
-    int valueIdx = 0;
-
-    while (valueIdx < 8) {
-      // If current available bits are not enough to decode one Integer,
-      // then add next byte from buf to 'buffer' until totalBits >= width
-      while (totalBits < width) {
-        buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-        byteIdx++;
-        totalBits += 8;
-      }
-
-      // If current available bits are enough to decode one Integer,
-      // then decode one Integer one by one until left bits in 'buffer' is
-      // not enough to decode one Integer.
-      while (totalBits >= width && valueIdx < 8) {
-        result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-        value_pos++;
-        valueIdx++;
-        totalBits -= width;
-        buffer = buffer & ((1L << totalBits) - 1);
-      }
-    }
-    return value_pos;
-  }
-
-  public static int bitPacking(
-      int[][] numbers,
-      int index,
-      int start,
-      int block_size,
-      int bit_width,
-      int encode_pos,
-      byte[] encoded_result) {
-    int block_num = block_size / 8;
-    for (int i = 0; i < block_num; i++) {
-      pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-      encode_pos += bit_width;
-    }
-
-    return encode_pos;
-  }
-
-  public static int decodeBitPacking(
-      byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-    int block_num = block_size / 8;
-    int value_pos = 0;
-
-    for (int i = 0; i < block_num; i++) { // bitpacking
-      value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-      decode_pos += bit_width;
-    }
-    return decode_pos;
-  }
-
-  public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-    int fbit = Float.floatToIntBits(f);
-    byte[] b = new byte[4];
-    for (int i = 0; i < 4; i++) {
-      b[i] = (byte) (fbit >> (24 - i * 8));
-    }
-    int len = b.length;
-
-    System.arraycopy(b, 0, encode_result, pos_encode, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = encode_result[i + pos_encode];
-      encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-      encode_result[len - i - 1 + pos_encode] = temp;
-    }
-  }
-
-  public static float bytes2float(byte[] b, int index) {
-    int l;
-    l = b[index];
-    l &= 0xff;
-    l |= ((long) b[index + 1] << 8);
-    l &= 0xffff;
-    l |= ((long) b[index + 2] << 16);
-    l &= 0xffffff;
-    l |= ((long) b[index + 3] << 24);
-    return Float.intBitsToFloat(l);
-  }
-
-  public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded.get(i + start) & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  public static int part(int[][] arr, int index, int low, int high) {
-    int[] tmp = arr[low];
-    while (low < high) {
-      while (low < high
-          && (arr[high][index] > tmp[index]
-              || (Objects.equals(arr[high][index], tmp[index])
-                  && arr[high][index ^ 1] >= tmp[index ^ 1]))) {
-        high--;
-      }
-      arr[low][0] = arr[high][0];
-      arr[low][1] = arr[high][1];
-      while (low < high
-          && (arr[low][index] < tmp[index]
-              || (Objects.equals(arr[low][index], tmp[index])
-                  && arr[low][index ^ 1] <= tmp[index ^ 1]))) {
-        low++;
-      }
-      arr[high][0] = arr[low][0];
-      arr[high][1] = arr[low][1];
-    }
-    arr[low][0] = tmp[0];
-    arr[low][1] = tmp[1];
-    return low;
-  }
-
-  public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    ArrayList<Integer> tmp = arr.get(low);
-    while (low < high) {
-      while (low < high
-          && (arr.get(high).get(index) > tmp.get(index)
-              || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                  && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-        high--;
-      }
-      arr.set(low, arr.get(high));
-      while (low < high
-          && (arr.get(low).get(index) < tmp.get(index)
-              || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                  && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-        low++;
-      }
-      arr.set(high, arr.get(low));
-    }
-    arr.set(low, tmp);
-    return low;
-  }
-
-  public static int getCommon(int m, int n) {
-    int z;
-    while (m % n != 0) {
-      z = m % n;
-      m = n;
-      n = z;
-    }
-    return n;
-  }
-
-  public static void splitTimeStamp3(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-    int td_common = 0;
-    for (int i = 1; i < ts_block.size(); i++) {
-      int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-      if (td_common == 0) {
-        if (time_diffi != 0) {
-          td_common = time_diffi;
-        }
-        continue;
-      }
-      if (time_diffi != 0) {
-        td_common = getCommon(time_diffi, td_common);
-        if (td_common == 1) {
-          break;
-        }
-      }
-    }
-    if (td_common == 0) {
-      td_common = 1;
-    }
-
-    int t0 = ts_block.get(0).get(0);
-    for (int i = 0; i < ts_block.size(); i++) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-      tmp.add(t0 + interval_i);
-      tmp.add(ts_block.get(i).get(1));
-      ts_block.set(i, tmp);
-    }
-    result.add(td_common);
-  }
-
-  private static void adjust1TimeCost(
-      int[][] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-    int block_size = ts_block.length;
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-
-    int min_delta_time = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-    int min_delta_time_i = min_delta_time;
-    int min_delta_time_index = i;
-
-    for (int j = 1; j < block_size; j++) {
-      int timestamp_delta_i =
-          ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      if (timestamp_delta_i < min_delta_time) {
-        min_delta_time_index = j;
-        min_delta_time = timestamp_delta_i;
-      }
-    }
-    raw_length[0] += (getBitWith(min_delta_time_i - min_delta_time) * (block_size - 1));
-    raw_length[3] = min_delta_time;
-    min_index.set(0, min_delta_time_index);
-  }
-
-  private static void adjust1ValueCost(
-      int[][] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-    int block_size = ts_block.length;
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int min_delta_value = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-    int min_delta_value_i = min_delta_value;
-    int min_delta_value_index = i;
-
-    for (int j = 1; j < block_size; j++) {
-      int value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      if (value_delta_i < min_delta_value) {
-        min_delta_value_index = j;
-        min_delta_value = value_delta_i;
-      }
-    }
-    raw_length[0] += (getBitWith(min_delta_value_i - min_delta_value) * (block_size - 1));
-    raw_length[3] = min_delta_value;
-    min_index.set(0, min_delta_value_index);
-  }
-
-  private static int[] adjust0MinChange(int[][] ts_block, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != block_size;
-
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int pos_ts_block_delta = 0;
-    for (int i = 2; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i != j) {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      } else {
-        timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-        value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-        ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-        ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i > timestamp_delta_max) {
-          timestamp_delta_max = timestamp_delta_i;
-        }
-        if (timestamp_delta_i < timestamp_delta_min) {
-          timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i > value_delta_max) {
-          value_delta_max = value_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-          value_delta_min = value_delta_i;
-        }
-        timestamp_delta_i =
-            ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i > timestamp_delta_max) {
-        timestamp_delta_max = timestamp_delta_i;
-      }
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i > value_delta_max) {
-        value_delta_max = value_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int length = 0;
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjust0MinChangeNo(
-      int[][] ts_block, int[] raw_length, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != block_size;
-
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[j + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i = ts_block[j + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[j + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust 0 to n
-  private static int[] adjust0n1MinChange(int[][] ts_block, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-    int pos_ts_block_delta = 0;
-    int length = 0;
-    for (int i = 2; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      timestamp_delta_i = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-      value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-    ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-    ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-    pos_ts_block_delta++;
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      value_delta_min = value_delta_i;
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjust0n1MinChangeNo(int[][] ts_block, int[] raw_length, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i = ts_block[1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust n to no 0
-  private static int[] adjustnMinChange(int[][] ts_block, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int length = 0;
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size - 1; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i != j) {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-        value_delta_i =
-            ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-        ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-        ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-        pos_ts_block_delta++;
-        if (timestamp_delta_i < timestamp_delta_min) {
-          timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-          value_delta_min = value_delta_i;
-        }
-
-        timestamp_delta_i =
-            ts_block[block_size - 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i =
-            ts_block[block_size - 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustnMinChangeNo(
-      int[][] ts_block, int[] raw_length, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[block_size - 1][0]
-            - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 2][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1]
-            - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 2][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[block_size - 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust n to 0
-  private static int[] adjustn0MinChange(int[][] ts_block, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int length = 0;
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size - 1; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      timestamp_delta_i = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-      value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-    ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-    ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-    pos_ts_block_delta++;
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      value_delta_min = value_delta_i;
-    }
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustn0MinChangeNo(int[][] ts_block, int[] raw_length, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[block_size - 1][0]
-            - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 2][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1]
-            - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 2][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust alpha to j
-
-  private static int[] adjustAlphaToJMinChange(int[][] ts_block, int alpha, int j, float[] theta) {
-
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    assert j != 0;
-    assert j != block_size;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int length = 0;
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == j) {
-        timestamp_delta_i =
-            ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-        value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i =
-            ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      } else if (i == alpha + 1) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustAlphaToJMinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, int j, float[] theta) {
-
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    assert j != 0;
-    assert j != block_size;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // move alpha to 0
-  private static int[] adjustTo0MinChange(int[][] ts_block, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == (alpha + 1)) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-        value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int length = 0;
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustTo0MinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // move alpha to n
-  private static int[] adjustTonMinChange(int[][] ts_block, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int pos_ts_block_delta = 0;
-    int length = 0;
-
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == (alpha + 1)) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-        value_delta_i =
-            ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustTonMinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int getIstarClose(
-      int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-    int min_i = 0;
-    int min_dis = Integer.MAX_VALUE;
-    for (int i = 0; i < j_star_list.size(); i++) {
-      if (abs(alpha - j_star_list.get(i)) < min_dis) {
-        min_i = j_star_list.get(i);
-        min_dis = abs(alpha - j_star_list.get(i));
-        raw_length[0] = new_length_list[i][0];
-        raw_length[3] = new_length_list[i][1];
-        raw_length[4] = new_length_list[i][2];
-      }
-    }
-    if (min_dis == 0) {
-      System.out.println("get IstarClose error");
-      return 0;
-    }
-    return min_i;
-  }
-
-  public static int[][] getEncodeBitsRegression(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-
-    long sum_X_r = 0;
-    long sum_Y_r = 0;
-    long sum_squ_X_r = 0;
-    long sum_squ_XY_r = 0;
-    long sum_X_v = 0;
-    long sum_Y_v = 0;
-    long sum_squ_X_v = 0;
-    long sum_squ_XY_v = 0;
-
-    for (int i = 1; i < block_size; i++) {
-      sum_X_r += ts_block[i - 1][0];
-      sum_X_v += ts_block[i - 1][1];
-      sum_Y_r += ts_block[i][0];
-      sum_Y_v += ts_block[i][1];
-      sum_squ_X_r += ((long) (ts_block[i - 1][0]) * (ts_block[i - 1][0]));
-      sum_squ_X_v += ((long) ts_block[i - 1][1] * ts_block[i - 1][1]);
-      sum_squ_XY_r += ((long) (ts_block[i - 1][0]) * (ts_block[i][0]));
-      sum_squ_XY_v += ((long) ts_block[i - 1][1] * ts_block[i][1]);
-    }
-
-    int m_reg = block_size - 1;
-    float theta0_r = 0.0F;
-    float theta1_r = 1.0F;
-    if (m_reg * sum_squ_X_r != sum_X_r * sum_X_r) {
-      theta0_r =
-          (float) (sum_squ_X_r * sum_Y_r - sum_X_r * sum_squ_XY_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-      theta1_r =
-          (float) (m_reg * sum_squ_XY_r - sum_X_r * sum_Y_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-    }
-
-    float theta0_v = 0.0F;
-    float theta1_v = 1.0F;
-    if (m_reg * sum_squ_X_v != sum_X_v * sum_X_v) {
-      theta0_v =
-          (float) (sum_squ_X_v * sum_Y_v - sum_X_v * sum_squ_XY_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-      theta1_v =
-          (float) (m_reg * sum_squ_XY_v - sum_X_v * sum_Y_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-    }
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    // delta to Regression
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r = (ts_block[j][0] - (int) (theta0_r + theta1_r * (float) ts_block[j - 1][0]));
-      int epsilon_v = (ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]));
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = epsilon_v;
-      }
-      ts_block_delta[j][0] = epsilon_r;
-      ts_block_delta[j][1] = epsilon_v;
-    }
-
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j > 0; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    theta[0] = theta0_r;
-    theta[1] = theta1_r;
-    theta[2] = theta0_v;
-    theta[3] = theta1_v;
-
-    return ts_block_delta;
-  }
-
-  public static int[][] getEncodeBitsRegressionNoTrain(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta, int segment_size) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    //        System.out.println(Arrays.deepToString(ts_block));
-
-    int pos_ts_block_delta = 0;
-    ts_block_delta[pos_ts_block_delta][0] = ts_block[0][0];
-    ts_block_delta[pos_ts_block_delta][1] = ts_block[0][1];
-    pos_ts_block_delta++;
-
-    int[][] ts_block_delta_segment = new int[block_size][2];
-    int pos_ts_block_delta_segment = 0;
-    int[] tmp_segment = new int[2];
-    int max_interval_segment = Integer.MIN_VALUE;
-    int max_value_segment = Integer.MIN_VALUE;
-    tmp_segment[0] = max_interval_segment;
-    tmp_segment[1] = max_value_segment;
-
-    // delta to Regression
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      int epsilon_v = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = epsilon_v;
-      }
-
-      ts_block_delta[pos_ts_block_delta][0] = epsilon_r;
-      ts_block_delta[pos_ts_block_delta][1] = epsilon_v;
-      pos_ts_block_delta++;
-
-      if (epsilon_r > max_interval_segment) {
-        max_interval_segment = epsilon_r;
-        tmp_segment[0] = max_interval_segment;
-      }
-      if (epsilon_v > max_value_segment) {
-        max_value_segment = epsilon_v;
-        tmp_segment[1] = max_value_segment;
-      }
-      if (j % segment_size == 0) {
-        ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-        ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-        pos_ts_block_delta_segment++;
-        tmp_segment = new int[2];
-        max_interval_segment = Integer.MIN_VALUE;
-        max_value_segment = Integer.MIN_VALUE;
-        tmp_segment[0] = max_interval_segment;
-        tmp_segment[1] = max_value_segment;
-      }
-    }
-
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j > 0; j--) {
-      int epsilon_r = ts_block_delta[j][0] - timestamp_delta_min;
-      int epsilon_v = ts_block_delta[j][1] - value_delta_min;
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-      ts_block_delta[j][0] = epsilon_r;
-      ts_block_delta[j][1] = epsilon_v;
-    }
-
-    for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-      length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-      length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    //        raw_length = new int[5];
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  public static int getBeta(
-      int[][] ts_block,
-      int alpha,
-      ArrayList<Integer> min_index,
-      int block_size,
-      int[] raw_length,
-      float[] theta) {
-
-    int raw_abs_sum = raw_length[0];
-    int[][] new_length_list = new int[block_size][3];
-    int pos_new_length_list = 0;
-    int range = block_size / 16;
-
-    ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-    int j_star = -1;
-    int[] b;
-    if (alpha == -1) {
-      return j_star;
-    }
-
-    if (alpha == 0) {
-      if (min_index.get(0) == 1) {
-        adjust1TimeCost(ts_block, 1, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == 1) {
-        adjust1ValueCost(ts_block, 1, raw_length, min_index, theta);
-      }
-
-      for (int j = 2; j < range - 1; j++) {
-        //            for (int j = 2; j < block_size - 1; j++) {
-        // if j, alpha+1, alpha points are min residuals, need to recalculate min residuals
-        if (min_index.contains(j)) { // || min_index.contains(1)
-          b = adjust0MinChange(ts_block, j, theta);
-        } else {
-          b = adjust0MinChangeNo(ts_block, raw_length, j, theta);
-        }
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list = new ArrayList<>();
-          pos_new_length_list = 0;
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      if (min_index.contains(0)) {
-        b = adjust0n1MinChange(ts_block, theta);
-      } else {
-        b = adjust0n1MinChangeNo(ts_block, raw_length, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // alpha == n
-    else if (alpha == block_size - 1) {
-      if (min_index.get(0) == block_size - 1) {
-        adjust1TimeCost(ts_block, block_size - 1, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == block_size - 1) {
-        adjust1ValueCost(ts_block, block_size - 1, raw_length, min_index, theta);
-      }
-      for (int j = block_size - range; j < block_size - 1; j++) {
-        //            for (int j = 1; j < block_size - 1; j++) {
-        if (min_index.contains(j)) { // min_index.contains(block_size - 1) ||
-          b = adjustnMinChange(ts_block, j, theta);
-        } else {
-          b = adjustnMinChangeNo(ts_block, raw_length, j, theta);
-        }
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list = new ArrayList<>();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      if (min_index.contains(0)) { // min_index.contains(block_size - 1) ||
-        b = adjustn0MinChange(ts_block, theta);
-      } else {
-        b = adjustn0MinChangeNo(ts_block, raw_length, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list = new ArrayList<>();
-        j_star_list.add(0);
-
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // alpha != 1 and alpha != n
-    else {
-      if (min_index.get(0) == alpha) {
-        adjust1TimeCost(ts_block, alpha, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == alpha) {
-        adjust1ValueCost(ts_block, alpha, raw_length, min_index, theta);
-      }
-      if (min_index.get(0) == alpha + 1) {
-        adjust1TimeCost(ts_block, alpha + 1, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == alpha + 1) {
-        adjust1ValueCost(ts_block, alpha + 1, raw_length, min_index, theta);
-      }
-      int start_j = Math.max(alpha - range / 2, 1);
-      int end_j = Math.min(alpha + range / 2, block_size - 1);
-      for (int j = start_j; j < end_j; j++) {
-        //            for (int j = 1; j < block_size - 1; j++) {
-        if (alpha != j && (alpha + 1) != j) {
-          if (min_index.contains(
-              j)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-            b = adjustAlphaToJMinChange(ts_block, alpha, j, theta);
-          } else {
-            b = adjustAlphaToJMinChangeNo(ts_block, raw_length, alpha, j, theta);
-          }
-          if (b[0] < raw_abs_sum) {
-            raw_abs_sum = b[0];
-            j_star_list = new ArrayList<>();
-            j_star_list.add(j);
-            pos_new_length_list = 0;
-            System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-            pos_new_length_list++;
-          } else if (b[0] == raw_abs_sum) {
-            j_star_list.add(j);
-            System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-            pos_new_length_list++;
-          }
-        }
-      }
-
-      if (min_index.contains(0)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-        b = adjustTo0MinChange(ts_block, alpha, theta);
-      } else {
-        b = adjustTo0MinChangeNo(ts_block, raw_length, alpha, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-      if (min_index.contains(
-          block_size - 1)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-        b = adjustTonMinChange(ts_block, alpha, theta);
-      } else {
-        b = adjustTonMinChangeNo(ts_block, raw_length, alpha, theta);
-      }
-
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    }
-    int[][] new_new_length_list = new int[pos_new_length_list][5];
-    for (int i = 0; i < pos_new_length_list; i++) {
-      System.arraycopy(new_new_length_list[i], 0, new_length_list[i], 0, 3);
-    }
-
-    if (j_star_list.size() != 0) {
-      j_star = getIstarClose(alpha, j_star_list, new_new_length_list, raw_length);
-    }
-    return j_star;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block,
-      ArrayList<Integer> min_index,
-      int block_size,
-      int index,
-      float[] theta,
-      int k) {
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int timestamp_delta_max_index = -1;
-    int value_delta_max_index = -1;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    //        int[][] ts_block_delta = new int[block_size - 1][2];
-
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_v_j = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      int epsilon_r_j = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      //            if (index == 0) {
-      //                ts_block_delta[j - 1][0] = j;
-      //                ts_block_delta[j - 1][1] = epsilon_v_j;
-      //            } else if (index == 1) {
-      //                ts_block_delta[j - 1][0] = j;
-      //                ts_block_delta[j - 1][1] = epsilon_r_j;
-      //            }
-      //      ts_block_delta.add(tmp);
-      if (epsilon_r_j < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r_j;
-        timestamp_delta_min_index = j;
-      }
-      if (epsilon_v_j < value_delta_min) {
-        value_delta_min = epsilon_v_j;
-        value_delta_min_index = j;
-      }
-      if (epsilon_r_j > timestamp_delta_max) {
-        timestamp_delta_max = epsilon_r_j;
-        timestamp_delta_max_index = j;
-      }
-      if (epsilon_v_j > value_delta_max) {
-        value_delta_max = epsilon_v_j;
-        value_delta_max_index = j;
-      }
-    }
-    min_index.add(timestamp_delta_min_index);
-    min_index.add(value_delta_min_index);
-    //        Arrays.sort(ts_block_delta, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-
-    int[] alpha_list = new int[2];
-    if (index == 0) {
-      alpha_list[0] = value_delta_min_index;
-      alpha_list[1] = value_delta_max_index;
-    } else {
-      alpha_list[0] = timestamp_delta_min_index;
-      alpha_list[1] = timestamp_delta_max_index;
-    }
-
-    //        alpha_list[0] = ts_block_delta[0][0];
-    //        for (int i = 0; i < k; i++) {
-    //            alpha_list[i + 1] = ts_block_delta[block_size - 2 - k][0];
-    //        }
-    return alpha_list;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block, ArrayList<Integer> min_index, int block_size, float[] theta, int k) {
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int timestamp_delta_max_index = -1;
-    int value_delta_max_index = -1;
-
-    int[] alpha_list = new int[2 * k + 2];
-
-    //        int[][] ts_block_delta_time = new int[block_size - 1][2];
-    //        int[][] ts_block_delta_value = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r_j = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      int epsilon_v_j = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      //            ts_block_delta_time[j - 1][0] = j;
-      //            ts_block_delta_time[j - 1][1] = epsilon_r_j;
-      //            ts_block_delta_value[j - 1][0] = j;
-      //            ts_block_delta_value[j - 1][1] = epsilon_v_j;
-
-      if (epsilon_v_j > value_delta_max) {
-        value_delta_max = epsilon_v_j;
-        value_delta_max_index = j;
-      }
-      if (epsilon_v_j < value_delta_min) {
-        value_delta_min = epsilon_v_j;
-        value_delta_min_index = j;
-      }
-      if (epsilon_r_j > timestamp_delta_max) {
-        timestamp_delta_max = epsilon_r_j;
-        timestamp_delta_max_index = j;
-      }
-      if (epsilon_r_j < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r_j;
-        timestamp_delta_min_index = j;
-      }
-    }
-    //        Arrays.sort(ts_block_delta_time, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-
-    min_index.add(timestamp_delta_min_index);
-    alpha_list[0] = timestamp_delta_min_index;
-    alpha_list[1] = timestamp_delta_max_index;
-    //        alpha_list[0] = ts_block_delta_time[0][0];
-    //        for (int i = 0; i < k; i++) {
-    //            alpha_list[i + 1] = ts_block_delta_time[block_size - 2 - k][0];
-    //        }
-
-    //        Arrays.sort(ts_block_delta_value, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-
-    int pos_alpha_list = k + 1;
-    min_index.add(value_delta_min_index);
-    if (!containsValue(alpha_list, value_delta_min_index)) {
-      alpha_list[pos_alpha_list] = value_delta_min_index;
-      pos_alpha_list++;
-    }
-    if (!containsValue(alpha_list, value_delta_max_index)) {
-      alpha_list[pos_alpha_list] = value_delta_max_index;
-      pos_alpha_list++;
-    }
-
-    //        for (int i = 0; i < k; i++) {
-    //            if (!containsValue(alpha_list, ts_block_delta_value[block_size - 2 - k][0])) {
-    //                alpha_list[pos_alpha_list] = ts_block_delta_value[block_size - 2 - k][0];
-    //                pos_alpha_list++;
-    //            }
-    //        }
-    int[] new_alpha_list = new int[pos_alpha_list];
-    System.arraycopy(alpha_list, 0, new_alpha_list, 0, pos_alpha_list);
-
-    return new_alpha_list;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(int[][] bit_width_segments) {
-    int encoded_result = 0;
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          pos_time++;
-          count_of_time = 1;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      pos_value++;
-    }
-
-    encoded_result += (pos_time * 2);
-    encoded_result += (pos_value * 2);
-
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(
-      int[][] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-    intWord2Bytes(pos_time, pos_encode, encoded_result);
-    pos_encode += 2;
-    intWord2Bytes(pos_value, pos_encode, encoded_result);
-    pos_encode += 2;
-
-    for (int i = 0; i < pos_time; i++) {
-      int[] bit_width_time = run_length_time[i];
-      intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-      pos_encode++;
-    }
-    for (int i = 0; i < pos_value; i++) {
-      int[] bit_width_value = run_length_value[i];
-      intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-      pos_encode++;
-    }
-
-    return pos_encode;
-  }
-
-  public static int[][] segmentBitPacking(
-      int[][] ts_block_delta, int block_size, int segment_size) {
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    return bit_width_segments;
-  }
-
-  public static void moveAlphaToBeta(int[][] ts_block, int alpha, int beta) {
-    int[] tmp_tv = ts_block[alpha];
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ts_block[u + 1][0] = ts_block[u][0];
-        ts_block[u + 1][1] = ts_block[u][1];
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ts_block[u - 1][0] = ts_block[u][0];
-        ts_block[u - 1][1] = ts_block[u][1];
-      }
-      beta--;
-    }
-    ts_block[beta][0] = tmp_tv[0];
-    ts_block[beta][1] = tmp_tv[1];
-  }
-
-  private static int numberOfEncodeSegment2Bytes(
-      int[][] delta_segments, int[][] bit_width_segments, int segment_size) {
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int result = 0;
-    result += 8; // encode interval0 and value0
-    result += 16; // encode theta
-    result += encodeRLEBitWidth2Bytes(bit_width_segments);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      result += (segment_size * bit_width_time / 8);
-      result += (segment_size * bit_width_value / 8);
-    }
-
-    return result;
-  }
-
-  private static int encodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      float[] theta,
-      int pos_encode,
-      byte[] encoded_result) {
-
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int2Bytes(delta_segments[0][0], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(delta_segments[0][1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[0] + raw_length[3], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[2] + raw_length[4], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[3], pos_encode, encoded_result);
-    pos_encode += 4;
-
-    pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              0,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_time,
-              pos_encode,
-              encoded_result);
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              1,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_value,
-              pos_encode,
-              encoded_result);
-    }
-
-    return pos_encode;
-  }
-
-  private static int[][] ReorderingTimeSeries(
-      int[][] ts_block, int[] raw_length, float[] theta, int segment_size, int k) {
-
-    int block_size = ts_block.length;
-    int[][] ts_block_delta = new int[block_size][2];
-
-    ArrayList<Integer> min_index = new ArrayList<>();
-    int index_alpha_list = 0;
-
-    getEncodeBitsRegression(ts_block, block_size, raw_length, theta);
-    int[] alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, k);
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-    int[] new_alpha_list = new int[alpha_list.length];
-
-    for (int alpha : alpha_list) {
-      if (alpha == -1) continue;
-      new_alpha_list[pos_new_length_list] = alpha;
-
-      ArrayList<Integer> new_min_index = (ArrayList<Integer>) min_index.clone();
-      int[] new_length = raw_length.clone();
-
-      beta_list[pos_new_length_list] =
-          getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-      if (beta_list[pos_new_length_list] == -1) continue;
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-
-    int adjust_count = 0;
-
-    int[][] all_length;
-    while (pos_new_length_list != 0) {
-      if (adjust_count < block_size / 2 && adjust_count < 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      all_length = new int[pos_new_length_list][2];
-      for (int pos_new_length_list_j = 0;
-          pos_new_length_list_j < pos_new_length_list;
-          pos_new_length_list_j++) {
-        all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-        all_length[pos_new_length_list_j][1] = new_length_list[pos_new_length_list_j][0];
-      }
-      Arrays.sort(
-          all_length,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-
-      if (all_length[0][1] <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block, new_alpha_list[all_length[0][0]], beta_list[all_length[0][0]]);
-        int[] new_length = new int[5];
-        ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length, theta);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, segment_size);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      new_alpha_list = new int[alpha_list.length];
-
-      for (int alpha : alpha_list) {
-        if (alpha == -1) continue;
-        new_alpha_list[pos_new_length_list] = alpha;
-
-        int[] new_length = raw_length.clone();
-        //            beta_list[j] = 0;
-        beta_list[pos_new_length_list] =
-            getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-        if (beta_list[pos_new_length_list] == -1) continue;
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-    }
-
-    return getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-    //        int segment_n = (block_size - 1) / segment_size;
-    //        int[][] bit_width_segments = new int[segment_n][2];
-    //        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-    //            int bit_width_time = Integer.MIN_VALUE;
-    //            int bit_width_value = Integer.MIN_VALUE;
-    //
-    //            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) *
-    // segment_size + 1; data_i++) {
-    //                int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-    //                int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-    //                if (cur_bit_width_time > bit_width_time) {
-    //                    bit_width_time = cur_bit_width_time;
-    //                }
-    //                if (cur_bit_width_value > bit_width_value) {
-    //                    bit_width_value = cur_bit_width_value;
-    //                }
-    //            }
-    //
-    //            bit_width_segments[segment_i][0] = bit_width_time;
-    //            bit_width_segments[segment_i][1] = bit_width_value;
-    //        }
-    //
-    //
-    //        encode_pos = encodeSegment2Bytes(ts_block_delta, bit_width_segments, raw_length,
-    // segment_size, theta, encode_pos, cur_byte);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    //        return encode_pos;
-  }
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte,
-      int[] best_order) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_value;
-    int[][] ts_block_partition;
-
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_value = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      //            Map<Integer, Integer> data_map = new HashMap<>();
-      //            int min_value = Integer.MAX_VALUE;
-
-      for (int j = 0; j < block_size; j++) {
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-
-
-        //                ts_block_value[j][0] =ts_block[j][0];
-        //                ts_block_value[j][1] =ts_block[j][1];
-      }
-      //            Map<Integer, Integer> data_map = new HashMap<>();
-
-      //            for (int j = 0; j < block_size; j++) {
-      //                ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-      //                ts_block[j][1] = data[j + i * block_size][1];
-      //                if(data_map.containsKey(tmp_value)){
-      //                    int tmp = data_map.get(tmp_value);
-      //                    tmp++;
-      //                    data_map.put(tmp_value,tmp);
-      //                }else{
-      //                    data_map.put(tmp_value,1);
-      //                }
-      //                ts_block_value[j][0] =ts_block[j][0];
-      //                ts_block_value[j][1] =ts_block[j][1];
-      //            }
-      //            double[] kernelDensity = calculateKernelDensity(data_map);
-      //
-      //            third_value= findMinIndex(kernelDensity);
-      //            for(int j=0;j<third_value.length;j++){
-      //                third_value[j] += min_value;
-      //            }
-      //            System.out.println("Minimum point: x=" + (Arrays.toString(third_value)));
-
-
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_value = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      //            Map<Integer, Integer> data_map = new HashMap<>();
-      //            int min_value = Integer.MAX_VALUE;
-
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-        //                if(ts_block[j][1]<min_value){
-        //                    min_value = ts_block[j][1];
-        //                }
-        //                if(data_map.containsKey(ts_block[j][1])){
-        //                    int tmp = data_map.get(ts_block[j][1]);
-        //                    tmp++;
-        //                    data_map.put(ts_block[j][1],tmp);
-        //                }else{
-        //                    data_map.put(ts_block[j][1],1);
-        //                }
-        //                ts_block_value[j][0] =ts_block[j][0];
-        //                ts_block_value[j][1] =ts_block[j][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-        //                if(data_map.containsKey(ts_block[j][1])){
-        //                    int tmp = data_map.get(ts_block[j][1]);
-        //                    tmp++;
-        //                    data_map.put(ts_block[j][1],tmp);
-        //                }else{
-        //                    data_map.put(ts_block[j][1],1);
-        //                }
-        //                ts_block_value[j][0] =ts_block[j][0];
-        //                ts_block_value[j][1] =ts_block[j][1];
-      }
-      //            double[] kernelDensity = calculateKernelDensity(data_map);
-
-      //            third_value= findMinIndex(kernelDensity);
-      block_size = supply_length;
-    }
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta_reorder;
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta_partition;
-    int[][] bit_width_segments_partition;
-
-    ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length, theta_time, segment_size, k);
-
-    //        int pos_ts_block_partition = 0;
-    //        if(third_value.length>0){
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] > third_value[third_value.length - 1]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //            for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //                for (int[] datum : ts_block) {
-    //                    if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i -
-    // 1]) {
-    //                        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                        pos_ts_block_partition++;
-    //                    }
-    //                }
-    //            }
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] <= third_value[0]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //        }
-    //
-    //
-    //        ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, raw_length,
-    // theta, segment_size, k);
-
-    //        Arrays.sort(ts_block_value, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-    //
-    //        ts_block_delta_reorder = ReorderingTimeSeries(ts_block_value, reorder_length,
-    // theta_reorder, segment_size, k);
-
-    //        int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    //        if(time_length[0] > raw_length[0]){
-    //            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size,
-    // segment_size);
-    //            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments,
-    // raw_length, segment_size, theta, encode_pos, cur_byte);
-    //        }else{
-    bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta_time,
-            bit_width_segments,
-            time_length,
-            segment_size,
-            theta_time,
-            encode_pos,
-            cur_byte);
-
-    //        }
-
-    //        if (choose == 0) {
-    //            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size,
-    // segment_size);
-    //            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments,
-    // time_length, segment_size, theta_time, encode_pos, cur_byte);
-    //            best_order[0] ++;
-    //        } else if (choose == 1) {
-    //            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size,
-    // segment_size);
-    //            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments,
-    // raw_length, segment_size, theta, encode_pos, cur_byte);
-    //            best_order[2] ++;
-    //        } else {
-    //            bit_width_segments = segmentBitPacking(ts_block_delta_reorder, block_size,
-    // segment_size);
-    //            encode_pos = encodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments,
-    // reorder_length, segment_size, theta_reorder, encode_pos, cur_byte);
-    //            best_order[1] ++;
-    //        }
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int ReorderingRegressionEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int k,
-      byte[] encoded_result,
-      int[] best_order) {
-    block_size++;
-    //    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-    int length_all = data.length;
-    //        System.out.println(length_all);
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              i,
-              block_size,
-              0,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result,
-              best_order);
-    }
-
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result,
-              best_order);
-    }
-    return encode_pos;
-  }
-
-  public static int REGERBlockDecoder(
-      byte[] encoded,
-      int decode_pos,
-      int[][] value_list,
-      int block_size,
-      int segment_size,
-      int[] value_pos_arr) {
-
-    int time0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = time0;
-    int value0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = value0;
-
-    value_pos_arr[0]++;
-
-    float theta_time0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_time1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    float theta_value0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_value1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-    int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-
-    int count;
-    int num;
-    int segment_n = block_size / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    int pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_time_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-
-      decode_pos++;
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][0] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_value_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][1] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    int pre_time = time0;
-    int pre_value = value0;
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      int[] decode_time_result = new int[segment_size];
-      int[] decode_value_result = new int[segment_size];
-
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-      int pos_time = value_pos_arr[0];
-      for (int delta_time : decode_time_result) {
-        pre_time = (int) (theta_time0 + theta_time1 * (double) delta_time) + pre_time;
-        value_list[pos_time][0] = pre_time;
-        pos_time++;
-      }
-      int pos_value = value_pos_arr[0];
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-      for (int delta_value : decode_value_result) {
-        pre_value = (int) (theta_value0 + theta_value1 * (double) delta_value) + pre_value;
-        value_list[pos_value][1] = pre_value;
-        pos_value++;
-      }
-      value_pos_arr[0] = pos_value;
-    }
-
-    return decode_pos;
-  }
-
-  public static void REGERDecoder(byte[] encoded) {
-
-    int decode_pos = 0;
-    int length_all = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int block_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int segment_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int remain_length = length_all - block_num * block_size;
-    int zero_number;
-    if (remain_length % segment_size == 0) {
-      zero_number = 1;
-    } else if (remain_length % segment_size == 1) {
-      zero_number = 0;
-    } else {
-      zero_number = segment_size + 1 - remain_length % segment_size;
-    }
-    int[][] value_list = new int[length_all + segment_size][2];
-
-    int[] value_pos_arr = new int[1];
-
-    //        for (int k = 0; k < 2; k++) {
-    for (int k = 0; k < block_num; k++) {
-      //            System.out.println("k="+k);
-      decode_pos =
-          REGERBlockDecoder(
-              encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-    }
-
-    if (remain_length == 1) {
-      for (int i = 0; i < remain_length; i++) {
-        int value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = value_end;
-        value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = value_end;
-        value_pos_arr[0]++;
-      }
-    } else {
-      REGERBlockDecoder(
-          encoded,
-          decode_pos,
-          value_list,
-          remain_length + zero_number,
-          segment_size,
-          value_pos_arr);
-    }
-  }
-
-  @Test
-  public void REGERBestOrder() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_best_order";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-
-    //    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-    for (int file_i = 0; file_i < 1; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Compression Ratio",
-        "Time Count",
-        "Value Count",
-        "Partition Count"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        //                f = tempList[1];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        //                System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-        double ratio = 0;
-        double compressed_size = 0;
-        int repeatTime2 = 1;
-        long s = System.nanoTime();
-        int[] best_order = new int[3];
-        int length = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++)
-          length =
-              ReorderingRegressionEncoder(
-                  data2_arr,
-                  dataset_block_size.get(file_i),
-                  dataset_third.get(file_i),
-                  8,
-                  dataset_k.get(file_i),
-                  encoded_result,
-                  best_order);
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-        compressed_size += length;
-        double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-        ratio += ratioTmp;
-        s = System.nanoTime();
-        //                for (int repeat = 0; repeat < repeatTime2; repeat++)
-        //                    REGERDecoder(encoded_result);
-        e = System.nanoTime();
-        decodeTime += ((e - s) / repeatTime2);
-
-        String[] record = {
-          f.toString(),
-          "REGER",
-          String.valueOf(encodeTime),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(ratio),
-          String.valueOf(best_order[0]),
-          String.valueOf(best_order[1]),
-          String.valueOf(best_order[2])
-        };
-        writer.writeRecord(record);
-        System.out.println(Arrays.toString(best_order));
-        System.out.println(ratio);
-
-        //                break;
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERRemoveOrderByValue() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_remove_value";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 0; file_i < 1; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Compression Ratio",
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        //                f = tempList[1];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        //                System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-        double ratio = 0;
-        double compressed_size = 0;
-        int repeatTime2 = 100;
-        long s = System.nanoTime();
-        int[] best_order = new int[3];
-        int length = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++)
-          length =
-              ReorderingRegressionEncoder(
-                  data2_arr,
-                  dataset_block_size.get(file_i),
-                  dataset_third.get(file_i),
-                  8,
-                  dataset_k.get(file_i),
-                  encoded_result,
-                  best_order);
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-        compressed_size += length;
-        double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-        ratio += ratioTmp;
-        s = System.nanoTime();
-        //                for (int repeat = 0; repeat < repeatTime2; repeat++)
-        //                    REGERDecoder(encoded_result);
-        e = System.nanoTime();
-        decodeTime += ((e - s) / repeatTime2);
-
-        String[] record = {
-          f.toString(),
-          "REGER-Remove-Value",
-          String.valueOf(encodeTime),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(ratio),
-          //                        String.valueOf(best_order[0]),
-          //                        String.valueOf(best_order[1]),
-          //                        String.valueOf(best_order[2])
-        };
-        writer.writeRecord(record);
-        //                System.out.println(Arrays.toString(best_order));
-        System.out.println(ratio);
-
-        //                break;
-      }
-      writer.close();
-    }
-  }
-
-  //    @Test
-  //    public void REGERTime() throws IOException {
-  ////        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-  //        String parent_dir =
-  // "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-  //        String output_parent_dir =
-  // "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger";
-  //
-  //
-  //        String input_parent_dir = parent_dir + "trans_data/";
-  //        ArrayList<String> input_path_list = new ArrayList<>();
-  //        ArrayList<String> output_path_list = new ArrayList<>();
-  //        ArrayList<String> dataset_name = new ArrayList<>();
-  //        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-  //        ArrayList<int[]> dataset_third = new ArrayList<>();
-  //        ArrayList<Integer> dataset_k = new ArrayList<>();
-  //        dataset_name.add("CS-Sensors");
-  //        dataset_name.add("Metro-Traffic");
-  //        dataset_name.add("USGS-Earthquakes");
-  //        dataset_name.add("YZ-Electricity");
-  //        dataset_name.add("GW-Magnetic");
-  //        dataset_name.add("TY-Fuel");
-  //        dataset_name.add("Cyber-Vehicle");
-  //        dataset_name.add("Vehicle-Charge");
-  //        dataset_name.add("Nifty-Stocks");
-  //        dataset_name.add("TH-Climate");
-  //        dataset_name.add("TY-Transport");
-  //        dataset_name.add("EPM-Education");
-  //
-  //        int[] dataset_0 = {547, 2816};
-  //        int[] dataset_1 = {1719, 3731};
-  //        int[] dataset_2 = {-48, -11, 6, 25, 52};
-  //        int[] dataset_3 = {8681, 13584};
-  //        int[] dataset_4 = {79, 184, 274};
-  //        int[] dataset_5 = {17, 68};
-  //        int[] dataset_6 = {677};
-  //        int[] dataset_7 = {1047, 1725};
-  //        int[] dataset_8 = {227, 499, 614, 1013};
-  //        int[] dataset_9 = {474, 678};
-  //        int[] dataset_10 = {4, 30, 38, 49, 58};
-  //        int[] dataset_11 = {5182, 8206};
-  //
-  //        dataset_third.add(dataset_0);
-  //        dataset_third.add(dataset_1);
-  //        dataset_third.add(dataset_2);
-  //        dataset_third.add(dataset_3);
-  //        dataset_third.add(dataset_4);
-  //        dataset_third.add(dataset_5);
-  //        dataset_third.add(dataset_6);
-  //        dataset_third.add(dataset_7);
-  //        dataset_third.add(dataset_8);
-  //        dataset_third.add(dataset_9);
-  //        dataset_third.add(dataset_10);
-  //        dataset_third.add(dataset_11);
-  //
-  //        for (String value : dataset_name) {
-  //            input_path_list.add(input_parent_dir + value);
-  //            dataset_k.add(1);
-  //            dataset_block_size.add(128);
-  //        }
-  //
-  //        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-  ////        dataset_block_size.add(128);
-  //
-  //        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-  ////        dataset_block_size.add(4096);
-  //        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-  ////        dataset_block_size.add(8192);
-  //        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-  //        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
-  //        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-  ////        dataset_block_size.add(8192);
-  //        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-  ////        dataset_block_size.add(2048);
-  //        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-  ////        dataset_block_size.add(2048);
-  //        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-  ////        dataset_block_size.add(128);
-  //        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-  ////        dataset_block_size.add(64);
-  //        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-  ////        dataset_block_size.add(64);
-  //        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-  ////        dataset_block_size.add(256);
-  //
-  ////    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-  //        for (int file_i = 0; file_i < 1; file_i++) {
-  //            String inputPath = input_path_list.get(file_i);
-  //            String Output = output_path_list.get(file_i);
-  //
-  //            File file = new File(inputPath);
-  //            File[] tempList = file.listFiles();
-  //
-  //            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-  //
-  //            String[] head = {
-  //                    "Input Direction",
-  //                    "Encoding Algorithm",
-  //                    "Encoding Time",
-  //                    "Decoding Time",
-  //                    "Points",
-  //                    "Compressed Size",
-  //                    "Compression Ratio"
-  //            };
-  //            writer.writeRecord(head); // write header to output file
-  //
-  //            assert tempList != null;
-  //
-  //            for (File f : tempList) {
-  ////                f = tempList[1];
-  //                System.out.println(f);
-  //                InputStream inputStream = Files.newInputStream(f.toPath());
-  //                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-  //                ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-  //
-  //                // add a column to "data"
-  //                loader.readHeaders();
-  //                while (loader.readRecord()) {
-  //                    ArrayList<Integer> tmp = new ArrayList<>();
-  //                    tmp.add(Integer.valueOf(loader.getValues()[0]));
-  //                    tmp.add(Integer.valueOf(loader.getValues()[1]));
-  //                    data.add(tmp);
-  //                }
-  //                inputStream.close();
-  //                ArrayList<Integer> result2 = new ArrayList<>();
-  //                splitTimeStamp3(data, result2);
-  //
-  //                int[][] data2_arr = new int[data.size()][2];
-  //                int min_time = data.get(0).get(0);
-  //                for (int i = 0; i < data.size(); i++) {
-  //                    data2_arr[i][0] = data.get(i).get(0) - min_time;
-  //                    data2_arr[i][1] = data.get(i).get(1);
-  //                }
-  ////                System.out.println(data2_arr[0][0]);
-  //                byte[] encoded_result = new byte[data2_arr.length * 8];
-  //                long encodeTime = 0;
-  //                long decodeTime = 0;
-  //                double ratio = 0;
-  //                double compressed_size = 0;
-  //                int repeatTime2 = 1;
-  //                long s = System.nanoTime();
-  //                int length = 0;
-  //                for (int repeat = 0; repeat < repeatTime2; repeat++)
-  //                    length = ReorderingRegressionEncoder(data2_arr,
-  // dataset_block_size.get(file_i), dataset_third.get(file_i), 8, dataset_k.get(file_i),
-  // encoded_result);
-  //                long e = System.nanoTime();
-  //                encodeTime += ((e - s) / repeatTime2);
-  //
-  //
-  //                String[] record = {
-  //                        f.toString(),
-  //                        "REGER",
-  //                        String.valueOf(encodeTime),
-  //                        String.valueOf(decodeTime),
-  //                        String.valueOf(data.size()),
-  //                        String.valueOf(compressed_size),
-  //                        String.valueOf(ratio)
-  //                };
-  //                writer.writeRecord(record);
-  //                System.out.println(ratio);
-  //
-  ////                break;
-  //            }
-  //            writer.close();
-  //        }
-  //    }
-  //
-  //    @Test
-  //    public void REGERVaryBlockSize() throws IOException {
-  ////        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-  //        String parent_dir =
-  // "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-  //        String output_parent_dir =
-  // "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/block_size";
-  //
-  //
-  //        String input_parent_dir = parent_dir + "trans_data/";
-  //        ArrayList<String> input_path_list = new ArrayList<>();
-  //        ArrayList<String> output_path_list = new ArrayList<>();
-  //        ArrayList<String> dataset_name = new ArrayList<>();
-  //        ArrayList<int[]> dataset_third = new ArrayList<>();
-  //        ArrayList<Integer> dataset_k = new ArrayList<>();
-  //        dataset_name.add("CS-Sensors");
-  //        dataset_name.add("Metro-Traffic");
-  //        dataset_name.add("USGS-Earthquakes");
-  //        dataset_name.add("YZ-Electricity");
-  //        dataset_name.add("GW-Magnetic");
-  //        dataset_name.add("TY-Fuel");
-  //        dataset_name.add("Cyber-Vehicle");
-  //        dataset_name.add("Vehicle-Charge");
-  //        dataset_name.add("Nifty-Stocks");
-  //        dataset_name.add("TH-Climate");
-  //        dataset_name.add("TY-Transport");
-  //        dataset_name.add("EPM-Education");
-  //
-  //        int[] dataset_0 = {547, 2816};
-  //        int[] dataset_1 = {1719, 3731};
-  //        int[] dataset_2 = {-48, -11, 6, 25, 52};
-  //        int[] dataset_3 = {8681, 13584};
-  //        int[] dataset_4 = {79, 184, 274};
-  //        int[] dataset_5 = {17, 68};
-  //        int[] dataset_6 = {677};
-  //        int[] dataset_7 = {1047, 1725};
-  //        int[] dataset_8 = {227, 499, 614, 1013};
-  //        int[] dataset_9 = {474, 678};
-  //        int[] dataset_10 = {4, 30, 38, 49, 58};
-  //        int[] dataset_11 = {5182, 8206};
-  //
-  //        dataset_third.add(dataset_0);
-  //        dataset_third.add(dataset_1);
-  //        dataset_third.add(dataset_2);
-  //        dataset_third.add(dataset_3);
-  //        dataset_third.add(dataset_4);
-  //        dataset_third.add(dataset_5);
-  //        dataset_third.add(dataset_6);
-  //        dataset_third.add(dataset_7);
-  //        dataset_third.add(dataset_8);
-  //        dataset_third.add(dataset_9);
-  //        dataset_third.add(dataset_10);
-  //        dataset_third.add(dataset_11);
-  //
-  //        for (String value : dataset_name) {
-  //            input_path_list.add(input_parent_dir + value);
-  //            dataset_k.add(1);
-  //        }
-  //
-  //        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-  ////        dataset_block_size.add(1024);
-  //
-  //        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-  ////        dataset_block_size.add(256);
-  //        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
-  ////        dataset_block_size.add(128);
-  //        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-  ////        dataset_block_size.add(64);
-  //        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-  ////        dataset_block_size.add(128);
-  //        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-  ////        dataset_block_size.add(256);
-  //        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-  ////        dataset_block_size.add(512);
-  //
-  //        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-  ////        for (int file_i = 6; file_i < input_path_list.size(); file_i++) {
-  //            String inputPath = input_path_list.get(file_i);
-  //            String Output = output_path_list.get(file_i);
-  //
-  //
-  //            File file = new File(inputPath);
-  //            File[] tempList = file.listFiles();
-  //
-  //            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-  //
-  //            String[] head = {
-  //                    "Input Direction",
-  //                    "Encoding Algorithm",
-  //                    "Encoding Time",
-  //                    "Decoding Time",
-  //                    "Points",
-  //                    "Compressed Size",
-  //                    "Block Size",
-  //                    "Compression Ratio"
-  //            };
-  //            writer.writeRecord(head); // write header to output file
-  //
-  //            assert tempList != null;
-  //
-  //            for (File f : tempList) {
-  //                System.out.println(f);
-  //                InputStream inputStream = Files.newInputStream(f.toPath());
-  //                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-  //                ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-  //
-  //                // add a column to "data"
-  //                loader.readHeaders();
-  //                while (loader.readRecord()) {
-  //                    ArrayList<Integer> tmp = new ArrayList<>();
-  //                    tmp.add(Integer.valueOf(loader.getValues()[0]));
-  //                    tmp.add(Integer.valueOf(loader.getValues()[1]));
-  //                    data.add(tmp);
-  //                }
-  //                inputStream.close();
-  //                ArrayList<Integer> result2 = new ArrayList<>();
-  //                splitTimeStamp3(data, result2);
-  //
-  //                int[][] data2_arr = new int[data.size()][2];
-  //                int min_time = data.get(0).get(0);
-  //                for (int i = 0; i < data.size(); i++) {
-  //                    data2_arr[i][0] = data.get(i).get(0) - min_time;
-  //                    data2_arr[i][1] = data.get(i).get(1);
-  //                }
-  //                System.out.println(data2_arr[0][0]);
-  //                for (int block_size_exp = 13; block_size_exp >= 4; block_size_exp--) {
-  //                    int block_size = (int) Math.pow(2, block_size_exp);
-  //                    System.out.println(block_size);
-  //
-  //                    byte[] encoded_result = new byte[data2_arr.length * 12];
-  //                    long encodeTime = 0;
-  //                    long decodeTime = 0;
-  //                    double ratio = 0;
-  //                    double compressed_size = 0;
-  //                    int repeatTime2 = 10;
-  //                    long s = System.nanoTime();
-  //                    int length = 0;
-  //                    for (int repeat = 0; repeat < repeatTime2; repeat++)
-  //                        length = ReorderingRegressionEncoder(data2_arr, block_size,
-  // dataset_third.get(file_i), 8, dataset_k.get(file_i), encoded_result);
-  //                    long e = System.nanoTime();
-  //                    encodeTime += ((e - s) / repeatTime2);
-  //                    compressed_size += length;
-  //                    double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES *
-  // 2);
-  //                    ratio += ratioTmp;
-  //                    s = System.nanoTime();
-  //                    for (int repeat = 0; repeat < repeatTime2; repeat++)
-  //                        REGERDecoder(encoded_result);
-  //                    e = System.nanoTime();
-  //                    decodeTime += ((e - s) / repeatTime2);
-  //
-  //
-  //                    String[] record = {
-  //                            f.toString(),
-  //                            "REGER",
-  //                            String.valueOf(encodeTime),
-  //                            String.valueOf(decodeTime),
-  //                            String.valueOf(data.size()),
-  //                            String.valueOf(compressed_size),
-  //                            String.valueOf(block_size_exp),
-  //                            String.valueOf(ratio)
-  //                    };
-  //                    writer.writeRecord(record);
-  //                    System.out.println(ratio);
-  //                }
-  //            }
-  //            writer.close();
-  //        }
-  //    }
-  //
-  //    @Test
-  //    public void REGERVaryPackSize() throws IOException {
-  ////        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-  //        String parent_dir =
-  // "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-  //        String output_parent_dir =
-  // "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/pack_size";
-  //
-  //
-  //        String input_parent_dir = parent_dir + "trans_data/";
-  //        ArrayList<String> input_path_list = new ArrayList<>();
-  //        ArrayList<String> output_path_list = new ArrayList<>();
-  //        ArrayList<String> dataset_name = new ArrayList<>();
-  //        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-  //        ArrayList<int[]> dataset_third = new ArrayList<>();
-  //        ArrayList<Integer> dataset_k = new ArrayList<>();
-  //        dataset_name.add("CS-Sensors");
-  //        dataset_name.add("Metro-Traffic");
-  //        dataset_name.add("USGS-Earthquakes");
-  //        dataset_name.add("YZ-Electricity");
-  //        dataset_name.add("GW-Magnetic");
-  //        dataset_name.add("TY-Fuel");
-  //        dataset_name.add("Cyber-Vehicle");
-  //        dataset_name.add("Vehicle-Charge");
-  //        dataset_name.add("Nifty-Stocks");
-  //        dataset_name.add("TH-Climate");
-  //        dataset_name.add("TY-Transport");
-  //        dataset_name.add("EPM-Education");
-  //
-  //        int[] dataset_0 = {547, 2816};
-  //        int[] dataset_1 = {1719, 3731};
-  //        int[] dataset_2 = {-48, -11, 6, 25, 52};
-  //        int[] dataset_3 = {8681, 13584};
-  //        int[] dataset_4 = {79, 184, 274};
-  //        int[] dataset_5 = {17, 68};
-  //        int[] dataset_6 = {677};
-  //        int[] dataset_7 = {1047, 1725};
-  //        int[] dataset_8 = {227, 499, 614, 1013};
-  //        int[] dataset_9 = {474, 678};
-  //        int[] dataset_10 = {4, 30, 38, 49, 58};
-  //        int[] dataset_11 = {5182, 8206};
-  //
-  //        dataset_third.add(dataset_0);
-  //        dataset_third.add(dataset_1);
-  //        dataset_third.add(dataset_2);
-  //        dataset_third.add(dataset_3);
-  //        dataset_third.add(dataset_4);
-  //        dataset_third.add(dataset_5);
-  //        dataset_third.add(dataset_6);
-  //        dataset_third.add(dataset_7);
-  //        dataset_third.add(dataset_8);
-  //        dataset_third.add(dataset_9);
-  //        dataset_third.add(dataset_10);
-  //        dataset_third.add(dataset_11);
-  //
-  //        for (String value : dataset_name) {
-  //            input_path_list.add(input_parent_dir + value);
-  //            dataset_k.add(1);
-  //            dataset_block_size.add(1024);
-  //        }
-  //
-  //        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-  ////        dataset_block_size.add(1024);
-  //
-  //        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-  ////        dataset_block_size.add(256);
-  //        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
-  ////        dataset_block_size.add(128);
-  //        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-  ////        dataset_block_size.add(64);
-  //        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-  ////        dataset_block_size.add(128);
-  //        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-  ////        dataset_block_size.add(256);
-  //        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-  ////        dataset_block_size.add(512);
-  //        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-  ////        dataset_block_size.add(512);
-  //
-  //        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-  ////        for (int file_i = 0; file_i < 1; file_i++) {
-  //            String inputPath = input_path_list.get(file_i);
-  //            String Output = output_path_list.get(file_i);
-  //
-  //            File file = new File(inputPath);
-  //            File[] tempList = file.listFiles();
-  //
-  //            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-  //
-  //            String[] head = {
-  //                    "Input Direction",
-  //                    "Encoding Algorithm",
-  //                    "Encoding Time",
-  //                    "Decoding Time",
-  //                    "Points",
-  //                    "Compressed Size",
-  //                    "Block Size",
-  //                    "Compression Ratio"
-  //            };
-  //            writer.writeRecord(head); // write header to output file
-  //
-  //            assert tempList != null;
-  //
-  //            for (File f : tempList) {
-  //                System.out.println(f);
-  //                InputStream inputStream = Files.newInputStream(f.toPath());
-  //                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-  //                ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-  //
-  //                loader.readHeaders();
-  //                while (loader.readRecord()) {
-  //                    ArrayList<Integer> tmp = new ArrayList<>();
-  //                    tmp.add(Integer.valueOf(loader.getValues()[0]));
-  //                    tmp.add(Integer.valueOf(loader.getValues()[1]));
-  //                    data.add(tmp);
-  //                }
-  //                inputStream.close();
-  //                ArrayList<Integer> result2 = new ArrayList<>();
-  //                splitTimeStamp3(data, result2);
-  //
-  //                int[][] data2_arr = new int[data.size()][2];
-  //                int min_time = data.get(0).get(0);
-  //                for (int i = 0; i < data.size(); i++) {
-  //                    data2_arr[i][0] = data.get(i).get(0) - min_time;
-  //                    data2_arr[i][1] = data.get(i).get(1);
-  //                }
-  //                System.out.println(data2_arr[0][0]);
-  //                for (int segment_size_exp = 6; segment_size_exp > 2; segment_size_exp--) {
-  //                    int segment_size = (int) Math.pow(2, segment_size_exp);
-  //                    System.out.println(segment_size);
-  //
-  //                    byte[] encoded_result = new byte[data2_arr.length * 12];
-  //                    long encodeTime = 0;
-  //                    long decodeTime = 0;
-  //                    double ratio = 0;
-  //                    double compressed_size = 0;
-  //                    int repeatTime2 = 10;
-  //                    long s = System.nanoTime();
-  //                    int length = 0;
-  //                    for (int repeat = 0; repeat < repeatTime2; repeat++)
-  //                        length = ReorderingRegressionEncoder(data2_arr,
-  // dataset_block_size.get(file_i), dataset_third.get(file_i), segment_size, dataset_k.get(file_i),
-  // encoded_result);
-  //                    long e = System.nanoTime();
-  //                    encodeTime += ((e - s) / repeatTime2);
-  //                    compressed_size += length;
-  //                    double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES *
-  // 2);
-  //                    ratio += ratioTmp;
-  //                    s = System.nanoTime();
-  //                    for (int repeat = 0; repeat < repeatTime2; repeat++)
-  //                        REGERDecoder(encoded_result);
-  //                    e = System.nanoTime();
-  //                    decodeTime += ((e - s) / repeatTime2);
-  //
-  //
-  //                    String[] record = {
-  //                            f.toString(),
-  //                            "REGER",
-  //                            String.valueOf(encodeTime),
-  //                            String.valueOf(decodeTime),
-  //                            String.valueOf(data.size()),
-  //                            String.valueOf(compressed_size),
-  //                            String.valueOf(segment_size_exp),
-  //                            String.valueOf(ratio)
-  //                    };
-  //                    writer.writeRecord(record);
-  //                    System.out.println(ratio);
-  //                }
-  //            }
-  //            writer.close();
-  //        }
-  //    }
-
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERDoubleTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERDoubleTest.java
deleted file mode 100644
index 4342bfe..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERDoubleTest.java
+++ /dev/null
@@ -1,3633 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-
-import static java.lang.Math.abs;
-
-public class REGERDoubleTest {
-    public static int getBitWith(int num) {
-        if (num == 0) return 1;
-        else return 32 - Integer.numberOfLeadingZeros(num);
-    }
-
-    public static boolean containsValue(int[] array, int targetValue) {
-        for (int value : array) {
-            if (value == targetValue) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static int[] removeElement(int[] array, int position) {
-        if (position < 0 || position >= array.length) {
-            return array;
-        }
-
-        int[] newArray = new int[array.length - 1];
-        int newIndex = 0;
-
-        for (int i = 0; i < array.length; i++) {
-            if (i != position) {
-                newArray[newIndex] = array[i];
-                newIndex++;
-            }
-        }
-
-        return newArray;
-    }
-
-    public static int min3(int a, int b, int c) {
-        if (a < b && a < c) {
-            return 0;
-        } else if (b < c) {
-            return 1;
-        } else {
-            return 2;
-        }
-    }
-
-    public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 24);
-        cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-        cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 3] = (byte) (integer);
-    }
-
-    public static void long2Bytes(long integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 56);
-        cur_byte[encode_pos + 1] = (byte) (integer >> 48);
-        cur_byte[encode_pos + 2] = (byte) (integer >> 40);
-        cur_byte[encode_pos + 3] = (byte) (integer >> 32);
-        cur_byte[encode_pos + 4] = (byte) (integer >> 24);
-        cur_byte[encode_pos + 5] = (byte) (integer >> 16);
-        cur_byte[encode_pos + 6] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 7] = (byte) (integer);
-    }
-
-
-    public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer);
-    }
-
-    public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 1] = (byte) (integer);
-    }
-
-    public static int bytes2Integer(byte[] encoded, int start, int num) {
-        int value = 0;
-        if (num > 4) {
-            System.out.println("bytes2Integer error");
-            return 0;
-        }
-        for (int i = 0; i < num; i++) {
-            value <<= 8;
-            int b = encoded[i + start] & 0xFF;
-            value |= b;
-        }
-        return value;
-    }
-
-    private static int byte2Integer(byte[] encoded, int decode_pos) {
-        int value = 0;
-        int b = encoded[decode_pos] & 0xFF;
-        value |= b;
-        if (value == 0)
-            return 256;
-        return value % 256;
-    }
-
-    public static void pack8Values(ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-        int bufIdx = 0;
-        int valueIdx = offset;
-        // remaining bits for the current unfinished Integer
-        int leftBit = 0;
-
-        while (valueIdx < 8 + offset) {
-            // buffer is used for saving 32 bits as a part of result
-            int buffer = 0;
-            // remaining size of bits in the 'buffer'
-            int leftSize = 32;
-
-            // encode the left bits of current Integer to 'buffer'
-            if (leftBit > 0) {
-                buffer |= (values.get(valueIdx) << (32 - leftBit));
-                leftSize -= leftBit;
-                leftBit = 0;
-                valueIdx++;
-            }
-
-            while (leftSize >= width && valueIdx < 8 + offset) {
-                // encode one Integer to the 'buffer'
-                buffer |= (values.get(valueIdx) << (leftSize - width));
-                leftSize -= width;
-                valueIdx++;
-            }
-            // If the remaining space of the buffer can not save the bits for one Integer,
-            if (leftSize > 0 && valueIdx < 8 + offset) {
-                // put the first 'leftSize' bits of the Integer into remaining space of the
-                // buffer
-                buffer |= (values.get(valueIdx) >>> (width - leftSize));
-                leftBit = width - leftSize;
-            }
-
-            // put the buffer into the final result
-            for (int j = 0; j < 4; j++) {
-                encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-                encode_pos++;
-                bufIdx++;
-                if (bufIdx >= width) {
-                    return;
-                }
-            }
-        }
-//        return encode_pos;
-    }
-
-    public static void pack8Values(long[] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-        int bufIdx = 0;
-        int valueIdx = offset;
-        // remaining bits for the current unfinished Integer
-        int leftBit = 0;
-
-        while (valueIdx < 8 + offset) {
-            // buffer is used for saving 32 bits as a part of result
-            int buffer = 0;
-            // remaining size of bits in the 'buffer'
-            int leftSize = 32;
-
-            // encode the left bits of current Integer to 'buffer'
-            if (leftBit > 0) {
-
-                buffer |= (getInt(values[valueIdx],index) << (32 - leftBit));
-                leftSize -= leftBit;
-                leftBit = 0;
-                valueIdx++;
-            }
-
-            while (leftSize >= width && valueIdx < 8 + offset) {
-                // encode one Integer to the 'buffer'
-                buffer |= (getInt(values[valueIdx],index) << (leftSize - width));
-                leftSize -= width;
-                valueIdx++;
-            }
-            // If the remaining space of the buffer can not save the bits for one Integer,
-            if (leftSize > 0 && valueIdx < 8 + offset) {
-                // put the first 'leftSize' bits of the Integer into remaining space of the
-                // buffer
-                buffer |= (getInt(values[valueIdx],index) >>> (width - leftSize));
-                leftBit = width - leftSize;
-            }
-
-            // put the buffer into the final result
-            for (int j = 0; j < 4; j++) {
-                encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-                encode_pos++;
-                bufIdx++;
-                if (bufIdx >= width) {
-                    return;
-                }
-            }
-        }
-//        return encode_pos;
-    }
-
-    public static int unpack8Values(byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-        int byteIdx = offset;
-//        int pos_encode = 0;
-        long buffer = 0;
-        // total bits which have read from 'buf' to 'buffer'. i.e.,
-        // number of available bits to be decoded.
-        int totalBits = 0;
-        int valueIdx = 0;
-
-        while (valueIdx < 8) {
-            // If current available bits are not enough to decode one Integer,
-            // then add next byte from buf to 'buffer' until totalBits >= width
-            while (totalBits < width) {
-                buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-                byteIdx++;
-                totalBits += 8;
-            }
-
-            // If current available bits are enough to decode one Integer,
-            // then decode one Integer one by one until left bits in 'buffer' is
-            // not enough to decode one Integer.
-            while (totalBits >= width && valueIdx < 8) {
-                result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-                value_pos++;
-                valueIdx++;
-                totalBits -= width;
-                buffer = buffer & ((1L << totalBits) - 1);
-            }
-        }
-        return value_pos;
-    }
-
-    public static int bitPacking(long[] numbers, int index, int start, int block_size, int bit_width, int encode_pos, byte[] encoded_result) {
-        int block_num = block_size / 8;
-        for (int i = 0; i < block_num; i++) {
-            pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-            encode_pos += bit_width;
-        }
-
-        return encode_pos;
-
-    }
-
-    public static int decodeBitPacking(
-            byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-        int block_num = block_size / 8;
-        int value_pos = 0;
-
-        for (int i = 0; i < block_num; i++) { // bitpacking
-            value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-            decode_pos += bit_width;
-        }
-        return decode_pos;
-    }
-    public static void double2bytes(double f, int pos_encode, byte[] encode_result) {
-        long fbit = Double.doubleToLongBits(f);
-        byte[] b = new byte[8];
-        for (int i = 0; i < 8; i++) {
-            b[i] = (byte) (fbit >> (56 - i * 8));
-        }
-        int len = b.length;
-
-        System.arraycopy(b, 0, encode_result, pos_encode, len);
-        byte temp;
-        for (int i = 0; i < len / 2; ++i) {
-            temp = encode_result[i + pos_encode];
-            encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-            encode_result[len - i - 1 + pos_encode] = temp;
-        }
-    }
-
-    public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-        int fbit = Float.floatToIntBits(f);
-        byte[] b = new byte[4];
-        for (int i = 0; i < 4; i++) {
-            b[i] = (byte) (fbit >> (24 - i * 8));
-        }
-        int len = b.length;
-
-        System.arraycopy(b, 0, encode_result, pos_encode, len);
-        byte temp;
-        for (int i = 0; i < len / 2; ++i) {
-            temp = encode_result[i + pos_encode];
-            encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-            encode_result[len - i - 1 + pos_encode] = temp;
-        }
-    }
-
-    public static float bytes2float(byte[] b, int index) {
-        int l;
-        l = b[index];
-        l &= 0xff;
-        l |= ((long) b[index + 1] << 8);
-        l &= 0xffff;
-        l |= ((long) b[index + 2] << 16);
-        l &= 0xffffff;
-        l |= ((long) b[index + 3] << 24);
-        return Float.intBitsToFloat(l);
-    }
-    public static double bytes2Double(byte[] encoded, int start) {
-        long value = 0;
-        for (int i = 0; i < 8; i++) {
-            value |= ((long) (encoded[i + start] & 0xff)) << (8 * i);
-        }
-        return Double.longBitsToDouble(value);
-    }
-
-    public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-        int value = 0;
-        if (num > 4) {
-            System.out.println("bytes2Integer error");
-            return 0;
-        }
-        for (int i = 0; i < num; i++) {
-            value <<= 8;
-            int b = encoded.get(i + start) & 0xFF;
-            value |= b;
-        }
-        return value;
-    }
-
-    public static int part(int[][] arr, int index, int low, int high) {
-        int[] tmp = arr[low];
-        while (low < high) {
-            while (low < high
-                    && (arr[high][index] > tmp[index]
-                    || (Objects.equals(arr[high][index], tmp[index])
-                    && arr[high][index ^ 1] >= tmp[index ^ 1]))) {
-                high--;
-            }
-            arr[low][0] = arr[high][0];
-            arr[low][1] = arr[high][1];
-            while (low < high
-                    && (arr[low][index] < tmp[index]
-                    || (Objects.equals(arr[low][index], tmp[index])
-                    && arr[low][index ^ 1] <= tmp[index ^ 1]))) {
-                low++;
-            }
-            arr[high][0] = arr[low][0];
-            arr[high][1] = arr[low][1];
-        }
-        arr[low][0] = tmp[0];
-        arr[low][1] = tmp[1];
-        return low;
-    }
-
-    public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-        ArrayList<Integer> tmp = arr.get(low);
-        while (low < high) {
-            while (low < high
-                    && (arr.get(high).get(index) > tmp.get(index)
-                    || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                    && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-                high--;
-            }
-            arr.set(low, arr.get(high));
-            while (low < high
-                    && (arr.get(low).get(index) < tmp.get(index)
-                    || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                    && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-                low++;
-            }
-            arr.set(high, arr.get(low));
-        }
-        arr.set(low, tmp);
-        return low;
-    }
-
-    public static long combine2Int(int int1, int int2){
-        return  ((long) int1 << 32) | (int2 & 0xFFFFFFFFL);
-    }
-
-    public static int getTime(long long1){
-        return  ((int) (long1 >> 32)) ;
-    }
-    public static int getValue(long long1){
-        return  ((int) (long1)) ;
-    }
-    public static int getInt(long long1, int index){
-        if(index==0) return (int) (long1 >> 32);
-        else return (int) (long1);
-    }
-
-    public static int getCommon(int m, int n) {
-        int z;
-        while (m % n != 0) {
-            z = m % n;
-            m = n;
-            n = z;
-        }
-        return n;
-    }
-
-    public static void splitTimeStamp3(
-            ArrayList<Long> ts_block, ArrayList<Integer> result) {
-        int td_common = 0;
-
-        for (int i = 1; i < ts_block.size(); i++) {
-            int cur_value =  getTime(ts_block.get(i));
-            int pre_value = getTime(ts_block.get(i-1));
-            int time_diffi = cur_value  - pre_value;
-
-            if (td_common == 0) {
-                if (time_diffi != 0) {
-                    td_common = time_diffi;
-                }
-                continue;
-            }
-            if (time_diffi != 0) {
-                td_common = getCommon(time_diffi, td_common);
-                if (td_common == 1) {
-                    break;
-                }
-            }
-        }
-        if (td_common == 0) {
-            td_common = 1;
-        }
-
-        int t0 =  getTime(ts_block.get(0));
-        for (int i = 0; i < ts_block.size(); i++) {
-//            ArrayList<Integer> tmp = new ArrayList<>();
-            int cur_value =getTime(ts_block.get(i));
-            int interval_i = ((cur_value - t0) / td_common);
-            ts_block.set(i, combine2Int(t0 + interval_i, getValue(ts_block.get(i))));
-//            tmp.add(t0 + interval_i);
-//            tmp.add(ts_block.get(i).get(1));
-//            ts_block.set(i, tmp);
-        }
-        result.add(td_common);
-    }
-
-    private static void adjust1TimeCost(long[] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, double[] theta) {
-
-
-        int block_size = ts_block.length;
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        long tmp_i = ts_block[i];
-        long tmp_i_1 = ts_block[i-1];
-
-        int min_delta_time = getTime(tmp_i) - (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-        int min_delta_time_i = min_delta_time;
-        int min_delta_time_index = i;
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-
-            if (epsilon_r_j < min_delta_time) {
-                min_delta_time_index = j;
-                min_delta_time = epsilon_r_j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        for (int j = 1; j < block_size; j++) {
-//            int timestamp_delta_i = getTime(ts_block[j]) - (int) (theta0_t + theta1_t * (double) getTime(ts_block[j - 1]));
-//            if (timestamp_delta_i < min_delta_time) {
-//                min_delta_time_index = j;
-//                min_delta_time = timestamp_delta_i;
-//            }
-//        }
-        raw_length[0] += (getBitWith(min_delta_time_i - min_delta_time) * (block_size - 1));
-        raw_length[3] = min_delta_time;
-        min_index.set(0, min_delta_time_index);
-
-
-    }
-
-    private static void adjust1ValueCost(long[] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, double[] theta) {
-
-        int block_size = ts_block.length;
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-
-        int min_delta_value = getValue(ts_block[i]) - (int) (theta0_v + theta1_v * (double) getValue(ts_block[i - 1]));
-        int min_delta_value_i = min_delta_value;
-        int min_delta_value_index = i;
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-
-            if (epsilon_r_j < min_delta_value) {
-                min_delta_value_index = j;
-                min_delta_value = epsilon_r_j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-
-//        for (int j = 1; j < block_size; j++) {
-//            int value_delta_i = getValue(ts_block[j]) - (int) (theta0_v + theta1_v * (double) getValue(ts_block[j - 1]));
-//            if (value_delta_i < min_delta_value) {
-//                min_delta_value_index = j;
-//                min_delta_value = value_delta_i;
-//            }
-//        }
-        raw_length[0] += (getBitWith(min_delta_value_i - min_delta_value) * (block_size - 1));
-        raw_length[3] = min_delta_value;
-        min_index.set(0, min_delta_value_index);
-
-
-    }
-
-    private static int[] adjust0MinChange(
-            long[] ts_block, int j, double[] theta) {
-        int block_size = ts_block.length;
-        assert j != block_size;
-
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        long[] ts_block_delta = new long[block_size - 1];
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-
-        int pos_ts_block_delta = 0;
-        for (int i = 2; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i != j) {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i =
-                        getTime(tmp_i)
-                                - (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-                value_delta_i =
-                        getValue(tmp_i)
-                                - (int) (theta0_v + theta1_v * (double) getValue(tmp_i_1));
-
-            } else {
-                long tmp_j = ts_block[j];
-                long tmp_0 = ts_block[0];
-                long tmp_j_1 = ts_block[j-1];
-                timestamp_delta_i =
-                       getTime(tmp_j)
-                                - (int) (theta0_t + theta1_t * (double) getTime(tmp_0));
-                value_delta_i =
-                        getValue(tmp_j)
-                                - (int) (theta0_v + theta1_v * (double) getValue(tmp_0));
-
-                long delta_i = combine2Int(timestamp_delta_i,value_delta_i);
-                ts_block_delta[pos_ts_block_delta] = delta_i;
-                pos_ts_block_delta++;
-
-                if (timestamp_delta_i > timestamp_delta_max) {
-                    timestamp_delta_max = timestamp_delta_i;
-                }
-                if (timestamp_delta_i < timestamp_delta_min) {
-                    timestamp_delta_min = timestamp_delta_i;
-                }
-                if (value_delta_i > value_delta_max) {
-                    value_delta_max = value_delta_i;
-                }
-                if (value_delta_i < value_delta_min) {
-                    value_delta_min = value_delta_i;
-                }
-                timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-                value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-            }
-            long delta_i = combine2Int(timestamp_delta_i,value_delta_i);
-            ts_block_delta[pos_ts_block_delta] = delta_i;
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i > timestamp_delta_max) {
-                timestamp_delta_max = timestamp_delta_i;
-            }
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i > value_delta_max) {
-                value_delta_max = value_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        int length = 0;
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjust0MinChangeNo(
-            long[] ts_block, int[] raw_length, int j, double[] theta) {
-        int block_size = ts_block.length;
-        assert j != block_size;
-
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_j_plus_1 = ts_block[j + 1];
-        long tmp_j_minus_1 = ts_block[j - 1];
-        long tmp_1 = ts_block[1];
-        long tmp_0 = ts_block[0];
-
-        timestamp_delta_i = getTime(tmp_j_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_j_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_minus_1));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-        timestamp_delta_i = getTime(tmp_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_0));
-        value_delta_i = getValue(tmp_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_0));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_minus_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_j_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_0));
-        value_delta_i = getValue(tmp_j_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_0));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust 0 to n
-    private static int[] adjust0n1MinChange(
-            long[] ts_block, double[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-        long[] ts_block_delta = new long[block_size - 1];
-        int pos_ts_block_delta = 0;
-        int length = 0;
-        for (int i = 2; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            long tmp_i = ts_block[i];
-            long tmp_i_1 = ts_block[i-1];
-
-            timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-            value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (double) getValue(tmp_i_1));
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-//            ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-//            ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-            pos_ts_block_delta++;
-
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-        }
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_0 = ts_block[0];
-        long tmp_block_size_1 = ts_block[block_size-1];
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1));
-        ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-            value_delta_min = value_delta_i;
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjust0n1MinChangeNo(
-            long[] ts_block, int[] raw_length, double[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_1 = ts_block[1];
-        long tmp_0 = ts_block[1];
-        long tmp_block_size_1 = ts_block[1];
-
-
-        timestamp_delta_i = getTime(tmp_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_0));
-        value_delta_i = getValue(tmp_1) - (int) (theta0_v + theta1_v * (double)  getValue(tmp_0));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust n to no 0
-    private static int[] adjustnMinChange(
-            long[] ts_block, int j, double[] theta) {
-        int block_size = ts_block.length;
-        assert j != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        long[] ts_block_delta = new long[block_size - 1];
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-        int length = 0;
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size - 1; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i != j) {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i)- (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (double) getValue(tmp_i_1));
-            } else {
-                long tmp_j = ts_block[j];
-                long tmp_block_size_1 = ts_block[block_size-1];
-                long tmp_j_1 = ts_block[j-1];
-
-                timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1));
-                value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1));
-                ts_block_delta[pos_ts_block_delta]= combine2Int(timestamp_delta_i,value_delta_i);
-                pos_ts_block_delta++;
-                if (timestamp_delta_i < timestamp_delta_min) {
-                    timestamp_delta_min = timestamp_delta_i;
-                }
-                if (value_delta_i < value_delta_min) {
-                    value_delta_min = value_delta_i;
-                }
-
-                timestamp_delta_i = getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-                value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-
-            }
-            ts_block_delta[pos_ts_block_delta]= combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustnMinChangeNo(
-            long[] ts_block, int[] raw_length, int j, double[] theta) {
-        int block_size = ts_block.length;
-        assert j != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-
-        long tmp_j = ts_block[j];
-        long tmp_block_size_1 = ts_block[block_size-1];
-        long tmp_block_size_2 = ts_block[block_size-2];
-        long tmp_j_1 = ts_block[j-1];
-
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-        value_delta_i =  getValue(tmp_j) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i =getTime(tmp_block_size_1)  - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_2) );
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_2));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i =  getTime(tmp_j)  - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1) );
-        value_delta_i =  getValue(tmp_j) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-
-        timestamp_delta_i = getTime(tmp_block_size_1)  - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    // adjust n to 0
-    private static int[] adjustn0MinChange(long[] ts_block, double[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int length = 0;
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size - 1; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            long tmp_i = ts_block[i];
-            long tmp_i_1 = ts_block[i-1];
-            timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-            value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (double) getValue(tmp_i_1));
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        long tmp_block_size_1 = ts_block[block_size-1];
-        long tmp_0 = ts_block[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1));
-        ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-            value_delta_min = value_delta_i;
-        }
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustn0MinChangeNo(
-            long[] ts_block, int[] raw_length, double[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_block_size_1 = ts_block[block_size-1];
-        long tmp_block_size_2 = ts_block[block_size-2];
-        long tmp_0 = ts_block[0];
-
-
-        timestamp_delta_i =getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_2));
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_2) );
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0)  - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1) );
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust alpha to j
-
-    private static int[] adjustAlphaToJMinChange(
-            long[] ts_block, int alpha, int j, double[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        assert j != 0;
-        assert j != block_size;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        long tmp_j = ts_block[j];
-        long tmp_j_minus_1 = ts_block[j-1];
-
-        int length = 0;
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-
-
-            if (i == j) {
-                timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha));
-                value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha));
-            } else if (i == alpha) {
-                timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_minus_1));
-                value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_minus_1));
-            } else if (i == alpha + 1) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (double) getValue(tmp_i_1));
-            }
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-
-        return b;
-    }
-
-    private static int[] adjustAlphaToJMinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, int j, double[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        assert j != 0;
-        assert j != block_size;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_j = ts_block[j];
-        long tmp_j_minus_1 = ts_block[j-1];
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_minus_1));
-
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_minus_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // move alpha to 0
-    private static int[] adjustTo0MinChange(long[] ts_block, int alpha, double[] theta,
-                                            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i == (alpha + 1)) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-            } else if (i == alpha) {
-                long tmp_0 = ts_block[0];
-                timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha));
-                value_delta_i =  getValue(tmp_0) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (double) getValue(tmp_i_1));
-            }
-
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        int length = 0;
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustTo0MinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, double[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        long tmp_0 = ts_block[0];
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // move alpha to n
-    private static int[] adjustTonMinChange(
-            long[] ts_block, int alpha, double[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int pos_ts_block_delta = 0;
-        int length = 0;
-
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i == (alpha + 1)) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-            } else if (i == alpha) {
-                long tmp_block_size_1 = ts_block[block_size - 1];
-                timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1));
-                value_delta_i =  getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i-1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (double) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (double) getValue(tmp_i_1));
-            }
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i,value_delta_i);
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-
-        return b;
-    }
-
-    private static int[] adjustTonMinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, double[] theta,
-            long tmp_alpha,long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-        int length = raw_length[0];
-
-        int timestamp_delta_i;
-        int value_delta_i;
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (double) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (double) getValue(tmp_alpha_minus_1));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        long tmp_block_size_1 = ts_block[block_size - 1];
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (double) getTime(tmp_block_size_1));
-        value_delta_i =  getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (double) getValue(tmp_block_size_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        }else{
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        }else{
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    private static int getIstarClose(int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-        int min_i = 0;
-        int min_dis = Integer.MAX_VALUE;
-        for (int i = 0; i < j_star_list.size(); i++) {
-            if (abs(alpha - j_star_list.get(i)) < min_dis) {
-                min_i = j_star_list.get(i);
-                min_dis = abs(alpha - j_star_list.get(i));
-                raw_length[0] = new_length_list[i][0];
-                raw_length[3] = new_length_list[i][1];
-                raw_length[4] = new_length_list[i][2];
-            }
-        }
-        if (min_dis == 0) {
-            System.out.println("get IstarClose error");
-            return 0;
-        }
-        return min_i;
-    }
-
-    public static void trainParameter( long[] ts_block,int block_size,double[] theta){
-        long sum_X_r = 0;
-        long sum_Y_r = 0;
-        long sum_squ_X_r = 0;
-        long sum_squ_XY_r = 0;
-        long sum_X_v = 0;
-        long sum_Y_v = 0;
-        long sum_squ_X_v = 0;
-        long sum_squ_XY_v = 0;
-
-        for (int i = 1; i < block_size; i++) {
-            long ts_block_i_1 = ts_block[i - 1];
-            long ts_block_i = ts_block[i];
-            long ts_block_i_1_time = getTime(ts_block_i_1);
-            long ts_block_i_1_value = getValue(ts_block_i_1);
-            long ts_block_i_time = getTime(ts_block_i);
-            long ts_block_i_value = getValue(ts_block_i);
-
-
-            sum_X_r += (ts_block_i_1_time);
-            sum_X_v += (ts_block_i_1_value);
-            sum_Y_r += (ts_block_i_time);
-            sum_Y_v += (ts_block_i_value);
-            sum_squ_X_r += (ts_block_i_1_time * (ts_block_i_1_time));
-            sum_squ_X_v += (ts_block_i_1_value * ts_block_i_1_value);
-            sum_squ_XY_r += (ts_block_i_1_time * ts_block_i_time);
-            sum_squ_XY_v += (ts_block_i_1_value * ts_block_i_value);
-        }
-
-        int m_reg = block_size - 1;
-        double theta0_r = 0.0F;
-        double theta1_r = 1.0F;
-        if (m_reg * sum_squ_X_r != sum_X_r * sum_X_r) {
-            theta0_r =
-                    (double) (sum_squ_X_r * sum_Y_r - sum_X_r * sum_squ_XY_r)
-                            / (double) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-            theta1_r =
-                    (double) (m_reg * sum_squ_XY_r - sum_X_r * sum_Y_r)
-                            / (double) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-        }
-
-        double theta0_v = 0.0F;
-        double theta1_v = 1.0F;
-        if (m_reg * sum_squ_X_v != sum_X_v * sum_X_v) {
-            theta0_v =
-                    (double) (sum_squ_X_v * sum_Y_v - sum_X_v * sum_squ_XY_v)
-                            / (double) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-            theta1_v =
-                    (double) (m_reg * sum_squ_XY_v - sum_X_v * sum_Y_v)
-                            / (double) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-        }
-        theta[0] = theta0_r;
-        theta[1] = theta1_r;
-        theta[2] = theta0_v;
-        theta[3] = theta1_v;
-    }
-
-    public static long[] getEncodeBitsRegressionNoTrain(
-            long[] ts_block,
-            int block_size,
-            int[] raw_length,
-            double[] theta,
-            int segment_size) {
-
-        long[] ts_block_delta = new long[ts_block.length];
-
-        double theta0_r = theta[0];
-        double theta1_r = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-        ts_block_delta[0] = ts_block[0];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_r + theta1_r * (double) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-            }
-            ts_block_delta[j] = combine2Int(epsilon_r_j,epsilon_v_j);
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        // delta to Regression
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r =
-//                    getTime(tmp_j) - (int) (theta0_r + theta1_r * (double) getTime(tmp_j_1));
-//            int epsilon_v =
-//                    getValue(tmp_j) - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-//
-//
-//            if (epsilon_r < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r;
-//            }
-//            if (epsilon_v < value_delta_min) {
-//                value_delta_min = epsilon_v;
-//            }
-//            ts_block_delta[j] = combine2Int(epsilon_r,epsilon_v);
-////            ts_block_delta[j][1] = epsilon_v;
-//        }
-
-
-        int max_interval = Integer.MIN_VALUE;
-        int max_value = Integer.MIN_VALUE;
-        int max_interval_segment = Integer.MIN_VALUE;
-        int max_value_segment = Integer.MIN_VALUE;
-        int length = 0;
-        long delta_time = combine2Int(timestamp_delta_min,value_delta_min);
-//        for (int i = block_size - 1; i > 0; i--) {
-        for (int i = 1; i < block_size; i++) {
-            tmp_j = ts_block_delta[i];
-            int epsilon_r = getTime(tmp_j) - timestamp_delta_min;
-            int epsilon_v = getValue(tmp_j) - value_delta_min;
-
-            ts_block_delta[i] = combine2Int(epsilon_r,epsilon_v);
-
-            if (epsilon_r > max_interval) {
-                max_interval = epsilon_r;
-            }
-            if (epsilon_v > max_value) {
-                max_value = epsilon_v;
-            }
-
-            if (epsilon_r > max_interval_segment) {
-                max_interval_segment = epsilon_r;
-            }
-            if (epsilon_v > max_value_segment) {
-                max_value_segment = epsilon_v;
-            }
-            if(i%segment_size==0){
-                length += getBitWith(max_interval_segment)*segment_size;
-                length += getBitWith(max_value_segment)*segment_size;
-                max_interval_segment = Integer.MIN_VALUE;
-                max_value_segment = Integer.MIN_VALUE;
-            }
-        }
-
-        int max_bit_width_interval = getBitWith(max_interval);
-        int max_bit_width_value = getBitWith(max_value);
-
-
-        raw_length[0] = length;
-        raw_length[1] = max_bit_width_interval;
-        raw_length[2] = max_bit_width_value;
-        raw_length[3] = timestamp_delta_min;
-        raw_length[4] = value_delta_min;
-
-//        printTSBlock(ts_block_delta);
-        return ts_block_delta;
-
-//        int[][] ts_block_delta_segment = new int[block_size][2];
-//        int pos_ts_block_delta_segment = 0;
-//        int[] tmp_segment = new int[2];
-//        int max_interval_segment = Integer.MIN_VALUE;
-//        int max_value_segment = Integer.MIN_VALUE;
-//        tmp_segment[0] = max_interval_segment;
-//        tmp_segment[1] = max_value_segment;
-//
-//
-//            if (epsilon_r > max_interval_segment) {
-//                max_interval_segment = epsilon_r;
-//                tmp_segment[0] = max_interval_segment;
-//            }
-//            if (epsilon_v > max_value_segment) {
-//                max_value_segment = epsilon_v;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//            if (j % segment_size == 0) {
-//                ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-//                ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-//                pos_ts_block_delta_segment++;
-//                tmp_segment = new int[2];
-//                max_interval_segment = Integer.MIN_VALUE;
-//                max_value_segment = Integer.MIN_VALUE;
-//                tmp_segment[0] = max_interval_segment;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//
-//
-//        for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-//            length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-//            length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-//        }
-
-
-    }
-
-    public static int getBeta(
-            long[] ts_block,
-            int alpha,
-            ArrayList<Integer> min_index,
-            int block_size,
-            int[] raw_length,
-            double[] theta) {
-
-        int raw_abs_sum = raw_length[0];
-        int[][] new_length_list = new int[block_size][3];
-        int pos_new_length_list = 0;
-        int range = block_size/16;
-
-        ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-        int j_star = -1;
-        int[] b;
-        if (alpha == -1) {
-            return j_star;
-        }
-
-        if (alpha == 0) {
-            if (min_index.get(0) == 1) {
-                adjust1TimeCost(ts_block, 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == 1) {
-                adjust1ValueCost(ts_block, 1, raw_length, min_index, theta);
-            }
-
-            for (int j = 2; j < range - 1; j++) {
-//            for (int j = 2; j < block_size - 1; j++) {
-                // if j, alpha+1, alpha points are min residuals, need to recalculate min residuals
-                if (min_index.contains(j)) { //|| min_index.contains(1)
-                    b = adjust0MinChange(ts_block, j, theta);
-                } else {
-                    b = adjust0MinChangeNo(ts_block, raw_length, j, theta);
-                }
-                if (b[0] < raw_abs_sum) {
-                    raw_abs_sum = b[0];
-                    j_star_list = new ArrayList<>();
-                    pos_new_length_list = 0;
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                } else if (b[0] == raw_abs_sum) {
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                }
-            }
-            if (min_index.contains(0)) {
-                b = adjust0n1MinChange(ts_block, theta);
-            } else {
-                b = adjust0n1MinChangeNo(ts_block, raw_length, theta);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-
-                j_star_list.add(block_size);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(block_size);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        } // alpha == n
-        else if (alpha == block_size - 1) {
-            if (min_index.get(0) == block_size - 1) {
-                adjust1TimeCost(ts_block, block_size - 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == block_size - 1) {
-                adjust1ValueCost(ts_block, block_size - 1, raw_length, min_index, theta);
-            }
-            for (int j = block_size - range; j < block_size - 1; j++) {
-//            for (int j = 1; j < block_size - 1; j++) {
-                if (min_index.contains(j)) { //min_index.contains(block_size - 1) ||
-                    b = adjustnMinChange(ts_block, j, theta);
-                } else {
-                    b = adjustnMinChangeNo(ts_block, raw_length, j, theta);
-                }
-                if (b[0] < raw_abs_sum) {
-                    raw_abs_sum = b[0];
-                    j_star_list = new ArrayList<>();
-                    j_star_list.add(j);
-                    pos_new_length_list = 0;
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                } else if (b[0] == raw_abs_sum) {
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                }
-            }
-            if (min_index.contains(0)) {//min_index.contains(block_size - 1) ||
-                b = adjustn0MinChange(ts_block, theta);
-            } else {
-                b = adjustn0MinChangeNo(ts_block, raw_length, theta);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list.clear();
-                j_star_list = new ArrayList<>();
-                j_star_list.add(0);
-
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(0);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        } // alpha != 1 and alpha != n
-        else {
-            if (min_index.get(0) == alpha) {
-                adjust1TimeCost(ts_block, alpha, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == alpha) {
-                adjust1ValueCost(ts_block, alpha, raw_length, min_index, theta);
-            }
-            if (min_index.get(0) == alpha + 1) {
-                adjust1TimeCost(ts_block, alpha + 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == alpha + 1) {
-                adjust1ValueCost(ts_block, alpha + 1, raw_length, min_index, theta);
-            }
-
-            long tmp_alpha = ts_block[alpha];
-            long tmp_alpha_plus_1 = ts_block[alpha+1];
-            long tmp_alpha_minus_1 = ts_block[alpha-1];
-
-            int start_j = Math.max(alpha-range/2,1);
-            int end_j = Math.min(alpha+range/2,block_size-1);
-            for (int j = start_j; j < end_j; j++) {
-//            for (int j = 1; j < block_size - 1; j++) {
-                if (alpha != j && (alpha + 1) != j) {
-                    if (min_index.contains(j)) { //|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                        b = adjustAlphaToJMinChange(ts_block, alpha, j, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-                    } else {
-                        b = adjustAlphaToJMinChangeNo(ts_block, raw_length, alpha, j, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-                    }
-                    if (b[0] < raw_abs_sum) {
-                        raw_abs_sum = b[0];
-                        j_star_list = new ArrayList<>();
-                        j_star_list.add(j);
-                        pos_new_length_list = 0;
-                        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                        pos_new_length_list++;
-                    } else if (b[0] == raw_abs_sum) {
-                        j_star_list.add(j);
-                        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                        pos_new_length_list++;
-                    }
-                }
-            }
-
-            if (min_index.contains(0)) {//|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                b = adjustTo0MinChange(ts_block, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            } else {
-                b = adjustTo0MinChangeNo(ts_block, raw_length, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-                j_star_list.add(0);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(0);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-            if (min_index.contains(block_size - 1)) {//|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                b = adjustTonMinChange(ts_block, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            } else {
-                b = adjustTonMinChangeNo(ts_block, raw_length, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1);
-            }
-
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-                j_star_list.add(block_size);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(block_size);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        }
-        int[][] new_new_length_list = new int[pos_new_length_list][5];
-        for (int i = 0; i < pos_new_length_list; i++) {
-            System.arraycopy(new_new_length_list[i], 0, new_length_list[i], 0, 3);
-        }
-
-        if (j_star_list.size() != 0) {
-            j_star = getIstarClose(alpha, j_star_list, new_new_length_list, raw_length);
-        }
-        return j_star;
-    }
-
-
-    public static int[] getIStar(
-            long[] ts_block, ArrayList<Integer> min_index, int block_size, int index, double[] theta) {
-
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_min_index = -1;
-        int value_delta_min_index = -1;
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        int timestamp_delta_max_index = -1;
-        int value_delta_max_index = -1;
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-//        int[][] ts_block_delta = new int[block_size - 1][2];
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-                timestamp_delta_min_index = j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-                value_delta_min_index = j;
-            }
-            if (epsilon_r_j > timestamp_delta_max) {
-                timestamp_delta_max = epsilon_r_j;
-                timestamp_delta_max_index = j;
-            }
-            if (epsilon_v_j > value_delta_max) {
-                value_delta_max = epsilon_v_j;
-                value_delta_max_index = j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//
-//        }
-        min_index.add(timestamp_delta_min_index);
-        min_index.add(value_delta_min_index);
-
-
-        int[] alpha_list = new int[2];
-        if(index==0){
-            alpha_list[0] = value_delta_min_index;
-            alpha_list[1] = value_delta_max_index;
-        }else{
-            alpha_list[0] = timestamp_delta_min_index;
-            alpha_list[1] = timestamp_delta_max_index;
-        }
-
-        return alpha_list;
-    }
-
-    public static int[] getIStar(
-            long[] ts_block,
-            ArrayList<Integer> min_index,
-            int block_size,
-            double[] theta) {
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_min_index = -1;
-        int value_delta_min_index = -1;
-        int timestamp_delta_max_index = -1;
-        int value_delta_max_index = -1;
-
-        int[] alpha_list = new int[4];
-
-        double theta0_t = theta[0];
-        double theta1_t = theta[1];
-        double theta0_v = theta[2];
-        double theta1_v = theta[3];
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while(j < block_size){
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-                timestamp_delta_min_index = j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-                value_delta_min_index = j;
-            }
-            if (epsilon_r_j > timestamp_delta_max) {
-                timestamp_delta_max = epsilon_r_j;
-                timestamp_delta_max_index = j;
-            }
-            if (epsilon_v_j > value_delta_max) {
-                value_delta_max = epsilon_v_j;
-                value_delta_max_index = j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r_j =
-//                    getTime(tmp_j)
-//                            - (int) (theta0_t + theta1_t * (double) getTime(tmp_j_1));
-//            int epsilon_v_j =
-//                    getValue(tmp_j)
-//                            - (int) (theta0_v + theta1_v * (double) getValue(tmp_j_1));
-//
-//            if (epsilon_v_j > value_delta_max) {
-//                value_delta_max = epsilon_v_j;
-//                value_delta_max_index = j;
-//            }
-//            if (epsilon_v_j < value_delta_min) {
-//                value_delta_min = epsilon_v_j;
-//                value_delta_min_index = j;
-//            }
-//            if (epsilon_r_j > timestamp_delta_max) {
-//                timestamp_delta_max = epsilon_r_j;
-//                timestamp_delta_max_index = j;
-//            }
-//            if (epsilon_r_j < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r_j;
-//                timestamp_delta_min_index = j;
-//            }
-//        }
-
-        min_index.add(timestamp_delta_min_index);
-        alpha_list[0] = timestamp_delta_min_index;
-        alpha_list[1] = timestamp_delta_max_index;
-
-
-        int pos_alpha_list = 2;
-        min_index.add(value_delta_min_index);
-        if (!containsValue(alpha_list, value_delta_min_index)) {
-            alpha_list[pos_alpha_list] = value_delta_min_index;
-            pos_alpha_list++;
-        }
-        if (!containsValue(alpha_list, value_delta_max_index)) {
-            alpha_list[pos_alpha_list] = value_delta_max_index;
-            pos_alpha_list++;
-        }
-
-
-        int[] new_alpha_list = new int[pos_alpha_list];
-        System.arraycopy(alpha_list, 0, new_alpha_list, 0, pos_alpha_list);
-
-        return new_alpha_list;
-    }
-
-
-    public static int encodeRLEBitWidth2Bytes(
-            long[] bit_width_segments) {
-        int encoded_result = 0;
-
-
-        int count_of_time = 1;
-        int count_of_value = 1;
-        long pre_bit_width_segments = bit_width_segments[0];
-        int pre_time = getTime(pre_bit_width_segments);
-        int pre_value = getValue(pre_bit_width_segments);
-        int size = bit_width_segments.length;
-
-
-        int pos_time = 0;
-        int pos_value = 0;
-
-        for (int i = 1; i < size; i++) {
-            long cur_bit_width_segments = bit_width_segments[i];
-            int cur_time = getTime(cur_bit_width_segments);
-            int cur_value = getValue(cur_bit_width_segments);
-            if (cur_time != pre_time && count_of_time != 0) {
-                pos_time++;
-                pre_time = cur_time;
-                count_of_time = 1;
-            } else {
-                count_of_time++;
-                pre_time = cur_time;
-                if (count_of_time == 256) {
-                    pos_time++;
-                    count_of_time = 1;
-                }
-            }
-
-            if (cur_value != pre_value && count_of_value != 0) {
-                pos_value++;
-
-                pre_value = cur_value;
-                count_of_value = 1;
-            } else {
-                count_of_value++;
-                pre_value = cur_value;
-                if (count_of_value == 256) {
-                    pos_value++;
-                    count_of_value = 0;
-                }
-            }
-
-        }
-        if (count_of_time != 0) {
-            pos_time++;
-        }
-        if (count_of_value != 0) {
-            pos_value++;
-        }
-
-        encoded_result += (pos_time * 2);
-        encoded_result += (pos_value * 2);
-
-        return encoded_result;
-    }
-
-    public static int encodeRLEBitWidth2Bytes(
-            long[] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-        int count_of_time = 1;
-        int count_of_value = 1;
-        long pre_bit_width_segments = bit_width_segments[0];
-        int pre_time = getTime(pre_bit_width_segments);
-        int pre_value = getValue(pre_bit_width_segments);
-
-        int size = bit_width_segments.length;
-        int[][] run_length_time = new int[size][2];
-        int[][] run_length_value = new int[size][2];
-
-        int pos_time = 0;
-        int pos_value = 0;
-
-        for (int i = 1; i < size; i++) {
-            long cur_bit_width_segments = bit_width_segments[i];
-            int cur_time = getTime(cur_bit_width_segments);
-            int cur_value = getValue(cur_bit_width_segments);
-            if (cur_time != pre_time && count_of_time != 0) {
-                run_length_time[pos_time][0] = count_of_time;
-                run_length_time[pos_time][1] = pre_time;
-                pos_time++;
-                pre_time = cur_time;
-                count_of_time = 1;
-            } else {
-                count_of_time++;
-                pre_time = cur_time;
-                if (count_of_time == 256) {
-                    run_length_time[pos_time][0] = count_of_time;
-                    run_length_time[pos_time][1] = pre_time;
-                    pos_time++;
-                    count_of_time = 0;
-                }
-            }
-
-            if (cur_value != pre_value && count_of_value != 0) {
-                run_length_value[pos_value][0] = count_of_value;
-                run_length_value[pos_value][1] = pre_value;
-                pos_value++;
-
-                pre_value = cur_value;
-                count_of_value = 1;
-            } else {
-                count_of_value++;
-                pre_value = cur_value;
-                if (count_of_value == 256) {
-                    run_length_value[pos_value][0] = count_of_value;
-                    run_length_value[pos_value][1] = pre_value;
-                    pos_value++;
-                    count_of_value = 0;
-                }
-            }
-
-        }
-        if (count_of_time != 0) {
-            run_length_time[pos_time][0] = count_of_time;
-            run_length_time[pos_time][1] = pre_time;
-            pos_time++;
-        }
-        if (count_of_value != 0) {
-            run_length_value[pos_value][0] = count_of_value;
-            run_length_value[pos_value][1] = pre_value;
-            pos_value++;
-        }
-        intWord2Bytes(pos_time, pos_encode, encoded_result);
-        pos_encode += 2;
-        intWord2Bytes(pos_value, pos_encode, encoded_result);
-        pos_encode += 2;
-
-        for (int i = 0; i < pos_time; i++) {
-            int[] bit_width_time = run_length_time[i];
-            intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-            pos_encode++;
-            intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-            pos_encode++;
-
-        }
-        for (int i = 0; i < pos_value; i++) {
-            int[] bit_width_value = run_length_value[i];
-            intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-            pos_encode++;
-            intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-            pos_encode++;
-
-        }
-
-        return pos_encode;
-    }
-
-    public static long[] segmentBitPacking(long[] ts_block_delta, int block_size, int segment_size) {
-
-        int segment_n = (block_size - 1) / segment_size;
-        long[] bit_width_segments = new long[segment_n];
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = Integer.MIN_VALUE;
-            int bit_width_value = Integer.MIN_VALUE;
-
-            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
-                long cur_data_i = ts_block_delta[data_i];
-//                System.out.println("cur_data_i: "+(cur_data_i));
-//                System.out.println("getTime(cur_data_i): "+getTime(cur_data_i));
-//                System.out.println("getValue(cur_data_i): "+getValue(cur_data_i));
-                int cur_bit_width_time = getBitWith(getTime(cur_data_i));
-                int cur_bit_width_value = getBitWith(getValue(cur_data_i));
-                if (cur_bit_width_time > bit_width_time) {
-                    bit_width_time = cur_bit_width_time;
-                }
-                if (cur_bit_width_value > bit_width_value) {
-                    bit_width_value = cur_bit_width_value;
-                }
-            }
-            bit_width_segments[segment_i] = combine2Int( bit_width_time, bit_width_value);
-        }
-        return bit_width_segments;
-    }
-
-    public static void moveAlphaToBeta(long[] ts_block, int alpha, int beta) {
-        long tmp_tv = ts_block[alpha];
-        if (beta < alpha) {
-            for (int u = alpha - 1; u >= beta; u--) {
-                ts_block[u + 1] = ts_block[u];
-            }
-        } else {
-            for (int u = alpha + 1; u < beta; u++) {
-                ts_block[u - 1] = ts_block[u];
-            }
-            beta--;
-        }
-        ts_block[beta] = tmp_tv;
-    }
-
-
-    private static int numberOfEncodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int segment_size) {
-        int block_size = delta_segments.length;
-        int segment_n = block_size / segment_size;
-        int result = 0;
-        result += 8; // encode interval0 and value0
-        result += 16; // encode theta
-        result += encodeRLEBitWidth2Bytes(bit_width_segments);
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            long cur_data_i = bit_width_segments[segment_i];
-            int bit_width_time = getTime(cur_data_i);
-            int bit_width_value =getValue(cur_data_i);
-            result += (segment_size * bit_width_time / 8);
-            result += (segment_size * bit_width_value / 8);
-        }
-
-        return result;
-    }
-
-    private static int encodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int[] raw_length, int segment_size, double[] theta, int pos_encode, byte[] encoded_result) {
-
-        int block_size = delta_segments.length;
-        int segment_n = block_size / segment_size;
-        long2Bytes(delta_segments[0], pos_encode, encoded_result);
-        pos_encode += 8;
-        double2bytes(theta[0], pos_encode, encoded_result);
-        pos_encode += 8;
-        double2bytes(theta[1], pos_encode, encoded_result);
-        pos_encode += 8;
-        double2bytes(theta[2], pos_encode, encoded_result);
-        pos_encode += 8;
-        double2bytes(theta[3], pos_encode, encoded_result);
-        pos_encode += 8;
-
-        int2Bytes( raw_length[3], pos_encode, encoded_result);
-        pos_encode += 4;
-        int2Bytes(raw_length[4], pos_encode, encoded_result);
-        pos_encode += 4;
-
-        pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-//        printTSBlock(bit_width_segments);
-//        System.out.println(pos_encode);
-//        System.out.println("theta:"+ Arrays.toString(theta));
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            long tmp_bit_width_segments = bit_width_segments[segment_i];
-            int bit_width_time = getTime(tmp_bit_width_segments);
-            int bit_width_value = getValue(tmp_bit_width_segments);
-//            System.out.println(bit_width_time);
-//            System.out.println(bit_width_value);
-            pos_encode = bitPacking(delta_segments, 0, segment_i * segment_size + 1, segment_size, bit_width_time, pos_encode, encoded_result);
-            pos_encode = bitPacking(delta_segments, 1, segment_i * segment_size + 1, segment_size, bit_width_value, pos_encode, encoded_result);
-        }
-
-        return pos_encode;
-    }
-    private static void printTSBlock(long[] ts_block){
-        for(long ts : ts_block){
-            System.out.println("["+getTime(ts)+","+getValue(ts)+"]");
-        }
-    }
-
-    private static long[] ReorderingTimeSeries(long[] ts_block, int[] raw_length, double[] theta, int segment_size) {
-
-
-        int block_size = ts_block.length;
-        long[] ts_block_delta = new long[block_size];
-
-        ArrayList<Integer> min_index = new ArrayList<>();
-        int index_alpha_list = 0;
-
-
-//        trainParameter(ts_block,block_size,theta);
-//        System.out.println(Arrays.toString(theta));
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta,segment_size);
-//        System.out.println(Arrays.toString(raw_length));
-        int[] alpha_list = getIStar(ts_block, min_index, block_size, 0, theta);
-        int[] beta_list = new int[alpha_list.length];
-        int[][] new_length_list = new int[alpha_list.length][5];
-        int pos_new_length_list = 0;
-        int[] new_alpha_list = new int[alpha_list.length];
-
-
-        for (int alpha : alpha_list) {
-            if (alpha == -1)
-                continue;
-            new_alpha_list[pos_new_length_list] = alpha;
-
-            ArrayList<Integer> new_min_index = (ArrayList<Integer>) min_index.clone();
-            int[] new_length = raw_length.clone();
-
-            beta_list[pos_new_length_list] = getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-            if (beta_list[pos_new_length_list] == -1)
-                continue;
-            System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-            pos_new_length_list++;
-        }
-
-        int adjust_count = 0;
-
-
-        while (pos_new_length_list != 0) {
-            if (adjust_count < block_size / 2 && adjust_count < 20) {
-                adjust_count++;
-            } else {
-                break;
-            }
-//            all_length = new int[pos_new_length_list][2];
-            int min_length_index = -1;
-            int min_length = Integer.MAX_VALUE;
-
-
-            for (int pos_new_length_list_j = 0; pos_new_length_list_j < pos_new_length_list; pos_new_length_list_j++) {
-                if(new_length_list[pos_new_length_list_j][0]<min_length){
-                    min_length = new_length_list[pos_new_length_list_j][0];
-                    min_length_index = pos_new_length_list_j;
-                }
-            }
-
-            if (min_length <= raw_length[0]) {
-                long[] new_ts_block = ts_block.clone();
-                moveAlphaToBeta(new_ts_block, new_alpha_list[min_length_index], beta_list[min_length_index]);
-                int[] new_length = raw_length.clone();
-                getEncodeBitsRegressionNoTrain(new_ts_block, block_size, new_length, theta, segment_size);
-                if(new_length[0] < raw_length[0]){
-                    System.arraycopy(new_length, 0, raw_length, 0, 5);
-                    ts_block = new_ts_block.clone();
-                }else{
-                    break;
-                }
-//                  moveAlphaToBeta(ts_block, new_alpha_list[min_length_index], beta_list[min_length_index]);
-//                  System.arraycopy(new_length_list[min_length_index], 0, raw_length, 0, 5);
-            } else {
-                break;
-            }
-
-            alpha_list = getIStar(ts_block, min_index, block_size, theta);
-
-            int alpha_size = alpha_list.length;
-            for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-                if (containsValue(beta_list, alpha_list[alpha_i])) {
-                    alpha_list = removeElement(alpha_list, alpha_i);
-                }
-            }
-            beta_list = new int[alpha_list.length];
-            new_length_list = new int[alpha_list.length][5];
-            pos_new_length_list = 0;
-            new_alpha_list = new int[alpha_list.length];
-
-            for (int alpha : alpha_list) {
-                if (alpha == -1)
-                    continue;
-                new_alpha_list[pos_new_length_list] = alpha;
-
-                int[] new_length = raw_length.clone();
-//            beta_list[j] = 0;
-                beta_list[pos_new_length_list] = getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-                if (beta_list[pos_new_length_list] == -1)
-                    continue;
-                System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-                pos_new_length_list++;
-            }
-
-        }
-
-//        System.out.println(adjust_count);
-//        printTSBlock(ts_block);
-        ts_block_delta = getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-//        printTSBlock(ts_block_delta);
-
-        return ts_block_delta;
-//        int segment_n = (block_size - 1) / segment_size;
-//        int[][] bit_width_segments = new int[segment_n][2];
-//        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-//            int bit_width_time = Integer.MIN_VALUE;
-//            int bit_width_value = Integer.MIN_VALUE;
-//
-//            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
-//                int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-//                int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-//                if (cur_bit_width_time > bit_width_time) {
-//                    bit_width_time = cur_bit_width_time;
-//                }
-//                if (cur_bit_width_value > bit_width_value) {
-//                    bit_width_value = cur_bit_width_value;
-//                }
-//            }
-//
-//            bit_width_segments[segment_i][0] = bit_width_time;
-//            bit_width_segments[segment_i][1] = bit_width_value;
-//        }
-//
-//
-//        encode_pos = encodeSegment2Bytes(ts_block_delta, bit_width_segments, raw_length, segment_size, theta, encode_pos, cur_byte);
-
-//        System.out.println("encode_pos="+encode_pos);
-//        return encode_pos;
-    }
-
-
-    private static int REGERBlockEncoder(long[] data, int i, int block_size, int supply_length, int[] third_value, int segment_size, int encode_pos, byte[] cur_byte, int[] block_sort) {
-
-
-        long min_time = (long) getTime(data[i * block_size]) <<32;
-        long[] ts_block;
-        long[] ts_block_value;
-        long[] ts_block_partition;
-
-        if (supply_length == 0) {
-            ts_block = new long[block_size];
-            ts_block_value = new long[block_size];
-            ts_block_partition = new long[block_size];
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-//            System.out.println((data[i * block_size+1]));
-//            System.out.println(getTime(data[i * block_size+1]));
-            for (int j = 0; j < block_size; j++) {
-                long tmp_j = data[j + i * block_size] - min_time;
-//                System.out.println(getTime(data[j + i * block_size]));
-//                System.out.println(getTime(data[i * block_size]));
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j),getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-//            for (int j = 0; j < block_size; j++) {
-//                ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-//                ts_block[j][1] = data[j + i * block_size][1];
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                int tmp_value = ts_block[j][1]-min_value;
-//                if(data_map.containsKey(tmp_value)){
-//                    int tmp = data_map.get(tmp_value);
-//                    tmp++;
-//                    data_map.put(tmp_value,tmp);
-//                }else{
-//                    data_map.put(tmp_value,1);
-//                }
-//                ts_block_value[j][0] =ts_block[j][0];
-//                ts_block_value[j][1] =ts_block[j][1];
-//            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-//
-//            third_value= findMinIndex(kernelDensity);
-//            for(int j=0;j<third_value.length;j++){
-//                third_value[j] += min_value;
-//            }
-//            System.out.println("Minimum point: x=" + (Arrays.toString(third_value)));
-        } else {
-            ts_block = new long[supply_length];
-            ts_block_value = new long[supply_length];
-            ts_block_partition = new long[supply_length];
-            int end = data.length - i * block_size;
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-            for (int j = 0; j < end; j++) {
-                long tmp_j = data[j + i * block_size] - min_time;
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j),getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-            for (int j = end; j < supply_length; j++) {
-                ts_block[j] = 0;
-                ts_block_value[j] = 0;
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] =0;
-            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-
-//            third_value= findMinIndex(kernelDensity);
-            block_size = supply_length;
-        }
-
-
-        int2Bytes(getTime(min_time),encode_pos,cur_byte);
-        encode_pos += 4;
-        int[] reorder_length = new int[5];
-        double[] theta_reorder = new double[4];
-        int[] time_length = new int[5];// length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        double[] theta_time = new double[4];
-        int[] partition_length = new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        double[] theta_partition = new double[4];
-
-        trainParameter(ts_block,block_size,theta_time);
-//printTSBlock(ts_block);
-
-        long[] ts_block_delta_time =  getEncodeBitsRegressionNoTrain(ts_block, block_size, time_length, theta_time,segment_size);
-
-
-        int pos_ts_block_partition = 0;
-        if (third_value.length > 0) {
-            for(int j=block_size-1;j>=0;j--){
-                long datum = ts_block[j];
-                if (getValue(datum) <= third_value[0]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-            for (int third_i = 1; third_i <= third_value.length - 1; third_i++) {
-                for (int j = block_size - 1; j >= 0; j--) {
-                    long datum = ts_block[j];
-                    if (getValue(datum) <= third_value[third_i] && getValue(datum) > third_value[third_i - 1]) {
-                        ts_block_partition[pos_ts_block_partition] = datum;
-                        pos_ts_block_partition++;
-                    }
-                }
-            }
-            for (int j = block_size - 1; j >= 0; j--) {
-                long datum = ts_block[j];
-                if (getValue(datum) > third_value[third_value.length - 1]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-
-        }
-
-
-
-        trainParameter(ts_block_partition,block_size,theta_partition);
-        long[] ts_block_delta_partition = getEncodeBitsRegressionNoTrain(ts_block_partition, block_size, partition_length, theta_partition,segment_size);
-
-        Arrays.sort(ts_block_value);
-        trainParameter(ts_block_value,block_size,theta_reorder);
-        long[] ts_block_delta_reorder = getEncodeBitsRegressionNoTrain(ts_block_value, block_size, reorder_length, theta_reorder,segment_size);
-
-
-//       ReorderingTimeSeries(ts_block_value, reorder_length,  theta_reorder, segment_size);
-
-        int segment_n = (block_size - 1) / segment_size;
-        long[] bit_width_segments = new long[segment_n];
-
-
-        int choose = min3(time_length[0], partition_length[0], reorder_length[0]);
-        if(choose == 0){
-//            System.out.println("time");
-//            System.out.println(Arrays.toString(time_length));
-            block_sort[i] = 0;
-            ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length,  theta_time, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments, time_length, segment_size, theta_time, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(time_length));
-        }
-        else if(choose==1){
-//            System.out.println("partition");
-//            System.out.println(Arrays.toString(partition_length));
-            block_sort[i] = 0;
-            ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length,  theta_partition, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(partition_length));
-        } else if (choose ==2) {
-//            System.out.println("value");
-//            System.out.println(Arrays.toString(reorder_length));
-            block_sort[i] = 1;
-            ts_block_delta_reorder = ReorderingTimeSeries(ts_block_value, reorder_length,  theta_reorder, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments, reorder_length, segment_size, theta_reorder, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(reorder_length));
-        }
-
-
-//        int segment_n = (block_size - 1) / segment_size;
-//        long[] bit_width_segments = new long[segment_n];
-//
-//        if(time_length[0] > partition_length[0]){
-//
-//            ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length,  theta_partition, segment_size);
-//
-//            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-//            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-//
-//        }else{
-//            ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length,  theta_time, segment_size);
-//
-//            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-//            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments, time_length, segment_size, theta_time, encode_pos, cur_byte);
-//
-//        }
-
-//        System.out.println(encode_pos);
-
-        return encode_pos;
-    }
-
-    public static int ReorderingRegressionEncoder(long[] data, int block_size, int[] third_value, int segment_size, byte[] encoded_result) {
-        block_size++;
-//    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-        int length_all = data.length;
-//        System.out.println(length_all);
-        int encode_pos = 0;
-        int2Bytes(length_all, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int block_num = length_all / block_size;
-        int2Bytes(block_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int2Bytes(segment_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int[] block_sort = new int[block_num+1];
-        int encode_pos_block_sort = encode_pos;
-        int length_block_sort = (int) Math.ceil((double)(block_num+1)/(double) 8);
-        encode_pos += length_block_sort;
-
-//        for (int i = 44; i < 45; i++) {
-        for (int i = 0; i < block_num; i++) {
-//            System.out.println(i);
-            encode_pos = REGERBlockEncoder(data, i, block_size, 0, third_value, segment_size, encode_pos, encoded_result, block_sort);
-        }
-
-        int remaining_length = length_all - block_num * block_size;
-        if (remaining_length == 1) {
-            long2Bytes(data[data.length - 1], encode_pos, encoded_result);
-            encode_pos += 8;
-        }
-        if (remaining_length != 0 && remaining_length != 1) {
-            int supple_length;
-            if (remaining_length % segment_size == 0) {
-                supple_length = 1;
-            } else if (remaining_length % segment_size == 1) {
-                supple_length = 0;
-            } else {
-                supple_length = segment_size + 1 - remaining_length % segment_size;
-            }
-            encode_pos = REGERBlockEncoder(data, block_num, block_size, supple_length + remaining_length, third_value, segment_size, encode_pos, encoded_result, block_sort);
-        }
-
-        encodeSort(block_sort,encode_pos_block_sort,encoded_result);
-
-
-        return encode_pos;
-    }
-
-    private static void encodeSort(int[] block_sort,int encode_pos_block_sort, byte[] encoded_result) {
-        int length = block_sort.length;
-        int cur_num = 0;
-        for(int i=1;i<=length;i++){
-            cur_num <<=1;
-            cur_num += block_sort[i-1];
-            if(i%8==0){
-                intByte2Bytes(cur_num, encode_pos_block_sort, encoded_result);
-                encode_pos_block_sort ++;
-                cur_num = 0;
-            }
-        }
-        if(length%8!=0){
-            intByte2Bytes(cur_num, encode_pos_block_sort, encoded_result);
-        }
-    }
-
-    public static int REGERBlockDecoder(byte[] encoded, int decode_pos, int[][] value_list, int block_size, int segment_size, int[] value_pos_arr) {
-
-        int min_time_0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-
-        int time0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = time0+min_time_0;
-        int value0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = value0;
-
-        value_pos_arr[0]++;
-
-        double theta_time0 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-        double theta_time1 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-
-        double theta_value0 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-        double theta_value1 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-
-        int min_time = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-        int min_value = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-
-        int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-        int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-
-        int count;
-        int num;
-        int segment_n = block_size / segment_size;
-        int[][] bit_width_segments = new int[segment_n][2];
-        int pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_time_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][0] = num;
-                pos_bit_width_segments++;
-            }
-
-        }
-
-        pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_value_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][1] = num;
-                pos_bit_width_segments++;
-            }
-        }
-
-        int pre_time = time0;
-        int pre_value = value0;
-
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = bit_width_segments[segment_i][0];
-            int bit_width_value = bit_width_segments[segment_i][1];
-            int[] decode_time_result = new int[segment_size];
-            int[] decode_value_result = new int[segment_size];
-
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-            int pos_decode_time_result = 0;
-            int length_decode_time_result = decode_time_result.length;
-            for(;pos_decode_time_result<length_decode_time_result;pos_decode_time_result++){
-                pre_time = (int) (theta_time0 + theta_time1 * (float)pre_time ) + decode_time_result[pos_decode_time_result] + min_time;
-                pre_value = (int) (theta_value0 + theta_value1 * (float)pre_value ) +  decode_value_result[pos_decode_time_result] + min_value;
-                value_list[value_pos_arr[0]][0] = pre_time + min_time_0;
-                value_list[value_pos_arr[0]][1] = pre_value;
-                value_pos_arr[0] ++;
-            }
-        }
-
-
-        return decode_pos;
-    }
-
-    public static int REGERBlockDecoderValue(byte[] encoded, int decode_pos, int[][] value_list, int block_size, int segment_size, int[] value_pos_arr) {
-
-        int min_time_0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        int time0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = time0;
-        int value0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = value0+min_time_0;
-
-        value_pos_arr[0]++;
-
-        double theta_time0 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-        double theta_time1 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-
-        double theta_value0 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-        double theta_value1 = bytes2Double(encoded, decode_pos);
-        decode_pos += 8;
-
-        int min_time = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-        int min_value = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-
-        int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-        int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-
-        int count;
-        int num;
-        int segment_n = block_size / segment_size;
-        int[][] bit_width_segments = new int[segment_n][2];
-        int pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_time_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][0] = num;
-                pos_bit_width_segments++;
-            }
-
-        }
-
-        pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_value_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][1] = num;
-                pos_bit_width_segments++;
-            }
-        }
-
-        int pre_time = time0;
-        int pre_value = value0;
-
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = bit_width_segments[segment_i][0];
-            int bit_width_value = bit_width_segments[segment_i][1];
-            int[] decode_time_result = new int[segment_size];
-            int[] decode_value_result = new int[segment_size];
-
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-            int pos_decode_time_result = 0;
-            int length_decode_time_result = decode_time_result.length;
-            for(;pos_decode_time_result<length_decode_time_result;pos_decode_time_result++){
-                pre_time = (int) (theta_time0 + theta_time1 * (float)pre_time ) + decode_time_result[pos_decode_time_result] + min_time;
-                pre_value = (int) (theta_value0 + theta_value1 * (float)pre_value ) +  decode_value_result[pos_decode_time_result] + min_value;
-                value_list[value_pos_arr[0]][1] = pre_time;
-                value_list[value_pos_arr[0]][0] = pre_value+min_time_0;
-                value_pos_arr[0] ++;
-            }
-        }
-
-
-        return decode_pos;
-    }
-
-
-    public static void REGERDecoder(byte[] encoded) {
-
-        int decode_pos = 0;
-        int length_all = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        int block_size = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        int segment_size = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-
-
-        int block_num = length_all / block_size;
-        int remain_length = length_all - block_num * block_size;
-        int zero_number;
-
-        int length_block_sort = (int) Math.ceil((double)(block_num+1)/(double) 8);
-        int[] block_sort = new int[block_num+1];
-        for(int i=0;i<length_block_sort-1;i++){
-            int sort = byte2Integer(encoded, decode_pos);
-            decode_pos ++;
-            for(int j=0;j<8;j++){
-                block_sort[i*8+7-j] = sort & 1;
-                sort >>= 1;
-            }
-        }
-        int block_sort_end =(block_num +1)- (length_block_sort*8-8);
-        int sort = byte2Integer(encoded, decode_pos);
-        decode_pos ++;
-        for(int j=0;j<block_sort_end;j++){
-            block_sort[8*length_block_sort-8+block_sort_end-j-1] = sort & 1;
-            sort >>= 1;
-        }
-
-        if (remain_length % segment_size == 0) {
-            zero_number = 1;
-        } else if (remain_length % segment_size == 1) {
-            zero_number = 0;
-        } else {
-            zero_number = segment_size + 1 - remain_length % segment_size;
-        }
-        int[][] value_list = new int[length_all + segment_size][2];
-
-        int[] value_pos_arr = new int[1];
-
-//        for (int k = 0; k < 2; k++) {
-        for (int k = 0; k < block_num; k++) {
-            int cur_block_sort = block_sort[k];
-            if(cur_block_sort==0)
-                decode_pos = REGERBlockDecoder(encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-            else if (cur_block_sort == 1){
-                decode_pos = REGERBlockDecoderValue(encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-            }
-
-        }
-
-        if (remain_length == 1) {
-            for (int i = 0; i < remain_length; i++) {
-                int value_end = bytes2Integer(encoded, decode_pos, 4);
-                decode_pos += 4;
-                value_list[value_pos_arr[0]][0] = value_end;
-                value_end = bytes2Integer(encoded, decode_pos, 4);
-                decode_pos += 4;
-                value_list[value_pos_arr[0]][1] = value_end;
-                value_pos_arr[0]++;
-            }
-        } else {
-            int cur_block_sort = block_sort[block_num];
-            if(cur_block_sort==0)
-                REGERBlockDecoder(encoded, decode_pos, value_list, remain_length + zero_number, segment_size, value_pos_arr);
-            else if (cur_block_sort == 1){
-                REGERBlockDecoderValue(encoded, decode_pos, value_list, remain_length + zero_number, segment_size, value_pos_arr);
-            }
-        }
-    }
-
-//    @Test
-    public static void REGER() throws IOException {
-//        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-        String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-        String output_parent_dir = "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_double";
-        int pack_size = 16;
-        int block_size = 512;
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> output_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-        dataset_name.add("FANYP-Sensors");
-        dataset_name.add("TRAJET-Transport");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-        int[] dataset_12 = {652477};
-        int[] dataset_13 = {581388};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-        dataset_third.add(dataset_12);
-        dataset_third.add(dataset_13);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
-            dataset_block_size.add(block_size);
-        }
-
-        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-//        dataset_block_size.add(128);
-
-        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-//        dataset_block_size.add(4096);
-        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
-        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-//        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-//        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
-        output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
-
-//        int[] file_lists = {5,6,8,10};
-//        for (int file_i : file_lists) {
-        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-//        for (int file_i = 12; file_i < 14; file_i++) {
-            String inputPath = input_path_list.get(file_i);
-            String Output = output_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-            String[] head = {
-                    "Input Direction",
-                    "Encoding Algorithm",
-                    "Encoding Time",
-                    "Decoding Time",
-                    "Points",
-                    "Compressed Size",
-                    "Compression Ratio",
-            };
-            writer.writeRecord(head); // write header to output file
-
-            assert tempList != null;
-
-            int count_csv =0;
-            for (File f : tempList) {
-                System.out.println(count_csv);
-                count_csv ++;
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-
-                ArrayList<Long> data = new ArrayList<>();
-
-                // add a column to "data"
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-
-                while (loader.readRecord()) {
-
-                    int time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-                    data.add(combine2Int(time_tmp,value_tmp));
-                }
-
-                inputStream.close();
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-
-                long[] data2_arr = new long[data.size()];
-
-                for (int i = 0; i < data.size(); i++) {
-                    data2_arr[i] = data.get(i) ;
-                }
-
-                byte[] encoded_result = new byte[data2_arr.length * 8];
-                long encodeTime = 0;
-                long decodeTime = 0;
-                double ratio = 0;
-                double compressed_size = 0;
-                int repeatTime2 = 100;
-                long s = System.nanoTime();
-                int[] best_order = new int[3];
-                int length = 0;
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    length = ReorderingRegressionEncoder(data2_arr, dataset_block_size.get(file_i), dataset_third.get(file_i), pack_size, encoded_result);
-                long e = System.nanoTime();
-                encodeTime += ((e - s) / repeatTime2);
-                compressed_size += length;
-                double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                ratio += ratioTmp;
-                s = System.nanoTime();
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    REGERDecoder(encoded_result);
-                e = System.nanoTime();
-                decodeTime += ((e - s) / repeatTime2);
-
-
-                String[] record = {
-                        f.toString(),
-                        "REGER-64-DOUBLE",
-                        String.valueOf(encodeTime),
-                        String.valueOf(decodeTime),
-                        String.valueOf(data.size()),
-                        String.valueOf(compressed_size),
-                        String.valueOf(ratio),
-//                        String.valueOf(best_order[0]),
-//                        String.valueOf(best_order[1]),
-//                        String.valueOf(best_order[2])
-                };
-                writer.writeRecord(record);
-//                System.out.println(Arrays.toString(best_order));
-                System.out.println(ratio);
-
-//                break;
-            }
-            writer.close();
-        }
-    }
-
-    @Test
-    public void REGERVaryBlockSize() throws IOException {
-        //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-        String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-        String output_parent_dir = "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/block_size_double";
-        int pack_size = 16;
-
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> output_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-        dataset_name.add("FANYP-Sensors");
-        dataset_name.add("TRAJET-Transport");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-        int[] dataset_12 = {652477};
-        int[] dataset_13 = {581388};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-        dataset_third.add(dataset_12);
-        dataset_third.add(dataset_13);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
-        }
-
-        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-        //        dataset_block_size.add(1024);
-
-        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        //        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-        //        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-        //        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-        //        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-        //        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
-        output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
-
-//        int[] file_lists = {5,6,8,10};
-//        for (int file_i : file_lists) {
-        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-//        for (int file_i = 12; file_i < 14; file_i++) {
-            String inputPath = input_path_list.get(file_i);
-            String Output = output_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-            String[] head = {
-                    "Input Direction",
-                    "Encoding Algorithm",
-                    "Encoding Time",
-                    "Decoding Time",
-                    "Points",
-                    "Compressed Size",
-                    "Block Size",
-                    "Compression Ratio"
-            };
-            writer.writeRecord(head); // write header to output file
-
-            assert tempList != null;
-
-            int count_csv =0;
-            for (File f : tempList) {
-                System.out.println(count_csv);
-                count_csv ++;
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-                ArrayList<Long> data = new ArrayList<>();
-
-                // add a column to "data"
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-//                loader.readRecord();
-//                int time1 = Integer.parseInt(loader.getValues()[0]);
-//                int value1 = Integer.parseInt(loader.getValues()[1]);
-//                System.out.println(time0);
-//                System.out.println(time1);
-//                System.out.println(value1);
-//                data.add(combine2Int(time1-time0, value1));
-
-                while (loader.readRecord()) {
-//                    long time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-//                    time_tmp <<=32;
-//                    time_tmp +=  Integer.parseInt(loader.getValues()[1]);
-                    int time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-//                    System.out.println(time_tmp);
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-
-                    data.add(combine2Int(time_tmp,value_tmp));
-                }
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-
-//                int[][] data2_arr = new int[data.size()][2];
-                long[] data2_arr = new long[data.size()];
-//                int min_time = data.get(0).get(0);
-                for (int i = 0; i < data.size(); i++) {
-                    data2_arr[i] = data.get(i) ;
-                }
-//                System.out.println(data2_arr[0][0]);
-                for (int block_size_exp = 13; block_size_exp >= 4; block_size_exp--) {
-                    int block_size = (int) Math.pow(2, block_size_exp);
-                    System.out.println(block_size);
-
-                    byte[] encoded_result = new byte[data2_arr.length * 12];
-                    long encodeTime = 0;
-                    long decodeTime = 0;
-                    double ratio = 0;
-                    double compressed_size = 0;
-                    int repeatTime2 = 1;
-                    long s = System.nanoTime();
-                    int length = 0;
-                    for (int repeat = 0; repeat < repeatTime2; repeat++)
-                        length =
-                                ReorderingRegressionEncoder(
-                                        data2_arr,
-                                        block_size,
-                                        dataset_third.get(file_i),
-                                        pack_size,
-                                        encoded_result);
-                    long e = System.nanoTime();
-                    encodeTime += ((e - s) / repeatTime2);
-                    compressed_size += length;
-                    double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                    ratio += ratioTmp;
-                    s = System.nanoTime();
-                    for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-                    e = System.nanoTime();
-                    decodeTime += ((e - s) / repeatTime2);
-
-                    String[] record = {
-                            f.toString(),
-                            "REGER-64-DOUBLE",
-                            String.valueOf(encodeTime),
-                            String.valueOf(decodeTime),
-                            String.valueOf(data.size()),
-                            String.valueOf(compressed_size),
-                            String.valueOf(block_size_exp),
-                            String.valueOf(ratio)
-                    };
-                    writer.writeRecord(record);
-                    System.out.println(ratio);
-                }
-            }
-            writer.close();
-        }
-    }
-
-    @Test
-    public void REGERVaryPackSize() throws IOException {
-        //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-        String parent_dir =
-                "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-        String output_parent_dir =
-                "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/pack_size_double";
-        int pack_size = 16;
-        int block_size = 512;
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> output_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-        dataset_name.add("FANYP-Sensors");
-        dataset_name.add("TRAJET-Transport");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-        int[] dataset_12 = {652477};
-        int[] dataset_13 = {581388};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-        dataset_third.add(dataset_12);
-        dataset_third.add(dataset_13);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
-            dataset_block_size.add(block_size);
-        }
-
-        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-        //        dataset_block_size.add(1024);
-
-        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        //        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-        //        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-        //        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-        //        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-        //        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-        //        dataset_block_size.add(512);
-        output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
-        output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
-
-//        int[] file_lists = {5,6,8,10};
-//        for (int file_i : file_lists) {
-        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-//        for (int file_i = 12; file_i < 14; file_i++) {
-            String inputPath = input_path_list.get(file_i);
-            String Output = output_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-            String[] head = {
-                    "Input Direction",
-                    "Encoding Algorithm",
-                    "Encoding Time",
-                    "Decoding Time",
-                    "Points",
-                    "Compressed Size",
-                    "Block Size",
-                    "Compression Ratio"
-            };
-            writer.writeRecord(head); // write header to output file
-
-            assert tempList != null;
-
-            int count_csv =0;
-            for (File f : tempList) {
-                System.out.println(count_csv);
-                count_csv ++;
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-                ArrayList<Long> data = new ArrayList<>();
-
-                // add a column to "data"
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-
-                while (loader.readRecord()) {
-                    int time_tmp = Integer.parseInt(loader.getValues()[0])-time0;
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-                    data.add(combine2Int(time_tmp,value_tmp));
-                }
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-
-
-                long[] data2_arr = new long[data.size()];
-                for (int i = 0; i < data.size(); i++) {
-                    data2_arr[i] = data.get(i) ;
-                }
-                for (int segment_size_exp = 8; segment_size_exp > 2; segment_size_exp--) {
-                    int segment_size = (int) Math.pow(2, segment_size_exp);
-                    System.out.println(segment_size);
-
-                    byte[] encoded_result = new byte[data2_arr.length * 12];
-                    long encodeTime = 0;
-                    long decodeTime = 0;
-                    double ratio = 0;
-                    double compressed_size = 0;
-                    int repeatTime2 = 1;
-                    long s = System.nanoTime();
-                    int length = 0;
-                    for (int repeat = 0; repeat < repeatTime2; repeat++)
-                        length =
-                                ReorderingRegressionEncoder(
-                                        data2_arr,
-                                        dataset_block_size.get(file_i),
-                                        dataset_third.get(file_i),
-                                        segment_size,
-                                        encoded_result);
-                    long e = System.nanoTime();
-                    encodeTime += ((e - s) / repeatTime2);
-                    compressed_size += length;
-                    double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                    ratio += ratioTmp;
-                    s = System.nanoTime();
-                    for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-                    e = System.nanoTime();
-                    decodeTime += ((e - s) / repeatTime2);
-
-                    String[] record = {
-                            f.toString(),
-                            "REGER-64-DOUBLE",
-                            String.valueOf(encodeTime),
-                            String.valueOf(decodeTime),
-                            String.valueOf(data.size()),
-                            String.valueOf(compressed_size),
-                            String.valueOf(segment_size_exp),
-                            String.valueOf(ratio)
-                    };
-                    writer.writeRecord(record);
-                    System.out.println(ratio);
-                }
-            }
-            writer.close();
-        }
-    }
-
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERFloatDecreaseTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERFloatDecreaseTest.java
deleted file mode 100644
index 3cc0bee..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERFloatDecreaseTest.java
+++ /dev/null
@@ -1,3741 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-
-import static java.lang.Math.abs;
-
-public class REGERFloatDecreaseTest {
-    public static int getBitWith(int num) {
-        if (num == 0) return 1;
-        else return 32 - Integer.numberOfLeadingZeros(num);
-    }
-
-    public static boolean containsValue(int[] array, int targetValue) {
-        for (int value : array) {
-            if (value == targetValue) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static int[] removeElement(int[] array, int position) {
-        if (position < 0 || position >= array.length) {
-            return array;
-        }
-
-        int[] newArray = new int[array.length - 1];
-        int newIndex = 0;
-
-        for (int i = 0; i < array.length; i++) {
-            if (i != position) {
-                newArray[newIndex] = array[i];
-                newIndex++;
-            }
-        }
-
-        return newArray;
-    }
-
-    public static int min3(int a, int b, int c) {
-        if (a < b && a < c) {
-            return 0;
-        } else if (b < c) {
-            return 1;
-        } else {
-            return 2;
-        }
-    }
-
-    public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 24);
-        cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-        cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 3] = (byte) (integer);
-    }
-
-    public static void long2Bytes(long integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 56);
-        cur_byte[encode_pos + 1] = (byte) (integer >> 48);
-        cur_byte[encode_pos + 2] = (byte) (integer >> 40);
-        cur_byte[encode_pos + 3] = (byte) (integer >> 32);
-        cur_byte[encode_pos + 4] = (byte) (integer >> 24);
-        cur_byte[encode_pos + 5] = (byte) (integer >> 16);
-        cur_byte[encode_pos + 6] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 7] = (byte) (integer);
-    }
-
-
-    public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer);
-    }
-
-    public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-        cur_byte[encode_pos] = (byte) (integer >> 8);
-        cur_byte[encode_pos + 1] = (byte) (integer);
-    }
-
-    public static int bytes2Integer(byte[] encoded, int start, int num) {
-        int value = 0;
-        if (num > 4) {
-            System.out.println("bytes2Integer error");
-            return 0;
-        }
-        for (int i = 0; i < num; i++) {
-            value <<= 8;
-            int b = encoded[i + start] & 0xFF;
-            value |= b;
-        }
-        return value;
-    }
-
-    private static int byte2Integer(byte[] encoded, int decode_pos) {
-        int value = 0;
-        int b = encoded[decode_pos] & 0xFF;
-        value |= b;
-        if (value == 0)
-            return 256;
-        return value % 256;
-    }
-
-    public static void pack8Values(ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-        int bufIdx = 0;
-        int valueIdx = offset;
-        // remaining bits for the current unfinished Integer
-        int leftBit = 0;
-
-        while (valueIdx < 8 + offset) {
-            // buffer is used for saving 32 bits as a part of result
-            int buffer = 0;
-            // remaining size of bits in the 'buffer'
-            int leftSize = 32;
-
-            // encode the left bits of current Integer to 'buffer'
-            if (leftBit > 0) {
-                buffer |= (values.get(valueIdx) << (32 - leftBit));
-                leftSize -= leftBit;
-                leftBit = 0;
-                valueIdx++;
-            }
-
-            while (leftSize >= width && valueIdx < 8 + offset) {
-                // encode one Integer to the 'buffer'
-                buffer |= (values.get(valueIdx) << (leftSize - width));
-                leftSize -= width;
-                valueIdx++;
-            }
-            // If the remaining space of the buffer can not save the bits for one Integer,
-            if (leftSize > 0 && valueIdx < 8 + offset) {
-                // put the first 'leftSize' bits of the Integer into remaining space of the
-                // buffer
-                buffer |= (values.get(valueIdx) >>> (width - leftSize));
-                leftBit = width - leftSize;
-            }
-
-            // put the buffer into the final result
-            for (int j = 0; j < 4; j++) {
-                encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-                encode_pos++;
-                bufIdx++;
-                if (bufIdx >= width) {
-                    return;
-                }
-            }
-        }
-//        return encode_pos;
-    }
-
-    public static void pack8Values(long[] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-        int bufIdx = 0;
-        int valueIdx = offset;
-        // remaining bits for the current unfinished Integer
-        int leftBit = 0;
-
-        while (valueIdx < 8 + offset) {
-            // buffer is used for saving 32 bits as a part of result
-            int buffer = 0;
-            // remaining size of bits in the 'buffer'
-            int leftSize = 32;
-
-            // encode the left bits of current Integer to 'buffer'
-            if (leftBit > 0) {
-
-                buffer |= (getInt(values[valueIdx], index) << (32 - leftBit));
-                leftSize -= leftBit;
-                leftBit = 0;
-                valueIdx++;
-            }
-
-            while (leftSize >= width && valueIdx < 8 + offset) {
-                // encode one Integer to the 'buffer'
-                buffer |= (getInt(values[valueIdx], index) << (leftSize - width));
-                leftSize -= width;
-                valueIdx++;
-            }
-            // If the remaining space of the buffer can not save the bits for one Integer,
-            if (leftSize > 0 && valueIdx < 8 + offset) {
-                // put the first 'leftSize' bits of the Integer into remaining space of the
-                // buffer
-                buffer |= (getInt(values[valueIdx], index) >>> (width - leftSize));
-                leftBit = width - leftSize;
-            }
-
-            // put the buffer into the final result
-            for (int j = 0; j < 4; j++) {
-                encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-                encode_pos++;
-                bufIdx++;
-                if (bufIdx >= width) {
-                    return;
-                }
-            }
-        }
-//        return encode_pos;
-    }
-
-    public static int unpack8Values(byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-        int byteIdx = offset;
-//        int pos_encode = 0;
-        long buffer = 0;
-        // total bits which have read from 'buf' to 'buffer'. i.e.,
-        // number of available bits to be decoded.
-        int totalBits = 0;
-        int valueIdx = 0;
-
-        while (valueIdx < 8) {
-            // If current available bits are not enough to decode one Integer,
-            // then add next byte from buf to 'buffer' until totalBits >= width
-            while (totalBits < width) {
-                buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-                byteIdx++;
-                totalBits += 8;
-            }
-
-            // If current available bits are enough to decode one Integer,
-            // then decode one Integer one by one until left bits in 'buffer' is
-            // not enough to decode one Integer.
-            while (totalBits >= width && valueIdx < 8) {
-                result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-                value_pos++;
-                valueIdx++;
-                totalBits -= width;
-                buffer = buffer & ((1L << totalBits) - 1);
-            }
-        }
-        return value_pos;
-    }
-
-    public static int bitPacking(long[] numbers, int index, int start, int block_size, int bit_width, int encode_pos, byte[] encoded_result) {
-        int block_num = block_size / 8;
-        for (int i = 0; i < block_num; i++) {
-            pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-            encode_pos += bit_width;
-        }
-
-        return encode_pos;
-
-    }
-
-    public static int decodeBitPacking(
-            byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-        int block_num = block_size / 8;
-        int value_pos = 0;
-
-        for (int i = 0; i < block_num; i++) {
-            value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-            decode_pos += bit_width;
-        }
-        return decode_pos;
-    }
-
-
-    public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-        int fbit = Float.floatToIntBits(f);
-        byte[] b = new byte[4];
-        for (int i = 0; i < 4; i++) {
-            b[i] = (byte) (fbit >> (24 - i * 8));
-        }
-        int len = b.length;
-
-        System.arraycopy(b, 0, encode_result, pos_encode, len);
-        byte temp;
-        for (int i = 0; i < len / 2; ++i) {
-            temp = encode_result[i + pos_encode];
-            encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-            encode_result[len - i - 1 + pos_encode] = temp;
-        }
-    }
-
-    public static float bytes2float(byte[] b, int index) {
-        int l;
-        l = b[index];
-        l &= 0xff;
-        l |= ((long) b[index + 1] << 8);
-        l &= 0xffff;
-        l |= ((long) b[index + 2] << 16);
-        l &= 0xffffff;
-        l |= ((long) b[index + 3] << 24);
-        return Float.intBitsToFloat(l);
-    }
-
-    public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-        int value = 0;
-        if (num > 4) {
-            System.out.println("bytes2Integer error");
-            return 0;
-        }
-        for (int i = 0; i < num; i++) {
-            value <<= 8;
-            int b = encoded.get(i + start) & 0xFF;
-            value |= b;
-        }
-        return value;
-    }
-
-    public static int part(int[][] arr, int index, int low, int high) {
-        int[] tmp = arr[low];
-        while (low < high) {
-            while (low < high
-                    && (arr[high][index] > tmp[index]
-                    || (Objects.equals(arr[high][index], tmp[index])
-                    && arr[high][index ^ 1] >= tmp[index ^ 1]))) {
-                high--;
-            }
-            arr[low][0] = arr[high][0];
-            arr[low][1] = arr[high][1];
-            while (low < high
-                    && (arr[low][index] < tmp[index]
-                    || (Objects.equals(arr[low][index], tmp[index])
-                    && arr[low][index ^ 1] <= tmp[index ^ 1]))) {
-                low++;
-            }
-            arr[high][0] = arr[low][0];
-            arr[high][1] = arr[low][1];
-        }
-        arr[low][0] = tmp[0];
-        arr[low][1] = tmp[1];
-        return low;
-    }
-
-    public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-        ArrayList<Integer> tmp = arr.get(low);
-        while (low < high) {
-            while (low < high
-                    && (arr.get(high).get(index) > tmp.get(index)
-                    || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                    && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-                high--;
-            }
-            arr.set(low, arr.get(high));
-            while (low < high
-                    && (arr.get(low).get(index) < tmp.get(index)
-                    || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                    && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-                low++;
-            }
-            arr.set(high, arr.get(low));
-        }
-        arr.set(low, tmp);
-        return low;
-    }
-
-    public static long combine2Int(int int1, int int2) {
-        return ((long) int1 << 32) | (int2 & 0xFFFFFFFFL);
-    }
-
-    public static int getTime(long long1) {
-        return ((int) (long1 >> 32));
-    }
-
-    public static int getValue(long long1) {
-        return ((int) (long1));
-    }
-
-    public static int getInt(long long1, int index) {
-        if (index == 0) return getTime(long1);
-        else return getValue(long1);
-    }
-
-    public static int getCommon(int m, int n) {
-        int z;
-        while (m % n != 0) {
-            z = m % n;
-            m = n;
-            n = z;
-        }
-        return n;
-    }
-
-    //    public static void splitTimeStamp3(
-//            ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-//        int td_common = 0;
-//        for (int i = 1; i < ts_block.size(); i++) {
-//            int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-//            if (td_common == 0) {
-//                if (time_diffi != 0) {
-//                    td_common = time_diffi;
-//                }
-//                continue;
-//            }
-//            if (time_diffi != 0) {
-//                td_common = getCommon(time_diffi, td_common);
-//                if (td_common == 1) {
-//                    break;
-//                }
-//            }
-//        }
-//        if (td_common == 0) {
-//            td_common = 1;
-//        }
-//
-//        int t0 = ts_block.get(0).get(0);
-//        for (int i = 0; i < ts_block.size(); i++) {
-//            ArrayList<Integer> tmp = new ArrayList<>();
-//            int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-//            tmp.add(t0 + interval_i);
-//            tmp.add(ts_block.get(i).get(1));
-//            ts_block.set(i, tmp);
-//        }
-//        result.add(td_common);
-//    }
-    public static void splitTimeStamp3(
-            ArrayList<Long> ts_block, ArrayList<Integer> result) {
-        int td_common = 0;
-
-        for (int i = 1; i < ts_block.size(); i++) {
-            int cur_value = getTime(ts_block.get(i));
-            int pre_value = getTime(ts_block.get(i - 1));
-            int time_diffi = cur_value - pre_value;
-
-            if (td_common == 0) {
-                if (time_diffi != 0) {
-                    td_common = time_diffi;
-                }
-                continue;
-            }
-            if (time_diffi != 0) {
-                td_common = getCommon(time_diffi, td_common);
-                if (td_common == 1) {
-                    break;
-                }
-            }
-        }
-        if (td_common == 0) {
-            td_common = 1;
-        }
-
-        int t0 = getTime(ts_block.get(0));
-        for (int i = 0; i < ts_block.size(); i++) {
-//            ArrayList<Integer> tmp = new ArrayList<>();
-            int cur_value = getTime(ts_block.get(i));
-            int interval_i = ((cur_value - t0) / td_common);
-            ts_block.set(i, combine2Int(t0 + interval_i, getValue(ts_block.get(i))));
-//            tmp.add(t0 + interval_i);
-//            tmp.add(ts_block.get(i).get(1));
-//            ts_block.set(i, tmp);
-        }
-        result.add(td_common);
-    }
-
-    private static void adjust1TimeCost(long[] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-
-        int block_size = ts_block.length;
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        long tmp_i = ts_block[i];
-        long tmp_i_1 = ts_block[i - 1];
-
-        int min_delta_time = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-        int min_delta_time_i = min_delta_time;
-        int min_delta_time_index = i;
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while (j < block_size) {
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-
-            if (epsilon_r_j < min_delta_time) {
-                min_delta_time_index = j;
-                min_delta_time = epsilon_r_j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        for (int j = 1; j < block_size; j++) {
-//            int timestamp_delta_i = getTime(ts_block[j]) - (int) (theta0_t + theta1_t * (float) getTime(ts_block[j - 1]));
-//            if (timestamp_delta_i < min_delta_time) {
-//                min_delta_time_index = j;
-//                min_delta_time = timestamp_delta_i;
-//            }
-//        }
-        raw_length[0] += (getBitWith(min_delta_time_i - min_delta_time) * (block_size - 1));
-        raw_length[3] = min_delta_time;
-        min_index.set(0, min_delta_time_index);
-
-
-    }
-
-    private static void adjust1ValueCost(long[] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-        int block_size = ts_block.length;
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-
-        int min_delta_value = getValue(ts_block[i]) - (int) (theta0_v + theta1_v * (float) getValue(ts_block[i - 1]));
-        int min_delta_value_i = min_delta_value;
-        int min_delta_value_index = i;
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while (j < block_size) {
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < min_delta_value) {
-                min_delta_value_index = j;
-                min_delta_value = epsilon_r_j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-
-//        for (int j = 1; j < block_size; j++) {
-//            int value_delta_i = getValue(ts_block[j]) - (int) (theta0_v + theta1_v * (float) getValue(ts_block[j - 1]));
-//            if (value_delta_i < min_delta_value) {
-//                min_delta_value_index = j;
-//                min_delta_value = value_delta_i;
-//            }
-//        }
-        raw_length[0] += (getBitWith(min_delta_value_i - min_delta_value) * (block_size - 1));
-        raw_length[3] = min_delta_value;
-        min_index.set(0, min_delta_value_index);
-
-
-    }
-
-    private static int[] adjust0MinChange(
-            long[] ts_block, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != block_size;
-
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        long[] ts_block_delta = new long[block_size - 1];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-
-        int pos_ts_block_delta = 0;
-        for (int i = 2; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i != j) {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i - 1];
-                timestamp_delta_i =
-                        getTime(tmp_i)
-                                - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i =
-                        getValue(tmp_i)
-                                - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-
-            } else {
-                long tmp_j = ts_block[j];
-                long tmp_0 = ts_block[0];
-                long tmp_j_1 = ts_block[j - 1];
-                timestamp_delta_i =
-                        getTime(tmp_j)
-                                - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-                value_delta_i =
-                        getValue(tmp_j)
-                                - (int) (theta0_v + theta1_v * (float) getValue(tmp_0));
-
-                long delta_i = combine2Int(timestamp_delta_i, value_delta_i);
-                ts_block_delta[pos_ts_block_delta] = delta_i;
-                pos_ts_block_delta++;
-
-                if (timestamp_delta_i > timestamp_delta_max) {
-                    timestamp_delta_max = timestamp_delta_i;
-                }
-                if (timestamp_delta_i < timestamp_delta_min) {
-                    timestamp_delta_min = timestamp_delta_i;
-                }
-                if (value_delta_i > value_delta_max) {
-                    value_delta_max = value_delta_i;
-                }
-                if (value_delta_i < value_delta_min) {
-                    value_delta_min = value_delta_i;
-                }
-                timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-                value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-            }
-            long delta_i = combine2Int(timestamp_delta_i, value_delta_i);
-            ts_block_delta[pos_ts_block_delta] = delta_i;
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i > timestamp_delta_max) {
-                timestamp_delta_max = timestamp_delta_i;
-            }
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i > value_delta_max) {
-                value_delta_max = value_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        int length = 0;
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjust0MinChangeNo(
-            long[] ts_block, int[] raw_length, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != block_size;
-
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_j_plus_1 = ts_block[j + 1];
-        long tmp_j_minus_1 = ts_block[j - 1];
-        long tmp_1 = ts_block[1];
-        long tmp_0 = ts_block[0];
-
-        timestamp_delta_i = getTime(tmp_j_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_j_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-        timestamp_delta_i = getTime(tmp_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-        value_delta_i = getValue(tmp_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_0));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_j_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-        value_delta_i = getValue(tmp_j_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_0));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust 0 to n
-    private static int[] adjust0n1MinChange(
-            long[] ts_block, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        long[] ts_block_delta = new long[block_size - 1];
-        int pos_ts_block_delta = 0;
-        int length = 0;
-        for (int i = 2; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            long tmp_i = ts_block[i];
-            long tmp_i_1 = ts_block[i - 1];
-
-            timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-            value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-//            ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-//            ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-            pos_ts_block_delta++;
-
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-        }
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_0 = ts_block[0];
-        long tmp_block_size_1 = ts_block[block_size - 1];
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-        ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-            value_delta_min = value_delta_i;
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjust0n1MinChangeNo(
-            long[] ts_block, int[] raw_length, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_1 = ts_block[1];
-        long tmp_0 = ts_block[1];
-        long tmp_block_size_1 = ts_block[1];
-
-
-        timestamp_delta_i = getTime(tmp_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_0));
-        value_delta_i = getValue(tmp_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_0));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust n to no 0
-    private static int[] adjustnMinChange(
-            long[] ts_block, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        long[] ts_block_delta = new long[block_size - 1];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        int length = 0;
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size - 1; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i != j) {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i - 1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            } else {
-                long tmp_j = ts_block[j];
-                long tmp_block_size_1 = ts_block[block_size - 1];
-                long tmp_j_1 = ts_block[j - 1];
-
-                timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-                value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-                ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-                pos_ts_block_delta++;
-                if (timestamp_delta_i < timestamp_delta_min) {
-                    timestamp_delta_min = timestamp_delta_i;
-                }
-                if (value_delta_i < value_delta_min) {
-                    value_delta_min = value_delta_i;
-                }
-
-                timestamp_delta_i = getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-                value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            }
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustnMinChangeNo(
-            long[] ts_block, int[] raw_length, int j, float[] theta) {
-        int block_size = ts_block.length;
-        assert j != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-
-        long tmp_j = ts_block[j];
-        long tmp_block_size_1 = ts_block[block_size - 1];
-        long tmp_block_size_2 = ts_block[block_size - 2];
-        long tmp_j_1 = ts_block[j - 1];
-
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_2));
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_2));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        timestamp_delta_i = getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    // adjust n to 0
-    private static int[] adjustn0MinChange(long[] ts_block, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int length = 0;
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size - 1; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            long tmp_i = ts_block[i];
-            long tmp_i_1 = ts_block[i - 1];
-            timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-            value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        long tmp_block_size_1 = ts_block[block_size - 1];
-        long tmp_0 = ts_block[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-        ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-            value_delta_min = value_delta_i;
-        }
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustn0MinChangeNo(
-            long[] ts_block, int[] raw_length, float[] theta) {
-        int block_size = ts_block.length;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_block_size_1 = ts_block[block_size - 1];
-        long tmp_block_size_2 = ts_block[block_size - 2];
-        long tmp_0 = ts_block[0];
-
-
-        timestamp_delta_i = getTime(tmp_block_size_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_2));
-        value_delta_i = getValue(tmp_block_size_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_2));
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // adjust alpha to j
-
-    private static int[] adjustAlphaToJMinChange(
-            long[] ts_block, int alpha, int j, float[] theta,
-            long tmp_alpha, long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        assert j != 0;
-        assert j != block_size;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        long tmp_j = ts_block[j];
-        long tmp_j_minus_1 = ts_block[j - 1];
-
-        int length = 0;
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-
-
-            if (i == j) {
-                timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-                value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-            } else if (i == alpha) {
-                timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-                value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-            } else if (i == alpha + 1) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i - 1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            }
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-
-        return b;
-    }
-
-    private static int[] adjustAlphaToJMinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, int j, float[] theta,
-            long tmp_alpha, long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        assert j != 0;
-        assert j != block_size;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-        long tmp_j = ts_block[j];
-        long tmp_j_minus_1 = ts_block[j - 1];
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_j) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // move alpha to 0
-    private static int[] adjustTo0MinChange(long[] ts_block, int alpha, float[] theta,
-                                            long tmp_alpha, long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int pos_ts_block_delta = 0;
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i == (alpha + 1)) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-            } else if (i == alpha) {
-                long tmp_0 = ts_block[0];
-                timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-                value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i - 1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            }
-
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-            pos_ts_block_delta++;
-
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-
-        }
-        int length = 0;
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-    private static int[] adjustTo0MinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, float[] theta,
-            long tmp_alpha, long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-        int timestamp_delta_i;
-        int value_delta_i;
-
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        long tmp_0 = ts_block[0];
-
-        timestamp_delta_i = getTime(tmp_0) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_0) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    // move alpha to n
-    private static int[] adjustTonMinChange(
-            long[] ts_block, int alpha, float[] theta,
-            long tmp_alpha, long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        long[] ts_block_delta = new long[block_size - 1];
-
-        int pos_ts_block_delta = 0;
-        int length = 0;
-
-        for (int i = 1; i < block_size; i++) {
-            int timestamp_delta_i;
-            int value_delta_i;
-            if (i == (alpha + 1)) {
-                timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-                value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-            } else if (i == alpha) {
-                long tmp_block_size_1 = ts_block[block_size - 1];
-                timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-                value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-            } else {
-                long tmp_i = ts_block[i];
-                long tmp_i_1 = ts_block[i - 1];
-                timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
-                value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
-            }
-            ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-            pos_ts_block_delta++;
-            if (timestamp_delta_i < timestamp_delta_min) {
-                timestamp_delta_min = timestamp_delta_i;
-            }
-            if (value_delta_i < value_delta_min) {
-                value_delta_min = value_delta_i;
-            }
-        }
-
-        for (long segment_max : ts_block_delta) {
-            length += getBitWith(getTime(segment_max) - timestamp_delta_min);
-            length += getBitWith(getValue(segment_max) - value_delta_min);
-        }
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-
-        return b;
-    }
-
-    private static int[] adjustTonMinChangeNo(
-            long[] ts_block, int[] raw_length, int alpha, float[] theta,
-            long tmp_alpha, long tmp_alpha_plus_1, long tmp_alpha_minus_1) {
-        int block_size = ts_block.length;
-        assert alpha != block_size - 1;
-        assert alpha != 0;
-        int[] b = new int[3];
-        int timestamp_delta_min = raw_length[3];
-        int value_delta_min = raw_length[4];
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-        int length = raw_length[0];
-
-        int timestamp_delta_i;
-        int value_delta_i;
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-        length -= getBitWith(value_delta_i - value_delta_min);
-
-        timestamp_delta_i = getTime(tmp_alpha_plus_1) - (int) (theta0_t + theta1_t * (float) getTime(tmp_alpha_minus_1));
-        value_delta_i = getValue(tmp_alpha_plus_1) - (int) (theta0_v + theta1_v * (float) getValue(tmp_alpha_minus_1));
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-
-        long tmp_block_size_1 = ts_block[block_size - 1];
-        timestamp_delta_i = getTime(tmp_alpha) - (int) (theta0_t + theta1_t * (float) getTime(tmp_block_size_1));
-        value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_block_size_1));
-
-        if (timestamp_delta_i < timestamp_delta_min) {
-            length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-            timestamp_delta_min = timestamp_delta_i;
-        } else {
-            length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-        }
-        if (value_delta_i < value_delta_min) {
-            length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-            value_delta_min = value_delta_i;
-        } else {
-            length += getBitWith(value_delta_i - value_delta_min);
-        }
-
-        b[0] = length;
-        b[1] = timestamp_delta_min;
-        b[2] = value_delta_min;
-
-        return b;
-    }
-
-
-    private static int getIstarClose(int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-        int min_i = 0;
-        int min_dis = Integer.MAX_VALUE;
-        for (int i = 0; i < j_star_list.size(); i++) {
-            if (abs(alpha - j_star_list.get(i)) < min_dis) {
-                min_i = j_star_list.get(i);
-                min_dis = abs(alpha - j_star_list.get(i));
-                raw_length[0] = new_length_list[i][0];
-                raw_length[3] = new_length_list[i][1];
-                raw_length[4] = new_length_list[i][2];
-            }
-        }
-        if (min_dis == 0) {
-            System.out.println("get IstarClose error");
-            return 0;
-        }
-        return min_i;
-    }
-
-    public static void trainParameter(long[] ts_block, int block_size, float[] theta) {
-        long sum_X_r = 0;
-        long sum_Y_r = 0;
-        long sum_squ_X_r = 0;
-        long sum_squ_XY_r = 0;
-        long sum_X_v = 0;
-        long sum_Y_v = 0;
-        long sum_squ_X_v = 0;
-        long sum_squ_XY_v = 0;
-
-        for (int i = 1; i < block_size; i++) {
-            long ts_block_i_1 = ts_block[i - 1];
-            long ts_block_i = ts_block[i];
-            long ts_block_i_1_time = getTime(ts_block_i_1);
-            long ts_block_i_1_value = getValue(ts_block_i_1);
-            long ts_block_i_time = getTime(ts_block_i);
-            long ts_block_i_value = getValue(ts_block_i);
-
-
-            sum_X_r += (ts_block_i_1_time);
-            sum_X_v += (ts_block_i_1_value);
-            sum_Y_r += (ts_block_i_time);
-            sum_Y_v += (ts_block_i_value);
-            sum_squ_X_r += (ts_block_i_1_time * (ts_block_i_1_time));
-            sum_squ_X_v += (ts_block_i_1_value * ts_block_i_1_value);
-            sum_squ_XY_r += (ts_block_i_1_time * ts_block_i_time);
-            sum_squ_XY_v += (ts_block_i_1_value * ts_block_i_value);
-        }
-
-        int m_reg = block_size - 1;
-        float theta0_r = 0.0F;
-        float theta1_r = 1.0F;
-        if (m_reg * sum_squ_X_r != sum_X_r * sum_X_r) {
-            theta0_r =
-                    (float) (sum_squ_X_r * sum_Y_r - sum_X_r * sum_squ_XY_r)
-                            / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-            theta1_r =
-                    (float) (m_reg * sum_squ_XY_r - sum_X_r * sum_Y_r)
-                            / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-        }
-
-        float theta0_v = 0.0F;
-        float theta1_v = 1.0F;
-        if (m_reg * sum_squ_X_v != sum_X_v * sum_X_v) {
-            theta0_v =
-                    (float) (sum_squ_X_v * sum_Y_v - sum_X_v * sum_squ_XY_v)
-                            / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-            theta1_v =
-                    (float) (m_reg * sum_squ_XY_v - sum_X_v * sum_Y_v)
-                            / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-        }
-        theta[0] = theta0_r;
-        theta[1] = theta1_r;
-        theta[2] = theta0_v;
-        theta[3] = theta1_v;
-    }
-
-    public static long[] getEncodeBitsRegressionNoTrain(
-            long[] ts_block,
-            int block_size,
-            int[] raw_length,
-            float[] theta,
-            int segment_size) {
-
-        long[] ts_block_delta = new long[ts_block.length];
-
-        float theta0_r = theta[0];
-        float theta1_r = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        ts_block_delta[0] = ts_block[0];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while (j < block_size) {
-            tmp_j = ts_block[j];
-
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_r + theta1_r * (float) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-            }
-            ts_block_delta[j] = combine2Int(epsilon_r_j, epsilon_v_j);
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        // delta to Regression
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r =
-//                    getTime(tmp_j) - (int) (theta0_r + theta1_r * (float) getTime(tmp_j_1));
-//            int epsilon_v =
-//                    getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-//
-//
-//            if (epsilon_r < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r;
-//            }
-//            if (epsilon_v < value_delta_min) {
-//                value_delta_min = epsilon_v;
-//            }
-//            ts_block_delta[j] = combine2Int(epsilon_r,epsilon_v);
-////            ts_block_delta[j][1] = epsilon_v;
-//        }
-
-//        printTSBlock(ts_block_delta);
-
-        int max_interval = Integer.MIN_VALUE;
-        int max_value = Integer.MIN_VALUE;
-        int max_interval_segment = Integer.MIN_VALUE;
-        int max_value_segment = Integer.MIN_VALUE;
-        int length = 0;
-        long delta_time = combine2Int(timestamp_delta_min, value_delta_min);
-//        for (int i = block_size - 1; i > 0; i--) {
-        for (int i = 1; i < block_size; i++) {
-            tmp_j = ts_block_delta[i];
-            int epsilon_r = getTime(tmp_j) - timestamp_delta_min;
-            int epsilon_v = getValue(tmp_j) - value_delta_min;
-
-            ts_block_delta[i] = combine2Int(epsilon_r, epsilon_v);
-
-            if (epsilon_r > max_interval) {
-                max_interval = epsilon_r;
-            }
-            if (epsilon_v > max_value) {
-                max_value = epsilon_v;
-            }
-
-            if (epsilon_r > max_interval_segment) {
-                max_interval_segment = epsilon_r;
-            }
-            if (epsilon_v > max_value_segment) {
-                max_value_segment = epsilon_v;
-            }
-            if (i % segment_size == 0) {
-                length += getBitWith(max_interval_segment) * segment_size;
-                length += getBitWith(max_value_segment) * segment_size;
-                max_interval_segment = Integer.MIN_VALUE;
-                max_value_segment = Integer.MIN_VALUE;
-            }
-        }
-
-        int max_bit_width_interval = getBitWith(max_interval);
-        int max_bit_width_value = getBitWith(max_value);
-
-//System.out.println("--------------------------------------------------");
-
-        raw_length[0] = length;
-        raw_length[1] = max_bit_width_interval;
-        raw_length[2] = max_bit_width_value;
-        raw_length[3] = timestamp_delta_min;
-        raw_length[4] = value_delta_min;
-
-//        printTSBlock(ts_block_delta);
-        return ts_block_delta;
-
-//        int[][] ts_block_delta_segment = new int[block_size][2];
-//        int pos_ts_block_delta_segment = 0;
-//        int[] tmp_segment = new int[2];
-//        int max_interval_segment = Integer.MIN_VALUE;
-//        int max_value_segment = Integer.MIN_VALUE;
-//        tmp_segment[0] = max_interval_segment;
-//        tmp_segment[1] = max_value_segment;
-//
-//
-//            if (epsilon_r > max_interval_segment) {
-//                max_interval_segment = epsilon_r;
-//                tmp_segment[0] = max_interval_segment;
-//            }
-//            if (epsilon_v > max_value_segment) {
-//                max_value_segment = epsilon_v;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//            if (j % segment_size == 0) {
-//                ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-//                ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-//                pos_ts_block_delta_segment++;
-//                tmp_segment = new int[2];
-//                max_interval_segment = Integer.MIN_VALUE;
-//                max_value_segment = Integer.MIN_VALUE;
-//                tmp_segment[0] = max_interval_segment;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//
-//
-//        for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-//            length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-//            length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-//        }
-
-
-    }
-
-    public static int getBeta(
-            long[] ts_block,
-            int alpha,
-            ArrayList<Integer> min_index,
-            int block_size,
-            int[] raw_length,
-            float[] theta) {
-
-        int raw_abs_sum = raw_length[0];
-        int[][] new_length_list = new int[block_size][3];
-        int pos_new_length_list = 0;
-        int range = block_size / 16;
-
-        ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-        int j_star = -1;
-        int[] b;
-        if (alpha == -1) {
-            return j_star;
-        }
-
-        if (alpha == 0) {
-            if (min_index.get(0) == 1) {
-                adjust1TimeCost(ts_block, 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == 1) {
-                adjust1ValueCost(ts_block, 1, raw_length, min_index, theta);
-            }
-
-            for (int j = 2; j < range - 1; j++) {
-//            for (int j = 2; j < block_size - 1; j++) {
-                // if j, alpha+1, alpha points are min residuals, need to recalculate min residuals
-                if (min_index.contains(j)) { //|| min_index.contains(1)
-                    b = adjust0MinChange(ts_block, j, theta);
-                } else {
-                    b = adjust0MinChangeNo(ts_block, raw_length, j, theta);
-                }
-                if (b[0] < raw_abs_sum) {
-                    raw_abs_sum = b[0];
-                    j_star_list = new ArrayList<>();
-                    pos_new_length_list = 0;
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                } else if (b[0] == raw_abs_sum) {
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                }
-            }
-            if (min_index.contains(0)) {
-                b = adjust0n1MinChange(ts_block, theta);
-            } else {
-                b = adjust0n1MinChangeNo(ts_block, raw_length, theta);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-
-                j_star_list.add(block_size);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(block_size);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        } // alpha == n
-        else if (alpha == block_size - 1) {
-            if (min_index.get(0) == block_size - 1) {
-                adjust1TimeCost(ts_block, block_size - 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == block_size - 1) {
-                adjust1ValueCost(ts_block, block_size - 1, raw_length, min_index, theta);
-            }
-            for (int j = block_size - range; j < block_size - 1; j++) {
-//            for (int j = 1; j < block_size - 1; j++) {
-                if (min_index.contains(j)) { //min_index.contains(block_size - 1) ||
-                    b = adjustnMinChange(ts_block, j, theta);
-                } else {
-                    b = adjustnMinChangeNo(ts_block, raw_length, j, theta);
-                }
-                if (b[0] < raw_abs_sum) {
-                    raw_abs_sum = b[0];
-                    j_star_list = new ArrayList<>();
-                    j_star_list.add(j);
-                    pos_new_length_list = 0;
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                } else if (b[0] == raw_abs_sum) {
-                    j_star_list.add(j);
-                    System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                    pos_new_length_list++;
-                }
-            }
-            if (min_index.contains(0)) {//min_index.contains(block_size - 1) ||
-                b = adjustn0MinChange(ts_block, theta);
-            } else {
-                b = adjustn0MinChangeNo(ts_block, raw_length, theta);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list.clear();
-                j_star_list = new ArrayList<>();
-                j_star_list.add(0);
-
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(0);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        } // alpha != 1 and alpha != n
-        else {
-            if (min_index.get(0) == alpha) {
-                adjust1TimeCost(ts_block, alpha, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == alpha) {
-                adjust1ValueCost(ts_block, alpha, raw_length, min_index, theta);
-            }
-            if (min_index.get(0) == alpha + 1) {
-                adjust1TimeCost(ts_block, alpha + 1, raw_length, min_index, theta);
-            }
-            if (min_index.get(1) == alpha + 1) {
-                adjust1ValueCost(ts_block, alpha + 1, raw_length, min_index, theta);
-            }
-
-            long tmp_alpha = ts_block[alpha];
-            long tmp_alpha_plus_1 = ts_block[alpha + 1];
-            long tmp_alpha_minus_1 = ts_block[alpha - 1];
-
-            int start_j = Math.max(alpha - range / 2, 1);
-            int end_j = Math.min(alpha + range / 2, block_size - 1);
-            for (int j = start_j; j < end_j; j++) {
-//            for (int j = 1; j < block_size - 1; j++) {
-                if (alpha != j && (alpha + 1) != j) {
-                    if (min_index.contains(j)) { //|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                        b = adjustAlphaToJMinChange(ts_block, alpha, j, theta, tmp_alpha, tmp_alpha_plus_1, tmp_alpha_minus_1);
-                    } else {
-                        b = adjustAlphaToJMinChangeNo(ts_block, raw_length, alpha, j, theta, tmp_alpha, tmp_alpha_plus_1, tmp_alpha_minus_1);
-                    }
-                    if (b[0] < raw_abs_sum) {
-                        raw_abs_sum = b[0];
-                        j_star_list = new ArrayList<>();
-                        j_star_list.add(j);
-                        pos_new_length_list = 0;
-                        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                        pos_new_length_list++;
-                    } else if (b[0] == raw_abs_sum) {
-                        j_star_list.add(j);
-                        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                        pos_new_length_list++;
-                    }
-                }
-            }
-
-            if (min_index.contains(0)) {//|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                b = adjustTo0MinChange(ts_block, alpha, theta, tmp_alpha, tmp_alpha_plus_1, tmp_alpha_minus_1);
-            } else {
-                b = adjustTo0MinChangeNo(ts_block, raw_length, alpha, theta, tmp_alpha, tmp_alpha_plus_1, tmp_alpha_minus_1);
-            }
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-                j_star_list.add(0);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(0);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-            if (min_index.contains(block_size - 1)) {//|| min_index.contains(alpha) || min_index.contains(alpha + 1)
-                b = adjustTonMinChange(ts_block, alpha, theta, tmp_alpha, tmp_alpha_plus_1, tmp_alpha_minus_1);
-            } else {
-                b = adjustTonMinChangeNo(ts_block, raw_length, alpha, theta, tmp_alpha, tmp_alpha_plus_1, tmp_alpha_minus_1);
-            }
-
-            if (b[0] < raw_abs_sum) {
-                raw_abs_sum = b[0];
-                j_star_list = new ArrayList<>();
-                j_star_list.add(block_size);
-                pos_new_length_list = 0;
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            } else if (b[0] == raw_abs_sum) {
-                j_star_list.add(block_size);
-                System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-                pos_new_length_list++;
-            }
-        }
-        int[][] new_new_length_list = new int[pos_new_length_list][5];
-        for (int i = 0; i < pos_new_length_list; i++) {
-            System.arraycopy(new_new_length_list[i], 0, new_length_list[i], 0, 3);
-        }
-
-        if (j_star_list.size() != 0) {
-            j_star = getIstarClose(alpha, j_star_list, new_new_length_list, raw_length);
-        }
-        return j_star;
-    }
-
-
-    public static int[] getIStar(
-            long[] ts_block, ArrayList<Integer> min_index, int block_size, int index, float[] theta) {
-
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_min_index = -1;
-        int value_delta_min_index = -1;
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        int timestamp_delta_max_index = -1;
-        int value_delta_max_index = -1;
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-//        int[][] ts_block_delta = new int[block_size - 1][2];
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while (j < block_size) {
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-                timestamp_delta_min_index = j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-                value_delta_min_index = j;
-            }
-            if (epsilon_r_j > timestamp_delta_max) {
-                timestamp_delta_max = epsilon_r_j;
-                timestamp_delta_max_index = j;
-            }
-            if (epsilon_v_j > value_delta_max) {
-                value_delta_max = epsilon_v_j;
-                value_delta_max_index = j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//
-//        }
-        min_index.add(timestamp_delta_min_index);
-        min_index.add(value_delta_min_index);
-
-
-        int[] alpha_list = new int[2];
-        if (index == 0) {
-            alpha_list[0] = value_delta_min_index;
-            alpha_list[1] = value_delta_max_index;
-        } else {
-            alpha_list[0] = timestamp_delta_min_index;
-            alpha_list[1] = timestamp_delta_max_index;
-        }
-
-        return alpha_list;
-    }
-
-    public static int[] getIStar(
-            long[] ts_block,
-            ArrayList<Integer> min_index,
-            int block_size,
-            float[] theta) {
-        int timestamp_delta_max = Integer.MIN_VALUE;
-        int value_delta_max = Integer.MIN_VALUE;
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int timestamp_delta_min_index = -1;
-        int value_delta_min_index = -1;
-        int timestamp_delta_max_index = -1;
-        int value_delta_max_index = -1;
-
-        int[] alpha_list = new int[4];
-
-        float theta0_t = theta[0];
-        float theta1_t = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while (j < block_size) {
-            tmp_j = ts_block[j];
-            int epsilon_r_j =
-                    getTime(tmp_j)
-                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-            int epsilon_v_j =
-                    getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-
-            if (epsilon_r_j < timestamp_delta_min) {
-                timestamp_delta_min = epsilon_r_j;
-                timestamp_delta_min_index = j;
-            }
-            if (epsilon_v_j < value_delta_min) {
-                value_delta_min = epsilon_v_j;
-                value_delta_min_index = j;
-            }
-            if (epsilon_r_j > timestamp_delta_max) {
-                timestamp_delta_max = epsilon_r_j;
-                timestamp_delta_max_index = j;
-            }
-            if (epsilon_v_j > value_delta_max) {
-                value_delta_max = epsilon_v_j;
-                value_delta_max_index = j;
-            }
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r_j =
-//                    getTime(tmp_j)
-//                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-//            int epsilon_v_j =
-//                    getValue(tmp_j)
-//                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-//
-//            if (epsilon_v_j > value_delta_max) {
-//                value_delta_max = epsilon_v_j;
-//                value_delta_max_index = j;
-//            }
-//            if (epsilon_v_j < value_delta_min) {
-//                value_delta_min = epsilon_v_j;
-//                value_delta_min_index = j;
-//            }
-//            if (epsilon_r_j > timestamp_delta_max) {
-//                timestamp_delta_max = epsilon_r_j;
-//                timestamp_delta_max_index = j;
-//            }
-//            if (epsilon_r_j < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r_j;
-//                timestamp_delta_min_index = j;
-//            }
-//        }
-
-        min_index.add(timestamp_delta_min_index);
-        alpha_list[0] = timestamp_delta_min_index;
-        alpha_list[1] = timestamp_delta_max_index;
-
-
-        int pos_alpha_list = 2;
-        min_index.add(value_delta_min_index);
-        if (!containsValue(alpha_list, value_delta_min_index)) {
-            alpha_list[pos_alpha_list] = value_delta_min_index;
-            pos_alpha_list++;
-        }
-        if (!containsValue(alpha_list, value_delta_max_index)) {
-            alpha_list[pos_alpha_list] = value_delta_max_index;
-            pos_alpha_list++;
-        }
-
-
-        int[] new_alpha_list = new int[pos_alpha_list];
-        System.arraycopy(alpha_list, 0, new_alpha_list, 0, pos_alpha_list);
-
-        return new_alpha_list;
-    }
-
-
-    public static int encodeRLEBitWidth2Bytes(
-            long[] bit_width_segments) {
-        int encoded_result = 0;
-
-
-        int count_of_time = 1;
-        int count_of_value = 1;
-        long pre_bit_width_segments = bit_width_segments[0];
-        int pre_time = getTime(pre_bit_width_segments);
-        int pre_value = getValue(pre_bit_width_segments);
-        int size = bit_width_segments.length;
-
-
-        int pos_time = 0;
-        int pos_value = 0;
-
-        for (int i = 1; i < size; i++) {
-            long cur_bit_width_segments = bit_width_segments[i];
-            int cur_time = getTime(cur_bit_width_segments);
-            int cur_value = getValue(cur_bit_width_segments);
-            if (cur_time != pre_time && count_of_time != 0) {
-                pos_time++;
-                pre_time = cur_time;
-                count_of_time = 1;
-            } else {
-                count_of_time++;
-                pre_time = cur_time;
-                if (count_of_time == 256) {
-                    pos_time++;
-                    count_of_time = 1;
-                }
-            }
-
-            if (cur_value != pre_value && count_of_value != 0) {
-                pos_value++;
-
-                pre_value = cur_value;
-                count_of_value = 1;
-            } else {
-                count_of_value++;
-                pre_value = cur_value;
-                if (count_of_value == 256) {
-                    pos_value++;
-                    count_of_value = 0;
-                }
-            }
-
-        }
-        if (count_of_time != 0) {
-            pos_time++;
-        }
-        if (count_of_value != 0) {
-            pos_value++;
-        }
-
-        encoded_result += (pos_time * 2);
-        encoded_result += (pos_value * 2);
-
-        return encoded_result;
-    }
-
-    public static int encodeRLEBitWidth2Bytes(
-            long[] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-        int count_of_time = 1;
-        int count_of_value = 1;
-        long pre_bit_width_segments = bit_width_segments[0];
-        int pre_time = getTime(pre_bit_width_segments);
-        int pre_value = getValue(pre_bit_width_segments);
-
-        int size = bit_width_segments.length;
-        int[][] run_length_time = new int[size][2];
-        int[][] run_length_value = new int[size][2];
-
-        int pos_time = 0;
-        int pos_value = 0;
-
-        for (int i = 1; i < size; i++) {
-            long cur_bit_width_segments = bit_width_segments[i];
-            int cur_time = getTime(cur_bit_width_segments);
-            int cur_value = getValue(cur_bit_width_segments);
-            if (cur_time != pre_time && count_of_time != 0) {
-                run_length_time[pos_time][0] = count_of_time;
-                run_length_time[pos_time][1] = pre_time;
-                pos_time++;
-                pre_time = cur_time;
-                count_of_time = 1;
-            } else {
-                count_of_time++;
-                pre_time = cur_time;
-                if (count_of_time == 256) {
-                    run_length_time[pos_time][0] = count_of_time;
-                    run_length_time[pos_time][1] = pre_time;
-                    pos_time++;
-                    count_of_time = 0;
-                }
-            }
-
-            if (cur_value != pre_value && count_of_value != 0) {
-                run_length_value[pos_value][0] = count_of_value;
-                run_length_value[pos_value][1] = pre_value;
-                pos_value++;
-
-                pre_value = cur_value;
-                count_of_value = 1;
-            } else {
-                count_of_value++;
-                pre_value = cur_value;
-                if (count_of_value == 256) {
-                    run_length_value[pos_value][0] = count_of_value;
-                    run_length_value[pos_value][1] = pre_value;
-                    pos_value++;
-                    count_of_value = 0;
-                }
-            }
-
-        }
-        if (count_of_time != 0) {
-            run_length_time[pos_time][0] = count_of_time;
-            run_length_time[pos_time][1] = pre_time;
-            pos_time++;
-        }
-        if (count_of_value != 0) {
-            run_length_value[pos_value][0] = count_of_value;
-            run_length_value[pos_value][1] = pre_value;
-            pos_value++;
-        }
-        intWord2Bytes(pos_time, pos_encode, encoded_result);
-        pos_encode += 2;
-        intWord2Bytes(pos_value, pos_encode, encoded_result);
-        pos_encode += 2;
-
-        for (int i = 0; i < pos_time; i++) {
-            int[] bit_width_time = run_length_time[i];
-            intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-            pos_encode++;
-            intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-            pos_encode++;
-
-        }
-        for (int i = 0; i < pos_value; i++) {
-            int[] bit_width_value = run_length_value[i];
-            intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-            pos_encode++;
-            intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-            pos_encode++;
-
-        }
-
-        return pos_encode;
-    }
-
-    public static long[] segmentBitPacking(long[] ts_block_delta, int block_size, int segment_size) {
-
-        int segment_n = (block_size - 1) / segment_size;
-        long[] bit_width_segments = new long[segment_n];
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = Integer.MIN_VALUE;
-            int bit_width_value = Integer.MIN_VALUE;
-
-            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
-                long cur_data_i = ts_block_delta[data_i];
-//                System.out.println("cur_data_i: "+(cur_data_i));
-//                System.out.println("getTime(cur_data_i): "+getTime(cur_data_i));
-//                System.out.println("getValue(cur_data_i): "+getValue(cur_data_i));
-                int cur_bit_width_time = getBitWith(getTime(cur_data_i));
-                int cur_bit_width_value = getBitWith(getValue(cur_data_i));
-                if (cur_bit_width_time > bit_width_time) {
-                    bit_width_time = cur_bit_width_time;
-                }
-                if (cur_bit_width_value > bit_width_value) {
-                    bit_width_value = cur_bit_width_value;
-                }
-            }
-            bit_width_segments[segment_i] = combine2Int(bit_width_time, bit_width_value);
-        }
-        return bit_width_segments;
-    }
-
-    public static void moveAlphaToBeta(long[] ts_block, int alpha, int beta) {
-        long tmp_tv = ts_block[alpha];
-        if (beta < alpha) {
-            for (int u = alpha - 1; u >= beta; u--) {
-                ts_block[u + 1] = ts_block[u];
-            }
-        } else {
-            for (int u = alpha + 1; u < beta; u++) {
-                ts_block[u - 1] = ts_block[u];
-            }
-            beta--;
-        }
-        ts_block[beta] = tmp_tv;
-    }
-
-
-    private static int numberOfEncodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int segment_size) {
-        int block_size = delta_segments.length;
-        int segment_n = block_size / segment_size;
-        int result = 0;
-        result += 8; // encode interval0 and value0
-        result += 16; // encode theta
-        result += encodeRLEBitWidth2Bytes(bit_width_segments);
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            long cur_data_i = bit_width_segments[segment_i];
-            int bit_width_time = getTime(cur_data_i);
-            int bit_width_value = getValue(cur_data_i);
-            result += (segment_size * bit_width_time / 8);
-            result += (segment_size * bit_width_value / 8);
-        }
-
-        return result;
-    }
-
-    private static int encodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int[] raw_length, int segment_size, float[] theta, int pos_encode, byte[] encoded_result) {
-
-        int block_size = delta_segments.length;
-        int segment_n = block_size / segment_size;
-        long2Bytes(delta_segments[0], pos_encode, encoded_result);
-        pos_encode += 8;
-        float2bytes(theta[0], pos_encode, encoded_result);
-        pos_encode += 4;
-        float2bytes(theta[1], pos_encode, encoded_result);
-        pos_encode += 4;
-        float2bytes(theta[2], pos_encode, encoded_result);
-        pos_encode += 4;
-        float2bytes(theta[3], pos_encode, encoded_result);
-        pos_encode += 4;
-
-        int2Bytes( raw_length[3], pos_encode, encoded_result);
-        pos_encode += 4;
-        int2Bytes(raw_length[4], pos_encode, encoded_result);
-        pos_encode += 4;
-
-
-//        System.out.println(Arrays.toString(theta));
-
-
-
-        pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-//        printTSBlock(bit_width_segments);
-//        System.out.println(pos_encode);
-//        System.out.println("theta:"+ Arrays.toString(theta));
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            long tmp_bit_width_segments = bit_width_segments[segment_i];
-            int bit_width_time = getTime(tmp_bit_width_segments);
-            int bit_width_value = getValue(tmp_bit_width_segments);
-//            System.out.println(bit_width_time);
-//            System.out.println(bit_width_value);
-            pos_encode = bitPacking(delta_segments, 0, segment_i * segment_size + 1, segment_size, bit_width_time, pos_encode, encoded_result);
-            pos_encode = bitPacking(delta_segments, 1, segment_i * segment_size + 1, segment_size, bit_width_value, pos_encode, encoded_result);
-        }
-
-        return pos_encode;
-    }
-
-    private static void printTSBlock(long[] ts_block) {
-        for (long ts : ts_block) {
-            System.out.println("[" + getTime(ts) + "," + getValue(ts) + "]");
-        }
-    }
-
-    private static long[] ReorderingTimeSeries(long[] ts_block, int[] raw_length, float[] theta, int segment_size) {
-
-
-        int block_size = ts_block.length;
-        long[] ts_block_delta = new long[block_size];
-
-        ArrayList<Integer> min_index = new ArrayList<>();
-        int index_alpha_list = 0;
-
-
-//        trainParameter(ts_block,block_size,theta);
-//        System.out.println(Arrays.toString(theta));
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-//        System.out.println(Arrays.toString(raw_length));
-        int[] alpha_list = getIStar(ts_block, min_index, block_size, 0, theta);
-        int[] beta_list = new int[alpha_list.length];
-        int[][] new_length_list = new int[alpha_list.length][5];
-        int pos_new_length_list = 0;
-        int[] new_alpha_list = new int[alpha_list.length];
-
-
-        for (int alpha : alpha_list) {
-            if (alpha == -1)
-                continue;
-            new_alpha_list[pos_new_length_list] = alpha;
-
-            ArrayList<Integer> new_min_index = (ArrayList<Integer>) min_index.clone();
-            int[] new_length = raw_length.clone();
-
-            beta_list[pos_new_length_list] = getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-            if (beta_list[pos_new_length_list] == -1)
-                continue;
-            System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-            pos_new_length_list++;
-        }
-
-        int adjust_count = 0;
-
-
-        while (pos_new_length_list != 0) {
-            if (adjust_count < block_size / 2 && adjust_count < 20) {
-                adjust_count++;
-            } else {
-                break;
-            }
-//            all_length = new int[pos_new_length_list][2];
-            int min_length_index = -1;
-            int min_length = Integer.MAX_VALUE;
-
-
-            for (int pos_new_length_list_j = 0; pos_new_length_list_j < pos_new_length_list; pos_new_length_list_j++) {
-                if (new_length_list[pos_new_length_list_j][0] < min_length) {
-                    min_length = new_length_list[pos_new_length_list_j][0];
-                    min_length_index = pos_new_length_list_j;
-                }
-            }
-
-            if (min_length <= raw_length[0]) {
-                long[] new_ts_block = ts_block.clone();
-                moveAlphaToBeta(new_ts_block, new_alpha_list[min_length_index], beta_list[min_length_index]);
-                int[] new_length = raw_length.clone();
-                getEncodeBitsRegressionNoTrain(new_ts_block, block_size, new_length, theta, segment_size);
-                if (new_length[0] < raw_length[0]) {
-                    System.arraycopy(new_length, 0, raw_length, 0, 5);
-                    ts_block = new_ts_block.clone();
-                } else {
-                    break;
-                }
-//                  moveAlphaToBeta(ts_block, new_alpha_list[min_length_index], beta_list[min_length_index]);
-//                  System.arraycopy(new_length_list[min_length_index], 0, raw_length, 0, 5);
-            } else {
-                break;
-            }
-
-            alpha_list = getIStar(ts_block, min_index, block_size, theta);
-
-            int alpha_size = alpha_list.length;
-            for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-                if (containsValue(beta_list, alpha_list[alpha_i])) {
-                    alpha_list = removeElement(alpha_list, alpha_i);
-                }
-            }
-            beta_list = new int[alpha_list.length];
-            new_length_list = new int[alpha_list.length][5];
-            pos_new_length_list = 0;
-            new_alpha_list = new int[alpha_list.length];
-
-            for (int alpha : alpha_list) {
-                if (alpha == -1)
-                    continue;
-                new_alpha_list[pos_new_length_list] = alpha;
-
-                int[] new_length = raw_length.clone();
-//            beta_list[j] = 0;
-                beta_list[pos_new_length_list] = getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-                if (beta_list[pos_new_length_list] == -1)
-                    continue;
-                System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-                pos_new_length_list++;
-            }
-
-        }
-
-//        System.out.println(adjust_count);
-//        printTSBlock(ts_block);
-        ts_block_delta = getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-//        printTSBlock(ts_block_delta);
-
-        return ts_block_delta;
-//        int segment_n = (block_size - 1) / segment_size;
-//        int[][] bit_width_segments = new int[segment_n][2];
-//        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-//            int bit_width_time = Integer.MIN_VALUE;
-//            int bit_width_value = Integer.MIN_VALUE;
-//
-//            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
-//                int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-//                int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-//                if (cur_bit_width_time > bit_width_time) {
-//                    bit_width_time = cur_bit_width_time;
-//                }
-//                if (cur_bit_width_value > bit_width_value) {
-//                    bit_width_value = cur_bit_width_value;
-//                }
-//            }
-//
-//            bit_width_segments[segment_i][0] = bit_width_time;
-//            bit_width_segments[segment_i][1] = bit_width_value;
-//        }
-//
-//
-//        encode_pos = encodeSegment2Bytes(ts_block_delta, bit_width_segments, raw_length, segment_size, theta, encode_pos, cur_byte);
-
-//        System.out.println("encode_pos="+encode_pos);
-//        return encode_pos;
-    }
-
-    private static int REGERBlockEncoderIncrease(long[] data, int i, int block_size, int supply_length, int[] third_value, int segment_size, int encode_pos, byte[] cur_byte, int[] block_sort) {
-
-
-        long min_time = (long) getTime(data[i * block_size]) << 32;
-        long[] ts_block;
-        long[] ts_block_value;
-        long[] ts_block_partition;
-
-        if (supply_length == 0) {
-            ts_block = new long[block_size];
-            ts_block_value = new long[block_size];
-            ts_block_partition = new long[block_size];
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-//            System.out.println((data[i * block_size+1]));
-//            System.out.println(getTime(data[i * block_size+1]));
-            for (int j = 0; j < block_size; j++) {
-                long tmp_j = data[j + i * block_size];//- min_time;
-//                System.out.println(getTime(data[j + i * block_size]));
-//                System.out.println(getTime(data[i * block_size]));
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j), getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-//            for (int j = 0; j < block_size; j++) {
-//                ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-//                ts_block[j][1] = data[j + i * block_size][1];
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                int tmp_value = ts_block[j][1]-min_value;
-//                if(data_map.containsKey(tmp_value)){
-//                    int tmp = data_map.get(tmp_value);
-//                    tmp++;
-//                    data_map.put(tmp_value,tmp);
-//                }else{
-//                    data_map.put(tmp_value,1);
-//                }
-//                ts_block_value[j][0] =ts_block[j][0];
-//                ts_block_value[j][1] =ts_block[j][1];
-//            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-//
-//            third_value= findMinIndex(kernelDensity);
-//            for(int j=0;j<third_value.length;j++){
-//                third_value[j] += min_value;
-//            }
-//            System.out.println("Minimum point: x=" + (Arrays.toString(third_value)));
-        } else {
-            ts_block = new long[supply_length];
-            ts_block_value = new long[supply_length];
-            ts_block_partition = new long[supply_length];
-            int end = data.length - i * block_size;
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-            for (int j = 0; j < end; j++) {
-                long tmp_j = data[j + i * block_size];// - min_time;
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j), getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-            for (int j = end; j < supply_length; j++) {
-                ts_block[j] = 0;
-                ts_block_value[j] = 0;
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] =0;
-            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-
-//            third_value= findMinIndex(kernelDensity);
-            block_size = supply_length;
-        }
-//        int2Bytes(getTime(min_time),encode_pos,cur_byte);
-//        encode_pos += 4;
-//        printTSBlock(ts_block);
-//        printTSBlock(ts_block_value);
-
-        int[] reorder_length = new int[5];
-        float[] theta_reorder = new float[4];
-        int[] time_length = new int[5];// length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        float[] theta_time = new float[4];
-        int[] partition_length = new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        float[] theta_partition = new float[4];
-
-        trainParameter(ts_block, block_size, theta_time);
-
-        long[] ts_block_delta_time = getEncodeBitsRegressionNoTrain(ts_block, block_size, time_length, theta_time, segment_size);
-
-
-        int pos_ts_block_partition = 0;
-        if (third_value.length > 0) {
-            for (long datum : ts_block) {
-                if (getValue(datum) > third_value[third_value.length - 1]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-            for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-                for (long datum : ts_block) {
-                    if (getValue(datum) <= third_value[third_i] && getValue(datum) > third_value[third_i - 1]) {
-                        ts_block_partition[pos_ts_block_partition] = datum;
-                        pos_ts_block_partition++;
-                    }
-                }
-            }
-            for (long datum : ts_block) {
-                if (getValue(datum) <= third_value[0]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-        }
-
-
-        trainParameter(ts_block_partition, block_size, theta_partition);
-        long[] ts_block_delta_partition = getEncodeBitsRegressionNoTrain(ts_block_partition, block_size, partition_length, theta_partition, segment_size);
-
-        Arrays.sort(ts_block_value);
-        trainParameter(ts_block_value, block_size, theta_reorder);
-        long[] ts_block_delta_reorder = getEncodeBitsRegressionNoTrain(ts_block_value, block_size, reorder_length, theta_reorder, segment_size);
-
-
-//       ReorderingTimeSeries(ts_block_value, reorder_length,  theta_reorder, segment_size);
-
-        int segment_n = (block_size - 1) / segment_size;
-        long[] bit_width_segments = new long[segment_n];
-
-
-        int choose = min3(time_length[0], partition_length[0], reorder_length[0]);
-        if (choose == 0) {
-//            System.out.println("time");
-//            System.out.println(Arrays.toString(time_length));
-//            intByte2Bytes(0, encode_pos, cur_byte);
-//            encode_pos ++;
-            block_sort[i] = 0;
-            ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length, theta_time, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-//            ts_block_delta_time[0] += min_time;
-            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments, time_length, segment_size, theta_time, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(time_length));
-        } else if (choose == 1) {
-//            System.out.println("partition");
-//            System.out.println(Arrays.toString(partition_length));
-//            intByte2Bytes(0, encode_pos, cur_byte);
-//            encode_pos ++;
-            block_sort[i] = 0;
-            ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length, theta_partition, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-//            ts_block_delta_partition[0] += min_time;
-            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(partition_length));
-        } else if (choose == 2) {
-
-//            System.out.println("value");
-//            System.out.println(Arrays.toString(reorder_length));
-//            intByte2Bytes(1, encode_pos, cur_byte);
-//            encode_pos ++;
-            block_sort[i] = 1;
-            ts_block_delta_reorder = ReorderingTimeSeries(ts_block_value, reorder_length, theta_reorder, segment_size);
-
-            bit_width_segments = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments, reorder_length, segment_size, theta_reorder, encode_pos, cur_byte);
-        }
-
-
-        return encode_pos;
-    }
-
-    private static int REGERBlockEncoderDecrease(long[] data, int i, int block_size, int supply_length, int[] third_value, int segment_size, int encode_pos, byte[] cur_byte, int[] block_sort) {
-
-
-        long min_time = (long) getTime(data[i * block_size]) << 32;
-        long[] ts_block;
-        long[] ts_block_value;
-        long[] ts_block_partition;
-
-        if (supply_length == 0) {
-            ts_block = new long[block_size];
-            ts_block_value = new long[block_size];
-            ts_block_partition = new long[block_size];
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-//            System.out.println((data[i * block_size+1]));
-//            System.out.println(getTime(data[i * block_size+1]));
-            for (int j = 0; j < block_size; j++) {
-                long tmp_j = data[j + i * block_size] - min_time;
-//                System.out.println(getTime(data[j + i * block_size]));
-//                System.out.println(getTime(data[i * block_size]));
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j), getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-//            for (int j = 0; j < block_size; j++) {
-//                ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-//                ts_block[j][1] = data[j + i * block_size][1];
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                int tmp_value = ts_block[j][1]-min_value;
-//                if(data_map.containsKey(tmp_value)){
-//                    int tmp = data_map.get(tmp_value);
-//                    tmp++;
-//                    data_map.put(tmp_value,tmp);
-//                }else{
-//                    data_map.put(tmp_value,1);
-//                }
-//                ts_block_value[j][0] =ts_block[j][0];
-//                ts_block_value[j][1] =ts_block[j][1];
-//            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-//
-//            third_value= findMinIndex(kernelDensity);
-//            for(int j=0;j<third_value.length;j++){
-//                third_value[j] += min_value;
-//            }
-//            System.out.println("Minimum point: x=" + (Arrays.toString(third_value)));
-        } else {
-            ts_block = new long[supply_length];
-            ts_block_value = new long[supply_length];
-            ts_block_partition = new long[supply_length];
-            int end = data.length - i * block_size;
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
-            for (int j = 0; j < end; j++) {
-                long tmp_j = data[j + i * block_size] - min_time;
-                ts_block[j] = tmp_j;
-                ts_block_value[j] = combine2Int(getValue(tmp_j), getTime(tmp_j));
-
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
-            }
-            for (int j = end; j < supply_length; j++) {
-                ts_block[j] = 0;
-                ts_block_value[j] = 0;
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] =0;
-            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-
-//            third_value= findMinIndex(kernelDensity);
-            block_size = supply_length;
-        }
-
-//        printTSBlock(ts_block);
-//        printTSBlock(ts_block_value);
-
-        int[] reorder_length = new int[5];
-        float[] theta_reorder = new float[4];
-        int[] time_length = new int[5];// length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        float[] theta_time = new float[4];
-        int[] partition_length = new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-        float[] theta_partition = new float[4];
-
-        trainParameter(ts_block, block_size, theta_time);
-
-        long[] ts_block_delta_time = getEncodeBitsRegressionNoTrain(ts_block, block_size, time_length, theta_time, segment_size);
-
-
-        int pos_ts_block_partition = 0;
-        if (third_value.length > 0) {
-            for(int j=block_size-1;j>=0;j--){
-                long datum = ts_block[j];
-                if (getValue(datum) <= third_value[0]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-            for (int third_i = 1; third_i <= third_value.length - 1; third_i++) {
-                for (int j = block_size - 1; j >= 0; j--) {
-                    long datum = ts_block[j];
-                    if (getValue(datum) <= third_value[third_i] && getValue(datum) > third_value[third_i - 1]) {
-                        ts_block_partition[pos_ts_block_partition] = datum;
-                        pos_ts_block_partition++;
-                    }
-                }
-            }
-            for (int j = block_size - 1; j >= 0; j--) {
-                long datum = ts_block[j];
-                if (getValue(datum) > third_value[third_value.length - 1]) {
-                    ts_block_partition[pos_ts_block_partition] = datum;
-                    pos_ts_block_partition++;
-                }
-            }
-//            System.out.println(pos_ts_block_partition);
-//            for (long datum : ts_block) {
-//                if (getValue(datum) <= third_value[0]) {
-//                    ts_block_partition[pos_ts_block_partition] = datum;
-//                    pos_ts_block_partition++;
-//                }
-//            }
-//            for (int third_i = 1; third_i < third_value.length - 1; third_i++) {
-//                for (long datum : ts_block) {
-//                    if (getValue(datum) <= third_value[third_i] && getValue(datum) > third_value[third_i - 1]) {
-//                        ts_block_partition[pos_ts_block_partition] = datum;
-//                        pos_ts_block_partition++;
-//                    }
-//                }
-//            }
-//            for (long datum : ts_block) {
-//                if (getValue(datum) > third_value[third_value.length - 1]) {
-//                    ts_block_partition[pos_ts_block_partition] = datum;
-//                    pos_ts_block_partition++;
-//                }
-//            }
-        }
-
-
-        trainParameter(ts_block_partition, block_size, theta_partition);
-        long[] ts_block_delta_partition = getEncodeBitsRegressionNoTrain(ts_block_partition, block_size, partition_length, theta_partition, segment_size);
-
-        Arrays.sort(ts_block_value);
-        trainParameter(ts_block_value, block_size, theta_reorder);
-        long[] ts_block_delta_reorder = getEncodeBitsRegressionNoTrain(ts_block_value, block_size, reorder_length, theta_reorder, segment_size);
-
-
-       ReorderingTimeSeries(ts_block_value, reorder_length,  theta_reorder, segment_size);
-
-        int segment_n = (block_size - 1) / segment_size;
-        long[] bit_width_segments = new long[segment_n];
-
-
-        int choose = min3(time_length[0], partition_length[0], reorder_length[0]);
-        if (choose == 0) {
-//            System.out.println("time");
-//            System.out.println(Arrays.toString(time_length));
-//            intByte2Bytes(0, encode_pos, cur_byte);
-//            encode_pos ++;
-            block_sort[i] = 0;
-            ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length, theta_time, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-            int2Bytes(getTime(min_time),encode_pos,cur_byte);
-            encode_pos += 4;
-//            ts_block_delta_time[0] += min_time;
-
-            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments, time_length, segment_size, theta_time, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(time_length));
-        } else if (choose == 1) {
-//            System.out.println(i);
-//            System.out.println("partition");
-//            printTSBlock(ts_block_partition);
-//            System.out.println(Arrays.toString(partition_length));
-//            intByte2Bytes(0, encode_pos, cur_byte);
-//            encode_pos ++;
-            block_sort[i] = 0;
-            ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length, theta_partition, segment_size);
-            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-//            ts_block_delta_partition[0] += min_time;
-            int2Bytes(getTime(min_time),encode_pos,cur_byte);
-            encode_pos += 4;
-            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-//            System.out.println(Arrays.toString(partition_length));
-        } else if (choose == 2) {
-            int2Bytes(getTime(min_time),encode_pos,cur_byte);
-            encode_pos += 4;
-//            System.out.println("value");
-//            printTSBlock(ts_block_value);
-//            System.out.println(Arrays.toString(reorder_length));
-//            intByte2Bytes(1, encode_pos, cur_byte);
-//            encode_pos ++;
-            block_sort[i] = 1;
-            ts_block_delta_reorder = ReorderingTimeSeries(ts_block_value, reorder_length, theta_reorder, segment_size);
-
-            bit_width_segments = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-            encode_pos = encodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments, reorder_length, segment_size, theta_reorder, encode_pos, cur_byte);
-        }
-
-//        block_sort[i] = 0;
-//        ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length, theta_partition, segment_size);
-//        bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-////            ts_block_delta_partition[0] += min_time;
-//        encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-
-//        int segment_n = (block_size - 1) / segment_size;
-//        long[] bit_width_segments = new long[segment_n];
-//
-//        if(time_length[0] > partition_length[0]){
-//
-//            ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length,  theta_partition, segment_size);
-//
-//            bit_width_segments = segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-//            encode_pos = encodeSegment2Bytes(ts_block_delta_partition, bit_width_segments, partition_length, segment_size, theta_partition, encode_pos, cur_byte);
-//
-//        }else{
-//            ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length,  theta_time, segment_size);
-//
-//            bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-//            encode_pos = encodeSegment2Bytes(ts_block_delta_time, bit_width_segments, time_length, segment_size, theta_time, encode_pos, cur_byte);
-//
-//        }
-
-//        System.out.println(encode_pos);
-
-        return encode_pos;
-    }
-
-    public static int ReorderingRegressionEncoderIncrease(long[] data, int block_size, int[] third_value, int segment_size, byte[] encoded_result) {
-        block_size++;
-//    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-        int length_all = data.length;
-//        System.out.println(length_all);
-        int encode_pos = 0;
-        int2Bytes(length_all, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int block_num = length_all / block_size;
-        int2Bytes(block_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int2Bytes(segment_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int[] block_sort = new int[block_num+1];
-        int encode_pos_block_sort = encode_pos;
-        int length_block_sort = (int) Math.ceil((double)(block_num+1)/(double) 8);
-        encode_pos += length_block_sort;
-
-//        for (int i = 0; i < 1; i++) {
-        for (int i = 0; i < block_num; i++) {
-//            System.out.println(i);
-            encode_pos = REGERBlockEncoderIncrease(data, i, block_size, 0, third_value, segment_size, encode_pos, encoded_result, block_sort);
-        }
-
-        int remaining_length = length_all - block_num * block_size;
-        if (remaining_length == 1) {
-            long2Bytes(data[data.length - 1], encode_pos, encoded_result);
-            encode_pos += 8;
-        }
-        if (remaining_length != 0 && remaining_length != 1) {
-            int supple_length;
-            if (remaining_length % segment_size == 0) {
-                supple_length = 1;
-            } else if (remaining_length % segment_size == 1) {
-                supple_length = 0;
-            } else {
-                supple_length = segment_size + 1 - remaining_length % segment_size;
-            }
-            encode_pos = REGERBlockEncoderIncrease(data, block_num, block_size, supple_length + remaining_length, third_value, segment_size, encode_pos, encoded_result, block_sort);
-
-        }
-        encodeSort(block_sort,encode_pos_block_sort,encoded_result);
-
-        return encode_pos;
-    }
-
-    public static int ReorderingRegressionEncoderDecrease(long[] data, int block_size, int[] third_value, int segment_size, byte[] encoded_result) {
-        block_size++;
-//    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-        int length_all = data.length;
-//        System.out.println(length_all);
-        int encode_pos = 0;
-        int2Bytes(length_all, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int block_num = length_all / block_size;
-        int2Bytes(block_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int2Bytes(segment_size, encode_pos, encoded_result);
-        encode_pos += 4;
-
-        int[] block_sort = new int[block_num+1];
-        int encode_pos_block_sort = encode_pos;
-        int length_block_sort = (int) Math.ceil((double)(block_num+1)/(double) 8);
-        encode_pos += length_block_sort;
-
-//        for (int i = 0; i < 1; i++) {
-        for (int i = 0; i < block_num; i++) {
-
-            encode_pos = REGERBlockEncoderDecrease(data, i, block_size, 0, third_value, segment_size, encode_pos, encoded_result, block_sort);
-        }
-
-        int remaining_length = length_all - block_num * block_size;
-        if (remaining_length == 1) {
-            long2Bytes(data[data.length - 1], encode_pos, encoded_result);
-            encode_pos += 8;
-        }
-        if (remaining_length != 0 && remaining_length != 1) {
-            int supple_length;
-            if (remaining_length % segment_size == 0) {
-                supple_length = 1;
-            } else if (remaining_length % segment_size == 1) {
-                supple_length = 0;
-            } else {
-                supple_length = segment_size + 1 - remaining_length % segment_size;
-            }
-            encode_pos = REGERBlockEncoderDecrease(data, block_num, block_size, supple_length + remaining_length, third_value, segment_size, encode_pos, encoded_result, block_sort);
-
-        }
-        encodeSort(block_sort,encode_pos_block_sort,encoded_result);
-
-        return encode_pos;
-    }
-
-    private static void encodeSort(int[] block_sort,int encode_pos_block_sort, byte[] encoded_result) {
-        int length = block_sort.length;
-        int cur_num = 0;
-        for(int i=1;i<=length;i++){
-            cur_num <<=1;
-            cur_num += block_sort[i-1];
-            if(i%8==0){
-                intByte2Bytes(cur_num, encode_pos_block_sort, encoded_result);
-                encode_pos_block_sort ++;
-                cur_num = 0;
-            }
-        }
-        if(length%8!=0){
-            intByte2Bytes(cur_num, encode_pos_block_sort, encoded_result);
-        }
-    }
-
-    public static int REGERBlockDecoder(byte[] encoded, int decode_pos, int[][] value_list, int block_size, int segment_size, int[] value_pos_arr) {
-
-        int min_time_0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-
-        int time0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = time0+min_time_0;
-        int value0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = value0;
-
-        value_pos_arr[0]++;
-
-        float theta_time0 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-        float theta_time1 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-
-        float theta_value0 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-        float theta_value1 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-
-        int min_time = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-        int min_value = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-
-        int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-        int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-
-        int count;
-        int num;
-        int segment_n = block_size / segment_size;
-        int[][] bit_width_segments = new int[segment_n][2];
-        int pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_time_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][0] = num;
-                pos_bit_width_segments++;
-            }
-
-        }
-
-        pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_value_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][1] = num;
-                pos_bit_width_segments++;
-            }
-        }
-
-        int pre_time = time0;
-        int pre_value = value0;
-
-
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = bit_width_segments[segment_i][0];
-            int bit_width_value = bit_width_segments[segment_i][1];
-            int[] decode_time_result = new int[segment_size];
-            int[] decode_value_result = new int[segment_size];
-
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-            int pos_decode_time_result = 0;
-            int length_decode_time_result = decode_time_result.length;
-            for(;pos_decode_time_result<length_decode_time_result;pos_decode_time_result++){
-                pre_time = (int) (theta_time0 + theta_time1 * (float)pre_time ) + decode_time_result[pos_decode_time_result] + min_time;
-                pre_value = (int) (theta_value0 + theta_value1 * (float)pre_value ) +  decode_value_result[pos_decode_time_result] + min_value;
-                value_list[value_pos_arr[0]][0] = pre_time+min_time_0;
-                value_list[value_pos_arr[0]][1] = pre_value;
-                value_pos_arr[0] ++;
-            }
-        }
-
-        return decode_pos;
-    }
-
-    public static int REGERBlockDecoderValue(byte[] encoded, int decode_pos, int[][] value_list, int block_size, int segment_size, int[] value_pos_arr) {
-
-        int min_time_0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-
-        int time0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = time0 ;
-        int value0 = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = value0+min_time_0;
-
-
-
-        value_pos_arr[0]++;
-
-        float theta_time0 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-        float theta_time1 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-
-        float theta_value0 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-        float theta_value1 = bytes2float(encoded, decode_pos);
-        decode_pos += 4;
-
-        int min_time = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-        int min_value = bytes2Integer(encoded, decode_pos,4);
-        decode_pos += 4;
-
-        int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-        int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-        decode_pos += 2;
-
-        int count;
-        int num;
-        int segment_n = block_size / segment_size;
-        int[][] bit_width_segments = new int[segment_n][2];
-        int pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_time_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][0] = num;
-                pos_bit_width_segments++;
-            }
-
-        }
-
-        pos_bit_width_segments = 0;
-        for (int i = 0; i < bit_width_value_count; i++) {
-            count = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            num = byte2Integer(encoded, decode_pos);
-            decode_pos++;
-            for (int j = 0; j < count; j++) {
-                bit_width_segments[pos_bit_width_segments][1] = num;
-                pos_bit_width_segments++;
-            }
-        }
-
-        int pre_time = time0;
-        int pre_value = value0;
-
-
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            int bit_width_time = bit_width_segments[segment_i][0];
-            int bit_width_value = bit_width_segments[segment_i][1];
-            int[] decode_time_result = new int[segment_size];
-            int[] decode_value_result = new int[segment_size];
-
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-            decode_pos = decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-            int pos_decode_time_result = 0;
-            int length_decode_time_result = decode_time_result.length;
-            for(;pos_decode_time_result<length_decode_time_result;pos_decode_time_result++){
-                pre_time = (int) (theta_time0 + theta_time1 * (float)pre_time ) + decode_time_result[pos_decode_time_result] + min_time;
-                pre_value = (int) (theta_value0 + theta_value1 * (float)pre_value ) +  decode_value_result[pos_decode_time_result] + min_value;
-                value_list[value_pos_arr[0]][1] = pre_time;
-                value_list[value_pos_arr[0]][0] = pre_value+min_time_0;
-                value_pos_arr[0] ++;
-            }
-        }
-
-
-        return decode_pos;
-    }
-
-    public static int[][] REGERDecoder(byte[] encoded) {
-
-        int decode_pos = 0;
-        int length_all = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        int block_size = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        int segment_size = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-
-
-        int block_num = length_all / block_size;
-        int remain_length = length_all - block_num * block_size;
-        int zero_number;
-
-        int length_block_sort = (int) Math.ceil((double)(block_num+1)/(double) 8);
-        int[] block_sort = new int[block_num+1];
-        for(int i=0;i<length_block_sort-1;i++){
-            int sort = byte2Integer(encoded, decode_pos);
-            decode_pos ++;
-            for(int j=0;j<8;j++){
-               block_sort[i*8+7-j] = sort & 1;
-               sort >>= 1;
-            }
-        }
-        int block_sort_end =(block_num +1)- (length_block_sort*8-8);
-        int sort = byte2Integer(encoded, decode_pos);
-        decode_pos ++;
-        for(int j=0;j<block_sort_end;j++){
-            block_sort[8*length_block_sort-8+block_sort_end-j-1] = sort & 1;
-            sort >>= 1;
-        }
-//        System.out.println(Arrays.toString(block_sort));
-
-        if (remain_length % segment_size == 0) {
-            zero_number = 1;
-        } else if (remain_length % segment_size == 1) {
-            zero_number = 0;
-        } else {
-            zero_number = segment_size + 1 - remain_length % segment_size;
-        }
-        int[][] value_list = new int[length_all + segment_size][2];
-
-        int[] value_pos_arr = new int[1];
-
-//        for (int k = 0; k < 1; k++) {
-        for (int k = 0; k < block_num; k++) {
-            int cur_block_sort = block_sort[k];
-            if(cur_block_sort==0)
-                decode_pos = REGERBlockDecoder(encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-            else if (cur_block_sort == 1){
-                decode_pos = REGERBlockDecoderValue(encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-            }
-
-        }
-
-        if (remain_length == 1) {
-            for (int i = 0; i < remain_length; i++) {
-                int value_end = bytes2Integer(encoded, decode_pos, 4);
-                decode_pos += 4;
-                value_list[value_pos_arr[0]][0] = value_end;
-                value_end = bytes2Integer(encoded, decode_pos, 4);
-                decode_pos += 4;
-                value_list[value_pos_arr[0]][1] = value_end;
-                value_pos_arr[0]++;
-            }
-        } else {
-            int cur_block_sort = block_sort[block_num];
-            if(cur_block_sort==0)
-                REGERBlockDecoder(encoded, decode_pos, value_list, remain_length + zero_number, segment_size, value_pos_arr);
-            else if (cur_block_sort == 1){
-                REGERBlockDecoderValue(encoded, decode_pos, value_list, remain_length + zero_number, segment_size, value_pos_arr);
-            }
-        }
-        return value_list;
-    }
-
-    @Test
-    public void REGERIncrease() throws IOException {
-//        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-        String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-        String output_parent_dir = "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_partition_increase";
-
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> output_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-        dataset_name.add("FANYP-Sensors");
-        dataset_name.add("TRAJET-Transport");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-        int[] dataset_12 = {652477};
-        int[] dataset_13 = {581388};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-        dataset_third.add(dataset_12);
-        dataset_third.add(dataset_13);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
-            dataset_block_size.add(512);
-        }
-
-        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-//        dataset_block_size.add(128);
-
-        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-//        dataset_block_size.add(4096);
-        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
-        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-//        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-//        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
-        output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
-
-//        int[] file_lists = {0,1,2,3};
-//        for (int file_i : file_lists) {
-//        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-        for (int file_i = 0; file_i < 12; file_i++) {
-            String inputPath = input_path_list.get(file_i);
-            String Output = output_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-            String[] head = {
-                    "Input Direction",
-                    "Encoding Algorithm",
-                    "Encoding Time",
-                    "Decoding Time",
-                    "Points",
-                    "Compressed Size",
-                    "Compression Ratio",
-            };
-            writer.writeRecord(head); // write header to output file
-
-            assert tempList != null;
-
-            int count_csv =0;
-            for (File f : tempList) {
-                System.out.println(count_csv);
-                count_csv ++;
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-                ArrayList<Long> data = new ArrayList<>();
-
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-
-                while (loader.readRecord()) {
-
-                    int time_tmp = Integer.parseInt(loader.getValues()[0]) - time0;
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-
-                    data.add(combine2Int(time_tmp, value_tmp));
-                }
-
-
-                inputStream.close();
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-
-                long[] data2_arr = new long[data.size()];
-
-                for (int i = 0; i < data.size(); i++) {
-                    data2_arr[i] = data.get(i);
-                }
-
-                byte[] encoded_result = new byte[data2_arr.length * 8];
-                long encodeTime = 0;
-                long decodeTime = 0;
-                double ratio = 0;
-                double compressed_size = 0;
-                int repeatTime2 = 1;
-                long s = System.nanoTime();
-                int[] best_order = new int[3];
-                int length = 0;
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    length = ReorderingRegressionEncoderIncrease(data2_arr, dataset_block_size.get(file_i), dataset_third.get(file_i), 16, encoded_result);
-                long e = System.nanoTime();
-                encodeTime += ((e - s) / repeatTime2);
-                compressed_size += length;
-                double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                ratio += ratioTmp;
-                s = System.nanoTime();
-//                for (int repeat = 0; repeat < repeatTime2; repeat++)
-//                    REGERDecoder(encoded_result);
-                e = System.nanoTime();
-                decodeTime += ((e - s) / repeatTime2);
-
-
-                String[] record = {
-                        f.toString(),
-                        "REGER-Increase",
-                        String.valueOf(encodeTime),
-                        String.valueOf(decodeTime),
-                        String.valueOf(data.size()),
-                        String.valueOf(compressed_size),
-                        String.valueOf(ratio),
-//                        String.valueOf(best_order[0]),
-//                        String.valueOf(best_order[1]),
-//                        String.valueOf(best_order[2])
-                };
-                writer.writeRecord(record);
-//                System.out.println(Arrays.toString(best_order));
-                System.out.println(ratio);
-
-//                break;
-            }
-            writer.close();
-        }
-    }
-
-    @Test
-    public void REGERDecrease() throws IOException {
-//        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-        String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-        String output_parent_dir = "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_partition_decrease";
-
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> output_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-        dataset_name.add("FANYP-Sensors");
-        dataset_name.add("TRAJET-Transport");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-        int[] dataset_12 = {652477};
-        int[] dataset_13 = {581388};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-        dataset_third.add(dataset_12);
-        dataset_third.add(dataset_13);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
-            dataset_block_size.add(512);
-        }
-
-        output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-//        dataset_block_size.add(128);
-
-        output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-//        dataset_block_size.add(4096);
-        output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
-        output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-//        dataset_block_size.add(8192);
-        output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-//        dataset_block_size.add(2048);
-        output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-//        dataset_block_size.add(128);
-        output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-//        dataset_block_size.add(64);
-        output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-//        dataset_block_size.add(256);
-        output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
-        output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
-
-//        int[] file_lists = {0,1,2,3};
-//        for (int file_i : file_lists) {
-//        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-        for (int file_i = 0; file_i < 12; file_i++) {
-            String inputPath = input_path_list.get(file_i);
-            String Output = output_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-            CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-            String[] head = {
-                    "Input Direction",
-                    "Encoding Algorithm",
-                    "Encoding Time",
-                    "Decoding Time",
-                    "Points",
-                    "Compressed Size",
-                    "Compression Ratio",
-            };
-            writer.writeRecord(head); // write header to output file
-
-            assert tempList != null;
-
-            int count_csv =0;
-            for (File f : tempList) {
-                System.out.println(count_csv);
-                count_csv ++;
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-                ArrayList<Long> data = new ArrayList<>();
-
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-
-                while (loader.readRecord()) {
-
-                    int time_tmp = Integer.parseInt(loader.getValues()[0]) - time0;
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-
-                    data.add(combine2Int(time_tmp, value_tmp));
-                }
-
-
-                inputStream.close();
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-
-
-                int number_test = data.size();
-                long[] data2_arr = new long[number_test];
-                int[][] correctness_test_data = new int[number_test][2];
-
-
-                for (int i = 0; i < number_test; i++) {
-                    data2_arr[i] = data.get(i);
-//                    correctness_test_data[i][0] = getTime(data2_arr[i]);
-//                    correctness_test_data[i][1] = getValue(data2_arr[i]);
-                }
-//                System.out.println(Arrays.deepToString(correctness_test_data));
-                byte[] encoded_result = new byte[data2_arr.length * 8];
-                long encodeTime = 0;
-                long decodeTime = 0;
-                double ratio = 0;
-                double compressed_size = 0;
-                int repeatTime2 = 1;
-                long s = System.nanoTime();
-                int[] best_order = new int[3];
-                int length = 0;
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    length = ReorderingRegressionEncoderDecrease(data2_arr, dataset_block_size.get(file_i), dataset_third.get(file_i), 16, encoded_result);
-                long e = System.nanoTime();
-                encodeTime += ((e - s) / repeatTime2);
-                compressed_size += length;
-                double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                ratio += ratioTmp;
-                s = System.nanoTime();
-                int[][] decode_result = new int[number_test][2];
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    decode_result = REGERDecoder(encoded_result);
-//                Arrays.sort(decode_result, (a, b) -> {
-//                    if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-//                    return Integer.compare(a[0], b[0]);
-//                });
-//                System.out.println(Arrays.deepToString(decode_result));
-                e = System.nanoTime();
-                decodeTime += ((e - s) / repeatTime2);
-
-
-                String[] record = {
-                        f.toString(),
-                        "REGER-Decrease",
-                        String.valueOf(encodeTime),
-                        String.valueOf(decodeTime),
-                        String.valueOf(data.size()),
-                        String.valueOf(compressed_size),
-                        String.valueOf(ratio),
-//                        String.valueOf(best_order[0]),
-//                        String.valueOf(best_order[1]),
-//                        String.valueOf(best_order[2])
-                };
-                writer.writeRecord(record);
-//                System.out.println(Arrays.toString(best_order));
-                System.out.println(ratio);
-
-//                break;
-            }
-            writer.close();
-        }
-    }
-
-
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERFloatTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERFloatTest.java
index c25edec..f0a4a00 100644
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERFloatTest.java
+++ b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERFloatTest.java
@@ -11,7 +11,6 @@
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Objects;
 
 import static java.lang.Math.abs;
 
@@ -114,52 +113,6 @@
         return value % 256;
     }
 
-    public static void pack8Values(ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-        int bufIdx = 0;
-        int valueIdx = offset;
-        // remaining bits for the current unfinished Integer
-        int leftBit = 0;
-
-        while (valueIdx < 8 + offset) {
-            // buffer is used for saving 32 bits as a part of result
-            int buffer = 0;
-            // remaining size of bits in the 'buffer'
-            int leftSize = 32;
-
-            // encode the left bits of current Integer to 'buffer'
-            if (leftBit > 0) {
-                buffer |= (values.get(valueIdx) << (32 - leftBit));
-                leftSize -= leftBit;
-                leftBit = 0;
-                valueIdx++;
-            }
-
-            while (leftSize >= width && valueIdx < 8 + offset) {
-                // encode one Integer to the 'buffer'
-                buffer |= (values.get(valueIdx) << (leftSize - width));
-                leftSize -= width;
-                valueIdx++;
-            }
-            // If the remaining space of the buffer can not save the bits for one Integer,
-            if (leftSize > 0 && valueIdx < 8 + offset) {
-                // put the first 'leftSize' bits of the Integer into remaining space of the
-                // buffer
-                buffer |= (values.get(valueIdx) >>> (width - leftSize));
-                leftBit = width - leftSize;
-            }
-
-            // put the buffer into the final result
-            for (int j = 0; j < 4; j++) {
-                encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-                encode_pos++;
-                bufIdx++;
-                if (bufIdx >= width) {
-                    return;
-                }
-            }
-        }
-//        return encode_pos;
-    }
 
     public static void pack8Values(long[] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
         int bufIdx = 0;
@@ -294,66 +247,6 @@
         return Float.intBitsToFloat(l);
     }
 
-    public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-        int value = 0;
-        if (num > 4) {
-            System.out.println("bytes2Integer error");
-            return 0;
-        }
-        for (int i = 0; i < num; i++) {
-            value <<= 8;
-            int b = encoded.get(i + start) & 0xFF;
-            value |= b;
-        }
-        return value;
-    }
-
-    public static int part(int[][] arr, int index, int low, int high) {
-        int[] tmp = arr[low];
-        while (low < high) {
-            while (low < high
-                    && (arr[high][index] > tmp[index]
-                    || (Objects.equals(arr[high][index], tmp[index])
-                    && arr[high][index ^ 1] >= tmp[index ^ 1]))) {
-                high--;
-            }
-            arr[low][0] = arr[high][0];
-            arr[low][1] = arr[high][1];
-            while (low < high
-                    && (arr[low][index] < tmp[index]
-                    || (Objects.equals(arr[low][index], tmp[index])
-                    && arr[low][index ^ 1] <= tmp[index ^ 1]))) {
-                low++;
-            }
-            arr[high][0] = arr[low][0];
-            arr[high][1] = arr[low][1];
-        }
-        arr[low][0] = tmp[0];
-        arr[low][1] = tmp[1];
-        return low;
-    }
-
-    public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-        ArrayList<Integer> tmp = arr.get(low);
-        while (low < high) {
-            while (low < high
-                    && (arr.get(high).get(index) > tmp.get(index)
-                    || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                    && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-                high--;
-            }
-            arr.set(low, arr.get(high));
-            while (low < high
-                    && (arr.get(low).get(index) < tmp.get(index)
-                    || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                    && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-                low++;
-            }
-            arr.set(high, arr.get(low));
-        }
-        arr.set(low, tmp);
-        return low;
-    }
 
     public static long combine2Int(int int1, int int2) {
         return ((long) int1 << 32) | (int2 & 0xFFFFFFFFL);
@@ -382,38 +275,6 @@
         return n;
     }
 
-    //    public static void splitTimeStamp3(
-//            ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-//        int td_common = 0;
-//        for (int i = 1; i < ts_block.size(); i++) {
-//            int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-//            if (td_common == 0) {
-//                if (time_diffi != 0) {
-//                    td_common = time_diffi;
-//                }
-//                continue;
-//            }
-//            if (time_diffi != 0) {
-//                td_common = getCommon(time_diffi, td_common);
-//                if (td_common == 1) {
-//                    break;
-//                }
-//            }
-//        }
-//        if (td_common == 0) {
-//            td_common = 1;
-//        }
-//
-//        int t0 = ts_block.get(0).get(0);
-//        for (int i = 0; i < ts_block.size(); i++) {
-//            ArrayList<Integer> tmp = new ArrayList<>();
-//            int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-//            tmp.add(t0 + interval_i);
-//            tmp.add(ts_block.get(i).get(1));
-//            ts_block.set(i, tmp);
-//        }
-//        result.add(td_common);
-//    }
     public static void splitTimeStamp3(
             ArrayList<Long> ts_block, ArrayList<Integer> result) {
         int td_common = 0;
@@ -442,13 +303,9 @@
 
         int t0 = getTime(ts_block.get(0));
         for (int i = 0; i < ts_block.size(); i++) {
-//            ArrayList<Integer> tmp = new ArrayList<>();
             int cur_value = getTime(ts_block.get(i));
             int interval_i = ((cur_value - t0) / td_common);
             ts_block.set(i, combine2Int(t0 + interval_i, getValue(ts_block.get(i))));
-//            tmp.add(t0 + interval_i);
-//            tmp.add(ts_block.get(i).get(1));
-//            ts_block.set(i, tmp);
         }
         result.add(td_common);
     }
@@ -482,13 +339,6 @@
             j++;
         }
 
-//        for (int j = 1; j < block_size; j++) {
-//            int timestamp_delta_i = getTime(ts_block[j]) - (int) (theta0_t + theta1_t * (float) getTime(ts_block[j - 1]));
-//            if (timestamp_delta_i < min_delta_time) {
-//                min_delta_time_index = j;
-//                min_delta_time = timestamp_delta_i;
-//            }
-//        }
         raw_length[0] += (getBitWith(min_delta_time_i - min_delta_time) * (block_size - 1));
         raw_length[3] = min_delta_time;
         min_index.set(0, min_delta_time_index);
@@ -524,13 +374,6 @@
         }
 
 
-//        for (int j = 1; j < block_size; j++) {
-//            int value_delta_i = getValue(ts_block[j]) - (int) (theta0_v + theta1_v * (float) getValue(ts_block[j - 1]));
-//            if (value_delta_i < min_delta_value) {
-//                min_delta_value_index = j;
-//                min_delta_value = value_delta_i;
-//            }
-//        }
         raw_length[0] += (getBitWith(min_delta_value_i - min_delta_value) * (block_size - 1));
         raw_length[3] = min_delta_value;
         min_index.set(0, min_delta_value_index);
@@ -730,8 +573,6 @@
             timestamp_delta_i = getTime(tmp_i) - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1));
             value_delta_i = getValue(tmp_i) - (int) (theta0_v + theta1_v * (float) getValue(tmp_i_1));
             ts_block_delta[pos_ts_block_delta] = combine2Int(timestamp_delta_i, value_delta_i);
-//            ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-//            ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
             pos_ts_block_delta++;
 
 
@@ -1624,35 +1465,13 @@
             j++;
         }
 
-//        // delta to Regression
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r =
-//                    getTime(tmp_j) - (int) (theta0_r + theta1_r * (float) getTime(tmp_j_1));
-//            int epsilon_v =
-//                    getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-//
-//
-//            if (epsilon_r < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r;
-//            }
-//            if (epsilon_v < value_delta_min) {
-//                value_delta_min = epsilon_v;
-//            }
-//            ts_block_delta[j] = combine2Int(epsilon_r,epsilon_v);
-////            ts_block_delta[j][1] = epsilon_v;
-//        }
-
-//        printTSBlock(ts_block_delta);
 
         int max_interval = Integer.MIN_VALUE;
         int max_value = Integer.MIN_VALUE;
         int max_interval_segment = Integer.MIN_VALUE;
         int max_value_segment = Integer.MIN_VALUE;
         int length = 0;
-//        long delta_time = combine2Int(timestamp_delta_min, value_delta_min);
-//        for (int i = block_size - 1; i > 0; i--) {
+
         for (int i = 1; i < block_size; i++) {
             tmp_j = ts_block_delta[i];
             int epsilon_r = getTime(tmp_j) - timestamp_delta_min;
@@ -1684,7 +1503,6 @@
         int max_bit_width_interval = getBitWith(max_interval);
         int max_bit_width_value = getBitWith(max_value);
 
-//System.out.println("--------------------------------------------------");
 
         raw_length[0] = length;
         raw_length[1] = max_bit_width_interval;
@@ -1692,190 +1510,8 @@
         raw_length[3] = timestamp_delta_min;
         raw_length[4] = value_delta_min;
 
-//        printTSBlock(ts_block_delta);
         return ts_block_delta;
 
-//        int[][] ts_block_delta_segment = new int[block_size][2];
-//        int pos_ts_block_delta_segment = 0;
-//        int[] tmp_segment = new int[2];
-//        int max_interval_segment = Integer.MIN_VALUE;
-//        int max_value_segment = Integer.MIN_VALUE;
-//        tmp_segment[0] = max_interval_segment;
-//        tmp_segment[1] = max_value_segment;
-//
-//
-//            if (epsilon_r > max_interval_segment) {
-//                max_interval_segment = epsilon_r;
-//                tmp_segment[0] = max_interval_segment;
-//            }
-//            if (epsilon_v > max_value_segment) {
-//                max_value_segment = epsilon_v;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//            if (j % segment_size == 0) {
-//                ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-//                ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-//                pos_ts_block_delta_segment++;
-//                tmp_segment = new int[2];
-//                max_interval_segment = Integer.MIN_VALUE;
-//                max_value_segment = Integer.MIN_VALUE;
-//                tmp_segment[0] = max_interval_segment;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//
-//
-//        for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-//            length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-//            length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-//        }
-
-
-    }
-    public static long[] getEncodeBitsRegressionNoTrain1(
-            long[] ts_block,
-            int block_size,
-            int[] raw_length,
-            float[] theta,
-            int segment_size) {
-
-        long[] ts_block_delta = new long[ts_block.length];
-
-        float theta0_r = theta[0];
-        float theta1_r = theta[1];
-        float theta0_v = theta[2];
-        float theta1_v = theta[3];
-
-        ts_block_delta[0] = ts_block[0];
-        int timestamp_delta_min = Integer.MAX_VALUE;
-        int value_delta_min = Integer.MAX_VALUE;
-        int max_interval = Integer.MIN_VALUE;
-        int max_value = Integer.MIN_VALUE;
-        int max_interval_segment = Integer.MIN_VALUE;
-        int max_value_segment = Integer.MIN_VALUE;
-        int length = 0;
-
-        int j = 1;
-        long tmp_j_1 = ts_block[0];
-        long tmp_j;
-        while (j < block_size) {
-            tmp_j = ts_block[j];
-
-            int epsilon_r_j =
-                    zigzag( getTime(tmp_j)
-                            - (int) (theta0_r + theta1_r * (float) getTime(tmp_j_1)));
-            int epsilon_v_j =
-                    zigzag( getValue(tmp_j)
-                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1)));
-            if (epsilon_r_j > max_interval) {
-                max_interval = epsilon_r_j;
-            }
-            if (epsilon_v_j > max_value) {
-                max_value = epsilon_v_j;
-            }
-
-            if (epsilon_r_j > max_interval_segment) {
-                max_interval_segment = epsilon_r_j;
-            }
-            if (epsilon_v_j > max_value_segment) {
-                max_value_segment = epsilon_v_j;
-            }
-//            if (epsilon_r_j < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r_j;
-//            }
-//            if (epsilon_v_j < value_delta_min) {
-//                value_delta_min = epsilon_v_j;
-//            }
-            ts_block_delta[j] = combine2Int(epsilon_r_j, epsilon_v_j);
-
-            if (j % segment_size == 0) {
-                length += getBitWith(max_interval_segment) * segment_size;
-                length += getBitWith(max_value_segment) * segment_size;
-                max_interval_segment = Integer.MIN_VALUE;
-                max_value_segment = Integer.MIN_VALUE;
-            }
-
-            tmp_j_1 = tmp_j;
-            j++;
-        }
-
-
-
-//        for (int i = 1; i < block_size; i++) {
-//            tmp_j = ts_block_delta[i];
-//            int epsilon_r = getTime(tmp_j) - timestamp_delta_min;
-//            int epsilon_v = getValue(tmp_j) - value_delta_min;
-//
-//            ts_block_delta[i] = combine2Int(epsilon_r, epsilon_v);
-//
-//            if (epsilon_r > max_interval) {
-//                max_interval = epsilon_r;
-//            }
-//            if (epsilon_v > max_value) {
-//                max_value = epsilon_v;
-//            }
-//
-//            if (epsilon_r > max_interval_segment) {
-//                max_interval_segment = epsilon_r;
-//            }
-//            if (epsilon_v > max_value_segment) {
-//                max_value_segment = epsilon_v;
-//            }
-//            if (i % segment_size == 0) {
-//                length += getBitWith(max_interval_segment) * segment_size;
-//                length += getBitWith(max_value_segment) * segment_size;
-//                max_interval_segment = Integer.MIN_VALUE;
-//                max_value_segment = Integer.MIN_VALUE;
-//            }
-//        }
-
-        int max_bit_width_interval = getBitWith(max_interval);
-        int max_bit_width_value = getBitWith(max_value);
-
-//System.out.println("--------------------------------------------------");
-
-        raw_length[0] = length;
-        raw_length[1] = max_bit_width_interval;
-        raw_length[2] = max_bit_width_value;
-        raw_length[3] = timestamp_delta_min;
-        raw_length[4] = value_delta_min;
-
-//        printTSBlock(ts_block_delta);
-        return ts_block_delta;
-
-//        int[][] ts_block_delta_segment = new int[block_size][2];
-//        int pos_ts_block_delta_segment = 0;
-//        int[] tmp_segment = new int[2];
-//        int max_interval_segment = Integer.MIN_VALUE;
-//        int max_value_segment = Integer.MIN_VALUE;
-//        tmp_segment[0] = max_interval_segment;
-//        tmp_segment[1] = max_value_segment;
-//
-//
-//            if (epsilon_r > max_interval_segment) {
-//                max_interval_segment = epsilon_r;
-//                tmp_segment[0] = max_interval_segment;
-//            }
-//            if (epsilon_v > max_value_segment) {
-//                max_value_segment = epsilon_v;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//            if (j % segment_size == 0) {
-//                ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-//                ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-//                pos_ts_block_delta_segment++;
-//                tmp_segment = new int[2];
-//                max_interval_segment = Integer.MIN_VALUE;
-//                max_value_segment = Integer.MIN_VALUE;
-//                tmp_segment[0] = max_interval_segment;
-//                tmp_segment[1] = max_value_segment;
-//            }
-//
-//
-//        for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-//            length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-//            length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-//        }
-
 
     }
 
@@ -2135,11 +1771,7 @@
             tmp_j_1 = tmp_j;
             j++;
         }
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//
-//        }
+
         min_index.add(timestamp_delta_min_index);
         min_index.add(value_delta_min_index);
 
@@ -2209,33 +1841,6 @@
             j++;
         }
 
-//        for (int j = 1; j < block_size; j++) {
-//            long tmp_j = ts_block[j];
-//            long tmp_j_1 = ts_block[j-1];
-//            int epsilon_r_j =
-//                    getTime(tmp_j)
-//                            - (int) (theta0_t + theta1_t * (float) getTime(tmp_j_1));
-//            int epsilon_v_j =
-//                    getValue(tmp_j)
-//                            - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1));
-//
-//            if (epsilon_v_j > value_delta_max) {
-//                value_delta_max = epsilon_v_j;
-//                value_delta_max_index = j;
-//            }
-//            if (epsilon_v_j < value_delta_min) {
-//                value_delta_min = epsilon_v_j;
-//                value_delta_min_index = j;
-//            }
-//            if (epsilon_r_j > timestamp_delta_max) {
-//                timestamp_delta_max = epsilon_r_j;
-//                timestamp_delta_max_index = j;
-//            }
-//            if (epsilon_r_j < timestamp_delta_min) {
-//                timestamp_delta_min = epsilon_r_j;
-//                timestamp_delta_min_index = j;
-//            }
-//        }
 
         min_index.add(timestamp_delta_min_index);
         alpha_list[0] = timestamp_delta_min_index;
@@ -2424,9 +2029,6 @@
 
             for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
                 long cur_data_i = ts_block_delta[data_i];
-//                System.out.println("cur_data_i: "+(cur_data_i));
-//                System.out.println("getTime(cur_data_i): "+getTime(cur_data_i));
-//                System.out.println("getValue(cur_data_i): "+getValue(cur_data_i));
                 int cur_bit_width_time = getBitWith(getTime(cur_data_i));
                 int cur_bit_width_value = getBitWith(getValue(cur_data_i));
                 if (cur_bit_width_time > bit_width_time) {
@@ -2456,25 +2058,6 @@
         ts_block[beta] = tmp_tv;
     }
 
-
-    private static int numberOfEncodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int segment_size) {
-        int block_size = delta_segments.length;
-        int segment_n = block_size / segment_size;
-        int result = 0;
-        result += 8; // encode interval0 and value0
-        result += 16; // encode theta
-        result += encodeRLEBitWidth2Bytes(bit_width_segments);
-        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-            long cur_data_i = bit_width_segments[segment_i];
-            int bit_width_time = getTime(cur_data_i);
-            int bit_width_value = getValue(cur_data_i);
-            result += (segment_size * bit_width_time / 8);
-            result += (segment_size * bit_width_value / 8);
-        }
-
-        return result;
-    }
-
     private static int encodeSegment2Bytes(long[] delta_segments, long[] bit_width_segments, int[] raw_length, int segment_size, float[] theta, int pos_encode, byte[] encoded_result) {
 
         int block_size = delta_segments.length;
@@ -2498,15 +2081,10 @@
 
 
         pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-//        printTSBlock(bit_width_segments);
-//        System.out.println(pos_encode);
-//        System.out.println("theta:"+ Arrays.toString(theta));
         for (int segment_i = 0; segment_i < segment_n; segment_i++) {
             long tmp_bit_width_segments = bit_width_segments[segment_i];
             int bit_width_time = getTime(tmp_bit_width_segments);
             int bit_width_value = getValue(tmp_bit_width_segments);
-//            System.out.println(bit_width_time);
-//            System.out.println(bit_width_value);
             pos_encode = bitPacking(delta_segments, 0, segment_i * segment_size + 1, segment_size, bit_width_time, pos_encode, encoded_result);
             pos_encode = bitPacking(delta_segments, 1, segment_i * segment_size + 1, segment_size, bit_width_value, pos_encode, encoded_result);
         }
@@ -2530,10 +2108,8 @@
         int index_alpha_list = 0;
 
 
-//        trainParameter(ts_block,block_size,theta);
-//        System.out.println(Arrays.toString(theta));
         getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-//        System.out.println(Arrays.toString(raw_length));
+
         int[] alpha_list = getIStar(ts_block, min_index, block_size, 0, theta);
         int[] beta_list = new int[alpha_list.length];
         int[][] new_length_list = new int[alpha_list.length][5];
@@ -2588,8 +2164,6 @@
                 } else {
                     break;
                 }
-//                  moveAlphaToBeta(ts_block, new_alpha_list[min_length_index], beta_list[min_length_index]);
-//                  System.arraycopy(new_length_list[min_length_index], 0, raw_length, 0, 5);
             } else {
                 break;
             }
@@ -2623,38 +2197,11 @@
 
         }
 
-//        System.out.println(adjust_count);
-//        printTSBlock(ts_block);
+
         ts_block_delta = getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-//        printTSBlock(ts_block_delta);
 
         return ts_block_delta;
-//        int segment_n = (block_size - 1) / segment_size;
-//        int[][] bit_width_segments = new int[segment_n][2];
-//        for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-//            int bit_width_time = Integer.MIN_VALUE;
-//            int bit_width_value = Integer.MIN_VALUE;
-//
-//            for (int data_i = segment_i * segment_size + 1; data_i < (segment_i + 1) * segment_size + 1; data_i++) {
-//                int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-//                int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-//                if (cur_bit_width_time > bit_width_time) {
-//                    bit_width_time = cur_bit_width_time;
-//                }
-//                if (cur_bit_width_value > bit_width_value) {
-//                    bit_width_value = cur_bit_width_value;
-//                }
-//            }
-//
-//            bit_width_segments[segment_i][0] = bit_width_time;
-//            bit_width_segments[segment_i][1] = bit_width_value;
-//        }
-//
-//
-//        encode_pos = encodeSegment2Bytes(ts_block_delta, bit_width_segments, raw_length, segment_size, theta, encode_pos, cur_byte);
 
-//        System.out.println("encode_pos="+encode_pos);
-//        return encode_pos;
     }
 
 
@@ -2670,94 +2217,29 @@
             ts_block = new long[block_size];
             ts_block_value = new long[block_size];
             ts_block_partition = new long[block_size];
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
 
-//            System.out.println((data[i * block_size+1]));
-//            System.out.println(getTime(data[i * block_size+1]));
             for (int j = 0; j < block_size; j++) {
                 long tmp_j = data[j + i * block_size] - min_time;
-//                System.out.println(getTime(data[j + i * block_size]));
-//                System.out.println(getTime(data[i * block_size]));
                 ts_block[j] = tmp_j;
                 ts_block_value[j] = combine2Int(getValue(tmp_j), getTime(tmp_j));
 
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
             }
-//            for (int j = 0; j < block_size; j++) {
-//                ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-//                ts_block[j][1] = data[j + i * block_size][1];
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                int tmp_value = ts_block[j][1]-min_value;
-//                if(data_map.containsKey(tmp_value)){
-//                    int tmp = data_map.get(tmp_value);
-//                    tmp++;
-//                    data_map.put(tmp_value,tmp);
-//                }else{
-//                    data_map.put(tmp_value,1);
-//                }
-//                ts_block_value[j][0] =ts_block[j][0];
-//                ts_block_value[j][1] =ts_block[j][1];
-//            }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-//
-//            third_value= findMinIndex(kernelDensity);
-//            for(int j=0;j<third_value.length;j++){
-//                third_value[j] += min_value;
-//            }
-//            System.out.println("Minimum point: x=" + (Arrays.toString(third_value)));
+
         } else {
             ts_block = new long[supply_length];
             ts_block_value = new long[supply_length];
             ts_block_partition = new long[supply_length];
             int end = data.length - i * block_size;
-//            Map<Integer, Integer> data_map = new HashMap<>();
-//            int min_value = Integer.MAX_VALUE;
-
             for (int j = 0; j < end; j++) {
                 long tmp_j = data[j + i * block_size] - min_time;
                 ts_block[j] = tmp_j;
                 ts_block_value[j] = combine2Int(getValue(tmp_j), getTime(tmp_j));
 
-//                if(ts_block[j][1]<min_value){
-//                    min_value = ts_block[j][1];
-//                }
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] = data[j + i * block_size] - (min_time);
             }
             for (int j = end; j < supply_length; j++) {
                 ts_block[j] = 0;
                 ts_block_value[j] = 0;
-//                if(data_map.containsKey(ts_block[j][1])){
-//                    int tmp = data_map.get(ts_block[j][1]);
-//                    tmp++;
-//                    data_map.put(ts_block[j][1],tmp);
-//                }else{
-//                    data_map.put(ts_block[j][1],1);
-//                }
-//                ts_block_value[j] =0;
             }
-//            double[] kernelDensity = calculateKernelDensity(data_map);
-
-//            third_value= findMinIndex(kernelDensity);
             block_size = supply_length;
         }
 
@@ -3130,7 +2612,6 @@
             block_sort[8*length_block_sort-8+block_sort_end-j-1] = sort & 1;
             sort >>= 1;
         }
-//        System.out.println(Arrays.toString(block_sort));
 
         if (remain_length % segment_size == 0) {
             zero_number = 1;
@@ -3143,7 +2624,6 @@
 
         int[] value_pos_arr = new int[1];
 
-//        for (int k = 0; k < 2; k++) {
         for (int k = 0; k < block_num; k++) {
             int cur_block_sort = block_sort[k];
             if(cur_block_sort==0)
@@ -3177,7 +2657,7 @@
 
     @Test
     public void REGER() throws IOException {
-//        String parent_dir = "C:/Users/xiaoj/Desktop/test";
+
         String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
         String output_parent_dir = "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_float";
         int pack_size = 16;
@@ -3189,7 +2669,7 @@
         ArrayList<String> dataset_name = new ArrayList<>();
         ArrayList<Integer> dataset_block_size = new ArrayList<>();
         ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
+
         dataset_name.add("CS-Sensors");
         dataset_name.add("Metro-Traffic");
         dataset_name.add("USGS-Earthquakes");
@@ -3237,40 +2717,26 @@
 
         for (String value : dataset_name) {
             input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
             dataset_block_size.add(block_size);
         }
 
         output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-//        dataset_block_size.add(128);
-
         output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv");// 1
-//        dataset_block_size.add(4096);
         output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv");// 2
-//        dataset_block_size.add(8192);
         output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
         output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); //4
         output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv");//5
-//        dataset_block_size.add(8192);
         output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); //6
-//        dataset_block_size.add(2048);
         output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv");//7
-//        dataset_block_size.add(2048);
         output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv");//8
-//        dataset_block_size.add(128);
         output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv");//9
-//        dataset_block_size.add(64);
         output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv");//10
-//        dataset_block_size.add(64);
         output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv");//11
-//        dataset_block_size.add(256);
         output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
         output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
 
-//        int[] file_lists = {4};
-//        for (int file_i : file_lists) {
+
         for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-//        for (int file_i = 12; file_i < 14; file_i++) {
             String inputPath = input_path_list.get(file_i);
             String Output = output_path_list.get(file_i);
 
@@ -3333,7 +2799,6 @@
                 double compressed_size = 0;
                 int repeatTime2 = 100;
                 long s = System.nanoTime();
-                int[] best_order = new int[3];
                 int length = 0;
                 for (int repeat = 0; repeat < repeatTime2; repeat++)
                     length = ReorderingRegressionEncoder(data2_arr, dataset_block_size.get(file_i), dataset_third.get(file_i), pack_size, encoded_result);
@@ -3568,7 +3033,6 @@
         ArrayList<String> dataset_name = new ArrayList<>();
         ArrayList<Integer> dataset_block_size = new ArrayList<>();
         ArrayList<int[]> dataset_third = new ArrayList<>();
-        ArrayList<Integer> dataset_k = new ArrayList<>();
         dataset_name.add("CS-Sensors");
         dataset_name.add("Metro-Traffic");
         dataset_name.add("USGS-Earthquakes");
@@ -3616,40 +3080,24 @@
 
         for (String value : dataset_name) {
             input_path_list.add(input_parent_dir + value);
-            dataset_k.add(1);
             dataset_block_size.add(block_size);
         }
 
         output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-        //        dataset_block_size.add(1024);
-
         output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-        //        dataset_block_size.add(512);
         output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-        //        dataset_block_size.add(512);
         output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-        //        dataset_block_size.add(256);
         output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-        //        dataset_block_size.add(128);
         output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-        //        dataset_block_size.add(64);
         output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-        //        dataset_block_size.add(128);
         output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-        //        dataset_block_size.add(512);
         output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-        //        dataset_block_size.add(256);
         output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-        //        dataset_block_size.add(512);
         output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-        //        dataset_block_size.add(512);
         output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-        //        dataset_block_size.add(512);
         output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
         output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
 
-//        int[] file_lists = {5,6,8,10};
-//        for (int file_i : file_lists) {
         for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
 //        for (int file_i = 12; file_i < 14; file_i++) {
             String inputPath = input_path_list.get(file_i);
@@ -3752,139 +3200,4 @@
     }
 
 
-    public static void REGERCorrect() throws IOException {
-
-        String parent_dir = "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-
-        String input_parent_dir = parent_dir + "trans_data/";
-        ArrayList<String> input_path_list = new ArrayList<>();
-        ArrayList<String> dataset_name = new ArrayList<>();
-        ArrayList<Integer> dataset_block_size = new ArrayList<>();
-        ArrayList<int[]> dataset_third = new ArrayList<>();
-        dataset_name.add("CS-Sensors");
-        dataset_name.add("Metro-Traffic");
-        dataset_name.add("USGS-Earthquakes");
-        dataset_name.add("YZ-Electricity");
-        dataset_name.add("GW-Magnetic");
-        dataset_name.add("TY-Fuel");
-        dataset_name.add("Cyber-Vehicle");
-        dataset_name.add("Vehicle-Charge");
-        dataset_name.add("Nifty-Stocks");
-        dataset_name.add("TH-Climate");
-        dataset_name.add("TY-Transport");
-        dataset_name.add("EPM-Education");
-        dataset_name.add("FANYP-Sensors");
-        dataset_name.add("TRAJET-Transport");
-
-        int[] dataset_0 = {547, 2816};
-        int[] dataset_1 = {1719, 3731};
-        int[] dataset_2 = {-48, -11, 6, 25, 52};
-        int[] dataset_3 = {8681, 13584};
-        int[] dataset_4 = {79, 184, 274};
-        int[] dataset_5 = {17, 68};
-        int[] dataset_6 = {677};
-        int[] dataset_7 = {1047, 1725};
-        int[] dataset_8 = {227, 499, 614, 1013};
-        int[] dataset_9 = {474, 678};
-        int[] dataset_10 = {4, 30, 38, 49, 58};
-        int[] dataset_11 = {5182, 8206};
-        int[] dataset_12 = {0};
-        int[] dataset_13 = {0};
-
-        dataset_third.add(dataset_0);
-        dataset_third.add(dataset_1);
-        dataset_third.add(dataset_2);
-        dataset_third.add(dataset_3);
-        dataset_third.add(dataset_4);
-        dataset_third.add(dataset_5);
-        dataset_third.add(dataset_6);
-        dataset_third.add(dataset_7);
-        dataset_third.add(dataset_8);
-        dataset_third.add(dataset_9);
-        dataset_third.add(dataset_10);
-        dataset_third.add(dataset_11);
-        dataset_third.add(dataset_12);
-        dataset_third.add(dataset_13);
-
-        for (String value : dataset_name) {
-            input_path_list.add(input_parent_dir + value);
-            dataset_block_size.add(128);
-        }
-
-
-//        for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-        for (int file_i = 3; file_i < 4; file_i++) {
-            String inputPath = input_path_list.get(file_i);
-
-            File file = new File(inputPath);
-            File[] tempList = file.listFiles();
-
-
-            assert tempList != null;
-
-            for (File f : tempList) {
-//                f = tempList[2];
-
-                System.out.println(f);
-                InputStream inputStream = Files.newInputStream(f.toPath());
-                CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-//                ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-                ArrayList<Long> data = new ArrayList<>();
-
-                // add a column to "data"
-                loader.readHeaders();
-                loader.readRecord();
-                int time0 = Integer.parseInt(loader.getValues()[0]);
-                int value0 = Integer.parseInt(loader.getValues()[1]);
-                data.add(combine2Int(0, value0));
-                while (loader.readRecord()) {
-                    int time_tmp = Integer.parseInt(loader.getValues()[0]) - time0;
-                    int value_tmp = Integer.parseInt(loader.getValues()[1]);
-
-                    data.add(combine2Int(time_tmp, value_tmp));
-                }
-
-                inputStream.close();
-                ArrayList<Integer> result2 = new ArrayList<>();
-                splitTimeStamp3(data, result2);
-
-                int num_of_points = data.size();
-                int[][] correctness_test_data = new int[num_of_points][2];
-
-                long[] data2_arr = new long[num_of_points];
-
-                for (int i = 0; i < num_of_points; i++) {
-                    data2_arr[i] = data.get(i);
-                    correctness_test_data[i][0] = getTime(data2_arr[i]);
-                    correctness_test_data[i][1] = getValue(data2_arr[i]);
-//                    System.out.println(getValue(data2_arr[i]));
-                }
-
-                byte[] encoded_result = new byte[data2_arr.length * 8];
-                double ratio = 0;
-                double compressed_size = 0;
-                int repeatTime2 = 1;
-                int length = 0;
-//                System.out.println(Arrays.deepToString(correctness_test_data));
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    length = ReorderingRegressionEncoder(data2_arr, dataset_block_size.get(file_i), dataset_third.get(file_i), 8, encoded_result);
-                compressed_size += length;
-                double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-                ratio += ratioTmp;
-                int[][] decode_result = new int[num_of_points][2];
-                for (int repeat = 0; repeat < repeatTime2; repeat++)
-                    decode_result = REGERDecoder(encoded_result);
-                Arrays.sort(decode_result, (a, b) -> {
-                    if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-                    return Integer.compare(a[0], b[0]);
-                });
-//                System.out.println(Arrays.deepToString(decode_result));
-                System.out.println(ratio);
-
-//                break;
-            }
-
-        }
-    }
-
 }
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERPFloat1115Test.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERPFloat1115Test.java
deleted file mode 100644
index 5aa2a68..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERPFloat1115Test.java
+++ /dev/null
@@ -1,3497 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
-import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.Stack;
-
-import static java.lang.Math.abs;
-
-public class REGERPFloat1115Test {
-
-  public static int min3(int a, int b, int c) {
-    if (a < b && a < c) {
-      return 0;
-    } else if (b < c) {
-      return 1;
-    } else {
-      return 2;
-    }
-  }
-
-  public static int getBitWith(int num) {
-    if (num == 0) return 1;
-    else return 32 - Integer.numberOfLeadingZeros(num);
-  }
-
-  public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 24);
-    cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-    cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 3] = (byte) (integer);
-  }
-
-  public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer);
-  }
-
-  public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 1] = (byte) (integer);
-  }
-
-  public static boolean containsValue(int[] array, int targetValue) {
-    for (int value : array) {
-      if (value == targetValue) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static int[] removeElement(int[] array, int position) {
-    if (position < 0 || position >= array.length) {
-      return array;
-    }
-
-    int[] newArray = new int[array.length - 1];
-    int newIndex = 0;
-
-    for (int i = 0; i < array.length; i++) {
-      if (i != position) {
-        newArray[newIndex] = array[i];
-        newIndex++;
-      }
-    }
-
-    return newArray;
-  }
-
-  public static int bytes2Integer(byte[] encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded[i + start] & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  private static int byte2Integer(byte[] encoded, int decode_pos) {
-    int value = 0;
-    int b = encoded[decode_pos] & 0xFF;
-    value |= b;
-    if (value == 0) return 256;
-    return value % 256;
-  }
-
-  public static void pack8Values(
-      ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values.get(valueIdx) << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values.get(valueIdx) << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values.get(valueIdx) >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static void pack8Values(
-      int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values[valueIdx][index] << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values[valueIdx][index] << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values[valueIdx][index] >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static int unpack8Values(
-      byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-    int byteIdx = offset;
-    //        int pos_encode = 0;
-    long buffer = 0;
-    // total bits which have read from 'buf' to 'buffer'. i.e.,
-    // number of available bits to be decoded.
-    int totalBits = 0;
-    int valueIdx = 0;
-
-    while (valueIdx < 8) {
-      // If current available bits are not enough to decode one Integer,
-      // then add next byte from buf to 'buffer' until totalBits >= width
-      while (totalBits < width) {
-        buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-        byteIdx++;
-        totalBits += 8;
-      }
-
-      // If current available bits are enough to decode one Integer,
-      // then decode one Integer one by one until left bits in 'buffer' is
-      // not enough to decode one Integer.
-      while (totalBits >= width && valueIdx < 8) {
-        result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-        value_pos++;
-        valueIdx++;
-        totalBits -= width;
-        buffer = buffer & ((1L << totalBits) - 1);
-      }
-    }
-    return value_pos;
-  }
-
-  public static int bitPacking(
-      int[][] numbers,
-      int index,
-      int start,
-      int block_size,
-      int bit_width,
-      int encode_pos,
-      byte[] encoded_result) {
-    int block_num = block_size / 8;
-    for (int i = 0; i < block_num; i++) {
-      pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-      encode_pos += bit_width;
-    }
-
-    return encode_pos;
-  }
-
-  public static int decodeBitPacking(
-      byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-    //        int[] result_list = new int[];
-    int block_num = block_size / 8;
-    int value_pos = 0;
-
-    for (int i = 0; i < block_num; i++) { // bitpacking
-      value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-      decode_pos += bit_width;
-    }
-    //        decode_pos_result.add(decode_pos);
-    return decode_pos;
-  }
-
-  public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-    int fbit = Float.floatToIntBits(f);
-    byte[] b = new byte[4];
-    for (int i = 0; i < 4; i++) {
-      b[i] = (byte) (fbit >> (24 - i * 8));
-    }
-    int len = b.length;
-
-    System.arraycopy(b, 0, encode_result, pos_encode, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = encode_result[i + pos_encode];
-      encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-      encode_result[len - i - 1 + pos_encode] = temp;
-    }
-  }
-
-  public static float bytes2float(ArrayList<Byte> b, int index) {
-    int l;
-    l = b.get(index);
-    l &= 0xff;
-    l |= ((long) b.get(index + 1) << 8);
-    l &= 0xffff;
-    l |= ((long) b.get(index + 2) << 16);
-    l &= 0xffffff;
-    l |= ((long) b.get(index + 3) << 24);
-    return Float.intBitsToFloat(l);
-  }
-
-  public static float bytes2float(byte[] b, int index) {
-    int l;
-    l = b[index];
-    l &= 0xff;
-    l |= ((long) b[index + 1] << 8);
-    l &= 0xffff;
-    l |= ((long) b[index + 2] << 16);
-    l &= 0xffffff;
-    l |= ((long) b[index + 3] << 24);
-    return Float.intBitsToFloat(l);
-  }
-
-  public static byte[] int2Bytes(int integer) {
-    byte[] bytes = new byte[4];
-    bytes[0] = (byte) (integer >> 24);
-    bytes[1] = (byte) (integer >> 16);
-    bytes[2] = (byte) (integer >> 8);
-    bytes[3] = (byte) integer;
-    return bytes;
-  }
-
-  public static byte[] bitWidth2Bytes(int integer) {
-    byte[] bytes = new byte[1];
-    bytes[0] = (byte) integer;
-    return bytes;
-  }
-
-  public static byte[] float2bytes(float f) {
-    int fbit = Float.floatToIntBits(f);
-    byte[] b = new byte[4];
-    for (int i = 0; i < 4; i++) {
-      b[i] = (byte) (fbit >> (24 - i * 8));
-    }
-    int len = b.length;
-    byte[] dest = new byte[len];
-    System.arraycopy(b, 0, dest, 0, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = dest[i];
-      dest[i] = dest[len - i - 1];
-      dest[len - i - 1] = temp;
-    }
-    return dest;
-  }
-
-  public static byte[] bitPacking(
-      ArrayList<ArrayList<Integer>> numbers, int index, int start, int block_num, int bit_width) {
-    block_num = block_num / 8;
-    byte[] result = new byte[bit_width * block_num];
-
-    for (int i = 0; i < block_num; i++) {
-      for (int j = 0; j < bit_width; j++) {
-        int tmp_int = 0;
-        for (int k = 0; k < 8; k++) {
-          tmp_int += (((numbers.get(start + i * 8 + k).get(index) >> j) % 2) << k);
-        }
-        result[i * bit_width + j] = (byte) tmp_int;
-      }
-    }
-    return result;
-  }
-
-  public static ArrayList<Integer> decodebitPacking(
-      ArrayList<Byte> encoded, int decode_pos, int bit_width, int min_delta, int block_size) {
-    ArrayList<Integer> result_list = new ArrayList<>();
-    for (int i = 0; i < (block_size - 1) / 8; i++) {
-      int[] val8 = new int[8];
-      for (int j = 0; j < 8; j++) {
-        val8[j] = 0;
-      }
-      for (int j = 0; j < bit_width; j++) {
-        byte tmp_byte = encoded.get(decode_pos + bit_width - 1 - j);
-        byte[] bit8 = new byte[8];
-        for (int k = 0; k < 8; k++) {
-          bit8[k] = (byte) (tmp_byte & 1);
-          tmp_byte = (byte) (tmp_byte >> 1);
-        }
-        for (int k = 0; k < 8; k++) {
-          val8[k] = val8[k] * 2 + bit8[k];
-        }
-      }
-      for (int j = 0; j < 8; j++) {
-        result_list.add(val8[j] + min_delta);
-      }
-      decode_pos += bit_width;
-    }
-    return result_list;
-  }
-
-  public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    ArrayList<Integer> tmp = arr.get(low);
-    while (low < high) {
-      while (low < high
-          && (arr.get(high).get(index) > tmp.get(index)
-              || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                  && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-        high--;
-      }
-      arr.set(low, arr.get(high));
-      while (low < high
-          && (arr.get(low).get(index) < tmp.get(index)
-              || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                  && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-        low++;
-      }
-
-      arr.set(high, arr.get(low));
-    }
-    arr.set(low, tmp);
-    return low;
-  }
-
-  public static void quickSort(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    Stack<Integer> stack = new Stack<>();
-    int mid = part(arr, index, low, high);
-    if (mid + 1 < high) {
-      stack.push(mid + 1);
-      stack.push(high);
-    }
-
-    if (mid - 1 > low) {
-      stack.push(low);
-      stack.push(mid - 1);
-    }
-    while (stack.empty() == false) {
-      high = stack.pop();
-      low = stack.pop();
-      mid = part(arr, index, low, high);
-      if (mid + 1 < high) {
-        stack.push(mid + 1);
-        stack.push(high);
-      }
-      if (mid - 1 > low) {
-        stack.push(low);
-        stack.push(mid - 1);
-      }
-    }
-  }
-
-  public static int getCommon(int m, int n) {
-    int z;
-    while (m % n != 0) {
-      z = m % n;
-      m = n;
-      n = z;
-    }
-    return n;
-  }
-
-  public static void splitTimeStamp3(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-
-    int td_common = 0;
-    for (int i = 1; i < ts_block.size(); i++) {
-      int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-      if (td_common == 0) {
-        if (time_diffi != 0) {
-          td_common = time_diffi;
-          continue;
-        } else {
-          continue;
-        }
-      }
-      if (time_diffi != 0) {
-        td_common = getCommon(time_diffi, td_common);
-        if (td_common == 1) {
-          break;
-        }
-      }
-    }
-    if (td_common == 0) {
-      td_common = 1;
-    }
-
-    int t0 = ts_block.get(0).get(0);
-    for (int i = 0; i < ts_block.size(); i++) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-
-      tmp.add(interval_i);
-      tmp.add(ts_block.get(i).get(1));
-      ts_block.set(i, tmp);
-    }
-    ArrayList<Integer> tmp = new ArrayList<>();
-
-    tmp.add(0);
-    tmp.add(ts_block.get(0).get(1));
-    ts_block.set(0, tmp);
-
-    result.add(td_common);
-    result.add(t0);
-  }
-
-  public static void terminate(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Float> coefficient, int p) {
-    int length = ts_block.size();
-    assert length > p;
-    int size = length - p;
-
-    double[] param;
-    try {
-      OLSMultipleLinearRegression ols1 = new OLSMultipleLinearRegression();
-      double[][] X1 = new double[size][p];
-      double[] Y1 = new double[size];
-      for (int i = 0; i < size; i++) {
-        X1[i] = new double[p];
-        for (int j = 0; j < p; j++) {
-          X1[i][j] = ts_block.get(i + j).get(0);
-        }
-        Y1[i] = ts_block.get(i + p).get(0);
-      }
-      ols1.newSampleData(Y1, X1);
-      param = ols1.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-      // System.out.println(Arrays.toString(param));
-    } catch (Exception e) {
-      param = new double[p + 1];
-      for (int i = 0; i <= p; i++) {
-        param[i] = 0;
-      }
-    }
-
-    double[] param2;
-    try {
-      OLSMultipleLinearRegression ols2 = new OLSMultipleLinearRegression();
-      double[][] X2 = new double[size][p];
-      double[] Y2 = new double[size];
-      for (int i = 0; i < size; i++) {
-        X2[i] = new double[p];
-        for (int j = 0; j < p; j++) {
-          X2[i][j] = ts_block.get(i + j).get(1);
-        }
-        Y2[i] = ts_block.get(i + p).get(1);
-      }
-      ols2.newSampleData(Y2, X2);
-      param2 = ols2.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-      // System.out.println(Arrays.toString(param2));
-    } catch (Exception exception) {
-      param2 = new double[p + 1];
-      for (int i = 0; i <= p; i++) {
-        param2[i] = 0;
-      }
-    }
-
-    for (int i = 0; i <= p; i++) {
-      coefficient.add((float) param[i]);
-      coefficient.add((float) param2[i]);
-    }
-  }
-
-  public static void terminate(int[][] ts_block, float[] coefficient, int p) {
-    int length = ts_block.length;
-    assert length > p;
-    int size = length - p;
-
-    double[] param;
-    try {
-      OLSMultipleLinearRegression ols1 = new OLSMultipleLinearRegression();
-      double[][] X1 = new double[size][p];
-      double[] Y1 = new double[size];
-      for (int i = 0; i < size; i++) {
-        X1[i] = new double[p];
-        for (int j = 0; j < p; j++) {
-          X1[i][j] = ts_block[i + j][0];
-        }
-        Y1[i] = ts_block[i + p][0];
-      }
-      ols1.newSampleData(Y1, X1);
-      param = ols1.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-      // System.out.println(Arrays.toString(param));
-    } catch (Exception e) {
-      param = new double[p + 1];
-      for (int i = 0; i <= p; i++) {
-        param[i] = 0;
-      }
-    }
-
-    double[] param2;
-    try {
-      OLSMultipleLinearRegression ols2 = new OLSMultipleLinearRegression();
-      double[][] X2 = new double[size][p];
-      double[] Y2 = new double[size];
-      for (int i = 0; i < size; i++) {
-        X2[i] = new double[p];
-        for (int j = 0; j < p; j++) {
-          X2[i][j] = ts_block[i + j][1];
-        }
-        Y2[i] = ts_block[i + p][1];
-      }
-      ols2.newSampleData(Y2, X2);
-      param2 = ols2.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-      // System.out.println(Arrays.toString(param2));
-    } catch (Exception exception) {
-      param2 = new double[p + 1];
-      for (int i = 0; i <= p; i++) {
-        param2[i] = 0;
-      }
-    }
-
-    for (int i = 0; i <= p; i++) {
-      coefficient[2 * i] = (float) param[i];
-      coefficient[2 * i + 1] = (float) param2[i];
-    }
-  }
-
-  // --------------------------------------  base function
-  // -----------------------------------------------------
-  public static ArrayList<ArrayList<Integer>> segmentBitPacking(
-      ArrayList<ArrayList<Integer>> ts_block_delta, int block_size, int segment_size) {
-    ArrayList<ArrayList<Integer>> bit_width_segments = new ArrayList<>();
-    int segment_n = (block_size - 1) / segment_size;
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta.get(data_i).get(0));
-        int cur_bit_width_value = getBitWith(ts_block_delta.get(data_i).get(1));
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      ArrayList<Integer> bit_width = new ArrayList<>();
-      bit_width.add(bit_width_time);
-      bit_width.add(bit_width_value);
-      bit_width_segments.add(bit_width);
-    }
-
-    return bit_width_segments;
-  }
-
-  public static int[][] segmentBitPacking(
-      int[][] ts_block_delta, int block_size, int segment_size) {
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    return bit_width_segments;
-  }
-
-  public static void moveAlphaToBeta(ArrayList<ArrayList<Integer>> ts_block, int alpha, int beta) {
-    ArrayList<Integer> tmp_tv = ts_block.get(alpha);
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ArrayList<Integer> tmp_tv_cur = new ArrayList<>();
-        tmp_tv_cur.add(ts_block.get(u).get(0));
-        tmp_tv_cur.add(ts_block.get(u).get(1));
-        ts_block.set(u + 1, tmp_tv_cur);
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ArrayList<Integer> tmp_tv_cur = new ArrayList<>();
-        tmp_tv_cur.add(ts_block.get(u).get(0));
-        tmp_tv_cur.add(ts_block.get(u).get(1));
-        ts_block.set(u - 1, tmp_tv_cur);
-      }
-      beta--;
-    }
-    ts_block.set(beta, tmp_tv);
-  }
-
-  public static void moveAlphaToBeta(int[][] ts_block, int alpha, int beta) {
-    int[] tmp_tv = ts_block[alpha];
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ts_block[u + 1][0] = ts_block[u][0];
-        ts_block[u + 1][1] = ts_block[u][1];
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ts_block[u - 1][0] = ts_block[u][0];
-        ts_block[u - 1][1] = ts_block[u][1];
-      }
-      beta--;
-    }
-    ts_block[beta][0] = tmp_tv[0];
-    ts_block[beta][1] = tmp_tv[1];
-  }
-
-  private static ArrayList<Integer> isMovable(
-      ArrayList<Integer> alpha_list, ArrayList<Integer> beta_list) {
-    ArrayList<Integer> isMoveable = new ArrayList<>();
-    for (int i = 0; i < alpha_list.size(); i++) {
-      if (alpha_list.get(i) != -1 && beta_list.get(i) != -1) {
-        isMoveable.add(i);
-      }
-    }
-    return isMoveable;
-  }
-
-  private static ArrayList<Integer> isMovable(int[] alpha_list, int[] beta_list) {
-    ArrayList<Integer> isMoveable = new ArrayList<>();
-    for (int i = 0; i < alpha_list.length; i++) {
-      if (alpha_list[i] != -1 && beta_list[i] != -1) {
-        isMoveable.add(i);
-      }
-    }
-    return isMoveable;
-  }
-
-  private static ArrayList<ArrayList<Integer>> getEncodeBitsRegressionP(
-      ArrayList<ArrayList<Integer>> ts_block,
-      int block_size,
-      ArrayList<Integer> raw_length,
-      ArrayList<Float> coefficient,
-      int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int max_timestamp = Integer.MIN_VALUE;
-    int max_timestamp_i = -1;
-    int max_value = Integer.MIN_VALUE;
-    int max_value_i = -1;
-    ArrayList<ArrayList<Integer>> ts_block_delta = new ArrayList<>();
-    coefficient.clear();
-
-    terminate(ts_block, coefficient, p);
-
-    ArrayList<Integer> tmp0 = new ArrayList<>();
-    tmp0.add(ts_block.get(0).get(0));
-    tmp0.add(ts_block.get(0).get(1));
-    ts_block_delta.add(tmp0);
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block.get(j).get(0) - coefficient.get(0));
-      float epsilon_v = (float) ((float) ts_block.get(j).get(1) - coefficient.get(1));
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (coefficient.get(2 * pi) * (float) ts_block.get(j - pi).get(0));
-        epsilon_v -= (float) (coefficient.get(2 * pi + 1) * (float) ts_block.get(j - pi).get(1));
-      }
-
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add((int) epsilon_r);
-      tmp.add((int) epsilon_v);
-      ts_block_delta.add(tmp);
-    }
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block.get(j).get(0) - coefficient.get(0);
-      float epsilon_v = (float) ts_block.get(j).get(1) - coefficient.get(1);
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= coefficient.get(2 * pi) * (float) ts_block.get(j - pi).get(0);
-        epsilon_v -= coefficient.get(2 * pi + 1) * (float) ts_block.get(j - pi).get(1);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (epsilon_r > max_timestamp) {
-        max_timestamp = (int) epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = (int) epsilon_v;
-      }
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add((int) epsilon_r);
-      tmp.add((int) epsilon_v);
-      ts_block_delta.add(tmp);
-    }
-    int length = 0;
-    for (int j = block_size - 1; j >= p; j--) {
-      float epsilon_r = ts_block_delta.get(j).get(0) - timestamp_delta_min;
-      float epsilon_v = ts_block_delta.get(j).get(1) - value_delta_min;
-      length += getBitWith((int) epsilon_r);
-      length += getBitWith((int) epsilon_v);
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add((int) epsilon_r);
-      tmp.add((int) epsilon_v);
-      ts_block_delta.set(j, tmp);
-    }
-    int max_bit_width_interval = getBitWith(max_timestamp - timestamp_delta_min);
-    int max_bit_width_value = getBitWith(max_value - value_delta_min);
-    //        int length = (max_bit_width_interval + max_bit_width_value) * (block_size - 1);
-    raw_length.clear();
-
-    raw_length.add(length);
-    raw_length.add(max_bit_width_interval);
-    raw_length.add(max_bit_width_value);
-
-    raw_length.add(timestamp_delta_min);
-    raw_length.add(value_delta_min);
-
-    return ts_block_delta;
-  }
-
-  private static ArrayList<ArrayList<Integer>> getEncodeBitsRegressionPNoTrain(
-      ArrayList<ArrayList<Integer>> ts_block,
-      int block_size,
-      ArrayList<Integer> raw_length,
-      ArrayList<Float> coefficient,
-      int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int max_timestamp = Integer.MIN_VALUE;
-    int max_timestamp_i = -1;
-    int max_value = Integer.MIN_VALUE;
-    int max_value_i = -1;
-    ArrayList<ArrayList<Integer>> ts_block_delta = new ArrayList<>();
-
-    ArrayList<Integer> tmp0 = new ArrayList<>();
-    tmp0.add(ts_block.get(0).get(0));
-    tmp0.add(ts_block.get(0).get(1));
-    ts_block_delta.add(tmp0);
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block.get(j).get(0) - coefficient.get(0));
-      float epsilon_v = (float) ((float) ts_block.get(j).get(1) - coefficient.get(1));
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (coefficient.get(2 * pi) * (float) ts_block.get(j - pi).get(0));
-        epsilon_v -= (float) (coefficient.get(2 * pi + 1) * (float) ts_block.get(j - pi).get(1));
-      }
-
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add((int) epsilon_r);
-      tmp.add((int) epsilon_v);
-      ts_block_delta.add(tmp);
-    }
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block.get(j).get(0) - coefficient.get(0);
-      float epsilon_v = (float) ts_block.get(j).get(1) - coefficient.get(1);
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= coefficient.get(2 * pi) * (float) ts_block.get(j - pi).get(0);
-        epsilon_v -= coefficient.get(2 * pi + 1) * (float) ts_block.get(j - pi).get(1);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (epsilon_r > max_timestamp) {
-        max_timestamp = (int) epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = (int) epsilon_v;
-      }
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add((int) epsilon_r);
-      tmp.add((int) epsilon_v);
-      ts_block_delta.add(tmp);
-    }
-    int length = 0;
-    for (int j = block_size - 1; j >= p; j--) {
-      float epsilon_r = ts_block_delta.get(j).get(0) - timestamp_delta_min;
-      float epsilon_v = ts_block_delta.get(j).get(1) - value_delta_min;
-      length += getBitWith((int) epsilon_r);
-      length += getBitWith((int) epsilon_v);
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add((int) epsilon_r);
-      tmp.add((int) epsilon_v);
-      ts_block_delta.set(j, tmp);
-    }
-    int max_bit_width_interval = getBitWith(max_timestamp - timestamp_delta_min);
-    int max_bit_width_value = getBitWith(max_value - value_delta_min);
-
-    raw_length.clear();
-
-    raw_length.add(length);
-    raw_length.add(max_bit_width_interval);
-    raw_length.add(max_bit_width_value);
-
-    raw_length.add(timestamp_delta_min);
-    raw_length.add(value_delta_min);
-
-    return ts_block_delta;
-  }
-
-  private static int getIstarClose(
-      int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-    int min_i = 0;
-    int min_dis = Integer.MAX_VALUE;
-    for (int i = 0; i < j_star_list.size(); i++) {
-      if (abs(alpha - j_star_list.get(i)) < min_dis) {
-        min_i = j_star_list.get(i);
-        min_dis = abs(alpha - j_star_list.get(i));
-        raw_length[0] = new_length_list[i][0];
-        raw_length[3] = new_length_list[i][1];
-        raw_length[4] = new_length_list[i][2];
-      }
-    }
-    if (min_dis == 0) {
-      System.out.println("get IstarClose error");
-      return 0;
-    }
-    return min_i;
-  }
-
-  public static int getBetaP(
-      int[][] ts_block, int alpha, int block_size, int[] raw_length, float[] theta, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int max_timestamp = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int raw_timestamp_delta_max_index = -1;
-    int raw_value_delta_max_index = -1;
-
-    int raw_abs_sum = raw_length[0];
-
-    ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-    ArrayList<Integer> max_index = new ArrayList<>();
-    int j_star = -1;
-
-    if (alpha == -1) {
-      return j_star;
-    }
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-      float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      //            System.out.println("p="+p);
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-      if (j != alpha && ((int) epsilon_r == max_timestamp || (int) epsilon_v == max_value)) {
-        max_index.add(j);
-      }
-    }
-    int[] b;
-    int[][] new_length_list = new int[block_size][3];
-    int pos_new_length_list = 0;
-
-    // alpha <= p
-    if (alpha < p) {
-
-      int j = 0;
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (j = alpha + 2; j < alpha + p; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < block_size; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-
-    } // alpha == n
-    else if (alpha < block_size && alpha >= block_size - p) {
-
-      int j = 0;
-      for (; j < alpha - p; j++) {
-
-        b = adjustCase1(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (j = alpha + 2; j < alpha + p && j < block_size; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < block_size; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // p < alpha <= n-p
-    else {
-
-      int j = 0;
-      for (; j < alpha - p; j++) {
-
-        b = adjustCase1(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (j = alpha + 2; j < alpha + p && j < block_size; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < block_size; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    }
-
-    if (j_star_list.size() != 0) {
-      j_star = getIstarClose(alpha, j_star_list, new_length_list, raw_length);
-    }
-    return j_star;
-  }
-
-  private static int[] adjustCase1(int[][] ts_block, int alpha, int j_star, float[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    int[] b = new int[3];
-    for (int u = alpha - 1; u >= j_star; u--) {
-      tmp_ts_block[u + 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u + 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-    //        for (int j = 1; j < p; j++) {
-    //            float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-    //            float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-    //            for (int pi = 1; pi <= j; pi++) {
-    //                epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-    //                epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-    //            }
-    //
-    //            if (epsilon_r < timestamp_delta_min) {
-    //                timestamp_delta_min = (int) epsilon_r;
-    //            }
-    //            if (epsilon_v < value_delta_min) {
-    //                value_delta_min = (int) epsilon_v;
-    //            }
-    //        }
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (float) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (float) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustCase2(int[][] ts_block, int alpha, int j_star, float[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha - 1; u >= j_star; u--) {
-      tmp_ts_block[u + 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u + 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (float) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (float) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase3(int[][] ts_block, int alpha, int j_star, float[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < j_star; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    j_star--;
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (float) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (float) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase4(int[][] ts_block, int alpha, int j_star, float[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < j_star; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    j_star--;
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (float) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (float) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase5(int[][] ts_block, int alpha, float[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < block_size; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[block_size - 1][0] = tmp_tv[0];
-    tmp_ts_block[block_size - 1][1] = tmp_tv[1];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (float) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (float) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int getIstarClose(int alpha, ArrayList<Integer> j_star_list) {
-    int min_i = 0;
-    int min_dis = Integer.MAX_VALUE;
-    for (int i : j_star_list) {
-      if (abs(alpha - i) < min_dis) {
-        min_i = i;
-        min_dis = abs(alpha - i);
-      }
-    }
-    if (min_dis == 0) {
-      System.out.println("get IstarClose error");
-      return 0;
-    }
-    return min_i;
-  }
-
-  public static int getIStarP(
-      ArrayList<ArrayList<Integer>> ts_block,
-      int block_size,
-      ArrayList<Integer> raw_length,
-      ArrayList<Float> coefficient,
-      int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int timestamp_delta_max_index = -1;
-    int value_delta_max_index = -1;
-
-    int i_star = 0;
-
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block.get(j).get(0) - coefficient.get(0));
-      float epsilon_v = (float) ((float) ts_block.get(j).get(1) - coefficient.get(1));
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (coefficient.get(2 * pi) * (float) ts_block.get(j - pi).get(0));
-        epsilon_v -= (float) (coefficient.get(2 * pi + 1) * (float) ts_block.get(j - pi).get(1));
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (epsilon_r > timestamp_delta_max) {
-        timestamp_delta_max = (int) epsilon_r;
-      }
-      if (epsilon_v > value_delta_max) {
-        value_delta_max = (int) epsilon_v;
-      }
-    }
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ((float) ts_block.get(j).get(0) - coefficient.get(0));
-      float epsilon_v = (float) ((float) ts_block.get(j).get(1) - coefficient.get(1));
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= (float) (coefficient.get(2 * pi) * (float) ts_block.get(j - pi).get(0));
-        epsilon_v -= (float) (coefficient.get(2 * pi + 1) * (float) ts_block.get(j - pi).get(1));
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (epsilon_r > timestamp_delta_max) {
-        timestamp_delta_max = (int) epsilon_r;
-      }
-      if (epsilon_v > value_delta_max) {
-        value_delta_max = (int) epsilon_v;
-      }
-    }
-    timestamp_delta_max -= timestamp_delta_min;
-    value_delta_max -= value_delta_min;
-    if (value_delta_max <= timestamp_delta_max) i_star = timestamp_delta_max_index;
-    else i_star = value_delta_max_index;
-    return i_star;
-  }
-
-  public static ArrayList<Byte> encode2Bytes(
-      ArrayList<ArrayList<Integer>> ts_block_delta,
-      ArrayList<Integer> raw_length,
-      ArrayList<Float> coefficient,
-      ArrayList<Integer> result2,
-      int p) {
-    ArrayList<Byte> encoded_result = new ArrayList<>();
-
-    // encode interval0 and value0
-    for (int i = 0; i < p; i++) {
-      byte[] interval0_byte = int2Bytes(ts_block_delta.get(i).get(0));
-      for (byte b : interval0_byte) encoded_result.add(b);
-      byte[] value0_byte = int2Bytes(ts_block_delta.get(i).get(1));
-      for (byte b : value0_byte) encoded_result.add(b);
-    }
-    // encode theta
-    byte[] theta0_r_byte = float2bytes(coefficient.get(0) + (float) raw_length.get(3));
-    for (byte b : theta0_r_byte) encoded_result.add(b);
-    byte[] theta0_v_byte = float2bytes(coefficient.get(1) + (float) raw_length.get(4));
-    for (byte b : theta0_v_byte) encoded_result.add(b);
-
-    for (int i = 2; i < coefficient.size(); i++) {
-      byte[] theta_byte = float2bytes(coefficient.get(i));
-      for (byte b : theta_byte) encoded_result.add(b);
-    }
-
-    byte[] max_bit_width_interval_byte = bitWidth2Bytes(raw_length.get(1));
-    for (byte b : max_bit_width_interval_byte) encoded_result.add(b);
-    byte[] timestamp_bytes =
-        bitPacking(ts_block_delta, 0, p, ts_block_delta.size() - p, raw_length.get(1));
-    for (byte b : timestamp_bytes) encoded_result.add(b);
-
-    // encode value
-    byte[] max_bit_width_value_byte = bitWidth2Bytes(raw_length.get(2));
-    for (byte b : max_bit_width_value_byte) encoded_result.add(b);
-    byte[] value_bytes =
-        bitPacking(ts_block_delta, 1, p, ts_block_delta.size() - p, raw_length.get(2));
-    for (byte b : value_bytes) encoded_result.add(b);
-
-    byte[] td_common_byte = int2Bytes(result2.get(0));
-    for (byte b : td_common_byte) encoded_result.add(b);
-
-    return encoded_result;
-  }
-
-  public static ArrayList<Byte> encodeRLEBitWidth2Bytes(
-      ArrayList<ArrayList<Integer>> bit_width_segments) {
-    ArrayList<Byte> encoded_result = new ArrayList<>();
-
-    ArrayList<ArrayList<Integer>> run_length_time = new ArrayList<>();
-    ArrayList<ArrayList<Integer>> run_length_value = new ArrayList<>();
-
-    int count_of_time = 0;
-    int count_of_value = 0;
-    int pre_time = bit_width_segments.get(0).get(0);
-    int pre_value = bit_width_segments.get(0).get(1);
-    int size = bit_width_segments.size();
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments.get(i).get(0);
-      int cur_value = bit_width_segments.get(i).get(1);
-      if (cur_time != pre_time) { // 当前值与前一个值不同
-        ArrayList<Integer> tmp = new ArrayList<>();
-        tmp.add(count_of_time);
-        tmp.add(pre_time);
-        run_length_time.add(tmp);
-        pre_time = cur_time;
-        count_of_time = 0;
-      } else { // 当前值与前一个值相同
-        count_of_time++;
-        if (count_of_time == 256) { // 个数不能大于256
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(count_of_time);
-          tmp.add(pre_time);
-          run_length_time.add(tmp);
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value) { // 当前值与前一个值不同
-        ArrayList<Integer> tmp = new ArrayList<>();
-        tmp.add(count_of_value);
-        tmp.add(pre_value);
-        run_length_value.add(tmp);
-        pre_value = cur_value;
-        count_of_value = 0;
-      } else { // 当前值与前一个值相同
-        count_of_value++;
-        if (count_of_value == 256) { // 个数不能大于256
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(count_of_value);
-          tmp.add(pre_value);
-          run_length_value.add(tmp);
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add(count_of_time);
-      tmp.add(pre_time);
-      run_length_time.add(tmp);
-    }
-    if (count_of_value != 0) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      tmp.add(count_of_value);
-      tmp.add(pre_value);
-      run_length_value.add(tmp);
-    }
-
-    for (ArrayList<Integer> bit_width_time : run_length_time) {
-      byte[] timestamp_bytes = bitWidth2Bytes(bit_width_time.get(0));
-      for (byte b : timestamp_bytes) encoded_result.add(b);
-      byte[] value_bytes = bitWidth2Bytes(bit_width_time.get(1));
-      for (byte b : value_bytes) encoded_result.add(b);
-    }
-    for (ArrayList<Integer> bit_width_value : run_length_value) {
-      byte[] timestamp_bytes = bitWidth2Bytes(bit_width_value.get(0));
-      for (byte b : timestamp_bytes) encoded_result.add(b);
-      byte[] value_bytes = bitWidth2Bytes(bit_width_value.get(1));
-      for (byte b : value_bytes) encoded_result.add(b);
-    }
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(int[][] bit_width_segments) {
-    int encoded_result = 0;
-
-    //    ArrayList<ArrayList<Integer>> run_length_time = new ArrayList<>();
-    //    ArrayList<ArrayList<Integer>> run_length_value = new ArrayList<>();
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 1;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-
-    encoded_result += (pos_time * 2);
-    encoded_result += (pos_value * 2);
-
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(
-      int[][] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-    intWord2Bytes(pos_time, pos_encode, encoded_result);
-    pos_encode += 2;
-    intWord2Bytes(pos_value, pos_encode, encoded_result);
-    pos_encode += 2;
-    //        System.out.println("pos_time="+pos_time);
-    //        System.out.println("pos_value="+pos_value);
-
-    //        System.out.println(Arrays.deepToString(run_length_time));
-    //        System.out.println(Arrays.deepToString(run_length_value));
-    for (int i = 0; i < pos_time; i++) {
-      int[] bit_width_time = run_length_time[i];
-      intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_time[0]="+bit_width_time[0]);
-      //            System.out.println("bit_width_time[1]="+bit_width_time[1]);
-    }
-    for (int i = 0; i < pos_value; i++) {
-      int[] bit_width_value = run_length_value[i];
-      intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_value[0]="+bit_width_value[0]);
-      //            System.out.println("bit_width_value[1]="+bit_width_value[1]);
-    }
-
-    return pos_encode;
-  }
-
-  private static int encodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      int p,
-      float[] theta,
-      int pos_encode,
-      byte[] encoded_result) {
-
-    int block_size = delta_segments.length;
-    int segment_n = (block_size - p) / segment_size;
-    int2Bytes(delta_segments[0][0], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(delta_segments[0][1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[0] + raw_length[3], pos_encode, encoded_result);
-    pos_encode += 4;
-    //        float2bytes(theta[1], pos_encode, encoded_result);
-    //        pos_encode += 4;
-    float2bytes(theta[1] + raw_length[4], pos_encode, encoded_result);
-    pos_encode += 4;
-    //        float2bytes(theta[3], pos_encode, encoded_result);
-    //        pos_encode += 4;
-
-    for (int i = 2; i < theta.length; i++) {
-      float2bytes(theta[i], pos_encode, encoded_result);
-      pos_encode += 4;
-    }
-    //        System.out.println(delta_segments[0][0]);
-    //        System.out.println(delta_segments[0][1]);
-    //        System.out.println(theta[0] + raw_length[3]);
-    //        System.out.println(theta[1]);
-    //        System.out.println(theta[2] + raw_length[4]);
-    //        System.out.println(theta[3]);
-
-    pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              0,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_time,
-              pos_encode,
-              encoded_result);
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              1,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_value,
-              pos_encode,
-              encoded_result);
-    }
-
-    return pos_encode;
-  }
-
-  public static int[][] getEncodeBitsRegression(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta, int segment_size, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-    //        theta = new float[4];
-
-    terminate(ts_block, theta, p);
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-      float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (float) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (float) ts_block[j - pi][1];
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      //            if (epsilon_r > max_timestamp) {
-      //                max_timestamp = (int) epsilon_r;
-      //            }
-      //            if (epsilon_v > max_value) {
-      //                max_value = (int) epsilon_v;
-      //            }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j >= p; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  public static int[][] getEncodeBitsRegressionNoTrain(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta, int segment_size, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-    //        theta = new float[4];
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-      float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ts_block[j][0] - theta[0];
-      float epsilon_v = (float) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (float) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (float) ts_block[j - pi][1];
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j >= p; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  private static int numberOfEncodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      int p,
-      float[] theta) {
-    ArrayList<Byte> encoded_result = new ArrayList<>();
-    int block_size = delta_segments.length;
-    int segment_n = (block_size - p) / segment_size;
-    int result = 0;
-    result += 8; // encode interval0 and value0
-    result += ((2 * p + 1) * 4); // encode theta
-    result += encodeRLEBitWidth2Bytes(bit_width_segments);
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      result += (segment_size * bit_width_time / 8);
-      result += (segment_size * bit_width_value / 8);
-    }
-
-    return result;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block,
-      ArrayList<Integer> min_index,
-      int block_size,
-      int index,
-      float[] theta,
-      int p,
-      int k) {
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int alpha = 0;
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-      float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        //                timestamp_delta_min_index
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_v;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_r;
-      }
-    }
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-      float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_v;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_r;
-      }
-    }
-
-    min_index.add(timestamp_delta_min_index);
-    min_index.add(value_delta_min_index);
-    Arrays.sort(
-        ts_block_delta,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    //        Arrays.sort(ts_block_delta);
-    //    quickSort(ts_block_delta, 1, 0, block_size - 2);
-    int[] alpha_list = new int[k + 1];
-    //    ArrayList<Integer> alpha_list = new ArrayList<>();
-    alpha_list[0] = ts_block_delta[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta[block_size - 2 - k][0];
-    }
-    return alpha_list;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block, ArrayList<Integer> min_index, int block_size, float[] theta, int p, int k) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_max_index = -1;
-    int value_delta_max_index = -1;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int[] alpha_list = new int[2 * k + 2];
-
-    int[][] ts_block_delta_time = new int[block_size - 1][2];
-    int[][] ts_block_delta_value = new int[block_size - 1][2];
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-      float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        //                timestamp_delta_min_index
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = (int) epsilon_r;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = (int) epsilon_v;
-    }
-    for (int j = p; j < block_size; j++) {
-      float epsilon_r = (float) ((float) ts_block[j][0] - theta[0]);
-      float epsilon_v = (float) ((float) ts_block[j][1] - theta[1]);
-
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= (float) (theta[2 * pi] * (float) ts_block[j - pi][0]);
-        epsilon_v -= (float) (theta[2 * pi + 1] * (float) ts_block[j - pi][1]);
-      }
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = (int) epsilon_r;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = (int) epsilon_v;
-    }
-
-    Arrays.sort(
-        ts_block_delta_time,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    min_index.add(ts_block_delta_time[0][0]);
-    alpha_list[0] = ts_block_delta_time[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta_time[block_size - 2 - k][0];
-    }
-
-    Arrays.sort(
-        ts_block_delta_value,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int pos_alpha_list = k + 1;
-    //    quickSort(ts_block_delta_value, 1, 0, block_size - 2);
-    min_index.add(ts_block_delta_value[0][0]);
-    if (!containsValue(alpha_list, ts_block_delta_value[0][0])) {
-      alpha_list[pos_alpha_list] = ts_block_delta_value[0][0];
-      pos_alpha_list++;
-    }
-
-    for (int i = 0; i < k; i++) {
-      if (!containsValue(alpha_list, ts_block_delta_value[block_size - 2 - k][0])) {
-        alpha_list[pos_alpha_list] = ts_block_delta_value[block_size - 2 - k][0];
-        pos_alpha_list++;
-      }
-    }
-
-    return alpha_list;
-  }
-
-  private static int REGERBlockEncoderPartition(
-      int[][] data,
-      int i,
-      int block_size,
-      int segment_size,
-      int k,
-      int p,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block = new int[block_size][2];
-    int[][] ts_block_reorder = new int[block_size][2];
-    int[][] ts_block_partition = new int[block_size][2];
-    for (int j = 0; j < block_size; j++) {
-      data[j + i * block_size][0] -= min_time;
-      ts_block[j][0] = data[j + i * block_size][0];
-      ts_block[j][1] = data[j + i * block_size][1];
-      ts_block_reorder[j][0] = data[j + i * block_size][0];
-      ts_block_reorder[j][1] = data[j + i * block_size][1];
-    }
-
-    // raw-order
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[2 * p + 2];
-    int[][] ts_block_delta =
-        getEncodeBitsRegression(ts_block, block_size, raw_length, theta, segment_size, p);
-    int[][] bit_width_segments_partition =
-        segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(
-            ts_block_delta, bit_width_segments_partition, raw_length, segment_size, p, theta);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-          return Integer.compare(a[0], b[0]);
-        });
-    //    quickSort(ts_block, 0, 0, block_size - 1);
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[2 * p + 2];
-    int[][] ts_block_delta_time =
-        getEncodeBitsRegression(ts_block, block_size, time_length, theta_time, segment_size, p);
-    int[][] bit_width_segments_time =
-        segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(
-            ts_block_delta_time, bit_width_segments_time, time_length, segment_size, p, theta_time);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    // value-order
-    //    quickSort(ts_block, 1, 0, block_size - 1);
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[2 * p + 2];
-    int[][] ts_block_delta_reorder =
-        getEncodeBitsRegression(
-            ts_block, block_size, reorder_length, theta_reorder, segment_size, p);
-    int[][] bit_width_segments_value =
-        segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(
-            ts_block_delta_reorder,
-            bit_width_segments_value,
-            reorder_length,
-            segment_size,
-            p,
-            theta_reorder);
-
-    int[] alpha_list;
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-      ts_block_delta = ts_block_delta_time;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, p, k);
-    } else if (choose == 1) {
-      ts_block = ts_block_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, p, k);
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      ts_block_delta = ts_block_delta_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 1, theta, p, k);
-    }
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-
-    //    ArrayList<ArrayList<Integer>> new_length_list = new ArrayList<>();
-
-    for (int j = 0; j < alpha_list.length; j++) {
-      int alpha = alpha_list[j];
-      int[] new_length = raw_length.clone();
-      beta_list[j] = getBetaP(ts_block, alpha, block_size, new_length, theta, p);
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-    ArrayList<Integer> isMoveable = isMovable(alpha_list, beta_list);
-    int adjust_count = 0;
-    while (isMoveable.size() != 0) {
-      if (adjust_count < block_size / 2 && adjust_count <= 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      ArrayList<ArrayList<Integer>> all_length = new ArrayList<>();
-
-      for (int isMoveable_i : isMoveable) {
-        ArrayList<Integer> tmp = new ArrayList<>();
-        tmp.add(isMoveable_i);
-        tmp.add(new_length_list[isMoveable_i][0]);
-        all_length.add(tmp);
-      }
-      quickSort(all_length, 1, 0, all_length.size() - 1);
-      if (all_length.get(0).get(1) <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block,
-            alpha_list[all_length.get(0).get(0)],
-            beta_list[all_length.get(0).get(0)]);
-        int[] new_length = new int[5];
-        ts_block_delta =
-            getEncodeBitsRegression(new_ts_block, block_size, new_length, theta, segment_size, p);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(
-                ts_block_delta, bit_width_segments, new_length, segment_size, p, theta);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, p, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      for (int alpha_i = 0; alpha_i < alpha_list.length; alpha_i++) {
-        int alpha = alpha_list[alpha_i];
-        int[] new_length = raw_length.clone();
-        beta_list[alpha_i] = (getBetaP(ts_block, alpha, block_size, raw_length, theta, p));
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-      isMoveable = isMovable(alpha_list, beta_list);
-    }
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size, p);
-
-    //    ArrayList<ArrayList<Integer>> bit_width_segments = new ArrayList<>();
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            p,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    return encode_pos;
-  }
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int order,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int p,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = data[j + i * block_size][0];
-        ts_block[j][1] = data[j + i * block_size][1];
-        //      ts_block_reorder[j][0] = data[j + i * block_size][0];
-        //      ts_block_reorder[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = data[j + i * block_size][0];
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    //        System.out.println(Arrays.deepToString(data));
-    //        System.out.println(Arrays.deepToString(ts_block));
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[2 * p + 2];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[2 * p + 2];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[2 * p + 2];
-    int[][] ts_block_delta_reorder = new int[block_size][2];
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time = new int[block_size][2];
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta = new int[block_size][2];
-    int[][] bit_width_segments_partition;
-
-    if (order == 1) {
-
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(
-              ts_block, block_size, reorder_length, theta_reorder, segment_size, p);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder,
-              bit_width_segments_value,
-              reorder_length,
-              segment_size,
-              p,
-              theta_reorder);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-
-      ts_block_delta_time =
-          getEncodeBitsRegression(ts_block, block_size, time_length, theta_time, segment_size, p);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_time,
-              bit_width_segments_time,
-              time_length,
-              segment_size,
-              p,
-              theta_time);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta =
-          getEncodeBitsRegression(
-              ts_block_partition, block_size, raw_length, theta, segment_size, p);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta, bit_width_segments_partition, raw_length, segment_size, p, theta);
-
-    } else if (order == 0) {
-
-      ts_block_delta_time =
-          getEncodeBitsRegression(ts_block, block_size, time_length, theta_time, segment_size, p);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_time,
-              bit_width_segments_time,
-              time_length,
-              segment_size,
-              p,
-              theta_time);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta =
-          getEncodeBitsRegression(
-              ts_block_partition, block_size, raw_length, theta, segment_size, p);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta, bit_width_segments_partition, raw_length, segment_size, p, theta);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(
-              ts_block, block_size, reorder_length, theta_reorder, segment_size, p);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder,
-              bit_width_segments_value,
-              reorder_length,
-              segment_size,
-              p,
-              theta_reorder);
-    }
-    //        System.out.println(Arrays.deepToString(ts_block_delta));
-
-    int[] alpha_list;
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-      ts_block_delta = ts_block_delta_time;
-      index_alpha_list = 0;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-      index_alpha_list = 0;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      ts_block_delta = ts_block_delta_reorder;
-      index_alpha_list = 1;
-    }
-
-    alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta, p, k);
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-
-    //    ArrayList<ArrayList<Integer>> new_length_list = new ArrayList<>();
-
-    for (int j = 0; j < alpha_list.length; j++) {
-      int alpha = alpha_list[j];
-      int[] new_length = raw_length.clone();
-      beta_list[j] = getBetaP(ts_block, alpha, block_size, new_length, theta, p);
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-    ArrayList<Integer> isMoveable = isMovable(alpha_list, beta_list);
-    int adjust_count = 0;
-    while (isMoveable.size() != 0) {
-      if (adjust_count < block_size / 2 && adjust_count <= 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      ArrayList<ArrayList<Integer>> all_length = new ArrayList<>();
-
-      for (int isMoveable_i : isMoveable) {
-        ArrayList<Integer> tmp = new ArrayList<>();
-        tmp.add(isMoveable_i);
-        tmp.add(new_length_list[isMoveable_i][0]);
-        all_length.add(tmp);
-      }
-      quickSort(all_length, 1, 0, all_length.size() - 1);
-      if (all_length.get(0).get(1) <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block,
-            alpha_list[all_length.get(0).get(0)],
-            beta_list[all_length.get(0).get(0)]);
-        int[] new_length = new int[5];
-        ts_block_delta =
-            getEncodeBitsRegression(new_ts_block, block_size, new_length, theta, segment_size, p);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(
-                ts_block_delta, bit_width_segments, new_length, segment_size, p, theta);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, p, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      for (int alpha_i = 0; alpha_i < alpha_list.length; alpha_i++) {
-        int alpha = alpha_list[alpha_i];
-        int[] new_length = raw_length.clone();
-        beta_list[alpha_i] = (getBetaP(ts_block, alpha, block_size, raw_length, theta, p));
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-      isMoveable = isMovable(alpha_list, beta_list);
-    }
-
-    //        System.out.println("getEncodeBitsRegressionNoTrain before:" +
-    // Arrays.deepToString(ts_block_delta));
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size, p);
-
-    //        System.out.println("getEncodeBitsRegressionNoTrain after:"
-    // +Arrays.deepToString(ts_block_delta));
-
-    //    ArrayList<ArrayList<Integer>> bit_width_segments = new ArrayList<>();
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    //        System.out.println(Arrays.deepToString(ts_block_delta));
-    //        System.out.println(Arrays.deepToString(bit_width_segments));
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            p,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int ReorderingRegressionEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int p,
-      int k,
-      byte[] encoded_result) {
-    for (int i = 0; i < p; i++) block_size++;
-
-    int length_all = data.length;
-
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    intByte2Bytes(p, encode_pos, encoded_result);
-    encode_pos += 1;
-
-    // ----------------------- compare data order by time, value and partition
-    // ---------------------------
-    int length_time = 0;
-    int length_value = 0;
-    int length_partition = 0;
-    int[][] data_value = data.clone();
-    Arrays.sort(
-        data_value,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int[][] data_partition = new int[length_all][2];
-    int pos_data_partition = 0;
-
-    for (int[] datum : data) {
-      if (datum[1] > third_value[third_value.length - 1]) {
-        data_partition[pos_data_partition][0] = datum[0];
-        data_partition[pos_data_partition][1] = datum[1];
-        pos_data_partition++;
-      }
-    }
-    for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-      for (int[] datum : data) {
-        if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-          data_partition[pos_data_partition][0] = datum[0];
-          data_partition[pos_data_partition][1] = datum[1];
-          pos_data_partition++;
-        }
-      }
-    }
-    for (int[] datum : data) {
-      if (datum[1] <= third_value[0]) {
-        data_partition[pos_data_partition][0] = datum[0];
-        data_partition[pos_data_partition][1] = datum[1];
-        pos_data_partition++;
-      }
-    }
-    for (int i = 0; i < block_num; i++) {
-      int[][] ts_block_time = new int[block_size][2];
-      int[][] ts_block_value = new int[block_size][2];
-      int[][] ts_block_partition = new int[block_size][2];
-
-      for (int j = 0; j < block_size; j++) {
-        ts_block_time[j][0] = data[j + i * block_size][0];
-        ts_block_time[j][1] = data[j + i * block_size][1];
-        ts_block_value[j][0] = data_value[j + i * block_size][0];
-        ts_block_value[j][1] = data_value[j + i * block_size][1];
-        ts_block_partition[j][0] = data_partition[j + i * block_size][0];
-        ts_block_partition[j][1] = data_partition[j + i * block_size][1];
-      }
-
-      int[] raw_length = new int[5];
-      float[] theta = new float[2 * p + 2];
-      int[][] ts_block_delta =
-          getEncodeBitsRegression(ts_block_time, block_size, raw_length, theta, segment_size, p);
-      int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      length_time +=
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta, bit_width_segments, raw_length, segment_size, p, theta);
-
-      int[] raw_length_value = new int[5];
-      float[] theta_value = new float[2 * p + 2];
-      int[][] ts_block_delta_value =
-          getEncodeBitsRegression(
-              ts_block_value, block_size, raw_length_value, theta_value, segment_size, p);
-      int[][] bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_value, block_size, segment_size);
-      length_value +=
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_value,
-              bit_width_segments_value,
-              raw_length_value,
-              segment_size,
-              p,
-              theta_value);
-
-      int[] raw_length_partition = new int[5];
-      float[] theta_partition = new float[2 * p + 2];
-      int[][] ts_block_delta_partition =
-          getEncodeBitsRegression(
-              ts_block_partition,
-              block_size,
-              raw_length_partition,
-              theta_partition,
-              segment_size,
-              p);
-      int[][] bit_width_segments_partition =
-          segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-      length_partition +=
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_partition,
-              bit_width_segments_partition,
-              raw_length_partition,
-              segment_size,
-              p,
-              theta_partition);
-    }
-    //        int remaining_length = length_all - block_num * block_size;
-
-    if (length_partition < length_time
-        && length_partition < length_value) { // partition performs better
-      data = data_partition;
-      //            for (int i = 0; i < 2; i++) {
-      System.out.println("Partition");
-      for (int i = 0; i < block_num; i++) {
-        encode_pos =
-            REGERBlockEncoderPartition(
-                data, i, block_size, segment_size, k, p, encode_pos, encoded_result);
-      }
-    } else {
-      if (length_value < length_time) { // order by value performs better
-        System.out.println("Value");
-        data = data_value;
-        //                for (int i = 0; i < 2; i++) {
-        for (int i = 0; i < block_num; i++) {
-
-          encode_pos =
-              REGERBlockEncoder(
-                  data,
-                  1,
-                  i,
-                  block_size,
-                  0,
-                  third_value,
-                  segment_size,
-                  k,
-                  p,
-                  encode_pos,
-                  encoded_result);
-        }
-      } else {
-        System.out.println("Time");
-        //                for (int i = 0; i < 2; i++) {
-        for (int i = 0; i < block_num; i++) {
-          encode_pos =
-              REGERBlockEncoder(
-                  data,
-                  0,
-                  i,
-                  block_size,
-                  0,
-                  third_value,
-                  segment_size,
-                  k,
-                  p,
-                  encode_pos,
-                  encoded_result);
-        }
-      }
-    }
-
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              0,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              p,
-              encode_pos,
-              encoded_result);
-    }
-
-    return encode_pos;
-  }
-
-  private static ArrayList<Byte> encodeSegment2Bytes(
-      ArrayList<ArrayList<Integer>> delta_segments,
-      ArrayList<ArrayList<Integer>> bit_width_segments,
-      ArrayList<Integer> raw_length,
-      int segment_size,
-      ArrayList<Float> coefficient,
-      ArrayList<Integer> result2,
-      int p) {
-    ArrayList<Byte> encoded_result = new ArrayList<>();
-    int block_size = delta_segments.size();
-    int segment_n = (block_size - p) / segment_size;
-    // encode theta
-
-    // encode interval0 and value0
-    for (int i = 0; i < p; i++) {
-      byte[] interval0_byte = int2Bytes(delta_segments.get(i).get(0));
-      for (byte b : interval0_byte) encoded_result.add(b);
-      byte[] value0_byte = int2Bytes(delta_segments.get(i).get(1));
-      for (byte b : value0_byte) encoded_result.add(b);
-    }
-
-    // encode theta
-    byte[] theta0_r_byte = float2bytes(coefficient.get(0) + (float) raw_length.get(3));
-    for (byte b : theta0_r_byte) encoded_result.add(b);
-    byte[] theta0_v_byte = float2bytes(coefficient.get(1) + (float) raw_length.get(4));
-    for (byte b : theta0_v_byte) encoded_result.add(b);
-
-    for (int i = 2; i < coefficient.size(); i++) {
-      byte[] theta_byte = float2bytes(coefficient.get(i));
-      for (byte b : theta_byte) encoded_result.add(b);
-    }
-
-    encoded_result.addAll(encodeRLEBitWidth2Bytes(bit_width_segments));
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments.get(segment_i).get(0);
-      int bit_width_value = bit_width_segments.get(segment_i).get(1);
-
-      byte[] timestamp_bytes =
-          bitPacking(delta_segments, 0, segment_i * segment_size + 1, segment_size, bit_width_time);
-      for (byte b : timestamp_bytes) encoded_result.add(b);
-      byte[] value_bytes =
-          bitPacking(
-              delta_segments, 1, segment_i * segment_size + 1, segment_size, bit_width_value);
-      for (byte b : value_bytes) encoded_result.add(b);
-    }
-
-    byte[] td_common_byte = int2Bytes(result2.get(0));
-    for (byte b : td_common_byte) encoded_result.add(b);
-
-    return encoded_result;
-  }
-
-  public static double bytes2Double(ArrayList<Byte> encoded, int start, int num) {
-    if (num > 8) {
-      System.out.println("bytes2Doubleerror");
-      return 0;
-    }
-    long value = 0;
-    for (int i = 0; i < 8; i++) {
-      value |= ((long) (encoded.get(i + start) & 0xff)) << (8 * i);
-    }
-    return Double.longBitsToDouble(value);
-  }
-
-  public static float byte2float2(ArrayList<Byte> b, int index) {
-    int l;
-    l = b.get(index);
-    l &= 0xff;
-    l |= ((long) b.get(index + 1) << 8);
-    l &= 0xffff;
-    l |= ((long) b.get(index + 2) << 16);
-    l &= 0xffffff;
-    l |= ((long) b.get(index + 3) << 24);
-    return Float.intBitsToFloat(l);
-  }
-
-  public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded.get(i + start) & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  public static double[] dataStandardization(double[] array) {
-    StandardDeviation deviation = new StandardDeviation();
-    for (int i = 0; i < array.length; i++) {
-      array[i] = array[i];
-    }
-    return array;
-  }
-
-  public static double[][] dataStandardizationDouble(double[][] arrays) {
-    double[][] result = new double[arrays[0].length][arrays.length];
-    for (int i = 0; i < arrays.length; i++) {
-      double[] doubles = dataStandardization(arrays[i]);
-      for (int k = 0; k < result.length; k++) {
-        result[k][i] = doubles[k];
-      }
-    }
-    return result;
-  }
-
-  @Test
-  public void REGERPFloat() throws IOException {
-
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/p_float/";
-    String input_parent_dir = parent_dir + "trans_data/";
-
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (int i = 0; i < dataset_name.size(); i++) {
-      input_path_list.add(input_parent_dir + dataset_name.get(i));
-      dataset_block_size.add(1024);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 3; file_i < 4; file_i++) {
-
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-      System.out.println(inputPath);
-
-      // speed
-      int repeatTime = 1; // set repeat time
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "p",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        for (int p = 2; p < 3; p++) {
-          //                for (int p = 1; p < 10; p++) {
-          System.out.println("p=" + p);
-
-          InputStream inputStream = Files.newInputStream(f.toPath());
-          CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-          ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-          ArrayList<ArrayList<Integer>> data_decoded = new ArrayList<>();
-
-          // add a column to "data"
-          loader.readHeaders();
-          data.clear();
-          while (loader.readRecord()) {
-            ArrayList<Integer> tmp = new ArrayList<>();
-            tmp.add(Integer.valueOf(loader.getValues()[0]));
-            tmp.add(Integer.valueOf(loader.getValues()[1]));
-            data.add(tmp);
-          }
-          inputStream.close();
-          ArrayList<Integer> result2 = new ArrayList<>();
-          splitTimeStamp3(data, result2);
-          int[][] data2_arr = new int[data.size()][2];
-          int min_time = data.get(0).get(0);
-          for (int i = 0; i < data.size(); i++) {
-            data2_arr[i][0] = data.get(i).get(0) - min_time;
-            data2_arr[i][1] = data.get(i).get(1);
-          }
-          System.out.println(data2_arr[0][0]);
-          byte[] encoded_result = new byte[data2_arr.length * 8];
-
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int length = 0;
-
-          long s = System.nanoTime();
-
-          for (int repeat_i = 0; repeat_i < 1; repeat_i++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr,
-                    dataset_block_size.get(file_i),
-                    dataset_third.get(file_i),
-                    8,
-                    p,
-                    1,
-                    encoded_result);
-
-          long e = System.nanoTime();
-          encodeTime += ((e - s));
-          compressed_size += length;
-          double ratioTmp = (double) compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          e = System.nanoTime();
-          decodeTime += ((e - s));
-
-          String[] record = {
-            f.toString(),
-            "REGER-32-FLOAT",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(p),
-            String.valueOf(compressed_size),
-            String.valueOf(ratio)
-          };
-
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERPFloatVaryP() throws IOException {
-
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/p_float_vary_p/";
-    String input_parent_dir = parent_dir + "trans_data/";
-
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (int i = 0; i < dataset_name.size(); i++) {
-      input_path_list.add(input_parent_dir + dataset_name.get(i));
-      dataset_block_size.add(1024);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 0; file_i < 1; file_i++) {
-
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-      System.out.println(inputPath);
-
-      // speed
-      int repeatTime = 1; // set repeat time
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "p",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        //                for (int p = 8; p < 9; p++) {
-        for (int p = 1; p < 10; p++) {
-          System.out.println("p=" + p);
-
-          InputStream inputStream = Files.newInputStream(f.toPath());
-          CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-          ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-          ArrayList<ArrayList<Integer>> data_decoded = new ArrayList<>();
-
-          // add a column to "data"
-          loader.readHeaders();
-          data.clear();
-          while (loader.readRecord()) {
-            ArrayList<Integer> tmp = new ArrayList<>();
-            tmp.add(Integer.valueOf(loader.getValues()[0]));
-            tmp.add(Integer.valueOf(loader.getValues()[1]));
-            data.add(tmp);
-          }
-          inputStream.close();
-          ArrayList<Integer> result2 = new ArrayList<>();
-          splitTimeStamp3(data, result2);
-          int[][] data2_arr = new int[data.size()][2];
-          int min_time = data.get(0).get(0);
-          for (int i = 0; i < data.size(); i++) {
-            data2_arr[i][0] = data.get(i).get(0) - min_time;
-            data2_arr[i][1] = data.get(i).get(1);
-          }
-          System.out.println(data2_arr[0][0]);
-          byte[] encoded_result = new byte[data2_arr.length * 8];
-
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int length = 0;
-
-          long s = System.nanoTime();
-
-          for (int repeat_i = 0; repeat_i < 1; repeat_i++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr,
-                    dataset_block_size.get(file_i),
-                    dataset_third.get(file_i),
-                    8,
-                    p,
-                    1,
-                    encoded_result);
-
-          long e = System.nanoTime();
-          encodeTime += ((e - s));
-          compressed_size += length;
-          double ratioTmp = (double) compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          e = System.nanoTime();
-          decodeTime += ((e - s));
-
-          String[] record = {
-            f.toString(),
-            "REGER-32-FLOAT",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(p),
-            String.valueOf(compressed_size),
-            String.valueOf(ratio)
-          };
-
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERTest.java
deleted file mode 100644
index 9288a7b..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERTest.java
+++ /dev/null
@@ -1,3706 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.*;
-
-import static java.lang.Math.abs;
-
-public class REGERTest {
-
-  public static int getBitWith(int num) {
-    if (num == 0) return 1;
-    else return 32 - Integer.numberOfLeadingZeros(num);
-  }
-
-  public static boolean containsValue(int[] array, int targetValue) {
-    for (int value : array) {
-      if (value == targetValue) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static int[] removeElement(int[] array, int position) {
-    if (position < 0 || position >= array.length) {
-      return array;
-    }
-
-    int[] newArray = new int[array.length - 1];
-    int newIndex = 0;
-
-    for (int i = 0; i < array.length; i++) {
-      if (i != position) {
-        newArray[newIndex] = array[i];
-        newIndex++;
-      }
-    }
-
-    return newArray;
-  }
-
-  public static int min3(int a, int b, int c) {
-    if (a < b && a < c) {
-      return 0;
-    } else if (b < c) {
-      return 1;
-    } else {
-      return 2;
-    }
-  }
-
-  public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 24);
-    cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-    cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 3] = (byte) (integer);
-  }
-
-  public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer);
-  }
-
-  public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 1] = (byte) (integer);
-  }
-
-  public static int bytes2Integer(byte[] encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded[i + start] & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  private static int byte2Integer(byte[] encoded, int decode_pos) {
-    int value = 0;
-    int b = encoded[decode_pos] & 0xFF;
-    value |= b;
-    if (value == 0) return 256;
-    return value % 256;
-  }
-
-  public static void pack8Values(
-      ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values.get(valueIdx) << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values.get(valueIdx) << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values.get(valueIdx) >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static void pack8Values(
-      int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values[valueIdx][index] << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values[valueIdx][index] << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values[valueIdx][index] >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static int unpack8Values(
-      byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-    int byteIdx = offset;
-    //        int pos_encode = 0;
-    long buffer = 0;
-    // total bits which have read from 'buf' to 'buffer'. i.e.,
-    // number of available bits to be decoded.
-    int totalBits = 0;
-    int valueIdx = 0;
-
-    while (valueIdx < 8) {
-      // If current available bits are not enough to decode one Integer,
-      // then add next byte from buf to 'buffer' until totalBits >= width
-      while (totalBits < width) {
-        buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-        byteIdx++;
-        totalBits += 8;
-      }
-
-      // If current available bits are enough to decode one Integer,
-      // then decode one Integer one by one until left bits in 'buffer' is
-      // not enough to decode one Integer.
-      while (totalBits >= width && valueIdx < 8) {
-        result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-        value_pos++;
-        valueIdx++;
-        totalBits -= width;
-        buffer = buffer & ((1L << totalBits) - 1);
-      }
-    }
-    return value_pos;
-  }
-
-  public static int bitPacking(
-      int[][] numbers,
-      int index,
-      int start,
-      int block_size,
-      int bit_width,
-      int encode_pos,
-      byte[] encoded_result) {
-    int block_num = block_size / 8;
-    for (int i = 0; i < block_num; i++) {
-      pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-      encode_pos += bit_width;
-    }
-
-    return encode_pos;
-  }
-
-  public static int decodeBitPacking(
-      byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-    int block_num = block_size / 8;
-    int value_pos = 0;
-
-    for (int i = 0; i < block_num; i++) { // bitpacking
-      value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-      decode_pos += bit_width;
-    }
-    return decode_pos;
-  }
-
-  public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-    int fbit = Float.floatToIntBits(f);
-    byte[] b = new byte[4];
-    for (int i = 0; i < 4; i++) {
-      b[i] = (byte) (fbit >> (24 - i * 8));
-    }
-    int len = b.length;
-
-    System.arraycopy(b, 0, encode_result, pos_encode, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = encode_result[i + pos_encode];
-      encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-      encode_result[len - i - 1 + pos_encode] = temp;
-    }
-  }
-
-  public static float bytes2float(byte[] b, int index) {
-    int l;
-    l = b[index];
-    l &= 0xff;
-    l |= ((long) b[index + 1] << 8);
-    l &= 0xffff;
-    l |= ((long) b[index + 2] << 16);
-    l &= 0xffffff;
-    l |= ((long) b[index + 3] << 24);
-    return Float.intBitsToFloat(l);
-  }
-
-  public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded.get(i + start) & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  public static int part(int[][] arr, int index, int low, int high) {
-    int[] tmp = arr[low];
-    while (low < high) {
-      while (low < high
-          && (arr[high][index] > tmp[index]
-              || (Objects.equals(arr[high][index], tmp[index])
-                  && arr[high][index ^ 1] >= tmp[index ^ 1]))) {
-        high--;
-      }
-      arr[low][0] = arr[high][0];
-      arr[low][1] = arr[high][1];
-      while (low < high
-          && (arr[low][index] < tmp[index]
-              || (Objects.equals(arr[low][index], tmp[index])
-                  && arr[low][index ^ 1] <= tmp[index ^ 1]))) {
-        low++;
-      }
-      arr[high][0] = arr[low][0];
-      arr[high][1] = arr[low][1];
-    }
-    arr[low][0] = tmp[0];
-    arr[low][1] = tmp[1];
-    return low;
-  }
-
-  public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    ArrayList<Integer> tmp = arr.get(low);
-    while (low < high) {
-      while (low < high
-          && (arr.get(high).get(index) > tmp.get(index)
-              || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                  && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-        high--;
-      }
-      arr.set(low, arr.get(high));
-      while (low < high
-          && (arr.get(low).get(index) < tmp.get(index)
-              || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                  && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-        low++;
-      }
-      arr.set(high, arr.get(low));
-    }
-    arr.set(low, tmp);
-    return low;
-  }
-
-  public static int getCommon(int m, int n) {
-    int z;
-    while (m % n != 0) {
-      z = m % n;
-      m = n;
-      n = z;
-    }
-    return n;
-  }
-
-  public static void splitTimeStamp3(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-    int td_common = 0;
-    for (int i = 1; i < ts_block.size(); i++) {
-      int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-      if (td_common == 0) {
-        if (time_diffi != 0) {
-          td_common = time_diffi;
-        }
-        continue;
-      }
-      if (time_diffi != 0) {
-        td_common = getCommon(time_diffi, td_common);
-        if (td_common == 1) {
-          break;
-        }
-      }
-    }
-    if (td_common == 0) {
-      td_common = 1;
-    }
-
-    int t0 = ts_block.get(0).get(0);
-    for (int i = 0; i < ts_block.size(); i++) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-      tmp.add(t0 + interval_i);
-      tmp.add(ts_block.get(i).get(1));
-      ts_block.set(i, tmp);
-    }
-    result.add(td_common);
-  }
-
-  private static void adjust1TimeCost(
-      int[][] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-    int block_size = ts_block.length;
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-
-    int min_delta_time = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-    int min_delta_time_i = min_delta_time;
-    int min_delta_time_index = i;
-
-    for (int j = 1; j < block_size; j++) {
-      int timestamp_delta_i =
-          ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      if (timestamp_delta_i < min_delta_time) {
-        min_delta_time_index = j;
-        min_delta_time = timestamp_delta_i;
-      }
-    }
-    raw_length[0] += (getBitWith(min_delta_time_i - min_delta_time) * (block_size - 1));
-    raw_length[3] = min_delta_time;
-    min_index.set(0, min_delta_time_index);
-  }
-
-  private static void adjust1ValueCost(
-      int[][] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) {
-
-    int block_size = ts_block.length;
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int min_delta_value = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-    int min_delta_value_i = min_delta_value;
-    int min_delta_value_index = i;
-
-    for (int j = 1; j < block_size; j++) {
-      int value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      if (value_delta_i < min_delta_value) {
-        min_delta_value_index = j;
-        min_delta_value = value_delta_i;
-      }
-    }
-    raw_length[0] += (getBitWith(min_delta_value_i - min_delta_value) * (block_size - 1));
-    raw_length[3] = min_delta_value;
-    min_index.set(0, min_delta_value_index);
-  }
-
-  private static int[] adjust0MinChange(int[][] ts_block, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != block_size;
-
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int pos_ts_block_delta = 0;
-    for (int i = 2; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i != j) {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      } else {
-        timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-        value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-        ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-        ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i > timestamp_delta_max) {
-          timestamp_delta_max = timestamp_delta_i;
-        }
-        if (timestamp_delta_i < timestamp_delta_min) {
-          timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i > value_delta_max) {
-          value_delta_max = value_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-          value_delta_min = value_delta_i;
-        }
-        timestamp_delta_i =
-            ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i > timestamp_delta_max) {
-        timestamp_delta_max = timestamp_delta_i;
-      }
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i > value_delta_max) {
-        value_delta_max = value_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int length = 0;
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjust0MinChangeNo(
-      int[][] ts_block, int[] raw_length, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != block_size;
-
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[j + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i = ts_block[j + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[j + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust 0 to n
-  private static int[] adjust0n1MinChange(int[][] ts_block, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-    int pos_ts_block_delta = 0;
-    int length = 0;
-    for (int i = 2; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      timestamp_delta_i = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-      value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-    ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-    ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-    pos_ts_block_delta++;
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      value_delta_min = value_delta_i;
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjust0n1MinChangeNo(int[][] ts_block, int[] raw_length, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i = ts_block[1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust n to no 0
-  private static int[] adjustnMinChange(int[][] ts_block, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int length = 0;
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size - 1; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i != j) {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-        value_delta_i =
-            ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-        ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-        ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-        pos_ts_block_delta++;
-        if (timestamp_delta_i < timestamp_delta_min) {
-          timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-          value_delta_min = value_delta_i;
-        }
-
-        timestamp_delta_i =
-            ts_block[block_size - 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i =
-            ts_block[block_size - 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustnMinChangeNo(
-      int[][] ts_block, int[] raw_length, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[block_size - 1][0]
-            - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 2][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1]
-            - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 2][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[block_size - 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust n to 0
-  private static int[] adjustn0MinChange(int[][] ts_block, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int length = 0;
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size - 1; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      timestamp_delta_i = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-      value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-    ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-    ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-    pos_ts_block_delta++;
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      value_delta_min = value_delta_i;
-    }
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustn0MinChangeNo(int[][] ts_block, int[] raw_length, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[block_size - 1][0]
-            - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 2][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1]
-            - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 2][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust alpha to j
-
-  private static int[] adjustAlphaToJMinChange(int[][] ts_block, int alpha, int j, float[] theta) {
-
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    assert j != 0;
-    assert j != block_size;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int length = 0;
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == j) {
-        timestamp_delta_i =
-            ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-        value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i =
-            ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      } else if (i == alpha + 1) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustAlphaToJMinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, int j, float[] theta) {
-
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    assert j != 0;
-    assert j != block_size;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // move alpha to 0
-  private static int[] adjustTo0MinChange(int[][] ts_block, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == (alpha + 1)) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-        value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int length = 0;
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustTo0MinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // move alpha to n
-  private static int[] adjustTonMinChange(int[][] ts_block, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int pos_ts_block_delta = 0;
-    int length = 0;
-
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == (alpha + 1)) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-        value_delta_i =
-            ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustTonMinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int getIstarClose(
-      int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-    int min_i = 0;
-    int min_dis = Integer.MAX_VALUE;
-    for (int i = 0; i < j_star_list.size(); i++) {
-      if (abs(alpha - j_star_list.get(i)) < min_dis) {
-        min_i = j_star_list.get(i);
-        min_dis = abs(alpha - j_star_list.get(i));
-        raw_length[0] = new_length_list[i][0];
-        raw_length[3] = new_length_list[i][1];
-        raw_length[4] = new_length_list[i][2];
-      }
-    }
-    if (min_dis == 0) {
-      System.out.println("get IstarClose error");
-      return 0;
-    }
-    return min_i;
-  }
-
-  public static int[][] getEncodeBitsRegression(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-
-    long sum_X_r = 0;
-    long sum_Y_r = 0;
-    long sum_squ_X_r = 0;
-    long sum_squ_XY_r = 0;
-    long sum_X_v = 0;
-    long sum_Y_v = 0;
-    long sum_squ_X_v = 0;
-    long sum_squ_XY_v = 0;
-
-    for (int i = 1; i < block_size; i++) {
-      sum_X_r += ts_block[i - 1][0];
-      sum_X_v += ts_block[i - 1][1];
-      sum_Y_r += ts_block[i][0];
-      sum_Y_v += ts_block[i][1];
-      sum_squ_X_r += ((long) (ts_block[i - 1][0]) * (ts_block[i - 1][0]));
-      sum_squ_X_v += ((long) ts_block[i - 1][1] * ts_block[i - 1][1]);
-      sum_squ_XY_r += ((long) (ts_block[i - 1][0]) * (ts_block[i][0]));
-      sum_squ_XY_v += ((long) ts_block[i - 1][1] * ts_block[i][1]);
-    }
-
-    int m_reg = block_size - 1;
-    float theta0_r = 0.0F;
-    float theta1_r = 1.0F;
-    if (m_reg * sum_squ_X_r != sum_X_r * sum_X_r) {
-      theta0_r =
-          (float) (sum_squ_X_r * sum_Y_r - sum_X_r * sum_squ_XY_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-      theta1_r =
-          (float) (m_reg * sum_squ_XY_r - sum_X_r * sum_Y_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-    }
-
-    float theta0_v = 0.0F;
-    float theta1_v = 1.0F;
-    if (m_reg * sum_squ_X_v != sum_X_v * sum_X_v) {
-      theta0_v =
-          (float) (sum_squ_X_v * sum_Y_v - sum_X_v * sum_squ_XY_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-      theta1_v =
-          (float) (m_reg * sum_squ_XY_v - sum_X_v * sum_Y_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-    }
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    // delta to Regression
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r = (ts_block[j][0] - (int) (theta0_r + theta1_r * (float) ts_block[j - 1][0]));
-      int epsilon_v = (ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]));
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = epsilon_v;
-      }
-      ts_block_delta[j][0] = epsilon_r;
-      ts_block_delta[j][1] = epsilon_v;
-    }
-
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j > 0; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    theta[0] = theta0_r;
-    theta[1] = theta1_r;
-    theta[2] = theta0_v;
-    theta[3] = theta1_v;
-
-    return ts_block_delta;
-  }
-
-  public static int[][] getEncodeBitsRegressionNoTrain(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta, int segment_size) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    //        System.out.println(Arrays.deepToString(ts_block));
-
-    int pos_ts_block_delta = 0;
-    ts_block_delta[pos_ts_block_delta][0] = ts_block[0][0];
-    ts_block_delta[pos_ts_block_delta][1] = ts_block[0][1];
-    pos_ts_block_delta++;
-
-    int[][] ts_block_delta_segment = new int[block_size][2];
-    int pos_ts_block_delta_segment = 0;
-    int[] tmp_segment = new int[2];
-    int max_interval_segment = Integer.MIN_VALUE;
-    int max_value_segment = Integer.MIN_VALUE;
-    tmp_segment[0] = max_interval_segment;
-    tmp_segment[1] = max_value_segment;
-
-    // delta to Regression
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      int epsilon_v = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = epsilon_v;
-      }
-
-      ts_block_delta[pos_ts_block_delta][0] = epsilon_r;
-      ts_block_delta[pos_ts_block_delta][1] = epsilon_v;
-      pos_ts_block_delta++;
-
-      if (epsilon_r > max_interval_segment) {
-        max_interval_segment = epsilon_r;
-        tmp_segment[0] = max_interval_segment;
-      }
-      if (epsilon_v > max_value_segment) {
-        max_value_segment = epsilon_v;
-        tmp_segment[1] = max_value_segment;
-      }
-      if (j % segment_size == 0) {
-        ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-        ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-        pos_ts_block_delta_segment++;
-        tmp_segment = new int[2];
-        max_interval_segment = Integer.MIN_VALUE;
-        max_value_segment = Integer.MIN_VALUE;
-        tmp_segment[0] = max_interval_segment;
-        tmp_segment[1] = max_value_segment;
-      }
-    }
-
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j > 0; j--) {
-      int epsilon_r = ts_block_delta[j][0] - timestamp_delta_min;
-      int epsilon_v = ts_block_delta[j][1] - value_delta_min;
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-      ts_block_delta[j][0] = epsilon_r;
-      ts_block_delta[j][1] = epsilon_v;
-    }
-
-    for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-      length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-      length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    //        raw_length = new int[5];
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  public static int getBeta(
-      int[][] ts_block,
-      int alpha,
-      ArrayList<Integer> min_index,
-      int block_size,
-      int[] raw_length,
-      float[] theta) {
-
-    int raw_abs_sum = raw_length[0];
-    int[][] new_length_list = new int[block_size][3];
-    int pos_new_length_list = 0;
-
-    ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-    int j_star = -1;
-    int[] b;
-    if (alpha == -1) {
-      return j_star;
-    }
-
-    if (alpha == 0) {
-      if (min_index.get(0) == 1) {
-        adjust1TimeCost(ts_block, 1, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == 1) {
-        adjust1ValueCost(ts_block, 1, raw_length, min_index, theta);
-      }
-
-      for (int j = 2; j < block_size - 1; j++) {
-        // if j, alpha+1, alpha points are min residuals, need to recalculate min residuals
-        if (min_index.contains(j)) { // || min_index.contains(1)
-          b = adjust0MinChange(ts_block, j, theta);
-        } else {
-          b = adjust0MinChangeNo(ts_block, raw_length, j, theta);
-        }
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list = new ArrayList<>();
-          pos_new_length_list = 0;
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      if (min_index.contains(0)) {
-        b = adjust0n1MinChange(ts_block, theta);
-      } else {
-        b = adjust0n1MinChangeNo(ts_block, raw_length, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // alpha == n
-    else if (alpha == block_size - 1) {
-      if (min_index.get(0) == block_size - 1) {
-        adjust1TimeCost(ts_block, block_size - 1, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == block_size - 1) {
-        adjust1ValueCost(ts_block, block_size - 1, raw_length, min_index, theta);
-      }
-      for (int j = 1; j < block_size - 1; j++) {
-        if (min_index.contains(j)) { // min_index.contains(block_size - 1) ||
-          b = adjustnMinChange(ts_block, j, theta);
-        } else {
-          b = adjustnMinChangeNo(ts_block, raw_length, j, theta);
-        }
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list = new ArrayList<>();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      if (min_index.contains(0)) { // min_index.contains(block_size - 1) ||
-        b = adjustn0MinChange(ts_block, theta);
-      } else {
-        b = adjustn0MinChangeNo(ts_block, raw_length, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list = new ArrayList<>();
-        j_star_list.add(0);
-
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // alpha != 1 and alpha != n
-    else {
-      if (min_index.get(0) == alpha) {
-        adjust1TimeCost(ts_block, alpha, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == alpha) {
-        adjust1ValueCost(ts_block, alpha, raw_length, min_index, theta);
-      }
-      if (min_index.get(0) == alpha + 1) {
-        adjust1TimeCost(ts_block, alpha + 1, raw_length, min_index, theta);
-      }
-      if (min_index.get(1) == alpha + 1) {
-        adjust1ValueCost(ts_block, alpha + 1, raw_length, min_index, theta);
-      }
-      for (int j = 1; j < block_size - 1; j++) {
-        if (alpha != j && (alpha + 1) != j) {
-          if (min_index.contains(
-              j)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-            b = adjustAlphaToJMinChange(ts_block, alpha, j, theta);
-          } else {
-            b = adjustAlphaToJMinChangeNo(ts_block, raw_length, alpha, j, theta);
-          }
-          if (b[0] < raw_abs_sum) {
-            raw_abs_sum = b[0];
-            j_star_list = new ArrayList<>();
-            j_star_list.add(j);
-            pos_new_length_list = 0;
-            System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-            pos_new_length_list++;
-          } else if (b[0] == raw_abs_sum) {
-            j_star_list.add(j);
-            System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-            pos_new_length_list++;
-          }
-        }
-      }
-      if (min_index.contains(0)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-        b = adjustTo0MinChange(ts_block, alpha, theta);
-      } else {
-        b = adjustTo0MinChangeNo(ts_block, raw_length, alpha, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-      if (min_index.contains(
-          block_size - 1)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-        b = adjustTonMinChange(ts_block, alpha, theta);
-      } else {
-        b = adjustTonMinChangeNo(ts_block, raw_length, alpha, theta);
-      }
-
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    }
-    int[][] new_new_length_list = new int[pos_new_length_list][5];
-    for (int i = 0; i < pos_new_length_list; i++) {
-      System.arraycopy(new_new_length_list[i], 0, new_length_list[i], 0, 3);
-    }
-
-    if (j_star_list.size() != 0) {
-      j_star = getIstarClose(alpha, j_star_list, new_new_length_list, raw_length);
-    }
-    return j_star;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block,
-      ArrayList<Integer> min_index,
-      int block_size,
-      int index,
-      float[] theta,
-      int k) {
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_v_j = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      int epsilon_r_j = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = epsilon_v_j;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = epsilon_r_j;
-      }
-      //      ts_block_delta.add(tmp);
-      if (epsilon_r_j < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r_j;
-        timestamp_delta_min_index = j;
-      }
-      if (epsilon_v_j < value_delta_min) {
-        value_delta_min = epsilon_v_j;
-        value_delta_min_index = j;
-      }
-    }
-    min_index.add(timestamp_delta_min_index);
-    min_index.add(value_delta_min_index);
-    Arrays.sort(
-        ts_block_delta,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int[] alpha_list = new int[k + 1];
-
-    alpha_list[0] = ts_block_delta[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta[block_size - 2 - k][0];
-    }
-    return alpha_list;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block, ArrayList<Integer> min_index, int block_size, float[] theta, int k) {
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[] alpha_list = new int[2 * k + 2];
-
-    int[][] ts_block_delta_time = new int[block_size - 1][2];
-    int[][] ts_block_delta_value = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r_j = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      int epsilon_v_j = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = epsilon_r_j;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = epsilon_v_j;
-
-      if (epsilon_v_j > value_delta_max) {
-        value_delta_max = epsilon_v_j;
-      }
-      if (epsilon_v_j < value_delta_min) {
-        value_delta_min = epsilon_v_j;
-      }
-      if (epsilon_r_j > timestamp_delta_max) {
-        timestamp_delta_max = epsilon_r_j;
-      }
-      if (epsilon_r_j < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r_j;
-      }
-    }
-    Arrays.sort(
-        ts_block_delta_time,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    min_index.add(ts_block_delta_time[0][0]);
-    alpha_list[0] = ts_block_delta_time[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta_time[block_size - 2 - k][0];
-    }
-
-    Arrays.sort(
-        ts_block_delta_value,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int pos_alpha_list = k + 1;
-    min_index.add(ts_block_delta_value[0][0]);
-    if (!containsValue(alpha_list, ts_block_delta_value[0][0])) {
-      alpha_list[pos_alpha_list] = ts_block_delta_value[0][0];
-      pos_alpha_list++;
-    }
-
-    for (int i = 0; i < k; i++) {
-      if (!containsValue(alpha_list, ts_block_delta_value[block_size - 2 - k][0])) {
-        alpha_list[pos_alpha_list] = ts_block_delta_value[block_size - 2 - k][0];
-        pos_alpha_list++;
-      }
-    }
-    int[] new_alpha_list = new int[pos_alpha_list];
-    System.arraycopy(alpha_list, 0, new_alpha_list, 0, pos_alpha_list);
-
-    return new_alpha_list;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(int[][] bit_width_segments) {
-    int encoded_result = 0;
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          pos_time++;
-          count_of_time = 1;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      pos_value++;
-    }
-
-    encoded_result += (pos_time * 2);
-    encoded_result += (pos_value * 2);
-
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(
-      int[][] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-    intWord2Bytes(pos_time, pos_encode, encoded_result);
-    pos_encode += 2;
-    intWord2Bytes(pos_value, pos_encode, encoded_result);
-    pos_encode += 2;
-
-    for (int i = 0; i < pos_time; i++) {
-      int[] bit_width_time = run_length_time[i];
-      intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-      pos_encode++;
-    }
-    for (int i = 0; i < pos_value; i++) {
-      int[] bit_width_value = run_length_value[i];
-      intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-      pos_encode++;
-    }
-
-    return pos_encode;
-  }
-
-  public static int[][] segmentBitPacking(
-      int[][] ts_block_delta, int block_size, int segment_size) {
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    return bit_width_segments;
-  }
-
-  public static void moveAlphaToBeta(int[][] ts_block, int alpha, int beta) {
-    int[] tmp_tv = ts_block[alpha];
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ts_block[u + 1][0] = ts_block[u][0];
-        ts_block[u + 1][1] = ts_block[u][1];
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ts_block[u - 1][0] = ts_block[u][0];
-        ts_block[u - 1][1] = ts_block[u][1];
-      }
-      beta--;
-    }
-    ts_block[beta][0] = tmp_tv[0];
-    ts_block[beta][1] = tmp_tv[1];
-  }
-
-  private static int numberOfEncodeSegment2Bytes(
-      int[][] delta_segments, int[][] bit_width_segments, int segment_size) {
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int result = 0;
-    result += 8; // encode interval0 and value0
-    result += 16; // encode theta
-    result += encodeRLEBitWidth2Bytes(bit_width_segments);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      result += (segment_size * bit_width_time / 8);
-      result += (segment_size * bit_width_value / 8);
-    }
-
-    return result;
-  }
-
-  private static int encodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      float[] theta,
-      int pos_encode,
-      byte[] encoded_result) {
-
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int2Bytes(delta_segments[0][0], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(delta_segments[0][1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[0] + raw_length[3], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[2] + raw_length[4], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[3], pos_encode, encoded_result);
-    pos_encode += 4;
-
-    pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              0,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_time,
-              pos_encode,
-              encoded_result);
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              1,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_value,
-              pos_encode,
-              encoded_result);
-    }
-
-    return pos_encode;
-  }
-
-  private static int REGERBlockEncoderPartition(
-      int[][] data,
-      int i,
-      int block_size,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block = new int[block_size][2];
-    int[][] ts_block_reorder = new int[block_size][2];
-    for (int j = 0; j < block_size; j++) {
-      //            data[j + i * block_size][0] -= min_time;
-      ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-      ts_block[j][1] = data[j + i * block_size][1];
-      ts_block_reorder[j][0] = data[j + i * block_size][0];
-      ts_block_reorder[j][1] = data[j + i * block_size][1];
-    }
-
-    // raw-order
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta = getEncodeBitsRegression(ts_block, block_size, raw_length, theta);
-    int[][] bit_width_segments_partition =
-        segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-          return Integer.compare(a[0], b[0]);
-        });
-    //    quickSort(ts_block, 0, 0, block_size - 1);
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[][] ts_block_delta_time =
-        getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-    int[][] bit_width_segments_time =
-        segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    // value-order
-    //    quickSort(ts_block, 1, 0, block_size - 1);
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[][] ts_block_delta_reorder =
-        getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-    int[][] bit_width_segments_value =
-        segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments_value, segment_size);
-
-    int[] alpha_list;
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, k);
-    } else if (choose == 1) {
-      ts_block = ts_block_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, k);
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 1, theta, k);
-    }
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-    int[] new_alpha_list = new int[alpha_list.length];
-
-    //    ArrayList<ArrayList<Integer>> new_length_list = new ArrayList<>();
-
-    for (int alpha : alpha_list) {
-      if (alpha == -1) continue;
-      new_alpha_list[pos_new_length_list] = alpha;
-
-      ArrayList<Integer> new_min_index = (ArrayList<Integer>) min_index.clone();
-      int[] new_length = raw_length.clone();
-      //            beta_list[j] = 0;
-      beta_list[pos_new_length_list] =
-          getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-      if (beta_list[pos_new_length_list] == -1) continue;
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-
-    int adjust_count = 0;
-    int[][] all_length;
-    while (pos_new_length_list != 0) {
-      if (adjust_count < block_size / 2 && adjust_count < 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-
-      all_length = new int[pos_new_length_list][2];
-      for (int pos_new_length_list_j = 0;
-          pos_new_length_list_j < pos_new_length_list;
-          pos_new_length_list_j++) {
-        all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-        all_length[pos_new_length_list_j][1] = new_length_list[pos_new_length_list_j][0];
-      }
-      Arrays.sort(
-          all_length,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-
-      if (all_length[0][1] <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block, new_alpha_list[all_length[0][0]], beta_list[all_length[0][0]]);
-        int[] new_length = new int[5];
-        ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length, theta);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, segment_size);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      new_alpha_list = new int[alpha_list.length];
-
-      for (int alpha : alpha_list) {
-        if (alpha == -1) continue;
-        new_alpha_list[pos_new_length_list] = alpha;
-
-        int[] new_length = raw_length.clone();
-        //            beta_list[j] = 0;
-        beta_list[pos_new_length_list] =
-            getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-        if (beta_list[pos_new_length_list] == -1) continue;
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-    }
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    return encode_pos;
-  }
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int order,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta_reorder;
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta;
-    int[][] bit_width_segments_partition;
-
-    if (order == 1) {
-
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder, bit_width_segments_value, segment_size);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-
-      ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    } else if (order == 0) {
-
-      ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder, bit_width_segments_value, segment_size);
-    }
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-    }
-
-    int[] alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta, k);
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-    int[] new_alpha_list = new int[alpha_list.length];
-
-    for (int alpha : alpha_list) {
-      if (alpha == -1) continue;
-      new_alpha_list[pos_new_length_list] = alpha;
-
-      ArrayList<Integer> new_min_index = (ArrayList<Integer>) min_index.clone();
-      int[] new_length = raw_length.clone();
-
-      beta_list[pos_new_length_list] =
-          getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-      if (beta_list[pos_new_length_list] == -1) continue;
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-
-    int adjust_count = 0;
-
-    int[][] all_length;
-    while (pos_new_length_list != 0) {
-      if (adjust_count < block_size / 2 && adjust_count < 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      all_length = new int[pos_new_length_list][2];
-      for (int pos_new_length_list_j = 0;
-          pos_new_length_list_j < pos_new_length_list;
-          pos_new_length_list_j++) {
-        all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-        all_length[pos_new_length_list_j][1] = new_length_list[pos_new_length_list_j][0];
-      }
-      Arrays.sort(
-          all_length,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-
-      if (all_length[0][1] <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block, new_alpha_list[all_length[0][0]], beta_list[all_length[0][0]]);
-        int[] new_length = new int[5];
-        ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length, theta);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, segment_size);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      new_alpha_list = new int[alpha_list.length];
-
-      for (int alpha : alpha_list) {
-        if (alpha == -1) continue;
-        new_alpha_list[pos_new_length_list] = alpha;
-
-        int[] new_length = raw_length.clone();
-        //            beta_list[j] = 0;
-        beta_list[pos_new_length_list] =
-            getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-        if (beta_list[pos_new_length_list] == -1) continue;
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-    }
-    //        System.out.println(adjust_count);
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int ReorderingRegressionEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int k,
-      byte[] encoded_result) {
-    block_size++;
-    //    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-    int length_all = data.length;
-    //        System.out.println(length_all);
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    //        // ----------------------- compare the whole time series order by time, value and
-    // partition ---------------------------
-    //        int length_time = 0;
-    //        int length_value = 0;
-    //        int length_partition = 0;
-    //        int[][] data_value = data.clone();
-    ////        System.out.println(Arrays.deepToString(data_value));
-    ////        quickSort(data_value,1,0,length_all-1);
-    ////        Arrays.sort(data_value, new Comparator<int[]>() {
-    ////            @Override
-    ////            public int compare(int[] a, int[] b) {
-    ////                if (a[1] == b[1])
-    ////                    return Integer.compare(a[0], b[0]);
-    ////                return Integer.compare(a[1], b[1]);
-    ////            }
-    ////        });
-    //        Arrays.sort(data_value, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-    ////        System.out.println(Arrays.deepToString(data_value));
-    //
-    //        int[][] data_partition = new int[length_all][2];
-    //        int pos_data_partition = 0;
-    //
-    //        for (int[] datum : data) {
-    //            if (datum[1] > third_value[third_value.length - 1]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //            for (int[] datum : data) {
-    //                if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-    //                    data_partition[pos_data_partition][0] = datum[0];
-    //                    data_partition[pos_data_partition][1] = datum[1];
-    //                    pos_data_partition++;
-    //                }
-    //            }
-    //        }
-    //        for (int[] datum : data) {
-    //            if (datum[1] <= third_value[0]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int i = 0; i < block_num; i++) {
-    //            int[][] ts_block_time = new int[block_size][2];
-    //            int[][] ts_block_value = new int[block_size][2];
-    //            int[][] ts_block_partition = new int[block_size][2];
-    //
-    //            for (int j = 0; j < block_size; j++) {
-    //                ts_block_time[j][0] = data[j + i * block_size][0];
-    //                ts_block_time[j][1] = data[j + i * block_size][1];
-    //                ts_block_value[j][0] = data_value[j + i * block_size][0];
-    //                ts_block_value[j][1] = data_value[j + i * block_size][1];
-    //                ts_block_partition[j][0] = data_partition[j + i * block_size][0];
-    //                ts_block_partition[j][1] = data_partition[j + i * block_size][1];
-    //            }
-    //
-    //            int[] raw_length = new int[5];
-    //            float[] theta = new float[4];
-    //            int[][] ts_block_delta = getEncodeBitsRegression(ts_block_time, block_size,
-    // raw_length, theta, segment_size);
-    //            int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //            length_time += numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments,
-    // raw_length, segment_size, theta);
-    //
-    //
-    //            int[] raw_length_value = new int[5];
-    //            float[] theta_value = new float[4];
-    //            int[][] ts_block_delta_value = getEncodeBitsRegression(ts_block_value, block_size,
-    // raw_length_value, theta_value, segment_size);
-    //            int[][] bit_width_segments_value = segmentBitPacking(ts_block_delta_value,
-    // block_size, segment_size);
-    //            length_value += numberOfEncodeSegment2Bytes(ts_block_delta_value,
-    // bit_width_segments_value, raw_length_value, segment_size, theta_value);
-    //
-    //            int[] raw_length_partition = new int[5];
-    //            float[] theta_partition = new float[4];
-    //            int[][] ts_block_delta_partition = getEncodeBitsRegression(ts_block_partition,
-    // block_size, raw_length_partition, theta_partition, segment_size);
-    //            int[][] bit_width_segments_partition = segmentBitPacking(ts_block_delta_partition,
-    // block_size, segment_size);
-    //            length_partition += numberOfEncodeSegment2Bytes(ts_block_delta_partition,
-    // bit_width_segments_partition, raw_length_partition, segment_size, theta_partition);
-    //
-    //        }
-    //
-
-    //        if (length_partition < length_time && length_partition < length_value) { // partition
-    // performs better
-    //            data = data_partition;
-    //
-    //                System.out.println("Partition");
-    //            for (int i = 0; i < block_num; i++) {
-    //                encode_pos = REGERBlockEncoderPartition(data, i, block_size, segment_size, k,
-    // encode_pos, encoded_result);
-    //            }
-    //        } else {
-    //            if (length_value < length_time) { // order by value performs better
-    //                System.out.println("Value");
-    //                data = data_value;
-    ////                for (int i = 0; i < 2; i++) {
-    //                for (int i = 0; i < block_num; i++) {
-    //
-    //                    encode_pos = REGERBlockEncoder(data, 1, i, block_size, 0, third_value,
-    // segment_size, k, encode_pos, encoded_result);
-    //                }
-    //            } else {
-    //                System.out.println("Time");
-    for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockEncoder(
-              data, 0, i, block_size, 0, third_value, segment_size, k, encode_pos, encoded_result);
-    }
-    //            }
-    //
-    //        }
-
-    //
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              0,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result);
-    }
-    return encode_pos;
-  }
-
-  public static int REGERBlockDecoder(
-      byte[] encoded,
-      int decode_pos,
-      int[][] value_list,
-      int block_size,
-      int segment_size,
-      int[] value_pos_arr) {
-
-    int time0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = time0;
-    int value0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = value0;
-
-    value_pos_arr[0]++;
-
-    float theta_time0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_time1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    float theta_value0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_value1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-    int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-
-    int count;
-    int num;
-    int segment_n = block_size / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    int pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_time_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-
-      decode_pos++;
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][0] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_value_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][1] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    int pre_time = time0;
-    int pre_value = value0;
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      int[] decode_time_result = new int[segment_size];
-      int[] decode_value_result = new int[segment_size];
-
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-      int pos_time = value_pos_arr[0];
-      for (int delta_time : decode_time_result) {
-        pre_time = (int) (theta_time0 + theta_time1 * (double) delta_time) + pre_time;
-        value_list[pos_time][0] = pre_time;
-        pos_time++;
-      }
-      int pos_value = value_pos_arr[0];
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-      for (int delta_value : decode_value_result) {
-        pre_value = (int) (theta_value0 + theta_value1 * (double) delta_value) + pre_value;
-        value_list[pos_value][1] = pre_value;
-        pos_value++;
-      }
-      value_pos_arr[0] = pos_value;
-    }
-
-    return decode_pos;
-  }
-
-  public static void REGERDecoder(byte[] encoded) {
-
-    int decode_pos = 0;
-    int length_all = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int block_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int segment_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int remain_length = length_all - block_num * block_size;
-    int zero_number;
-    if (remain_length % segment_size == 0) {
-      zero_number = 1;
-    } else if (remain_length % segment_size == 1) {
-      zero_number = 0;
-    } else {
-      zero_number = segment_size + 1 - remain_length % segment_size;
-    }
-    int[][] value_list = new int[length_all + segment_size][2];
-
-    int[] value_pos_arr = new int[1];
-
-    //        for (int k = 0; k < 2; k++) {
-    for (int k = 0; k < block_num; k++) {
-      //            System.out.println("k="+k);
-      decode_pos =
-          REGERBlockDecoder(
-              encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-    }
-
-    if (remain_length == 1) {
-      for (int i = 0; i < remain_length; i++) {
-        int value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = value_end;
-        value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = value_end;
-        value_pos_arr[0]++;
-      }
-    } else {
-      REGERBlockDecoder(
-          encoded,
-          decode_pos,
-          value_list,
-          remain_length + zero_number,
-          segment_size,
-          value_pos_arr);
-    }
-  }
-
-  @Test
-  public void REGER() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger";
-
-//    String parent_dir = "E:\\encoding-reorder-icde\\vldb\\iotdb_datasets_lists\\";
-//    String output_parent_dir = "E:\\encoding-reorder-icde\\compression_ratio\\block_size";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    //String input_parent_dir = parent_dir;
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-    dataset_name.add("FANYP-Sensors");
-    dataset_name.add("TRAJET-Transport");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-    int[] dataset_12 = {0};
-    int[] dataset_13 = {0};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-    dataset_third.add(dataset_12);
-    dataset_third.add(dataset_13);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
-    output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 0; file_i < 1; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        //                f = tempList[1];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        //                System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-        double ratio = 0;
-        double compressed_size = 0;
-        int repeatTime2 = 1;
-        long s = System.nanoTime();
-        int length = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++)
-          length =
-              ReorderingRegressionEncoder(
-                  data2_arr,
-                  dataset_block_size.get(file_i),
-                  dataset_third.get(file_i),
-                  8,
-                  dataset_k.get(file_i),
-                  encoded_result);
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-        compressed_size += length;
-        double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-        ratio += ratioTmp;
-        s = System.nanoTime();
-        for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-        e = System.nanoTime();
-        decodeTime += ((e - s) / repeatTime2);
-
-        String[] record = {
-          f.toString(),
-          "REGER",
-          String.valueOf(encodeTime),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(ratio)
-        };
-        writer.writeRecord(record);
-        System.out.println(ratio);
-
-        //                break;
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERTime() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-
-    //    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-    for (int file_i = 0; file_i < 1; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        //                f = tempList[1];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        //                System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-        double ratio = 0;
-        double compressed_size = 0;
-        int repeatTime2 = 1;
-        long s = System.nanoTime();
-        int length = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++)
-          length =
-              ReorderingRegressionEncoder(
-                  data2_arr,
-                  dataset_block_size.get(file_i),
-                  dataset_third.get(file_i),
-                  8,
-                  dataset_k.get(file_i),
-                  encoded_result);
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-
-        String[] record = {
-          f.toString(),
-          "REGER",
-          String.valueOf(encodeTime),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(ratio)
-        };
-        writer.writeRecord(record);
-        System.out.println(ratio);
-
-        //                break;
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERVaryBlockSize() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/block_size";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 6; file_i < input_path_list.size(); file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Block Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        System.out.println(data2_arr[0][0]);
-        for (int block_size_exp = 13; block_size_exp >= 4; block_size_exp--) {
-          int block_size = (int) Math.pow(2, block_size_exp);
-          System.out.println(block_size);
-
-          byte[] encoded_result = new byte[data2_arr.length * 12];
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int repeatTime2 = 10;
-          long s = System.nanoTime();
-          int length = 0;
-          for (int repeat = 0; repeat < repeatTime2; repeat++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr,
-                    block_size,
-                    dataset_third.get(file_i),
-                    8,
-                    dataset_k.get(file_i),
-                    encoded_result);
-          long e = System.nanoTime();
-          encodeTime += ((e - s) / repeatTime2);
-          compressed_size += length;
-          double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-          e = System.nanoTime();
-          decodeTime += ((e - s) / repeatTime2);
-
-          String[] record = {
-            f.toString(),
-            "REGER",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(compressed_size),
-            String.valueOf(block_size_exp),
-            String.valueOf(ratio)
-          };
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERVaryPackSize() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/pack_size";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(1024);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 0; file_i < 1; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Block Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        System.out.println(data2_arr[0][0]);
-        for (int segment_size_exp = 6; segment_size_exp > 2; segment_size_exp--) {
-          int segment_size = (int) Math.pow(2, segment_size_exp);
-          System.out.println(segment_size);
-
-          byte[] encoded_result = new byte[data2_arr.length * 12];
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int repeatTime2 = 10;
-          long s = System.nanoTime();
-          int length = 0;
-          for (int repeat = 0; repeat < repeatTime2; repeat++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr,
-                    dataset_block_size.get(file_i),
-                    dataset_third.get(file_i),
-                    segment_size,
-                    dataset_k.get(file_i),
-                    encoded_result);
-          long e = System.nanoTime();
-          encodeTime += ((e - s) / repeatTime2);
-          compressed_size += length;
-          double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-          e = System.nanoTime();
-          decodeTime += ((e - s) / repeatTime2);
-
-          String[] record = {
-            f.toString(),
-            "REGER",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(compressed_size),
-            String.valueOf(segment_size_exp),
-            String.valueOf(ratio)
-          };
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERTimeTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERTimeTest.java
deleted file mode 100644
index 7d44242..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERTimeTest.java
+++ /dev/null
@@ -1,5323 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-
-import static java.lang.Math.abs;
-import static java.lang.Math.min;
-
-public class REGERTimeTest {
-  public static int getBitWith(int num) {
-    if (num == 0) return 1;
-    else return 32 - Integer.numberOfLeadingZeros(num);
-  }
-
-  public static boolean containsValue(int[] array, int targetValue) {
-    for (int value : array) {
-      if (value == targetValue) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static int[] removeElement(int[] array, int position) {
-    if (position < 0 || position >= array.length) {
-      return array;
-    }
-
-    int[] newArray = new int[array.length - 1];
-    int newIndex = 0;
-
-    for (int i = 0; i < array.length; i++) {
-      if (i != position) {
-        newArray[newIndex] = array[i];
-        newIndex++;
-      }
-    }
-
-    return newArray;
-  }
-
-  public static int min3(int a, int b, int c) {
-    if (a < b && a < c) {
-      return 0;
-    } else if (b < c) {
-      return 1;
-    } else {
-      return 2;
-    }
-  }
-
-  public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 24);
-    cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-    cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 3] = (byte) (integer);
-  }
-
-  public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer);
-  }
-
-  public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 1] = (byte) (integer);
-  }
-
-  public static int bytes2Integer(byte[] encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded[i + start] & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  private static int byte2Integer(byte[] encoded, int decode_pos) {
-    int value = 0;
-    int b = encoded[decode_pos] & 0xFF;
-    value |= b;
-    if (value == 0) return 256;
-    return value % 256;
-  }
-
-  public static void pack8Values(
-      ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values.get(valueIdx) << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values.get(valueIdx) << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values.get(valueIdx) >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static void pack8Values(
-      int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values[valueIdx][index] << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values[valueIdx][index] << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values[valueIdx][index] >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static int unpack8Values(
-      byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-    int byteIdx = offset;
-    //        int pos_encode = 0;
-    long buffer = 0;
-    // total bits which have read from 'buf' to 'buffer'. i.e.,
-    // number of available bits to be decoded.
-    int totalBits = 0;
-    int valueIdx = 0;
-
-    while (valueIdx < 8) {
-      // If current available bits are not enough to decode one Integer,
-      // then add next byte from buf to 'buffer' until totalBits >= width
-      while (totalBits < width) {
-        buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-        byteIdx++;
-        totalBits += 8;
-      }
-
-      // If current available bits are enough to decode one Integer,
-      // then decode one Integer one by one until left bits in 'buffer' is
-      // not enough to decode one Integer.
-      while (totalBits >= width && valueIdx < 8) {
-        result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-        value_pos++;
-        valueIdx++;
-        totalBits -= width;
-        buffer = buffer & ((1L << totalBits) - 1);
-      }
-    }
-    return value_pos;
-  }
-
-  public static int bitPacking(
-      int[][] numbers,
-      int index,
-      int start,
-      int block_size,
-      int bit_width,
-      int encode_pos,
-      byte[] encoded_result) {
-    int block_num = block_size / 8;
-    for (int i = 0; i < block_num; i++) {
-      pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-      encode_pos += bit_width;
-    }
-
-    return encode_pos;
-  }
-
-  public static int decodeBitPacking(
-      byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-    int block_num = block_size / 8;
-    int value_pos = 0;
-
-    for (int i = 0; i < block_num; i++) { // bitpacking
-      value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-      decode_pos += bit_width;
-    }
-    return decode_pos;
-  }
-
-  public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-    int fbit = Float.floatToIntBits(f);
-    byte[] b = new byte[4];
-    for (int i = 0; i < 4; i++) {
-      b[i] = (byte) (fbit >> (24 - i * 8));
-    }
-    int len = b.length;
-
-    System.arraycopy(b, 0, encode_result, pos_encode, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = encode_result[i + pos_encode];
-      encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-      encode_result[len - i - 1 + pos_encode] = temp;
-    }
-  }
-
-  public static float bytes2float(byte[] b, int index) {
-    int l;
-    l = b[index];
-    l &= 0xff;
-    l |= ((long) b[index + 1] << 8);
-    l &= 0xffff;
-    l |= ((long) b[index + 2] << 16);
-    l &= 0xffffff;
-    l |= ((long) b[index + 3] << 24);
-    return Float.intBitsToFloat(l);
-  }
-
-  public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded.get(i + start) & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  public static int part(int[][] arr, int index, int low, int high) {
-    int[] tmp = arr[low];
-    while (low < high) {
-      while (low < high
-          && (arr[high][index] > tmp[index]
-              || (Objects.equals(arr[high][index], tmp[index])
-                  && arr[high][index ^ 1] >= tmp[index ^ 1]))) {
-        high--;
-      }
-      arr[low][0] = arr[high][0];
-      arr[low][1] = arr[high][1];
-      while (low < high
-          && (arr[low][index] < tmp[index]
-              || (Objects.equals(arr[low][index], tmp[index])
-                  && arr[low][index ^ 1] <= tmp[index ^ 1]))) {
-        low++;
-      }
-      arr[high][0] = arr[low][0];
-      arr[high][1] = arr[low][1];
-    }
-    arr[low][0] = tmp[0];
-    arr[low][1] = tmp[1];
-    return low;
-  }
-
-  public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    ArrayList<Integer> tmp = arr.get(low);
-    while (low < high) {
-      while (low < high
-          && (arr.get(high).get(index) > tmp.get(index)
-              || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                  && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-        high--;
-      }
-      arr.set(low, arr.get(high));
-      while (low < high
-          && (arr.get(low).get(index) < tmp.get(index)
-              || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                  && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-        low++;
-      }
-      arr.set(high, arr.get(low));
-    }
-    arr.set(low, tmp);
-    return low;
-  }
-
-  public static int getCommon(int m, int n) {
-    int z;
-    while (m % n != 0) {
-      z = m % n;
-      m = n;
-      n = z;
-    }
-    return n;
-  }
-
-  public static void splitTimeStamp3(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-    int td_common = 0;
-    for (int i = 1; i < ts_block.size(); i++) {
-      int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-      if (td_common == 0) {
-        if (time_diffi != 0) {
-          td_common = time_diffi;
-        }
-        continue;
-      }
-      if (time_diffi != 0) {
-        td_common = getCommon(time_diffi, td_common);
-        if (td_common == 1) {
-          break;
-        }
-      }
-    }
-    if (td_common == 0) {
-      td_common = 1;
-    }
-
-    int t0 = ts_block.get(0).get(0);
-    for (int i = 0; i < ts_block.size(); i++) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-      tmp.add(t0 + interval_i);
-      tmp.add(ts_block.get(i).get(1));
-      ts_block.set(i, tmp);
-    }
-    result.add(td_common);
-  }
-
-  private static void adjust1TimeCost(
-      int[][] ts_block, int i, int[] raw_length, int[] min_index, float[] theta) {
-
-    int block_size = ts_block.length;
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-
-    int min_delta_time = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-    int min_delta_time_i = min_delta_time;
-    int min_delta_time_index = i;
-
-    for (int j = 1; j < block_size; j++) {
-      int timestamp_delta_i =
-          ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      if (timestamp_delta_i < min_delta_time) {
-        min_delta_time_index = j;
-        min_delta_time = timestamp_delta_i;
-      }
-    }
-    raw_length[0] += (getBitWith(min_delta_time_i - min_delta_time) * (block_size - 1));
-    raw_length[3] = min_delta_time;
-    min_index[0] = min_delta_time_index;
-  }
-
-  private static void adjust1ValueCost(
-      int[][] ts_block, int i, int[] raw_length, int[] min_index, float[] theta) {
-
-    int block_size = ts_block.length;
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int min_delta_value = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-    int min_delta_value_i = min_delta_value;
-    int min_delta_value_index = i;
-
-    for (int j = 1; j < block_size; j++) {
-      int value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      if (value_delta_i < min_delta_value) {
-        min_delta_value_index = j;
-        min_delta_value = value_delta_i;
-      }
-    }
-    raw_length[0] += (getBitWith(min_delta_value_i - min_delta_value) * (block_size - 1));
-    raw_length[3] = min_delta_value;
-    min_index[1] = min_delta_value_index;
-  }
-
-  private static int[] adjust0MinChange(int[][] ts_block, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != block_size;
-
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int pos_ts_block_delta = 0;
-    for (int i = 2; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i != j) {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      } else {
-        timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-        value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-        ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-        ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-        pos_ts_block_delta++;
-
-        if (timestamp_delta_i > timestamp_delta_max) {
-          timestamp_delta_max = timestamp_delta_i;
-        }
-        if (timestamp_delta_i < timestamp_delta_min) {
-          timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i > value_delta_max) {
-          value_delta_max = value_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-          value_delta_min = value_delta_i;
-        }
-        timestamp_delta_i =
-            ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i > timestamp_delta_max) {
-        timestamp_delta_max = timestamp_delta_i;
-      }
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i > value_delta_max) {
-        value_delta_max = value_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int length = 0;
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjust0MinChangeNo(
-      int[][] ts_block, int[] raw_length, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != block_size;
-
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[j + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i = ts_block[j + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[j + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust 0 to n
-  private static int[] adjust0n1MinChange(int[][] ts_block, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-    int pos_ts_block_delta = 0;
-    int length = 0;
-    for (int i = 2; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      timestamp_delta_i = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-      value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-    ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-    ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-    pos_ts_block_delta++;
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      value_delta_min = value_delta_i;
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjust0n1MinChangeNo(int[][] ts_block, int[] raw_length, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i = ts_block[1][0] - (int) (theta0_t + theta1_t * (float) ts_block[0][0]);
-    value_delta_i = ts_block[1][1] - (int) (theta0_v + theta1_v * (float) ts_block[0][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust n to no 0
-  private static int[] adjustnMinChange(int[][] ts_block, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int length = 0;
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size - 1; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i != j) {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-        value_delta_i =
-            ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-        ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-        ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-        pos_ts_block_delta++;
-        if (timestamp_delta_i < timestamp_delta_min) {
-          timestamp_delta_min = timestamp_delta_i;
-        }
-        if (value_delta_i < value_delta_min) {
-          value_delta_min = value_delta_i;
-        }
-
-        timestamp_delta_i =
-            ts_block[block_size - 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i =
-            ts_block[block_size - 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustnMinChangeNo(
-      int[][] ts_block, int[] raw_length, int j, float[] theta) {
-    int block_size = ts_block.length;
-    assert j != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[block_size - 1][0]
-            - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 2][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1]
-            - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 2][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[block_size - 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust n to 0
-  private static int[] adjustn0MinChange(int[][] ts_block, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int length = 0;
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size - 1; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      timestamp_delta_i = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-      value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-    ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-    ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-    pos_ts_block_delta++;
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      value_delta_min = value_delta_i;
-    }
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustn0MinChangeNo(int[][] ts_block, int[] raw_length, float[] theta) {
-    int block_size = ts_block.length;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[block_size - 1][0]
-            - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 2][0]);
-    value_delta_i =
-        ts_block[block_size - 1][1]
-            - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 2][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // adjust alpha to j
-
-  private static int[] adjustAlphaToJMinChange(int[][] ts_block, int alpha, int j, float[] theta) {
-
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    assert j != 0;
-    assert j != block_size;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int length = 0;
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == j) {
-        timestamp_delta_i =
-            ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-        value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-        value_delta_i =
-            ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      } else if (i == alpha + 1) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustAlphaToJMinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, int j, float[] theta) {
-
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    assert j != 0;
-    assert j != block_size;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-    value_delta_i = ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // move alpha to 0
-  private static int[] adjustTo0MinChange(int[][] ts_block, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int pos_ts_block_delta = 0;
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == (alpha + 1)) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-        value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-    int length = 0;
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustTo0MinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i = ts_block[0][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i = ts_block[0][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  // move alpha to n
-  private static int[] adjustTonMinChange(int[][] ts_block, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    int pos_ts_block_delta = 0;
-    int length = 0;
-
-    for (int i = 1; i < block_size; i++) {
-      int timestamp_delta_i;
-      int value_delta_i;
-      if (i == (alpha + 1)) {
-        timestamp_delta_i =
-            ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-        value_delta_i =
-            ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-      } else if (i == alpha) {
-        timestamp_delta_i =
-            ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-        value_delta_i =
-            ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-      } else {
-        timestamp_delta_i =
-            ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]);
-        value_delta_i = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]);
-      }
-      ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i;
-      ts_block_delta[pos_ts_block_delta][1] = value_delta_i;
-      pos_ts_block_delta++;
-      if (timestamp_delta_i < timestamp_delta_min) {
-        timestamp_delta_min = timestamp_delta_i;
-      }
-      if (value_delta_i < value_delta_min) {
-        value_delta_min = value_delta_i;
-      }
-    }
-
-    for (int[] segment_max : ts_block_delta) {
-      length += getBitWith(segment_max[0] - timestamp_delta_min);
-      length += getBitWith(segment_max[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustTonMinChangeNo(
-      int[][] ts_block, int[] raw_length, int alpha, float[] theta) {
-    int block_size = ts_block.length;
-    assert alpha != block_size - 1;
-    assert alpha != 0;
-    int[] b = new int[3];
-    int timestamp_delta_min = raw_length[3];
-    int value_delta_min = raw_length[4];
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int length = raw_length[0];
-
-    int timestamp_delta_i;
-    int value_delta_i;
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha][1]);
-
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-    length -= getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length -= getBitWith(value_delta_i - value_delta_min);
-
-    timestamp_delta_i =
-        ts_block[alpha + 1][0] - (int) (theta0_t + theta1_t * (float) ts_block[alpha - 1][0]);
-    value_delta_i =
-        ts_block[alpha + 1][1] - (int) (theta0_v + theta1_v * (float) ts_block[alpha - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-    timestamp_delta_i =
-        ts_block[alpha][0] - (int) (theta0_t + theta1_t * (float) ts_block[block_size - 1][0]);
-    value_delta_i =
-        ts_block[alpha][1] - (int) (theta0_v + theta1_v * (float) ts_block[block_size - 1][1]);
-
-    if (timestamp_delta_i < timestamp_delta_min) {
-      length += getBitWith(timestamp_delta_min - timestamp_delta_i) * (block_size - 1);
-      timestamp_delta_min = timestamp_delta_i;
-    }
-    if (value_delta_i < value_delta_min) {
-      length += getBitWith(value_delta_min - value_delta_i) * (block_size - 1);
-      value_delta_min = value_delta_i;
-    }
-    length += getBitWith(timestamp_delta_i - timestamp_delta_min);
-    length += getBitWith(value_delta_i - value_delta_min);
-
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int getIstarClose(
-      int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-    int min_i = 0;
-    int min_dis = Integer.MAX_VALUE;
-    for (int i = 0; i < j_star_list.size(); i++) {
-      if (abs(alpha - j_star_list.get(i)) < min_dis) {
-        min_i = j_star_list.get(i);
-        min_dis = abs(alpha - j_star_list.get(i));
-        raw_length[0] = new_length_list[i][0];
-        raw_length[3] = new_length_list[i][1];
-        raw_length[4] = new_length_list[i][2];
-      }
-    }
-    if (min_dis == 0) {
-      System.out.println("get IstarClose error");
-      return 0;
-    }
-    return min_i;
-  }
-
-  public static int[][] getEncodeBitsRegression(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-
-    long sum_X_r = 0;
-    long sum_Y_r = 0;
-    long sum_squ_X_r = 0;
-    long sum_squ_XY_r = 0;
-    long sum_X_v = 0;
-    long sum_Y_v = 0;
-    long sum_squ_X_v = 0;
-    long sum_squ_XY_v = 0;
-
-    for (int i = 1; i < block_size; i++) {
-      sum_X_r += ts_block[i - 1][0];
-      sum_X_v += ts_block[i - 1][1];
-      sum_Y_r += ts_block[i][0];
-      sum_Y_v += ts_block[i][1];
-      sum_squ_X_r += ((long) (ts_block[i - 1][0]) * (ts_block[i - 1][0]));
-      sum_squ_X_v += ((long) ts_block[i - 1][1] * ts_block[i - 1][1]);
-      sum_squ_XY_r += ((long) (ts_block[i - 1][0]) * (ts_block[i][0]));
-      sum_squ_XY_v += ((long) ts_block[i - 1][1] * ts_block[i][1]);
-    }
-
-    int m_reg = block_size - 1;
-    float theta0_r = 0.0F;
-    float theta1_r = 1.0F;
-    if (m_reg * sum_squ_X_r != sum_X_r * sum_X_r) {
-      theta0_r =
-          (float) (sum_squ_X_r * sum_Y_r - sum_X_r * sum_squ_XY_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-      theta1_r =
-          (float) (m_reg * sum_squ_XY_r - sum_X_r * sum_Y_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-    }
-
-    float theta0_v = 0.0F;
-    float theta1_v = 1.0F;
-    if (m_reg * sum_squ_X_v != sum_X_v * sum_X_v) {
-      theta0_v =
-          (float) (sum_squ_X_v * sum_Y_v - sum_X_v * sum_squ_XY_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-      theta1_v =
-          (float) (m_reg * sum_squ_XY_v - sum_X_v * sum_Y_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-    }
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    // delta to Regression
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r = (ts_block[j][0] - (int) (theta0_r + theta1_r * (float) ts_block[j - 1][0]));
-      int epsilon_v = (ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]));
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = epsilon_v;
-      }
-      ts_block_delta[j][0] = epsilon_r;
-      ts_block_delta[j][1] = epsilon_v;
-    }
-
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j > 0; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    theta[0] = theta0_r;
-    theta[1] = theta1_r;
-    theta[2] = theta0_v;
-    theta[3] = theta1_v;
-
-    return ts_block_delta;
-  }
-
-  public static int[][] getEncodeBitsRegressionNoTrain(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta, int segment_size) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    //        System.out.println(Arrays.deepToString(ts_block));
-
-    int pos_ts_block_delta = 0;
-    ts_block_delta[pos_ts_block_delta][0] = ts_block[0][0];
-    ts_block_delta[pos_ts_block_delta][1] = ts_block[0][1];
-    pos_ts_block_delta++;
-
-    int[][] ts_block_delta_segment = new int[block_size][2];
-    int pos_ts_block_delta_segment = 0;
-    int[] tmp_segment = new int[2];
-    int max_interval_segment = Integer.MIN_VALUE;
-    int max_value_segment = Integer.MIN_VALUE;
-    tmp_segment[0] = max_interval_segment;
-    tmp_segment[1] = max_value_segment;
-
-    // delta to Regression
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      int epsilon_v = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = epsilon_v;
-      }
-
-      ts_block_delta[pos_ts_block_delta][0] = epsilon_r;
-      ts_block_delta[pos_ts_block_delta][1] = epsilon_v;
-      pos_ts_block_delta++;
-
-      if (epsilon_r > max_interval_segment) {
-        max_interval_segment = epsilon_r;
-        tmp_segment[0] = max_interval_segment;
-      }
-      if (epsilon_v > max_value_segment) {
-        max_value_segment = epsilon_v;
-        tmp_segment[1] = max_value_segment;
-      }
-      if (j % segment_size == 0) {
-        ts_block_delta_segment[pos_ts_block_delta_segment][0] = tmp_segment[0];
-        ts_block_delta_segment[pos_ts_block_delta_segment][1] = tmp_segment[1];
-        pos_ts_block_delta_segment++;
-        tmp_segment = new int[2];
-        max_interval_segment = Integer.MIN_VALUE;
-        max_value_segment = Integer.MIN_VALUE;
-        tmp_segment[0] = max_interval_segment;
-        tmp_segment[1] = max_value_segment;
-      }
-    }
-
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j > 0; j--) {
-      int epsilon_r = ts_block_delta[j][0] - timestamp_delta_min;
-      int epsilon_v = ts_block_delta[j][1] - value_delta_min;
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-      ts_block_delta[j][0] = epsilon_r;
-      ts_block_delta[j][1] = epsilon_v;
-    }
-
-    for (int j = 0; j < pos_ts_block_delta_segment; j++) {
-      length += getBitWith(ts_block_delta_segment[j][0] - timestamp_delta_min);
-      length += getBitWith(ts_block_delta_segment[j][1] - value_delta_min);
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    //        raw_length = new int[5];
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  public static int getBeta(
-      int[][] ts_block,
-      int alpha,
-      int[] min_index,
-      int block_size,
-      int[] raw_length,
-      float[] theta) {
-
-    int raw_abs_sum = raw_length[0];
-    int[][] new_length_list = new int[block_size][3];
-    int pos_new_length_list = 0;
-
-    ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-    int j_star = -1;
-    int[] b;
-    if (alpha == -1) {
-      return j_star;
-    }
-
-    if (alpha == 0) {
-      if (min_index[0] == 1) {
-        adjust1TimeCost(ts_block, 1, raw_length, min_index, theta);
-      }
-      if (min_index[1] == 1) {
-        adjust1ValueCost(ts_block, 1, raw_length, min_index, theta);
-      }
-
-      for (int j = 2; j < block_size - 1; j++) {
-        // if j, alpha+1, alpha points are min residuals, need to recalculate min residuals
-        if (min_index[0] == (j) || min_index[1] == (j)) { // || min_index.contains(1)
-          b = adjust0MinChange(ts_block, j, theta);
-        } else {
-          b = adjust0MinChangeNo(ts_block, raw_length, j, theta);
-        }
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list = new ArrayList<>();
-          pos_new_length_list = 0;
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      if (min_index[0] == 0 || min_index[1] == 0) {
-        b = adjust0n1MinChange(ts_block, theta);
-      } else {
-        b = adjust0n1MinChangeNo(ts_block, raw_length, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // alpha == n
-    else if (alpha == block_size - 1) {
-      if (min_index[0] == block_size - 1) {
-        adjust1TimeCost(ts_block, block_size - 1, raw_length, min_index, theta);
-      }
-      if (min_index[1] == block_size - 1) {
-        adjust1ValueCost(ts_block, block_size - 1, raw_length, min_index, theta);
-      }
-      for (int j = 1; j < block_size - 1; j++) {
-        if (min_index[0] == (j) || min_index[1] == (j)) { // min_index.contains(block_size - 1) ||
-          b = adjustnMinChange(ts_block, j, theta);
-        } else {
-          b = adjustnMinChangeNo(ts_block, raw_length, j, theta);
-        }
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list = new ArrayList<>();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      if (min_index[0] == 0 || min_index[1] == 0) { // min_index.contains(block_size - 1) ||
-        b = adjustn0MinChange(ts_block, theta);
-      } else {
-        b = adjustn0MinChangeNo(ts_block, raw_length, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list = new ArrayList<>();
-        j_star_list.add(0);
-
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // alpha != 1 and alpha != n
-    else {
-      if (min_index[0] == alpha) {
-        adjust1TimeCost(ts_block, alpha, raw_length, min_index, theta);
-      }
-      if (min_index[1] == alpha) {
-        adjust1ValueCost(ts_block, alpha, raw_length, min_index, theta);
-      }
-      if (min_index[0] == alpha + 1) {
-        adjust1TimeCost(ts_block, alpha + 1, raw_length, min_index, theta);
-      }
-      if (min_index[1] == alpha + 1) {
-        adjust1ValueCost(ts_block, alpha + 1, raw_length, min_index, theta);
-      }
-      for (int j = 1; j < block_size - 1; j++) {
-        if (alpha != j && (alpha + 1) != j) {
-          if (min_index[0] == (j)
-              || min_index[1]
-                  == (j)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-            b = adjustAlphaToJMinChange(ts_block, alpha, j, theta);
-          } else {
-            b = adjustAlphaToJMinChangeNo(ts_block, raw_length, alpha, j, theta);
-          }
-          if (b[0] < raw_abs_sum) {
-            raw_abs_sum = b[0];
-            j_star_list = new ArrayList<>();
-            j_star_list.add(j);
-            pos_new_length_list = 0;
-            System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-            pos_new_length_list++;
-          } else if (b[0] == raw_abs_sum) {
-            j_star_list.add(j);
-            System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-            pos_new_length_list++;
-          }
-        }
-      }
-      if (min_index[0] == 0
-          || min_index[1] == 0) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-        b = adjustTo0MinChange(ts_block, alpha, theta);
-      } else {
-        b = adjustTo0MinChangeNo(ts_block, raw_length, alpha, theta);
-      }
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-      if (min_index[0] == (block_size - 1)
-          || min_index[1]
-              == (block_size
-                  - 1)) { // || min_index.contains(alpha) || min_index.contains(alpha + 1)
-        b = adjustTonMinChange(ts_block, alpha, theta);
-      } else {
-        b = adjustTonMinChangeNo(ts_block, raw_length, alpha, theta);
-      }
-
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list = new ArrayList<>();
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    }
-    int[][] new_new_length_list = new int[pos_new_length_list][5];
-    for (int i = 0; i < pos_new_length_list; i++) {
-      System.arraycopy(new_new_length_list[i], 0, new_length_list[i], 0, 3);
-    }
-
-    if (j_star_list.size() != 0) {
-      j_star = getIstarClose(alpha, j_star_list, new_new_length_list, raw_length);
-    }
-    return j_star;
-  }
-
-  //  ArrayList<Integer>
-  public static int[] getIStar(
-      int[][] ts_block, int[] min_index, int block_size, int index, float[] theta, int k) {
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_v_j = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      int epsilon_r_j = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = epsilon_v_j;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = epsilon_r_j;
-      }
-      //      ts_block_delta.add(tmp);
-      if (epsilon_r_j < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r_j;
-        timestamp_delta_min_index = j;
-      }
-      if (epsilon_v_j < value_delta_min) {
-        value_delta_min = epsilon_v_j;
-        value_delta_min_index = j;
-      }
-    }
-    min_index[0] = (timestamp_delta_min_index);
-    min_index[1] = (value_delta_min_index);
-    Arrays.sort(
-        ts_block_delta,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int[] alpha_list = new int[k + 1];
-
-    alpha_list[0] = ts_block_delta[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta[block_size - 2 - k][0];
-    }
-    return alpha_list;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block, int[] min_index, int block_size, float[] theta, int k) {
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[] alpha_list = new int[2 * k + 2];
-
-    int[][] ts_block_delta_time = new int[block_size - 1][2];
-    int[][] ts_block_delta_value = new int[block_size - 1][2];
-
-    float theta0_t = theta[0];
-    float theta1_t = theta[1];
-    float theta0_v = theta[2];
-    float theta1_v = theta[3];
-
-    for (int j = 1; j < block_size; j++) {
-      int epsilon_r_j = ts_block[j][0] - (int) (theta0_t + theta1_t * (float) ts_block[j - 1][0]);
-      int epsilon_v_j = ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]);
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = epsilon_r_j;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = epsilon_v_j;
-
-      if (epsilon_v_j > value_delta_max) {
-        value_delta_max = epsilon_v_j;
-      }
-      if (epsilon_v_j < value_delta_min) {
-        value_delta_min = epsilon_v_j;
-      }
-      if (epsilon_r_j > timestamp_delta_max) {
-        timestamp_delta_max = epsilon_r_j;
-      }
-      if (epsilon_r_j < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r_j;
-      }
-    }
-    Arrays.sort(
-        ts_block_delta_time,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    min_index[0] = (ts_block_delta_time[0][0]);
-    alpha_list[0] = ts_block_delta_time[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta_time[block_size - 2 - k][0];
-    }
-
-    Arrays.sort(
-        ts_block_delta_value,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int pos_alpha_list = k + 1;
-    min_index[1] = (ts_block_delta_value[0][0]);
-    if (!containsValue(alpha_list, ts_block_delta_value[0][0])) {
-      alpha_list[pos_alpha_list] = ts_block_delta_value[0][0];
-      pos_alpha_list++;
-    }
-
-    for (int i = 0; i < k; i++) {
-      if (!containsValue(alpha_list, ts_block_delta_value[block_size - 2 - k][0])) {
-        alpha_list[pos_alpha_list] = ts_block_delta_value[block_size - 2 - k][0];
-        pos_alpha_list++;
-      }
-    }
-    int[] new_alpha_list = new int[pos_alpha_list];
-    System.arraycopy(alpha_list, 0, new_alpha_list, 0, pos_alpha_list);
-
-    return new_alpha_list;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(int[][] bit_width_segments) {
-    int encoded_result = 0;
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          pos_time++;
-          count_of_time = 1;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      pos_value++;
-    }
-
-    encoded_result += (pos_time * 2);
-    encoded_result += (pos_value * 2);
-
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(
-      int[][] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-    intWord2Bytes(pos_time, pos_encode, encoded_result);
-    pos_encode += 2;
-    intWord2Bytes(pos_value, pos_encode, encoded_result);
-    pos_encode += 2;
-
-    for (int i = 0; i < pos_time; i++) {
-      int[] bit_width_time = run_length_time[i];
-      intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-      pos_encode++;
-    }
-    for (int i = 0; i < pos_value; i++) {
-      int[] bit_width_value = run_length_value[i];
-      intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-      pos_encode++;
-    }
-
-    return pos_encode;
-  }
-
-  public static int[][] segmentBitPacking(
-      int[][] ts_block_delta, int block_size, int segment_size) {
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    return bit_width_segments;
-  }
-
-  public static void moveAlphaToBeta(int[][] ts_block, int alpha, int beta) {
-    int[] tmp_tv = ts_block[alpha].clone();
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ts_block[u + 1][0] = ts_block[u][0];
-        ts_block[u + 1][1] = ts_block[u][1];
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ts_block[u - 1][0] = ts_block[u][0];
-        ts_block[u - 1][1] = ts_block[u][1];
-      }
-      beta--;
-    }
-    ts_block[beta][0] = tmp_tv[0];
-    ts_block[beta][1] = tmp_tv[1];
-  }
-
-  private static int numberOfEncodeSegment2Bytes(
-      int[][] delta_segments, int[][] bit_width_segments, int segment_size) {
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int result = 0;
-    //        result += 8; // encode interval0 and value0
-    //        result += 16; // encode theta
-    //        result += encodeRLEBitWidth2Bytes(bit_width_segments);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      result += (segment_size * bit_width_time / 8);
-      result += (segment_size * bit_width_value / 8);
-    }
-
-    return result;
-  }
-
-  private static int encodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      float[] theta,
-      int pos_encode,
-      byte[] encoded_result) {
-
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int2Bytes(delta_segments[0][0], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(delta_segments[0][1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[0] + raw_length[3], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[2] + raw_length[4], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[3], pos_encode, encoded_result);
-    pos_encode += 4;
-
-    pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              0,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_time,
-              pos_encode,
-              encoded_result);
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              1,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_value,
-              pos_encode,
-              encoded_result);
-    }
-
-    return pos_encode;
-  }
-
-  private static int REGERBlockEncoderPartition(
-      int[][] data,
-      int i,
-      int block_size,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block = new int[block_size][2];
-    int[][] ts_block_reorder = new int[block_size][2];
-    for (int j = 0; j < block_size; j++) {
-      //            data[j + i * block_size][0] -= min_time;
-      ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-      ts_block[j][1] = data[j + i * block_size][1];
-      ts_block_reorder[j][0] = data[j + i * block_size][0];
-      ts_block_reorder[j][1] = data[j + i * block_size][1];
-    }
-
-    // raw-order
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta = getEncodeBitsRegression(ts_block, block_size, raw_length, theta);
-    int[][] bit_width_segments_partition =
-        segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-          return Integer.compare(a[0], b[0]);
-        });
-    //    quickSort(ts_block, 0, 0, block_size - 1);
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[][] ts_block_delta_time =
-        getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-    int[][] bit_width_segments_time =
-        segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    // value-order
-    //    quickSort(ts_block, 1, 0, block_size - 1);
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[][] ts_block_delta_reorder =
-        getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-    int[][] bit_width_segments_value =
-        segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments_value, segment_size);
-
-    int[] alpha_list;
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    //        ArrayList<Integer> min_index = new ArrayList<>();
-
-    int[] min_index = new int[2];
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, k);
-    } else if (choose == 1) {
-      ts_block = ts_block_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, k);
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 1, theta, k);
-    }
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-    int[] new_alpha_list = new int[alpha_list.length];
-
-    //    ArrayList<ArrayList<Integer>> new_length_list = new ArrayList<>();
-
-    for (int alpha : alpha_list) {
-      if (alpha == -1) continue;
-      new_alpha_list[pos_new_length_list] = alpha;
-
-      int[] new_min_index = min_index.clone();
-      int[] new_length = raw_length.clone();
-      //            beta_list[j] = 0;
-      beta_list[pos_new_length_list] =
-          getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-      if (beta_list[pos_new_length_list] == -1) continue;
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-
-    int adjust_count = 0;
-    int[][] all_length;
-    while (pos_new_length_list != 0) {
-      if (adjust_count < block_size / 2 && adjust_count < 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-
-      all_length = new int[pos_new_length_list][2];
-      for (int pos_new_length_list_j = 0;
-          pos_new_length_list_j < pos_new_length_list;
-          pos_new_length_list_j++) {
-        all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-        all_length[pos_new_length_list_j][1] = new_length_list[pos_new_length_list_j][0];
-      }
-      Arrays.sort(
-          all_length,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-
-      if (all_length[0][1] <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block, new_alpha_list[all_length[0][0]], beta_list[all_length[0][0]]);
-        int[] new_length = new int[5];
-        ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length, theta);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, segment_size);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      new_alpha_list = new int[alpha_list.length];
-
-      for (int alpha : alpha_list) {
-        if (alpha == -1) continue;
-        new_alpha_list[pos_new_length_list] = alpha;
-
-        int[] new_length = raw_length.clone();
-        //            beta_list[j] = 0;
-        beta_list[pos_new_length_list] =
-            getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-        if (beta_list[pos_new_length_list] == -1) continue;
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-    }
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    return encode_pos;
-  }
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int order,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta_reorder;
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta;
-    int[][] bit_width_segments_partition;
-
-    if (order == 1) {
-
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder, bit_width_segments_value, segment_size);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-
-      ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    } else if (order == 0) {
-
-      ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder, bit_width_segments_value, segment_size);
-    }
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    int[] min_index = new int[2];
-
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      index_alpha_list = 1;
-    }
-
-    int[] alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta, k);
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-    int[] new_alpha_list = new int[alpha_list.length];
-
-    for (int alpha : alpha_list) {
-      if (alpha == -1) continue;
-      new_alpha_list[pos_new_length_list] = alpha;
-
-      int[] new_min_index = min_index.clone();
-      int[] new_length = raw_length.clone();
-
-      beta_list[pos_new_length_list] =
-          getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-      if (beta_list[pos_new_length_list] == -1) continue;
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-
-    int adjust_count = 0;
-
-    int[][] all_length;
-    while (pos_new_length_list != 0) {
-      if (adjust_count < block_size / 2 && adjust_count < 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      all_length = new int[pos_new_length_list][2];
-      for (int pos_new_length_list_j = 0;
-          pos_new_length_list_j < pos_new_length_list;
-          pos_new_length_list_j++) {
-        all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-        all_length[pos_new_length_list_j][1] = new_length_list[pos_new_length_list_j][0];
-      }
-      Arrays.sort(
-          all_length,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-
-      if (all_length[0][1] <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block, new_alpha_list[all_length[0][0]], beta_list[all_length[0][0]]);
-        int[] new_length = new int[5];
-        ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length, theta);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, segment_size);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      new_alpha_list = new int[alpha_list.length];
-
-      for (int alpha : alpha_list) {
-        if (alpha == -1) continue;
-        new_alpha_list[pos_new_length_list] = alpha;
-
-        int[] new_length = raw_length.clone();
-        //            beta_list[j] = 0;
-        beta_list[pos_new_length_list] =
-            getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-        if (beta_list[pos_new_length_list] == -1) continue;
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-    }
-
-    //        printArray(ts_block);
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println(Arrays.deepToString(bit_width_segments));
-    //        System.out.println(Arrays.toString(theta));
-    //        System.out.println("Adjust - encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int ReorderingRegressionEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int k,
-      byte[] encoded_result) {
-    block_size++;
-    //    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-    int length_all = data.length;
-    //        System.out.println(length_all);
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int end_i = min(block_num, 64);
-    for (int i = 0; i < end_i; i++) {
-      //        for (int i = 0; i <6; i++) {
-      //        for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockEncoder(
-              data, 0, i, block_size, 0, third_value, segment_size, k, encode_pos, encoded_result);
-    }
-
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              0,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result);
-    }
-    return encode_pos;
-  }
-
-  private static int REGERBlockOptimal(
-      int[][] data,
-      int order,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta_reorder;
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta;
-    int[][] bit_width_segments_partition;
-
-    ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-    bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-    int pos_ts_block_partition = 0;
-    for (int[] datum : ts_block) {
-      if (datum[1] > third_value[third_value.length - 1]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-    for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-    }
-    for (int[] datum : ts_block) {
-      if (datum[1] <= third_value[0]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-
-    ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-    bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    ts_block_delta_reorder =
-        getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-    bit_width_segments_value = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments_value, segment_size);
-
-    //        ts_block_delta = getEncodeBitsRegression(ts_block, block_size, raw_length, theta);
-    //        bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //        raw_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta,
-    // bit_width_segments_partition, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-          return Integer.compare(a[0], b[0]);
-        });
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-
-    //        System.out.println("choose:"+choose);
-    if (choose == 0) {
-      theta = theta_time.clone();
-      raw_length = time_length.clone();
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-    } else {
-      raw_length = reorder_length.clone();
-      theta = theta_reorder.clone();
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-    }
-
-    int[][] ts_block_optimal = new int[block_size][2]; // ts_block.clone();
-    for (int j = 0; j < block_size; j++) {
-      ts_block_optimal[j][0] = ts_block[j][0];
-      ts_block_optimal[j][1] = ts_block[j][1];
-    }
-    permute(ts_block, 0, ts_block.length - 1, ts_block_optimal, theta, raw_length);
-
-    //        printArray(ts_block_optimal);
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(
-            ts_block_optimal, block_size, raw_length, theta, segment_size);
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println(Arrays.deepToString(bit_width_segments));
-    //        System.out.println(Arrays.toString(theta));
-    //        System.out.println("Optimal - encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int OptimalEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int k,
-      byte[] encoded_result) {
-    block_size++;
-    //    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-    int length_all = data.length;
-    //        System.out.println(length_all);
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int end_i = min(block_num, 64);
-    for (int i = 0; i < end_i; i++) {
-      //            for (int i = 0; i < 6; i++) {
-      //        for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockOptimal(
-              data, 0, i, block_size, 0, third_value, segment_size, k, encode_pos, encoded_result);
-    }
-
-    //        int remaining_length = length_all - block_num * block_size;
-    //        if (remaining_length == 1) {
-    //            int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-    //            encode_pos += 4;
-    //            int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-    //            encode_pos += 4;
-    //        }
-    //        if (remaining_length != 0 && remaining_length != 1) {
-    //            int supple_length;
-    //            if (remaining_length % segment_size == 0) {
-    //                supple_length = 1;
-    //            } else if (remaining_length % segment_size == 1) {
-    //                supple_length = 0;
-    //            } else {
-    //                supple_length = segment_size + 1 - remaining_length % segment_size;
-    //            }
-    //            encode_pos = REGERBlockOptimal(data, 0, block_num, block_size, supple_length +
-    // remaining_length, third_value, segment_size, k, encode_pos, encoded_result);
-    //
-    //        }
-    return encode_pos;
-  }
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta_reorder;
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta;
-    int[][] bit_width_segments_partition;
-
-    //        if (order == 1) {
-    //
-    //            ts_block_delta_reorder = getEncodeBitsRegression(ts_block, block_size,
-    // reorder_length, theta_reorder);
-    //            bit_width_segments_value = segmentBitPacking(ts_block_delta_reorder, block_size,
-    // segment_size);
-    //            reorder_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta_reorder,
-    // bit_width_segments_value, segment_size);
-    //
-    //
-    //            Arrays.sort(ts_block, (a, b) -> {
-    //                if (a[0] == b[0])
-    //                    return Integer.compare(a[1], b[1]);
-    //                return Integer.compare(a[0], b[0]);
-    //            });
-    //
-    //            ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length,
-    // theta_time);
-    //            bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size,
-    // segment_size);
-    //            time_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta_time,
-    // bit_width_segments_time, segment_size);
-    //
-    //
-    //            int pos_ts_block_partition = 0;
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] > third_value[third_value.length - 1]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //            for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //                for (int[] datum : ts_block) {
-    //                    if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i -
-    // 1]) {
-    //                        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                        pos_ts_block_partition++;
-    //                    }
-    //                }
-    //            }
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] <= third_value[0]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //
-    //            ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size,
-    // raw_length, theta);
-    //            bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //            raw_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta,
-    // bit_width_segments_partition, segment_size);
-    //
-    //
-    //        } else if (order == 0) {
-
-    ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-    bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-    int pos_ts_block_partition = 0;
-    for (int[] datum : ts_block) {
-      if (datum[1] > third_value[third_value.length - 1]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-    for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-    }
-    for (int[] datum : ts_block) {
-      if (datum[1] <= third_value[0]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-
-    ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-    bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    ts_block_delta_reorder =
-        getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-    bit_width_segments_value = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments_value, segment_size);
-    //        }
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      index_alpha_list = 1;
-    }
-
-    //        int[] alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta,
-    // k);
-    //        int[] beta_list = new int[alpha_list.length];
-    //        int[][] new_length_list = new int[alpha_list.length][5];
-    //        int pos_new_length_list = 0;
-    //        int[] new_alpha_list = new int[alpha_list.length];
-    //
-    //
-    //        for (int alpha : alpha_list) {
-    //            if (alpha == -1)
-    //                continue;
-    //            new_alpha_list[pos_new_length_list] = alpha;
-    //
-    //            ArrayList<Integer> new_min_index = (ArrayList<Integer>) min_index.clone();
-    //            int[] new_length = raw_length.clone();
-    //
-    //            beta_list[pos_new_length_list] = getBeta(ts_block, alpha, new_min_index,
-    // block_size, new_length, theta);
-    //            if (beta_list[pos_new_length_list] == -1)
-    //                continue;
-    //            System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-    //            pos_new_length_list++;
-    //        }
-    //
-    //        int adjust_count = 0;
-    //
-    //        int[][] all_length;
-    //        while (pos_new_length_list != 0) {
-    //            if (adjust_count < block_size / 2 && adjust_count < 20) {
-    //                adjust_count++;
-    //            } else {
-    //                break;
-    //            }
-    //            all_length = new int[pos_new_length_list][2];
-    //            for (int pos_new_length_list_j = 0; pos_new_length_list_j < pos_new_length_list;
-    // pos_new_length_list_j++) {
-    //                all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-    //                all_length[pos_new_length_list_j][1] =
-    // new_length_list[pos_new_length_list_j][0];
-    //            }
-    //            Arrays.sort(all_length, (a, b) -> {
-    //                if (a[1] == b[1])
-    //                    return Integer.compare(a[0], b[0]);
-    //                return Integer.compare(a[1], b[1]);
-    //            });
-    //
-    //            if (all_length[0][1] <= raw_length[0]) {
-    //                int[][] new_ts_block = ts_block.clone();
-    //                moveAlphaToBeta(new_ts_block, new_alpha_list[all_length[0][0]],
-    // beta_list[all_length[0][0]]);
-    //                int[] new_length = new int[5];
-    //                ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length,
-    // theta);
-    //                int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //                new_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta,
-    // bit_width_segments, segment_size);
-    //
-    //                if (new_length[0] <= raw_length[0]) {
-    //                    raw_length = new_length;
-    //                    ts_block = new_ts_block.clone();
-    //                } else {
-    //                    break;
-    //                }
-    //            } else {
-    //                break;
-    //            }
-    //            alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-    //
-    //            int alpha_size = alpha_list.length;
-    //            for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-    //                if (containsValue(beta_list, alpha_list[alpha_i])) {
-    //                    alpha_list = removeElement(alpha_list, alpha_i);
-    //                }
-    //            }
-    //            beta_list = new int[alpha_list.length];
-    //            new_length_list = new int[alpha_list.length][5];
-    //            pos_new_length_list = 0;
-    //            new_alpha_list = new int[alpha_list.length];
-    //
-    //            for (int alpha : alpha_list) {
-    //                if (alpha == -1)
-    //                    continue;
-    //                new_alpha_list[pos_new_length_list] = alpha;
-    //
-    //                int[] new_length = raw_length.clone();
-    ////            beta_list[j] = 0;
-    //                beta_list[pos_new_length_list] = getBeta(ts_block, alpha, min_index,
-    // block_size, new_length, theta);
-    //                if (beta_list[pos_new_length_list] == -1)
-    //                    continue;
-    //                System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-    //                pos_new_length_list++;
-    //            }
-    //
-    //        }
-    ////        System.out.println(adjust_count);
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  private static int REGERBlockEncoderAdjustCount(
-      int[][] data,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte,
-      double[] adjust_count_arr) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta_reorder;
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta;
-    int[][] bit_width_segments_partition;
-
-    //        if (order == 1) {
-    //
-    //            ts_block_delta_reorder = getEncodeBitsRegression(ts_block, block_size,
-    // reorder_length, theta_reorder);
-    //            bit_width_segments_value = segmentBitPacking(ts_block_delta_reorder, block_size,
-    // segment_size);
-    //            reorder_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta_reorder,
-    // bit_width_segments_value, segment_size);
-    //
-    //
-    //            Arrays.sort(ts_block, (a, b) -> {
-    //                if (a[0] == b[0])
-    //                    return Integer.compare(a[1], b[1]);
-    //                return Integer.compare(a[0], b[0]);
-    //            });
-    //
-    //            ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length,
-    // theta_time);
-    //            bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size,
-    // segment_size);
-    //            time_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta_time,
-    // bit_width_segments_time, segment_size);
-    //
-    //
-    //            int pos_ts_block_partition = 0;
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] > third_value[third_value.length - 1]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //            for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //                for (int[] datum : ts_block) {
-    //                    if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i -
-    // 1]) {
-    //                        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                        pos_ts_block_partition++;
-    //                    }
-    //                }
-    //            }
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] <= third_value[0]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //
-    //            ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size,
-    // raw_length, theta);
-    //            bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //            raw_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta,
-    // bit_width_segments_partition, segment_size);
-    //
-    //
-    //        } else if (order == 0) {
-
-    ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-    bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-    int pos_ts_block_partition = 0;
-    for (int[] datum : ts_block) {
-      if (datum[1] > third_value[third_value.length - 1]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-    for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-    }
-    for (int[] datum : ts_block) {
-      if (datum[1] <= third_value[0]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-
-    ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-    bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    ts_block_delta_reorder =
-        getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-    bit_width_segments_value = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments_value, segment_size);
-    //        }
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    //        ArrayList<Integer> min_index = new ArrayList<>();
-
-    int[] min_index = new int[2];
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      index_alpha_list = 1;
-    }
-
-    int[] alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta, k);
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-    int[] new_alpha_list = new int[alpha_list.length];
-
-    for (int alpha : alpha_list) {
-      if (alpha == -1) continue;
-      new_alpha_list[pos_new_length_list] = alpha;
-
-      int[] new_min_index = min_index.clone();
-      int[] new_length = raw_length.clone();
-
-      beta_list[pos_new_length_list] =
-          getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-      if (beta_list[pos_new_length_list] == -1) continue;
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-
-    int adjust_count = 0;
-
-    int[][] all_length;
-    while (pos_new_length_list != 0) {
-      if (adjust_count < block_size / 2 && adjust_count < 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      all_length = new int[pos_new_length_list][2];
-      for (int pos_new_length_list_j = 0;
-          pos_new_length_list_j < pos_new_length_list;
-          pos_new_length_list_j++) {
-        all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-        all_length[pos_new_length_list_j][1] = new_length_list[pos_new_length_list_j][0];
-      }
-      Arrays.sort(
-          all_length,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-
-      if (all_length[0][1] <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block, new_alpha_list[all_length[0][0]], beta_list[all_length[0][0]]);
-        int[] new_length = new int[5];
-        ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length, theta);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, segment_size);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      new_alpha_list = new int[alpha_list.length];
-
-      for (int alpha : alpha_list) {
-        if (alpha == -1) continue;
-        new_alpha_list[pos_new_length_list] = alpha;
-
-        int[] new_length = raw_length.clone();
-        //            beta_list[j] = 0;
-        beta_list[pos_new_length_list] =
-            getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-        if (beta_list[pos_new_length_list] == -1) continue;
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-    }
-    //        System.out.println(adjust_count);
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    adjust_count_arr[0] += adjust_count;
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int SortEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int k,
-      byte[] encoded_result) {
-    block_size++;
-    //    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-    int length_all = data.length;
-    //        System.out.println(length_all);
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    //        // ----------------------- compare the whole time series order by time, value and
-    // partition ---------------------------
-    //        int length_time = 0;
-    //        int length_value = 0;
-    //        int length_partition = 0;
-    //        int[][] data_value = data.clone();
-    ////        System.out.println(Arrays.deepToString(data_value));
-    ////        quickSort(data_value,1,0,length_all-1);
-    ////        Arrays.sort(data_value, new Comparator<int[]>() {
-    ////            @Override
-    ////            public int compare(int[] a, int[] b) {
-    ////                if (a[1] == b[1])
-    ////                    return Integer.compare(a[0], b[0]);
-    ////                return Integer.compare(a[1], b[1]);
-    ////            }
-    ////        });
-    //        Arrays.sort(data_value, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-    ////        System.out.println(Arrays.deepToString(data_value));
-    //
-    //        int[][] data_partition = new int[length_all][2];
-    //        int pos_data_partition = 0;
-    //
-    //        for (int[] datum : data) {
-    //            if (datum[1] > third_value[third_value.length - 1]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //            for (int[] datum : data) {
-    //                if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-    //                    data_partition[pos_data_partition][0] = datum[0];
-    //                    data_partition[pos_data_partition][1] = datum[1];
-    //                    pos_data_partition++;
-    //                }
-    //            }
-    //        }
-    //        for (int[] datum : data) {
-    //            if (datum[1] <= third_value[0]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int i = 0; i < block_num; i++) {
-    //            int[][] ts_block_time = new int[block_size][2];
-    //            int[][] ts_block_value = new int[block_size][2];
-    //            int[][] ts_block_partition = new int[block_size][2];
-    //
-    //            for (int j = 0; j < block_size; j++) {
-    //                ts_block_time[j][0] = data[j + i * block_size][0];
-    //                ts_block_time[j][1] = data[j + i * block_size][1];
-    //                ts_block_value[j][0] = data_value[j + i * block_size][0];
-    //                ts_block_value[j][1] = data_value[j + i * block_size][1];
-    //                ts_block_partition[j][0] = data_partition[j + i * block_size][0];
-    //                ts_block_partition[j][1] = data_partition[j + i * block_size][1];
-    //            }
-    //
-    //            int[] raw_length = new int[5];
-    //            float[] theta = new float[4];
-    //            int[][] ts_block_delta = getEncodeBitsRegression(ts_block_time, block_size,
-    // raw_length, theta, segment_size);
-    //            int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //            length_time += numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments,
-    // raw_length, segment_size, theta);
-    //
-    //
-    //            int[] raw_length_value = new int[5];
-    //            float[] theta_value = new float[4];
-    //            int[][] ts_block_delta_value = getEncodeBitsRegression(ts_block_value, block_size,
-    // raw_length_value, theta_value, segment_size);
-    //            int[][] bit_width_segments_value = segmentBitPacking(ts_block_delta_value,
-    // block_size, segment_size);
-    //            length_value += numberOfEncodeSegment2Bytes(ts_block_delta_value,
-    // bit_width_segments_value, raw_length_value, segment_size, theta_value);
-    //
-    //            int[] raw_length_partition = new int[5];
-    //            float[] theta_partition = new float[4];
-    //            int[][] ts_block_delta_partition = getEncodeBitsRegression(ts_block_partition,
-    // block_size, raw_length_partition, theta_partition, segment_size);
-    //            int[][] bit_width_segments_partition = segmentBitPacking(ts_block_delta_partition,
-    // block_size, segment_size);
-    //            length_partition += numberOfEncodeSegment2Bytes(ts_block_delta_partition,
-    // bit_width_segments_partition, raw_length_partition, segment_size, theta_partition);
-    //
-    //        }
-    //
-
-    //        if (length_partition < length_time && length_partition < length_value) { // partition
-    // performs better
-    //            data = data_partition;
-    //
-    //                System.out.println("Partition");
-    //            for (int i = 0; i < block_num; i++) {
-    //                encode_pos = REGERBlockEncoderPartition(data, i, block_size, segment_size, k,
-    // encode_pos, encoded_result);
-    //            }
-    //        } else {
-    //            if (length_value < length_time) { // order by value performs better
-    //                System.out.println("Value");
-    //                data = data_value;
-    ////                for (int i = 0; i < 2; i++) {
-    //                for (int i = 0; i < block_num; i++) {
-    //
-    //                    encode_pos = REGERBlockEncoder(data, 1, i, block_size, 0, third_value,
-    // segment_size, k, encode_pos, encoded_result);
-    //                }
-    //            } else {
-    //                System.out.println("Time");
-    for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockEncoder(
-              data, i, block_size, 0, third_value, segment_size, k, encode_pos, encoded_result);
-    }
-    //            }
-    //
-    //        }
-
-    //
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result);
-    }
-    return encode_pos;
-  }
-
-  public static int AdjustEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int k,
-      byte[] encoded_result,
-      double[] adjust_count_arr) {
-    block_size++;
-    //    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-    int length_all = data.length;
-    //        System.out.println(length_all);
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    //        // ----------------------- compare the whole time series order by time, value and
-    // partition ---------------------------
-    //        int length_time = 0;
-    //        int length_value = 0;
-    //        int length_partition = 0;
-    //        int[][] data_value = data.clone();
-    ////        System.out.println(Arrays.deepToString(data_value));
-    ////        quickSort(data_value,1,0,length_all-1);
-    ////        Arrays.sort(data_value, new Comparator<int[]>() {
-    ////            @Override
-    ////            public int compare(int[] a, int[] b) {
-    ////                if (a[1] == b[1])
-    ////                    return Integer.compare(a[0], b[0]);
-    ////                return Integer.compare(a[1], b[1]);
-    ////            }
-    ////        });
-    //        Arrays.sort(data_value, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-    ////        System.out.println(Arrays.deepToString(data_value));
-    //
-    //        int[][] data_partition = new int[length_all][2];
-    //        int pos_data_partition = 0;
-    //
-    //        for (int[] datum : data) {
-    //            if (datum[1] > third_value[third_value.length - 1]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //            for (int[] datum : data) {
-    //                if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-    //                    data_partition[pos_data_partition][0] = datum[0];
-    //                    data_partition[pos_data_partition][1] = datum[1];
-    //                    pos_data_partition++;
-    //                }
-    //            }
-    //        }
-    //        for (int[] datum : data) {
-    //            if (datum[1] <= third_value[0]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int i = 0; i < block_num; i++) {
-    //            int[][] ts_block_time = new int[block_size][2];
-    //            int[][] ts_block_value = new int[block_size][2];
-    //            int[][] ts_block_partition = new int[block_size][2];
-    //
-    //            for (int j = 0; j < block_size; j++) {
-    //                ts_block_time[j][0] = data[j + i * block_size][0];
-    //                ts_block_time[j][1] = data[j + i * block_size][1];
-    //                ts_block_value[j][0] = data_value[j + i * block_size][0];
-    //                ts_block_value[j][1] = data_value[j + i * block_size][1];
-    //                ts_block_partition[j][0] = data_partition[j + i * block_size][0];
-    //                ts_block_partition[j][1] = data_partition[j + i * block_size][1];
-    //            }
-    //
-    //            int[] raw_length = new int[5];
-    //            float[] theta = new float[4];
-    //            int[][] ts_block_delta = getEncodeBitsRegression(ts_block_time, block_size,
-    // raw_length, theta, segment_size);
-    //            int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //            length_time += numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments,
-    // raw_length, segment_size, theta);
-    //
-    //
-    //            int[] raw_length_value = new int[5];
-    //            float[] theta_value = new float[4];
-    //            int[][] ts_block_delta_value = getEncodeBitsRegression(ts_block_value, block_size,
-    // raw_length_value, theta_value, segment_size);
-    //            int[][] bit_width_segments_value = segmentBitPacking(ts_block_delta_value,
-    // block_size, segment_size);
-    //            length_value += numberOfEncodeSegment2Bytes(ts_block_delta_value,
-    // bit_width_segments_value, raw_length_value, segment_size, theta_value);
-    //
-    //            int[] raw_length_partition = new int[5];
-    //            float[] theta_partition = new float[4];
-    //            int[][] ts_block_delta_partition = getEncodeBitsRegression(ts_block_partition,
-    // block_size, raw_length_partition, theta_partition, segment_size);
-    //            int[][] bit_width_segments_partition = segmentBitPacking(ts_block_delta_partition,
-    // block_size, segment_size);
-    //            length_partition += numberOfEncodeSegment2Bytes(ts_block_delta_partition,
-    // bit_width_segments_partition, raw_length_partition, segment_size, theta_partition);
-    //
-    //        }
-    //
-
-    //        if (length_partition < length_time && length_partition < length_value) { // partition
-    // performs better
-    //            data = data_partition;
-    //
-    //                System.out.println("Partition");
-    //            for (int i = 0; i < block_num; i++) {
-    //                encode_pos = REGERBlockEncoderPartition(data, i, block_size, segment_size, k,
-    // encode_pos, encoded_result);
-    //            }
-    //        } else {
-    //            if (length_value < length_time) { // order by value performs better
-    //                System.out.println("Value");
-    //                data = data_value;
-    ////                for (int i = 0; i < 2; i++) {
-    //                for (int i = 0; i < block_num; i++) {
-    //
-    //                    encode_pos = REGERBlockEncoder(data, 1, i, block_size, 0, third_value,
-    // segment_size, k, encode_pos, encoded_result);
-    //                }
-    //            } else {
-    //                System.out.println("Time");
-    for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockEncoderAdjustCount(
-              data,
-              i,
-              block_size,
-              0,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result,
-              adjust_count_arr);
-    }
-    //            }
-    //
-    //        }
-
-    //
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoderAdjustCount(
-              data,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result,
-              adjust_count_arr);
-    }
-    //        adjust_count_arr[0] /= block_num;
-
-    return encode_pos;
-  }
-
-  private static int REGERBlockEncoderTime(
-      int[][] data,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int encode_pos,
-      byte[] cur_byte,
-      long[] time) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    int[] reorder_length = new int[5];
-    float[] theta_reorder = new float[4];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta = new float[4];
-    int[][] ts_block_delta_reorder;
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta;
-    int[][] bit_width_segments_partition;
-
-    //        if (order == 1) {
-    //
-    //            ts_block_delta_reorder = getEncodeBitsRegression(ts_block, block_size,
-    // reorder_length, theta_reorder);
-    //            bit_width_segments_value = segmentBitPacking(ts_block_delta_reorder, block_size,
-    // segment_size);
-    //            reorder_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta_reorder,
-    // bit_width_segments_value, segment_size);
-    //
-    //
-    //            Arrays.sort(ts_block, (a, b) -> {
-    //                if (a[0] == b[0])
-    //                    return Integer.compare(a[1], b[1]);
-    //                return Integer.compare(a[0], b[0]);
-    //            });
-    //
-    //            ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length,
-    // theta_time);
-    //            bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size,
-    // segment_size);
-    //            time_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta_time,
-    // bit_width_segments_time, segment_size);
-    //
-    //
-    //            int pos_ts_block_partition = 0;
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] > third_value[third_value.length - 1]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //            for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //                for (int[] datum : ts_block) {
-    //                    if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i -
-    // 1]) {
-    //                        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                        pos_ts_block_partition++;
-    //                    }
-    //                }
-    //            }
-    //            for (int[] datum : ts_block) {
-    //                if (datum[1] <= third_value[0]) {
-    //                    ts_block_partition[pos_ts_block_partition][0] = datum[0];
-    //                    ts_block_partition[pos_ts_block_partition][1] = datum[1];
-    //                    pos_ts_block_partition++;
-    //                }
-    //            }
-    //
-    //            ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size,
-    // raw_length, theta);
-    //            bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //            raw_length[0] = numberOfEncodeSegment2Bytes(ts_block_delta,
-    // bit_width_segments_partition, segment_size);
-    //
-    //
-    //        } else if (order == 0) {
-
-    long start_sort = System.nanoTime();
-    ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-    bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-    int pos_ts_block_partition = 0;
-    for (int[] datum : ts_block) {
-      if (datum[1] > third_value[third_value.length - 1]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-    for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-    }
-    for (int[] datum : ts_block) {
-      if (datum[1] <= third_value[0]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-
-    ts_block_delta = getEncodeBitsRegression(ts_block_partition, block_size, raw_length, theta);
-    bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments_partition, segment_size);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    ts_block_delta_reorder =
-        getEncodeBitsRegression(ts_block, block_size, reorder_length, theta_reorder);
-    bit_width_segments_value = segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(ts_block_delta_reorder, bit_width_segments_value, segment_size);
-    //        }
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    //        ArrayList<Integer> min_index = new ArrayList<>();
-
-    int[] min_index = new int[2];
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      index_alpha_list = 1;
-    }
-
-    long end_sort = System.nanoTime();
-    time[0] += (end_sort - start_sort);
-
-    long start_alpha_time = System.nanoTime();
-    int[] alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta, k);
-    long end_alpha_time = System.nanoTime();
-    time[1] += (end_alpha_time - start_alpha_time);
-
-    long start_beta_time = System.nanoTime();
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-    int[] new_alpha_list = new int[alpha_list.length];
-    for (int alpha : alpha_list) {
-      if (alpha == -1) continue;
-      new_alpha_list[pos_new_length_list] = alpha;
-
-      int[] new_min_index = min_index.clone();
-
-      int[] new_length = raw_length.clone();
-
-      beta_list[pos_new_length_list] =
-          getBeta(ts_block, alpha, new_min_index, block_size, new_length, theta);
-      if (beta_list[pos_new_length_list] == -1) continue;
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-    long end_beta_time = System.nanoTime();
-    time[2] += (end_beta_time - start_beta_time);
-
-    int adjust_count = 0;
-
-    int[][] all_length;
-    while (pos_new_length_list != 0) {
-      if (adjust_count < block_size / 2 && adjust_count < 30) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      long start_movement_time = System.nanoTime();
-
-      all_length = new int[pos_new_length_list][2];
-      for (int pos_new_length_list_j = 0;
-          pos_new_length_list_j < pos_new_length_list;
-          pos_new_length_list_j++) {
-        all_length[pos_new_length_list_j][0] = pos_new_length_list_j;
-        all_length[pos_new_length_list_j][1] = new_length_list[pos_new_length_list_j][0];
-      }
-      Arrays.sort(
-          all_length,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-
-      if (all_length[0][1] <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block, new_alpha_list[all_length[0][0]], beta_list[all_length[0][0]]);
-        int[] new_length = new int[5];
-        ts_block_delta = getEncodeBitsRegression(new_ts_block, block_size, new_length, theta);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, segment_size);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      long end_movement_time = System.nanoTime();
-      time[3] += (end_movement_time - start_movement_time);
-
-      start_alpha_time = System.nanoTime();
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, k);
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      end_alpha_time = System.nanoTime();
-      time[1] += (end_alpha_time - start_alpha_time);
-
-      start_beta_time = System.nanoTime();
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      new_alpha_list = new int[alpha_list.length];
-
-      for (int alpha : alpha_list) {
-        if (alpha == -1) continue;
-        new_alpha_list[pos_new_length_list] = alpha;
-
-        int[] new_length = raw_length.clone();
-        //            beta_list[j] = 0;
-        beta_list[pos_new_length_list] =
-            getBeta(ts_block, alpha, min_index, block_size, new_length, theta);
-        if (beta_list[pos_new_length_list] == -1) continue;
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-      end_beta_time = System.nanoTime();
-      time[2] += (end_beta_time - start_beta_time);
-    }
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size);
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int TimeEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int k,
-      byte[] encoded_result,
-      long[] time) {
-    block_size++;
-    //    ArrayList<Byte> encoded_result = new ArrayList<Byte>();
-    int length_all = data.length;
-    //        System.out.println(length_all);
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    //        // ----------------------- compare the whole time series order by time, value and
-    // partition ---------------------------
-    //        int length_time = 0;
-    //        int length_value = 0;
-    //        int length_partition = 0;
-    //        int[][] data_value = data.clone();
-    ////        System.out.println(Arrays.deepToString(data_value));
-    ////        quickSort(data_value,1,0,length_all-1);
-    ////        Arrays.sort(data_value, new Comparator<int[]>() {
-    ////            @Override
-    ////            public int compare(int[] a, int[] b) {
-    ////                if (a[1] == b[1])
-    ////                    return Integer.compare(a[0], b[0]);
-    ////                return Integer.compare(a[1], b[1]);
-    ////            }
-    ////        });
-    //        Arrays.sort(data_value, (a, b) -> {
-    //            if (a[1] == b[1])
-    //                return Integer.compare(a[0], b[0]);
-    //            return Integer.compare(a[1], b[1]);
-    //        });
-    ////        System.out.println(Arrays.deepToString(data_value));
-    //
-    //        int[][] data_partition = new int[length_all][2];
-    //        int pos_data_partition = 0;
-    //
-    //        for (int[] datum : data) {
-    //            if (datum[1] > third_value[third_value.length - 1]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-    //            for (int[] datum : data) {
-    //                if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-    //                    data_partition[pos_data_partition][0] = datum[0];
-    //                    data_partition[pos_data_partition][1] = datum[1];
-    //                    pos_data_partition++;
-    //                }
-    //            }
-    //        }
-    //        for (int[] datum : data) {
-    //            if (datum[1] <= third_value[0]) {
-    //                data_partition[pos_data_partition][0] = datum[0];
-    //                data_partition[pos_data_partition][1] = datum[1];
-    //                pos_data_partition++;
-    //            }
-    //        }
-    //        for (int i = 0; i < block_num; i++) {
-    //            int[][] ts_block_time = new int[block_size][2];
-    //            int[][] ts_block_value = new int[block_size][2];
-    //            int[][] ts_block_partition = new int[block_size][2];
-    //
-    //            for (int j = 0; j < block_size; j++) {
-    //                ts_block_time[j][0] = data[j + i * block_size][0];
-    //                ts_block_time[j][1] = data[j + i * block_size][1];
-    //                ts_block_value[j][0] = data_value[j + i * block_size][0];
-    //                ts_block_value[j][1] = data_value[j + i * block_size][1];
-    //                ts_block_partition[j][0] = data_partition[j + i * block_size][0];
-    //                ts_block_partition[j][1] = data_partition[j + i * block_size][1];
-    //            }
-    //
-    //            int[] raw_length = new int[5];
-    //            float[] theta = new float[4];
-    //            int[][] ts_block_delta = getEncodeBitsRegression(ts_block_time, block_size,
-    // raw_length, theta, segment_size);
-    //            int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size,
-    // segment_size);
-    //            length_time += numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments,
-    // raw_length, segment_size, theta);
-    //
-    //
-    //            int[] raw_length_value = new int[5];
-    //            float[] theta_value = new float[4];
-    //            int[][] ts_block_delta_value = getEncodeBitsRegression(ts_block_value, block_size,
-    // raw_length_value, theta_value, segment_size);
-    //            int[][] bit_width_segments_value = segmentBitPacking(ts_block_delta_value,
-    // block_size, segment_size);
-    //            length_value += numberOfEncodeSegment2Bytes(ts_block_delta_value,
-    // bit_width_segments_value, raw_length_value, segment_size, theta_value);
-    //
-    //            int[] raw_length_partition = new int[5];
-    //            float[] theta_partition = new float[4];
-    //            int[][] ts_block_delta_partition = getEncodeBitsRegression(ts_block_partition,
-    // block_size, raw_length_partition, theta_partition, segment_size);
-    //            int[][] bit_width_segments_partition = segmentBitPacking(ts_block_delta_partition,
-    // block_size, segment_size);
-    //            length_partition += numberOfEncodeSegment2Bytes(ts_block_delta_partition,
-    // bit_width_segments_partition, raw_length_partition, segment_size, theta_partition);
-    //
-    //        }
-    //
-
-    //        if (length_partition < length_time && length_partition < length_value) { // partition
-    // performs better
-    //            data = data_partition;
-    //
-    //                System.out.println("Partition");
-    //            for (int i = 0; i < block_num; i++) {
-    //                encode_pos = REGERBlockEncoderPartition(data, i, block_size, segment_size, k,
-    // encode_pos, encoded_result);
-    //            }
-    //        } else {
-    //            if (length_value < length_time) { // order by value performs better
-    //                System.out.println("Value");
-    //                data = data_value;
-    ////                for (int i = 0; i < 2; i++) {
-    //                for (int i = 0; i < block_num; i++) {
-    //
-    //                    encode_pos = REGERBlockEncoder(data, 1, i, block_size, 0, third_value,
-    // segment_size, k, encode_pos, encoded_result);
-    //                }
-    //            } else {
-    //                System.out.println("Time");
-    for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockEncoderTime(
-              data,
-              i,
-              block_size,
-              0,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result,
-              time);
-    }
-    //            }
-    //
-    //        }
-
-    //
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoderTime(
-              data,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              encode_pos,
-              encoded_result,
-              time);
-    }
-    //        adjust_count_arr[0] /= block_num;
-
-    return encode_pos;
-  }
-
-  public static int REGERBlockDecoder(
-      byte[] encoded,
-      int decode_pos,
-      int[][] value_list,
-      int block_size,
-      int segment_size,
-      int[] value_pos_arr) {
-
-    int time0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = time0;
-    int value0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = value0;
-
-    value_pos_arr[0]++;
-
-    float theta_time0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_time1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    float theta_value0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_value1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-    int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-
-    int count;
-    int num;
-    int segment_n = block_size / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    int pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_time_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-
-      decode_pos++;
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][0] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_value_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][1] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    int pre_time = time0;
-    int pre_value = value0;
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      int[] decode_time_result = new int[segment_size];
-      int[] decode_value_result = new int[segment_size];
-
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-      int pos_time = value_pos_arr[0];
-      for (int delta_time : decode_time_result) {
-        pre_time = (int) (theta_time0 + theta_time1 * (double) delta_time) + pre_time;
-        value_list[pos_time][0] = pre_time;
-        pos_time++;
-      }
-      int pos_value = value_pos_arr[0];
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-      for (int delta_value : decode_value_result) {
-        pre_value = (int) (theta_value0 + theta_value1 * (double) delta_value) + pre_value;
-        value_list[pos_value][1] = pre_value;
-        pos_value++;
-      }
-      value_pos_arr[0] = pos_value;
-    }
-
-    return decode_pos;
-  }
-
-  public static void REGERDecoder(byte[] encoded) {
-
-    int decode_pos = 0;
-    int length_all = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int block_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int segment_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int remain_length = length_all - block_num * block_size;
-    int zero_number;
-    if (remain_length % segment_size == 0) {
-      zero_number = 1;
-    } else if (remain_length % segment_size == 1) {
-      zero_number = 0;
-    } else {
-      zero_number = segment_size + 1 - remain_length % segment_size;
-    }
-    int[][] value_list = new int[length_all + segment_size][2];
-
-    int[] value_pos_arr = new int[1];
-
-    //        for (int k = 0; k < 2; k++) {
-    for (int k = 0; k < block_num; k++) {
-      //            System.out.println("k="+k);
-      decode_pos =
-          REGERBlockDecoder(
-              encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-    }
-
-    if (remain_length == 1) {
-      for (int i = 0; i < remain_length; i++) {
-        int value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = value_end;
-        value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = value_end;
-        value_pos_arr[0]++;
-      }
-    } else {
-      REGERBlockDecoder(
-          encoded,
-          decode_pos,
-          value_list,
-          remain_length + zero_number,
-          segment_size,
-          value_pos_arr);
-    }
-  }
-
-  @Test
-  public void REGERTime() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_sort";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 0; file_i < 1; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        //                    "Compression Ratio",
-        "Sort Time",
-        "Alpha Time",
-        "Beta Time",
-        "Movement Time"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        //                f = tempList[1];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        //                System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-        double ratio = 0;
-        double compressed_size = 0;
-        int repeatTime2 = 100;
-        long[] time = new long[4];
-        long s = System.nanoTime();
-        int length = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++)
-          length =
-              TimeEncoder(
-                  data2_arr,
-                  dataset_block_size.get(file_i),
-                  dataset_third.get(file_i),
-                  8,
-                  dataset_k.get(file_i),
-                  encoded_result,
-                  time);
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-        time[0] /= repeatTime2;
-        time[1] /= repeatTime2;
-        time[2] /= repeatTime2;
-        time[3] /= repeatTime2;
-
-        compressed_size += length;
-        double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-        ratio += ratioTmp;
-
-        String[] record = {
-          f.toString(),
-          "REGER-Only-Order",
-          String.valueOf(encodeTime),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(time[0]),
-          String.valueOf(time[1]),
-          String.valueOf(time[2]),
-          String.valueOf(time[3]),
-        };
-        writer.writeRecord(record);
-        System.out.println(ratio);
-
-        //                break;
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERAdjust() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_test";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 0; file_i < 1; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Compression Ratio",
-        "Adjust Count"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        //                f = tempList[1];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        //                System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-        double ratio = 0;
-        double compressed_size = 0;
-        int repeatTime2 = 1;
-        long s = System.nanoTime();
-        double[] adjust_count = new double[1];
-        int length = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++)
-          length =
-              AdjustEncoder(
-                  data2_arr,
-                  dataset_block_size.get(file_i),
-                  dataset_third.get(file_i),
-                  8,
-                  dataset_k.get(file_i),
-                  encoded_result,
-                  adjust_count);
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-        compressed_size += length;
-        double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-        ratio += ratioTmp;
-
-        String[] record = {
-          f.toString(),
-          "REGER-Only-Order",
-          String.valueOf(encodeTime),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(ratio),
-          String.valueOf(adjust_count[0])
-        };
-        writer.writeRecord(record);
-        System.out.println(adjust_count[0]);
-        System.out.println(ratio);
-
-        //                break;
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERSmallBlock() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_small_block";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-    ArrayList<Integer> dataset_k = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_k.add(1);
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 2; file_i < 3; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Encoding Time Optimal",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Compressed Size Optimal",
-        //                    "Compression Ratio",
-        //                    "Compression Ratio Optimal",
-
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        //                f = tempList[1];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        //                System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-
-        double compressed_size = 0;
-        double compressed_size1 = 0;
-        int repeatTime2 = 1;
-        //                long[] time = new long[4];
-        long s = System.nanoTime();
-        int length = 0;
-        int length1 = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++) {
-          length =
-              ReorderingRegressionEncoder(
-                  data2_arr, 8, dataset_third.get(file_i), 8, 1, encoded_result);
-        }
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-        long s_optimal = System.nanoTime();
-        for (int repeat = 0; repeat < repeatTime2; repeat++) {
-          length1 = OptimalEncoder(data2_arr, 8, dataset_third.get(file_i), 8, 1, encoded_result);
-        }
-        long e_optimal = System.nanoTime();
-        long encodeTime1 = 0;
-        encodeTime1 += ((e_optimal - s_optimal) / repeatTime2);
-        //                time[0] /= repeatTime2;
-        //                time[1] /= repeatTime2;
-        //                time[2] /= repeatTime2;
-        //                time[3] /= repeatTime2;
-
-        compressed_size += length;
-        compressed_size1 += length1;
-        double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-        double ratioTmp1 = compressed_size1 / (double) (data.size() * Integer.BYTES * 2);
-
-        String[] record = {
-          f.toString(),
-          "REGER-Only-Order",
-          String.valueOf(encodeTime),
-          String.valueOf(encodeTime1),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(compressed_size1),
-          //                        String.valueOf(ratioTmp),
-          //                        String.valueOf(ratioTmp1),
-          //                        String.valueOf(time[0]),
-          //                        String.valueOf(time[1]),
-          //                        String.valueOf(time[2]),
-          //                        String.valueOf(time[3]),
-
-        };
-        writer.writeRecord(record);
-        System.out.println(compressed_size);
-        System.out.println(compressed_size1);
-        //                break;
-      }
-      writer.close();
-    }
-  }
-
-  //    @Test
-  //    public void testSort() {
-  //        int[][] array = {{1,1}, {2,2}, {3,3}, {4,4},{5,1}, {6,2}, {7,3}, {8,4}};
-  //        permute(array, 0, array.length - 1);
-  //    }
-
-  private static void permute(
-      int[][] ts_block,
-      int left,
-      int right,
-      int[][] optimal_array,
-      float[] theta,
-      int[] raw_length) {
-    if (left == right) {
-      int[][] ts_block_delta;
-      //            int[][] bit_width_segments_partition;
-      int[] new_raw_length = new int[5];
-      float[] cur_theta = theta.clone();
-      int block_size = ts_block.length;
-
-      ts_block_delta =
-          getEncodeBitsRegressionNoTrain(ts_block, block_size, new_raw_length, cur_theta, 8);
-      //            bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, 8);
-      int segment_n = (block_size - 1) / 8;
-      int[][] bit_width_segments = new int[segment_n][2];
-      for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-        int bit_width_time = Integer.MIN_VALUE;
-        int bit_width_value = Integer.MIN_VALUE;
-
-        for (int data_i = segment_i * 8 + 1; data_i < (segment_i + 1) * 8 + 1; data_i++) {
-          int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-          int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-          if (cur_bit_width_time > bit_width_time) {
-            bit_width_time = cur_bit_width_time;
-          }
-          if (cur_bit_width_value > bit_width_value) {
-            bit_width_value = cur_bit_width_value;
-          }
-        }
-
-        bit_width_segments[segment_i][0] = bit_width_time;
-        bit_width_segments[segment_i][1] = bit_width_value;
-      }
-
-      byte[] cur_byte = new byte[block_size * 8];
-      //            int length = encodeSegment2Bytes(ts_block_delta, bit_width_segments, raw_length,
-      // 8, cur_theta, 0, cur_byte);
-
-      int length = numberOfEncodeSegment2Bytes(ts_block_delta, bit_width_segments, 8);
-      //            if(ts_block[0][0]==1563 &&ts_block[1][0]==0 &&ts_block[2][0]==18
-      // &&ts_block[3][0]==3515 &&
-      //                    ts_block[4][0]==3861 &&ts_block[5][0]==1569 &&ts_block[6][0]==816
-      // &&ts_block[7][0]==2593 ){
-      //                System.out.println("length is "+length);
-      //                System.out.println("raw_length is "+raw_length[0]);
-      //                System.out.println(Arrays.deepToString(optimal_array));
-      //            }
-      if (length < raw_length[0]) {
-        //                optimal_array = ts_block.clone();
-        for (int i = 0; i < block_size; i++) {
-          optimal_array[i][0] = ts_block[i][0];
-          optimal_array[i][1] = ts_block[i][1];
-        }
-        raw_length[0] = length;
-
-        //                System.out.println(Arrays.deepToString(ts_block));
-        //                System.out.println(Arrays.deepToString(ts_block_delta));
-        //                System.out.println("length is "+length);
-
-        //                theta = cur_theta.clone();
-      }
-      //            System.out.println("optimal ---- "+Arrays.deepToString(optimal_array));
-      //            printArray(ts_block);
-    } else {
-      for (int i = left; i <= right; i++) {
-        swap(ts_block, left, i);
-        permute(ts_block, left + 1, right, optimal_array, theta, raw_length);
-        swap(ts_block, left, i); // backtrack
-      }
-    }
-  }
-
-  private static void swap(int[][] array, int i, int j) {
-    int[] temp = new int[2];
-    temp[0] = array[i][0];
-    temp[1] = array[i][1];
-    array[i][0] = array[j][0];
-    array[i][1] = array[j][1];
-    array[j][0] = temp[0];
-    array[j][1] = temp[1];
-  }
-
-  private static void printArray(int[][] array) {
-    for (int[] num : array) {
-      System.out.print("[" + num[0] + "," + num[1] + "], ");
-    }
-    System.out.println();
-  }
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerPDouble1115Test.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerPDouble1115Test.java
deleted file mode 100644
index 4a92307..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerPDouble1115Test.java
+++ /dev/null
@@ -1,2930 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
-import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.Stack;
-
-import static java.lang.Math.abs;
-
-public class RegerPDouble1115Test {
-
-  public static int min3(int a, int b, int c) {
-    if (a < b && a < c) {
-      return 0;
-    } else if (b < c) {
-      return 1;
-    } else {
-      return 2;
-    }
-  }
-
-  public static int getBitWith(int num) {
-    if (num == 0) return 1;
-    else return 32 - Integer.numberOfLeadingZeros(num);
-  }
-
-  public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 24);
-    cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-    cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 3] = (byte) (integer);
-  }
-
-  public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer);
-  }
-
-  public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 1] = (byte) (integer);
-  }
-
-  public static boolean containsValue(int[] array, int targetValue) {
-    for (int value : array) {
-      if (value == targetValue) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static int[] removeElement(int[] array, int position) {
-    if (position < 0 || position >= array.length) {
-      return array;
-    }
-
-    int[] newArray = new int[array.length - 1];
-    int newIndex = 0;
-
-    for (int i = 0; i < array.length; i++) {
-      if (i != position) {
-        newArray[newIndex] = array[i];
-        newIndex++;
-      }
-    }
-
-    return newArray;
-  }
-
-  public static int bytes2Integer(byte[] encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded[i + start] & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  private static int byte2Integer(byte[] encoded, int decode_pos) {
-    int value = 0;
-    int b = encoded[decode_pos] & 0xFF;
-    value |= b;
-    if (value == 0) return 256;
-    return value % 256;
-  }
-
-  public static void pack8Values(
-      ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values.get(valueIdx) << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values.get(valueIdx) << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values.get(valueIdx) >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static void pack8Values(
-      int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values[valueIdx][index] << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values[valueIdx][index] << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values[valueIdx][index] >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static int unpack8Values(
-      byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-    int byteIdx = offset;
-    //        int pos_encode = 0;
-    long buffer = 0;
-    // total bits which have read from 'buf' to 'buffer'. i.e.,
-    // number of available bits to be decoded.
-    int totalBits = 0;
-    int valueIdx = 0;
-
-    while (valueIdx < 8) {
-      // If current available bits are not enough to decode one Integer,
-      // then add next byte from buf to 'buffer' until totalBits >= width
-      while (totalBits < width) {
-        buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-        byteIdx++;
-        totalBits += 8;
-      }
-
-      // If current available bits are enough to decode one Integer,
-      // then decode one Integer one by one until left bits in 'buffer' is
-      // not enough to decode one Integer.
-      while (totalBits >= width && valueIdx < 8) {
-        result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-        value_pos++;
-        valueIdx++;
-        totalBits -= width;
-        buffer = buffer & ((1L << totalBits) - 1);
-      }
-    }
-    return value_pos;
-  }
-
-  public static int bitPacking(
-      int[][] numbers,
-      int index,
-      int start,
-      int block_size,
-      int bit_width,
-      int encode_pos,
-      byte[] encoded_result) {
-    int block_num = block_size / 8;
-    for (int i = 0; i < block_num; i++) {
-      pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-      encode_pos += bit_width;
-    }
-
-    return encode_pos;
-  }
-
-  public static int decodeBitPacking(
-      byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-    //        int[] result_list = new int[];
-    int block_num = block_size / 8;
-    int value_pos = 0;
-
-    for (int i = 0; i < block_num; i++) { // bitpacking
-      value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-      decode_pos += bit_width;
-    }
-    //        decode_pos_result.add(decode_pos);
-    return decode_pos;
-  }
-
-  public static void double2bytes(double f, int pos_encode, byte[] encode_result) {
-    long fbit = Double.doubleToLongBits(f);
-    byte[] b = new byte[8];
-    for (int i = 0; i < 8; i++) {
-      b[i] = (byte) (fbit >> (56 - i * 8));
-    }
-    int len = b.length;
-
-    System.arraycopy(b, 0, encode_result, pos_encode, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = encode_result[i + pos_encode];
-      encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-      encode_result[len - i - 1 + pos_encode] = temp;
-    }
-  }
-
-  public static byte[] int2Bytes(int integer) {
-    byte[] bytes = new byte[4];
-    bytes[0] = (byte) (integer >> 24);
-    bytes[1] = (byte) (integer >> 16);
-    bytes[2] = (byte) (integer >> 8);
-    bytes[3] = (byte) integer;
-    return bytes;
-  }
-
-  public static byte[] bitWidth2Bytes(int integer) {
-    byte[] bytes = new byte[1];
-    bytes[0] = (byte) integer;
-    return bytes;
-  }
-
-  public static byte[] bitPacking(
-      ArrayList<ArrayList<Integer>> numbers, int index, int start, int block_num, int bit_width) {
-    block_num = block_num / 8;
-    byte[] result = new byte[bit_width * block_num];
-
-    for (int i = 0; i < block_num; i++) {
-      for (int j = 0; j < bit_width; j++) {
-        int tmp_int = 0;
-        for (int k = 0; k < 8; k++) {
-          tmp_int += (((numbers.get(start + i * 8 + k).get(index) >> j) % 2) << k);
-        }
-        result[i * bit_width + j] = (byte) tmp_int;
-      }
-    }
-    return result;
-  }
-
-  public static ArrayList<Integer> decodebitPacking(
-      ArrayList<Byte> encoded, int decode_pos, int bit_width, int min_delta, int block_size) {
-    ArrayList<Integer> result_list = new ArrayList<>();
-    for (int i = 0; i < (block_size - 1) / 8; i++) {
-      int[] val8 = new int[8];
-      for (int j = 0; j < 8; j++) {
-        val8[j] = 0;
-      }
-      for (int j = 0; j < bit_width; j++) {
-        byte tmp_byte = encoded.get(decode_pos + bit_width - 1 - j);
-        byte[] bit8 = new byte[8];
-        for (int k = 0; k < 8; k++) {
-          bit8[k] = (byte) (tmp_byte & 1);
-          tmp_byte = (byte) (tmp_byte >> 1);
-        }
-        for (int k = 0; k < 8; k++) {
-          val8[k] = val8[k] * 2 + bit8[k];
-        }
-      }
-      for (int j = 0; j < 8; j++) {
-        result_list.add(val8[j] + min_delta);
-      }
-      decode_pos += bit_width;
-    }
-    return result_list;
-  }
-
-  public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    ArrayList<Integer> tmp = arr.get(low);
-    while (low < high) {
-      while (low < high
-          && (arr.get(high).get(index) > tmp.get(index)
-              || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                  && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-        high--;
-      }
-      arr.set(low, arr.get(high));
-      while (low < high
-          && (arr.get(low).get(index) < tmp.get(index)
-              || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                  && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-        low++;
-      }
-
-      arr.set(high, arr.get(low));
-    }
-    arr.set(low, tmp);
-    return low;
-  }
-
-  public static void quickSort(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    Stack<Integer> stack = new Stack<>();
-    int mid = part(arr, index, low, high);
-    if (mid + 1 < high) {
-      stack.push(mid + 1);
-      stack.push(high);
-    }
-
-    if (mid - 1 > low) {
-      stack.push(low);
-      stack.push(mid - 1);
-    }
-    while (stack.empty() == false) {
-      high = stack.pop();
-      low = stack.pop();
-      mid = part(arr, index, low, high);
-      if (mid + 1 < high) {
-        stack.push(mid + 1);
-        stack.push(high);
-      }
-      if (mid - 1 > low) {
-        stack.push(low);
-        stack.push(mid - 1);
-      }
-    }
-  }
-
-  public static int getCommon(int m, int n) {
-    int z;
-    while (m % n != 0) {
-      z = m % n;
-      m = n;
-      n = z;
-    }
-    return n;
-  }
-
-  public static void splitTimeStamp3(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-
-    int td_common = 0;
-    for (int i = 1; i < ts_block.size(); i++) {
-      int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-      if (td_common == 0) {
-        if (time_diffi != 0) {
-          td_common = time_diffi;
-          continue;
-        } else {
-          continue;
-        }
-      }
-      if (time_diffi != 0) {
-        td_common = getCommon(time_diffi, td_common);
-        if (td_common == 1) {
-          break;
-        }
-      }
-    }
-    if (td_common == 0) {
-      td_common = 1;
-    }
-
-    int t0 = ts_block.get(0).get(0);
-    for (int i = 0; i < ts_block.size(); i++) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-
-      tmp.add(interval_i);
-      tmp.add(ts_block.get(i).get(1));
-      ts_block.set(i, tmp);
-    }
-    ArrayList<Integer> tmp = new ArrayList<>();
-
-    tmp.add(0);
-    tmp.add(ts_block.get(0).get(1));
-    ts_block.set(0, tmp);
-
-    result.add(td_common);
-    result.add(t0);
-  }
-
-  public static void terminate(int[][] ts_block, double[] coefficient, int p) {
-    int length = ts_block.length;
-    assert length > p;
-    int size = length - p;
-
-    double[] param;
-    try {
-      OLSMultipleLinearRegression ols1 = new OLSMultipleLinearRegression();
-      double[][] X1 = new double[size][p];
-      double[] Y1 = new double[size];
-      for (int i = 0; i < size; i++) {
-        X1[i] = new double[p];
-        for (int j = 0; j < p; j++) {
-          X1[i][j] = ts_block[i + j][0];
-        }
-        Y1[i] = ts_block[i + p][0];
-      }
-      ols1.newSampleData(Y1, X1);
-      param = ols1.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-      // System.out.println(Arrays.toString(param));
-    } catch (Exception e) {
-      param = new double[p + 1];
-      for (int i = 0; i <= p; i++) {
-        param[i] = 0;
-      }
-    }
-
-    double[] param2;
-    try {
-      OLSMultipleLinearRegression ols2 = new OLSMultipleLinearRegression();
-      double[][] X2 = new double[size][p];
-      double[] Y2 = new double[size];
-      for (int i = 0; i < size; i++) {
-        X2[i] = new double[p];
-        for (int j = 0; j < p; j++) {
-          X2[i][j] = ts_block[i + j][1];
-        }
-        Y2[i] = ts_block[i + p][1];
-      }
-      ols2.newSampleData(Y2, X2);
-      param2 = ols2.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-      // System.out.println(Arrays.toString(param2));
-    } catch (Exception exception) {
-      param2 = new double[p + 1];
-      for (int i = 0; i <= p; i++) {
-        param2[i] = 0;
-      }
-    }
-
-    for (int i = 0; i <= p; i++) {
-      coefficient[2 * i] = param[i];
-      coefficient[2 * i + 1] = param2[i];
-    }
-  }
-
-  // --------------------------------------  base function
-  // -----------------------------------------------------
-  public static ArrayList<ArrayList<Integer>> segmentBitPacking(
-      ArrayList<ArrayList<Integer>> ts_block_delta, int block_size, int segment_size) {
-    ArrayList<ArrayList<Integer>> bit_width_segments = new ArrayList<>();
-    int segment_n = (block_size - 1) / segment_size;
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta.get(data_i).get(0));
-        int cur_bit_width_value = getBitWith(ts_block_delta.get(data_i).get(1));
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      ArrayList<Integer> bit_width = new ArrayList<>();
-      bit_width.add(bit_width_time);
-      bit_width.add(bit_width_value);
-      bit_width_segments.add(bit_width);
-    }
-
-    return bit_width_segments;
-  }
-
-  public static int[][] segmentBitPacking(
-      int[][] ts_block_delta, int block_size, int segment_size) {
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    return bit_width_segments;
-  }
-
-  public static void moveAlphaToBeta(ArrayList<ArrayList<Integer>> ts_block, int alpha, int beta) {
-    ArrayList<Integer> tmp_tv = ts_block.get(alpha);
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ArrayList<Integer> tmp_tv_cur = new ArrayList<>();
-        tmp_tv_cur.add(ts_block.get(u).get(0));
-        tmp_tv_cur.add(ts_block.get(u).get(1));
-        ts_block.set(u + 1, tmp_tv_cur);
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ArrayList<Integer> tmp_tv_cur = new ArrayList<>();
-        tmp_tv_cur.add(ts_block.get(u).get(0));
-        tmp_tv_cur.add(ts_block.get(u).get(1));
-        ts_block.set(u - 1, tmp_tv_cur);
-      }
-      beta--;
-    }
-    ts_block.set(beta, tmp_tv);
-  }
-
-  public static void moveAlphaToBeta(int[][] ts_block, int alpha, int beta) {
-    int[] tmp_tv = ts_block[alpha];
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ts_block[u + 1][0] = ts_block[u][0];
-        ts_block[u + 1][1] = ts_block[u][1];
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ts_block[u - 1][0] = ts_block[u][0];
-        ts_block[u - 1][1] = ts_block[u][1];
-      }
-      beta--;
-    }
-    ts_block[beta][0] = tmp_tv[0];
-    ts_block[beta][1] = tmp_tv[1];
-  }
-
-  private static ArrayList<Integer> isMovable(int[] alpha_list, int[] beta_list) {
-    ArrayList<Integer> isMoveable = new ArrayList<>();
-    for (int i = 0; i < alpha_list.length; i++) {
-      if (alpha_list[i] != -1 && beta_list[i] != -1) {
-        isMoveable.add(i);
-      }
-    }
-    return isMoveable;
-  }
-
-  private static int getIstarClose(
-      int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-    int min_i = 0;
-    int min_dis = Integer.MAX_VALUE;
-    for (int i = 0; i < j_star_list.size(); i++) {
-      if (abs(alpha - j_star_list.get(i)) < min_dis) {
-        min_i = j_star_list.get(i);
-        min_dis = abs(alpha - j_star_list.get(i));
-        raw_length[0] = new_length_list[i][0];
-        raw_length[3] = new_length_list[i][1];
-        raw_length[4] = new_length_list[i][2];
-      }
-    }
-    if (min_dis == 0) {
-      System.out.println("get IstarClose error");
-      return 0;
-    }
-    return min_i;
-  }
-
-  public static int getBetaP(
-      int[][] ts_block, int alpha, int block_size, int[] raw_length, double[] theta, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int max_timestamp = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int raw_timestamp_delta_max_index = -1;
-    int raw_value_delta_max_index = -1;
-
-    int raw_abs_sum = raw_length[0];
-
-    ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-    ArrayList<Integer> max_index = new ArrayList<>();
-    int j_star = -1;
-
-    if (alpha == -1) {
-      return j_star;
-    }
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      //            System.out.println("p="+p);
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      if (j != alpha && ((int) epsilon_r == max_timestamp || (int) epsilon_v == max_value)) {
-        max_index.add(j);
-      }
-    }
-    int[] b;
-    int[][] new_length_list = new int[block_size][3];
-    int pos_new_length_list = 0;
-
-    // alpha <= p
-    if (alpha < p) {
-
-      int j = 0;
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (j = alpha + 2; j < alpha + p; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < block_size; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-
-    } // alpha == n
-    else if (alpha < block_size && alpha >= block_size - p) {
-
-      int j = 0;
-      for (; j < alpha - p; j++) {
-
-        b = adjustCase1(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (j = alpha + 2; j < alpha + p && j < block_size; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < block_size; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // p < alpha <= n-p
-    else {
-
-      int j = 0;
-      for (; j < alpha - p; j++) {
-
-        b = adjustCase1(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (j = alpha + 2; j < alpha + p && j < block_size; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < block_size; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    }
-
-    if (j_star_list.size() != 0) {
-      j_star = getIstarClose(alpha, j_star_list, new_length_list, raw_length);
-    }
-    return j_star;
-  }
-
-  private static int[] adjustCase1(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    int[] b = new int[3];
-    for (int u = alpha - 1; u >= j_star; u--) {
-      tmp_ts_block[u + 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u + 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustCase2(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha - 1; u >= j_star; u--) {
-      tmp_ts_block[u + 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u + 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase3(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < j_star; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    j_star--;
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase4(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < j_star; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    j_star--;
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase5(int[][] ts_block, int alpha, double[] theta, int p) {
-    int[][] tmp_ts_block = ts_block.clone();
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < block_size; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[block_size - 1][0] = tmp_tv[0];
-    tmp_ts_block[block_size - 1][1] = tmp_tv[1];
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[block_size - p][2];
-
-    // regression residual
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-      ts_block_delta[j - p][0] = (int) epsilon_r;
-      ts_block_delta[j - p][1] = (int) epsilon_v;
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-    }
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(int[][] bit_width_segments) {
-    int encoded_result = 0;
-
-    //    ArrayList<ArrayList<Integer>> run_length_time = new ArrayList<>();
-    //    ArrayList<ArrayList<Integer>> run_length_value = new ArrayList<>();
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 1;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-
-    encoded_result += (pos_time * 2);
-    encoded_result += (pos_value * 2);
-
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(
-      int[][] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-    intWord2Bytes(pos_time, pos_encode, encoded_result);
-    pos_encode += 2;
-    intWord2Bytes(pos_value, pos_encode, encoded_result);
-    pos_encode += 2;
-    //        System.out.println("pos_time="+pos_time);
-    //        System.out.println("pos_value="+pos_value);
-
-    //        System.out.println(Arrays.deepToString(run_length_time));
-    //        System.out.println(Arrays.deepToString(run_length_value));
-    for (int i = 0; i < pos_time; i++) {
-      int[] bit_width_time = run_length_time[i];
-      intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_time[0]="+bit_width_time[0]);
-      //            System.out.println("bit_width_time[1]="+bit_width_time[1]);
-    }
-    for (int i = 0; i < pos_value; i++) {
-      int[] bit_width_value = run_length_value[i];
-      intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_value[0]="+bit_width_value[0]);
-      //            System.out.println("bit_width_value[1]="+bit_width_value[1]);
-    }
-
-    return pos_encode;
-  }
-
-  private static int encodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      int p,
-      double[] theta,
-      int pos_encode,
-      byte[] encoded_result) {
-
-    int block_size = delta_segments.length;
-    int segment_n = (block_size - p) / segment_size;
-    int2Bytes(delta_segments[0][0], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(delta_segments[0][1], pos_encode, encoded_result);
-    pos_encode += 4;
-    double2bytes(theta[0] + raw_length[3], pos_encode, encoded_result);
-    pos_encode += 8;
-
-    double2bytes(theta[1] + raw_length[4], pos_encode, encoded_result);
-    pos_encode += 8;
-
-    for (int i = 2; i < theta.length; i++) {
-      double2bytes(theta[i], pos_encode, encoded_result);
-      pos_encode += 8;
-    }
-    //        System.out.println(delta_segments[0][0]);
-    //        System.out.println(delta_segments[0][1]);
-    //        System.out.println(theta[0] + raw_length[3]);
-    //        System.out.println(theta[1]);
-    //        System.out.println(theta[2] + raw_length[4]);
-    //        System.out.println(theta[3]);
-
-    pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              0,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_time,
-              pos_encode,
-              encoded_result);
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              1,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_value,
-              pos_encode,
-              encoded_result);
-    }
-
-    return pos_encode;
-  }
-
-  public static int[][] getEncodeBitsRegression(
-      int[][] ts_block, int block_size, int[] raw_length, double[] theta, int segment_size, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-
-    terminate(ts_block, theta, p);
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      //            if (epsilon_r > max_timestamp) {
-      //                max_timestamp = (int) epsilon_r;
-      //            }
-      //            if (epsilon_v > max_value) {
-      //                max_value = (int) epsilon_v;
-      //            }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j >= p; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  public static int[][] getEncodeBitsRegressionNoTrain(
-      int[][] ts_block, int block_size, int[] raw_length, double[] theta, int segment_size, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j >= p; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  private static int numberOfEncodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      int p,
-      double[] theta) {
-    ArrayList<Byte> encoded_result = new ArrayList<>();
-    int block_size = delta_segments.length;
-    int segment_n = (block_size - p) / segment_size;
-    int result = 0;
-    result += 8; // encode interval0 and value0
-    result += ((2 * p + 1) * 8); // encode theta
-    result += encodeRLEBitWidth2Bytes(bit_width_segments);
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      result += (segment_size * bit_width_time / 8);
-      result += (segment_size * bit_width_value / 8);
-    }
-
-    return result;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block,
-      ArrayList<Integer> min_index,
-      int block_size,
-      int index,
-      double[] theta,
-      int p,
-      int k) {
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int alpha = 0;
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        //                timestamp_delta_min_index
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_v;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_r;
-      }
-    }
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-
-      for (int pi = 1; pi < p; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_v;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_r;
-      }
-    }
-
-    min_index.add(timestamp_delta_min_index);
-    min_index.add(value_delta_min_index);
-    Arrays.sort(
-        ts_block_delta,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    //        Arrays.sort(ts_block_delta);
-    //    quickSort(ts_block_delta, 1, 0, block_size - 2);
-    int[] alpha_list = new int[k + 1];
-    //    ArrayList<Integer> alpha_list = new ArrayList<>();
-    alpha_list[0] = ts_block_delta[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta[block_size - 2 - k][0];
-    }
-    return alpha_list;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block,
-      ArrayList<Integer> min_index,
-      int block_size,
-      double[] theta,
-      int p,
-      int k) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_max_index = -1;
-    int value_delta_max_index = -1;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int[] alpha_list = new int[2 * k + 2];
-
-    int[][] ts_block_delta_time = new int[block_size - 1][2];
-    int[][] ts_block_delta_value = new int[block_size - 1][2];
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (double) (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (double) (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        //                timestamp_delta_min_index
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = (int) epsilon_r;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = (int) epsilon_v;
-    }
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = (int) epsilon_r;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = (int) epsilon_v;
-    }
-
-    Arrays.sort(
-        ts_block_delta_time,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    min_index.add(ts_block_delta_time[0][0]);
-    alpha_list[0] = ts_block_delta_time[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta_time[block_size - 2 - k][0];
-    }
-
-    Arrays.sort(
-        ts_block_delta_value,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int pos_alpha_list = k + 1;
-    //    quickSort(ts_block_delta_value, 1, 0, block_size - 2);
-    min_index.add(ts_block_delta_value[0][0]);
-    if (!containsValue(alpha_list, ts_block_delta_value[0][0])) {
-      alpha_list[pos_alpha_list] = ts_block_delta_value[0][0];
-      pos_alpha_list++;
-    }
-
-    for (int i = 0; i < k; i++) {
-      if (!containsValue(alpha_list, ts_block_delta_value[block_size - 2 - k][0])) {
-        alpha_list[pos_alpha_list] = ts_block_delta_value[block_size - 2 - k][0];
-        pos_alpha_list++;
-      }
-    }
-
-    return alpha_list;
-  }
-
-  private static int REGERBlockEncoderPartition(
-      int[][] data,
-      int i,
-      int block_size,
-      int segment_size,
-      int k,
-      int p,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block = new int[block_size][2];
-    int[][] ts_block_reorder = new int[block_size][2];
-    int[][] ts_block_partition = new int[block_size][2];
-    for (int j = 0; j < block_size; j++) {
-      data[j + i * block_size][0] -= min_time;
-      ts_block[j][0] = data[j + i * block_size][0];
-      ts_block[j][1] = data[j + i * block_size][1];
-      ts_block_reorder[j][0] = data[j + i * block_size][0];
-      ts_block_reorder[j][1] = data[j + i * block_size][1];
-    }
-
-    // raw-order
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    double[] theta = new double[2 * p + 2];
-    int[][] ts_block_delta =
-        getEncodeBitsRegression(ts_block, block_size, raw_length, theta, segment_size, p);
-    int[][] bit_width_segments_partition =
-        segmentBitPacking(ts_block_delta, block_size, segment_size);
-    raw_length[0] =
-        numberOfEncodeSegment2Bytes(
-            ts_block_delta, bit_width_segments_partition, raw_length, segment_size, p, theta);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-          return Integer.compare(a[0], b[0]);
-        });
-    //    quickSort(ts_block, 0, 0, block_size - 1);
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    double[] theta_time = new double[2 * p + 2];
-    int[][] ts_block_delta_time =
-        getEncodeBitsRegression(ts_block, block_size, time_length, theta_time, segment_size, p);
-    int[][] bit_width_segments_time =
-        segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-    time_length[0] =
-        numberOfEncodeSegment2Bytes(
-            ts_block_delta_time, bit_width_segments_time, time_length, segment_size, p, theta_time);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    // value-order
-    //    quickSort(ts_block, 1, 0, block_size - 1);
-
-    int[] reorder_length = new int[5];
-    double[] theta_reorder = new double[2 * p + 2];
-    int[][] ts_block_delta_reorder =
-        getEncodeBitsRegression(
-            ts_block, block_size, reorder_length, theta_reorder, segment_size, p);
-    int[][] bit_width_segments_value =
-        segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-    reorder_length[0] =
-        numberOfEncodeSegment2Bytes(
-            ts_block_delta_reorder,
-            bit_width_segments_value,
-            reorder_length,
-            segment_size,
-            p,
-            theta_reorder);
-
-    int[] alpha_list;
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-      ts_block_delta = ts_block_delta_time;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, p, k);
-    } else if (choose == 1) {
-      ts_block = ts_block_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 0, theta, p, k);
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      ts_block_delta = ts_block_delta_reorder;
-      alpha_list = getIStar(ts_block, min_index, block_size, 1, theta, p, k);
-    }
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-
-    //    ArrayList<ArrayList<Integer>> new_length_list = new ArrayList<>();
-
-    for (int j = 0; j < alpha_list.length; j++) {
-      int alpha = alpha_list[j];
-      int[] new_length = raw_length.clone();
-      beta_list[j] = getBetaP(ts_block, alpha, block_size, new_length, theta, p);
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-    ArrayList<Integer> isMoveable = isMovable(alpha_list, beta_list);
-    int adjust_count = 0;
-    while (isMoveable.size() != 0) {
-      if (adjust_count < block_size / 2 && adjust_count <= 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      ArrayList<ArrayList<Integer>> all_length = new ArrayList<>();
-
-      for (int isMoveable_i : isMoveable) {
-        ArrayList<Integer> tmp = new ArrayList<>();
-        tmp.add(isMoveable_i);
-        tmp.add(new_length_list[isMoveable_i][0]);
-        all_length.add(tmp);
-      }
-      quickSort(all_length, 1, 0, all_length.size() - 1);
-      if (all_length.get(0).get(1) <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block,
-            alpha_list[all_length.get(0).get(0)],
-            beta_list[all_length.get(0).get(0)]);
-        int[] new_length = new int[5];
-        ts_block_delta =
-            getEncodeBitsRegression(new_ts_block, block_size, new_length, theta, segment_size, p);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(
-                ts_block_delta, bit_width_segments, new_length, segment_size, p, theta);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, p, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      for (int alpha_i = 0; alpha_i < alpha_list.length; alpha_i++) {
-        int alpha = alpha_list[alpha_i];
-        int[] new_length = raw_length.clone();
-        beta_list[alpha_i] = (getBetaP(ts_block, alpha, block_size, raw_length, theta, p));
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-      isMoveable = isMovable(alpha_list, beta_list);
-    }
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size, p);
-
-    //    ArrayList<ArrayList<Integer>> bit_width_segments = new ArrayList<>();
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            p,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    return encode_pos;
-  }
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int order,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int p,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = data[j + i * block_size][0];
-        ts_block[j][1] = data[j + i * block_size][1];
-        //      ts_block_reorder[j][0] = data[j + i * block_size][0];
-        //      ts_block_reorder[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = data[j + i * block_size][0];
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    //        System.out.println(Arrays.deepToString(data));
-    //        System.out.println(Arrays.deepToString(ts_block));
-
-    int[] reorder_length = new int[5];
-    double[] theta_reorder = new double[2 * p + 2];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    double[] theta_time = new double[2 * p + 2];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    double[] theta = new double[2 * p + 2];
-    int[][] ts_block_delta_reorder = new int[block_size][2];
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time = new int[block_size][2];
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta = new int[block_size][2];
-    int[][] bit_width_segments_partition;
-
-    if (order == 1) {
-
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(
-              ts_block, block_size, reorder_length, theta_reorder, segment_size, p);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder,
-              bit_width_segments_value,
-              reorder_length,
-              segment_size,
-              p,
-              theta_reorder);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-
-      ts_block_delta_time =
-          getEncodeBitsRegression(ts_block, block_size, time_length, theta_time, segment_size, p);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_time,
-              bit_width_segments_time,
-              time_length,
-              segment_size,
-              p,
-              theta_time);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta =
-          getEncodeBitsRegression(
-              ts_block_partition, block_size, raw_length, theta, segment_size, p);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta, bit_width_segments_partition, raw_length, segment_size, p, theta);
-
-    } else if (order == 0) {
-
-      ts_block_delta_time =
-          getEncodeBitsRegression(ts_block, block_size, time_length, theta_time, segment_size, p);
-      bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-      time_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_time,
-              bit_width_segments_time,
-              time_length,
-              segment_size,
-              p,
-              theta_time);
-
-      int pos_ts_block_partition = 0;
-      for (int[] datum : ts_block) {
-        if (datum[1] > third_value[third_value.length - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-      for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-        for (int[] datum : ts_block) {
-          if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-            ts_block_partition[pos_ts_block_partition][0] = datum[0];
-            ts_block_partition[pos_ts_block_partition][1] = datum[1];
-            pos_ts_block_partition++;
-          }
-        }
-      }
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[0]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-
-      ts_block_delta =
-          getEncodeBitsRegression(
-              ts_block_partition, block_size, raw_length, theta, segment_size, p);
-      bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      raw_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta, bit_width_segments_partition, raw_length, segment_size, p, theta);
-
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      ts_block_delta_reorder =
-          getEncodeBitsRegression(
-              ts_block, block_size, reorder_length, theta_reorder, segment_size, p);
-      bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-      reorder_length[0] =
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_reorder,
-              bit_width_segments_value,
-              reorder_length,
-              segment_size,
-              p,
-              theta_reorder);
-    }
-    //        System.out.println(Arrays.deepToString(ts_block_delta));
-
-    int[] alpha_list;
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-      ts_block_delta = ts_block_delta_time;
-      index_alpha_list = 0;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-      index_alpha_list = 0;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      ts_block_delta = ts_block_delta_reorder;
-      index_alpha_list = 1;
-    }
-
-    alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta, p, k);
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-
-    //    ArrayList<ArrayList<Integer>> new_length_list = new ArrayList<>();
-
-    for (int j = 0; j < alpha_list.length; j++) {
-      int alpha = alpha_list[j];
-      int[] new_length = raw_length.clone();
-      beta_list[j] = getBetaP(ts_block, alpha, block_size, new_length, theta, p);
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-    ArrayList<Integer> isMoveable = isMovable(alpha_list, beta_list);
-    int adjust_count = 0;
-    while (isMoveable.size() != 0) {
-      if (adjust_count < block_size / 2 && adjust_count <= 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      ArrayList<ArrayList<Integer>> all_length = new ArrayList<>();
-
-      for (int isMoveable_i : isMoveable) {
-        ArrayList<Integer> tmp = new ArrayList<>();
-        tmp.add(isMoveable_i);
-        tmp.add(new_length_list[isMoveable_i][0]);
-        all_length.add(tmp);
-      }
-      quickSort(all_length, 1, 0, all_length.size() - 1);
-      if (all_length.get(0).get(1) <= raw_length[0]) {
-        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block,
-            alpha_list[all_length.get(0).get(0)],
-            beta_list[all_length.get(0).get(0)]);
-        int[] new_length = new int[5];
-        ts_block_delta =
-            getEncodeBitsRegression(new_ts_block, block_size, new_length, theta, segment_size, p);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(
-                ts_block_delta, bit_width_segments, new_length, segment_size, p, theta);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, p, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      for (int alpha_i = 0; alpha_i < alpha_list.length; alpha_i++) {
-        int alpha = alpha_list[alpha_i];
-        int[] new_length = raw_length.clone();
-        beta_list[alpha_i] = (getBetaP(ts_block, alpha, block_size, raw_length, theta, p));
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-      isMoveable = isMovable(alpha_list, beta_list);
-    }
-
-    //        System.out.println("getEncodeBitsRegressionNoTrain before:" +
-    // Arrays.deepToString(ts_block_delta));
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size, p);
-
-    //        System.out.println("getEncodeBitsRegressionNoTrain after:"
-    // +Arrays.deepToString(ts_block_delta));
-
-    //    ArrayList<ArrayList<Integer>> bit_width_segments = new ArrayList<>();
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    //        System.out.println(Arrays.deepToString(ts_block_delta));
-    //        System.out.println(Arrays.deepToString(bit_width_segments));
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            p,
-            theta,
-            encode_pos,
-            cur_byte);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int ReorderingRegressionEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int p,
-      int k,
-      byte[] encoded_result) {
-    for (int i = 0; i < p; i++) block_size++;
-
-    int length_all = data.length;
-
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    intByte2Bytes(p, encode_pos, encoded_result);
-    encode_pos += 1;
-
-    // ----------------------- compare data order by time, value and partition
-    // ---------------------------
-    int length_time = 0;
-    int length_value = 0;
-    int length_partition = 0;
-    int[][] data_value = data.clone();
-    Arrays.sort(
-        data_value,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int[][] data_partition = new int[length_all][2];
-    int pos_data_partition = 0;
-
-    for (int[] datum : data) {
-      if (datum[1] > third_value[third_value.length - 1]) {
-        data_partition[pos_data_partition][0] = datum[0];
-        data_partition[pos_data_partition][1] = datum[1];
-        pos_data_partition++;
-      }
-    }
-    for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-      for (int[] datum : data) {
-        if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-          data_partition[pos_data_partition][0] = datum[0];
-          data_partition[pos_data_partition][1] = datum[1];
-          pos_data_partition++;
-        }
-      }
-    }
-    for (int[] datum : data) {
-      if (datum[1] <= third_value[0]) {
-        data_partition[pos_data_partition][0] = datum[0];
-        data_partition[pos_data_partition][1] = datum[1];
-        pos_data_partition++;
-      }
-    }
-    for (int i = 0; i < block_num; i++) {
-      int[][] ts_block_time = new int[block_size][2];
-      int[][] ts_block_value = new int[block_size][2];
-      int[][] ts_block_partition = new int[block_size][2];
-
-      for (int j = 0; j < block_size; j++) {
-        ts_block_time[j][0] = data[j + i * block_size][0];
-        ts_block_time[j][1] = data[j + i * block_size][1];
-        ts_block_value[j][0] = data_value[j + i * block_size][0];
-        ts_block_value[j][1] = data_value[j + i * block_size][1];
-        ts_block_partition[j][0] = data_partition[j + i * block_size][0];
-        ts_block_partition[j][1] = data_partition[j + i * block_size][1];
-      }
-
-      int[] raw_length = new int[5];
-      double[] theta = new double[2 * p + 2];
-      int[][] ts_block_delta =
-          getEncodeBitsRegression(ts_block_time, block_size, raw_length, theta, segment_size, p);
-      int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-      length_time +=
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta, bit_width_segments, raw_length, segment_size, p, theta);
-
-      int[] raw_length_value = new int[5];
-      double[] theta_value = new double[2 * p + 2];
-      int[][] ts_block_delta_value =
-          getEncodeBitsRegression(
-              ts_block_value, block_size, raw_length_value, theta_value, segment_size, p);
-      int[][] bit_width_segments_value =
-          segmentBitPacking(ts_block_delta_value, block_size, segment_size);
-      length_value +=
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_value,
-              bit_width_segments_value,
-              raw_length_value,
-              segment_size,
-              p,
-              theta_value);
-
-      int[] raw_length_partition = new int[5];
-      double[] theta_partition = new double[2 * p + 2];
-      int[][] ts_block_delta_partition =
-          getEncodeBitsRegression(
-              ts_block_partition,
-              block_size,
-              raw_length_partition,
-              theta_partition,
-              segment_size,
-              p);
-      int[][] bit_width_segments_partition =
-          segmentBitPacking(ts_block_delta_partition, block_size, segment_size);
-      length_partition +=
-          numberOfEncodeSegment2Bytes(
-              ts_block_delta_partition,
-              bit_width_segments_partition,
-              raw_length_partition,
-              segment_size,
-              p,
-              theta_partition);
-    }
-    //        int remaining_length = length_all - block_num * block_size;
-
-    if (length_partition < length_time
-        && length_partition < length_value) { // partition performs better
-      data = data_partition;
-      //            for (int i = 0; i < 2; i++) {
-      System.out.println("Partition");
-      for (int i = 0; i < block_num; i++) {
-        encode_pos =
-            REGERBlockEncoderPartition(
-                data, i, block_size, segment_size, k, p, encode_pos, encoded_result);
-      }
-    } else {
-      if (length_value < length_time) { // order by value performs better
-        System.out.println("Value");
-        data = data_value;
-        //                for (int i = 0; i < 2; i++) {
-        for (int i = 0; i < block_num; i++) {
-
-          encode_pos =
-              REGERBlockEncoder(
-                  data,
-                  1,
-                  i,
-                  block_size,
-                  0,
-                  third_value,
-                  segment_size,
-                  k,
-                  p,
-                  encode_pos,
-                  encoded_result);
-        }
-      } else {
-        System.out.println("Time");
-        //                for (int i = 0; i < 2; i++) {
-        for (int i = 0; i < block_num; i++) {
-          encode_pos =
-              REGERBlockEncoder(
-                  data,
-                  0,
-                  i,
-                  block_size,
-                  0,
-                  third_value,
-                  segment_size,
-                  k,
-                  p,
-                  encode_pos,
-                  encoded_result);
-        }
-      }
-    }
-
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              0,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              p,
-              encode_pos,
-              encoded_result);
-    }
-
-    return encode_pos;
-  }
-
-  public static double bytes2Double(ArrayList<Byte> encoded, int start, int num) {
-    if (num > 8) {
-      System.out.println("bytes2Doubleerror");
-      return 0;
-    }
-    long value = 0;
-    for (int i = 0; i < 8; i++) {
-      value |= ((long) (encoded.get(i + start) & 0xff)) << (8 * i);
-    }
-    return Double.longBitsToDouble(value);
-  }
-
-  public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded.get(i + start) & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  public static double[] dataStandardization(double[] array) {
-    StandardDeviation deviation = new StandardDeviation();
-    for (int i = 0; i < array.length; i++) {
-      array[i] = array[i];
-    }
-    return array;
-  }
-
-  public static double[][] dataStandardizationDouble(double[][] arrays) {
-    double[][] result = new double[arrays[0].length][arrays.length];
-    for (int i = 0; i < arrays.length; i++) {
-      double[] doubles = dataStandardization(arrays[i]);
-      for (int k = 0; k < result.length; k++) {
-        result[k][i] = doubles[k];
-      }
-    }
-    return result;
-  }
-
-  @Test
-  public void REGERPDouble() throws IOException {
-
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/p_double/";
-    String input_parent_dir = parent_dir + "trans_data/";
-
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (int i = 0; i < dataset_name.size(); i++) {
-      input_path_list.add(input_parent_dir + dataset_name.get(i));
-      dataset_block_size.add(1024);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 3; file_i < 4; file_i++) {
-
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-      System.out.println(inputPath);
-
-      // speed
-      int repeatTime = 1; // set repeat time
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "p",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        for (int p = 2; p < 3; p++) {
-          //                for (int p = 1; p < 10; p++) {
-          System.out.println("p=" + p);
-
-          InputStream inputStream = Files.newInputStream(f.toPath());
-          CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-          ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-          ArrayList<ArrayList<Integer>> data_decoded = new ArrayList<>();
-
-          // add a column to "data"
-          loader.readHeaders();
-          data.clear();
-          while (loader.readRecord()) {
-            ArrayList<Integer> tmp = new ArrayList<>();
-            tmp.add(Integer.valueOf(loader.getValues()[0]));
-            tmp.add(Integer.valueOf(loader.getValues()[1]));
-            data.add(tmp);
-          }
-          inputStream.close();
-          ArrayList<Integer> result2 = new ArrayList<>();
-          splitTimeStamp3(data, result2);
-          int[][] data2_arr = new int[data.size()][2];
-          int min_time = data.get(0).get(0);
-          for (int i = 0; i < data.size(); i++) {
-            data2_arr[i][0] = data.get(i).get(0) - min_time;
-            data2_arr[i][1] = data.get(i).get(1);
-          }
-          System.out.println(data2_arr[0][0]);
-          byte[] encoded_result = new byte[data2_arr.length * 8];
-
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int length = 0;
-
-          long s = System.nanoTime();
-
-          for (int repeat_i = 0; repeat_i < 1; repeat_i++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr,
-                    dataset_block_size.get(file_i),
-                    dataset_third.get(file_i),
-                    8,
-                    p,
-                    1,
-                    encoded_result);
-
-          long e = System.nanoTime();
-          encodeTime += ((e - s));
-          compressed_size += length;
-          double ratioTmp = (double) compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          e = System.nanoTime();
-          decodeTime += ((e - s));
-
-          String[] record = {
-            f.toString(),
-            "REGER-64-DOUBLE",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(p),
-            String.valueOf(compressed_size),
-            String.valueOf(ratio)
-          };
-
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERPDoubleVaryP() throws IOException {
-
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/p_double_vary_p/";
-    String input_parent_dir = parent_dir + "trans_data/";
-
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (int i = 0; i < dataset_name.size(); i++) {
-      input_path_list.add(input_parent_dir + dataset_name.get(i));
-      dataset_block_size.add(1024);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 0; file_i < 1; file_i++) {
-
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-      System.out.println(inputPath);
-
-      // speed
-      int repeatTime = 1; // set repeat time
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "p",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        //                for (int p = 8; p < 9; p++) {
-        for (int p = 1; p < 10; p++) {
-          System.out.println("p=" + p);
-
-          InputStream inputStream = Files.newInputStream(f.toPath());
-          CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-          ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-          ArrayList<ArrayList<Integer>> data_decoded = new ArrayList<>();
-
-          // add a column to "data"
-          loader.readHeaders();
-          data.clear();
-          while (loader.readRecord()) {
-            ArrayList<Integer> tmp = new ArrayList<>();
-            tmp.add(Integer.valueOf(loader.getValues()[0]));
-            tmp.add(Integer.valueOf(loader.getValues()[1]));
-            data.add(tmp);
-          }
-          inputStream.close();
-          ArrayList<Integer> result2 = new ArrayList<>();
-          splitTimeStamp3(data, result2);
-          int[][] data2_arr = new int[data.size()][2];
-          int min_time = data.get(0).get(0);
-          for (int i = 0; i < data.size(); i++) {
-            data2_arr[i][0] = data.get(i).get(0) - min_time;
-            data2_arr[i][1] = data.get(i).get(1);
-          }
-          System.out.println(data2_arr[0][0]);
-          byte[] encoded_result = new byte[data2_arr.length * 8];
-
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int length = 0;
-
-          long s = System.nanoTime();
-
-          for (int repeat_i = 0; repeat_i < 1; repeat_i++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr,
-                    dataset_block_size.get(file_i),
-                    dataset_third.get(file_i),
-                    8,
-                    p,
-                    1,
-                    encoded_result);
-
-          long e = System.nanoTime();
-          encodeTime += ((e - s));
-          compressed_size += length;
-          double ratioTmp = (double) compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          e = System.nanoTime();
-          decodeTime += ((e - s));
-
-          String[] record = {
-            f.toString(),
-            "REGER-64-DOUBLE",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(p),
-            String.valueOf(compressed_size),
-            String.valueOf(ratio)
-          };
-
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerPDoubleTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerPDoubleTest.java
deleted file mode 100644
index f827565..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerPDoubleTest.java
+++ /dev/null
@@ -1,2480 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.apache.commons.math3.linear.*;
-import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
-import org.junit.Test;
-import java.text.DecimalFormat;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.Stack;
-
-import static java.lang.Math.abs;
-
-public class RegerPDoubleTest {
-
-  static int[] precision = {0,5,8,11,15,18,21,25,28,31,35};
-  public static int min3(int a, int b, int c) {
-    if (a < b && a < c) {
-      return 0;
-    } else if (b < c) {
-      return 1;
-    } else {
-      return 2;
-    }
-  }
-
-  public static double decimalFloat(double f,int pre){
-    StringBuilder pattern = new StringBuilder("#.");
-    for(int i=0;i<pre;i++){
-      pattern.append("#");
-    }
-    DecimalFormat decimalFormat = new DecimalFormat(pattern.toString());
-
-    String formattedFloatStr = decimalFormat.format(f);
-    return Double.parseDouble(formattedFloatStr);
-  }
-  public static int getBitWith(int num) {
-    if (num == 0) return 1;
-    else return 32 - Integer.numberOfLeadingZeros(num);
-  }
-
-  public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 24);
-    cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-    cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 3] = (byte) (integer);
-  }
-
-  public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer);
-  }
-
-  public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 1] = (byte) (integer);
-  }
-
-  public static boolean containsValue(int[] array, int targetValue) {
-    for (int value : array) {
-      if (value == targetValue) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static int[] removeElement(int[] array, int position) {
-    if (position < 0 || position >= array.length) {
-      return array;
-    }
-
-    int[] newArray = new int[array.length - 1];
-    int newIndex = 0;
-
-    for (int i = 0; i < array.length; i++) {
-      if (i != position) {
-        newArray[newIndex] = array[i];
-        newIndex++;
-      }
-    }
-
-    return newArray;
-  }
-
-  public static int bytes2Integer(byte[] encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded[i + start] & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  private static int byte2Integer(byte[] encoded, int decode_pos) {
-    int value = 0;
-    int b = encoded[decode_pos] & 0xFF;
-    value |= b;
-    if (value == 0) return 256;
-    return value % 256;
-  }
-
-  public static void pack8Values(
-      ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values.get(valueIdx) << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values.get(valueIdx) << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values.get(valueIdx) >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static void pack8Values(
-      int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values[valueIdx][index] << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values[valueIdx][index] << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values[valueIdx][index] >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static int unpack8Values(
-      byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-    int byteIdx = offset;
-    //        int pos_encode = 0;
-    long buffer = 0;
-    // total bits which have read from 'buf' to 'buffer'. i.e.,
-    // number of available bits to be decoded.
-    int totalBits = 0;
-    int valueIdx = 0;
-
-    while (valueIdx < 8) {
-      // If current available bits are not enough to decode one Integer,
-      // then add next byte from buf to 'buffer' until totalBits >= width
-      while (totalBits < width) {
-        buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-        byteIdx++;
-        totalBits += 8;
-      }
-
-      // If current available bits are enough to decode one Integer,
-      // then decode one Integer one by one until left bits in 'buffer' is
-      // not enough to decode one Integer.
-      while (totalBits >= width && valueIdx < 8) {
-        result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-        value_pos++;
-        valueIdx++;
-        totalBits -= width;
-        buffer = buffer & ((1L << totalBits) - 1);
-      }
-    }
-    return value_pos;
-  }
-
-  public static int bitPacking(
-      int[][] numbers,
-      int index,
-      int start,
-      int block_size,
-      int bit_width,
-      int encode_pos,
-      byte[] encoded_result) {
-    int block_num = block_size / 8;
-    for (int i = 0; i < block_num; i++) {
-      pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-      encode_pos += bit_width;
-    }
-
-    return encode_pos;
-  }
-
-  public static int decodeBitPacking(
-      byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-    //        int[] result_list = new int[];
-    int block_num = block_size / 8;
-    int value_pos = 0;
-
-    for (int i = 0; i < block_num; i++) { // bitpacking
-      value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-      decode_pos += bit_width;
-    }
-    //        decode_pos_result.add(decode_pos);
-    return decode_pos;
-  }
-
-  public static void double2bytes(double f, int pos_encode, byte[] encode_result) {
-    long fbit = Double.doubleToLongBits(f);
-    byte[] b = new byte[8];
-    for (int i = 0; i < 8; i++) {
-      b[i] = (byte) (fbit >> (56 - i * 8));
-    }
-    int len = b.length;
-
-    System.arraycopy(b, 0, encode_result, pos_encode, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = encode_result[i + pos_encode];
-      encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-      encode_result[len - i - 1 + pos_encode] = temp;
-    }
-  }
-
-  public static byte[] int2Bytes(int integer) {
-    byte[] bytes = new byte[4];
-    bytes[0] = (byte) (integer >> 24);
-    bytes[1] = (byte) (integer >> 16);
-    bytes[2] = (byte) (integer >> 8);
-    bytes[3] = (byte) integer;
-    return bytes;
-  }
-
-  public static byte[] bitWidth2Bytes(int integer) {
-    byte[] bytes = new byte[1];
-    bytes[0] = (byte) integer;
-    return bytes;
-  }
-
-  public static byte[] bitPacking(
-      ArrayList<ArrayList<Integer>> numbers, int index, int start, int block_num, int bit_width) {
-    block_num = block_num / 8;
-    byte[] result = new byte[bit_width * block_num];
-
-    for (int i = 0; i < block_num; i++) {
-      for (int j = 0; j < bit_width; j++) {
-        int tmp_int = 0;
-        for (int k = 0; k < 8; k++) {
-          tmp_int += (((numbers.get(start + i * 8 + k).get(index) >> j) % 2) << k);
-        }
-        result[i * bit_width + j] = (byte) tmp_int;
-      }
-    }
-    return result;
-  }
-
-  public static ArrayList<Integer> decodebitPacking(
-      ArrayList<Byte> encoded, int decode_pos, int bit_width, int min_delta, int block_size) {
-    ArrayList<Integer> result_list = new ArrayList<>();
-    for (int i = 0; i < (block_size - 1) / 8; i++) {
-      int[] val8 = new int[8];
-      for (int j = 0; j < 8; j++) {
-        val8[j] = 0;
-      }
-      for (int j = 0; j < bit_width; j++) {
-        byte tmp_byte = encoded.get(decode_pos + bit_width - 1 - j);
-        byte[] bit8 = new byte[8];
-        for (int k = 0; k < 8; k++) {
-          bit8[k] = (byte) (tmp_byte & 1);
-          tmp_byte = (byte) (tmp_byte >> 1);
-        }
-        for (int k = 0; k < 8; k++) {
-          val8[k] = val8[k] * 2 + bit8[k];
-        }
-      }
-      for (int j = 0; j < 8; j++) {
-        result_list.add(val8[j] + min_delta);
-      }
-      decode_pos += bit_width;
-    }
-    return result_list;
-  }
-
-  public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    ArrayList<Integer> tmp = arr.get(low);
-    while (low < high) {
-      while (low < high
-          && (arr.get(high).get(index) > tmp.get(index)
-              || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                  && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-        high--;
-      }
-      arr.set(low, arr.get(high));
-      while (low < high
-          && (arr.get(low).get(index) < tmp.get(index)
-              || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                  && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-        low++;
-      }
-
-      arr.set(high, arr.get(low));
-    }
-    arr.set(low, tmp);
-    return low;
-  }
-
-  public static void quickSort(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    Stack<Integer> stack = new Stack<>();
-    int mid = part(arr, index, low, high);
-    if (mid + 1 < high) {
-      stack.push(mid + 1);
-      stack.push(high);
-    }
-
-    if (mid - 1 > low) {
-      stack.push(low);
-      stack.push(mid - 1);
-    }
-    while (stack.empty() == false) {
-      high = stack.pop();
-      low = stack.pop();
-      mid = part(arr, index, low, high);
-      if (mid + 1 < high) {
-        stack.push(mid + 1);
-        stack.push(high);
-      }
-      if (mid - 1 > low) {
-        stack.push(low);
-        stack.push(mid - 1);
-      }
-    }
-  }
-
-  public static int getCommon(int m, int n) {
-    int z;
-    while (m % n != 0) {
-      z = m % n;
-      m = n;
-      n = z;
-    }
-    return n;
-  }
-
-  public static void splitTimeStamp3(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-
-    int td_common = 0;
-    for (int i = 1; i < ts_block.size(); i++) {
-      int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-      if (td_common == 0) {
-        if (time_diffi != 0) {
-          td_common = time_diffi;
-          continue;
-        } else {
-          continue;
-        }
-      }
-      if (time_diffi != 0) {
-        td_common = getCommon(time_diffi, td_common);
-        if (td_common == 1) {
-          break;
-        }
-      }
-    }
-    if (td_common == 0) {
-      td_common = 1;
-    }
-
-    int t0 = ts_block.get(0).get(0);
-    for (int i = 0; i < ts_block.size(); i++) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-
-      tmp.add(interval_i);
-      tmp.add(ts_block.get(i).get(1));
-      ts_block.set(i, tmp);
-    }
-    ArrayList<Integer> tmp = new ArrayList<>();
-
-    tmp.add(0);
-    tmp.add(ts_block.get(0).get(1));
-    ts_block.set(0, tmp);
-
-    result.add(td_common);
-    result.add(t0);
-  }
-
-//  public static void terminate(int[][] ts_block, double[] coefficient, int p) {
-//    int length = ts_block.length;
-//    assert length > p;
-//    int size = length - p;
-//
-//    double[] param;
-//    try {
-//      OLSMultipleLinearRegression ols1 = new OLSMultipleLinearRegression();
-//      double[][] X1 = new double[size][p];
-//      double[] Y1 = new double[size];
-//      for (int i = 0; i < size; i++) {
-//        X1[i] = new double[p];
-//        for (int j = 0; j < p; j++) {
-//          X1[i][j] = ts_block[i + j][0];
-//        }
-//        Y1[i] = ts_block[i + p][0];
-//      }
-//      ols1.newSampleData(Y1, X1);
-//      param = ols1.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-//      // System.out.println(Arrays.toString(param));
-//    } catch (Exception e) {
-//      param = new double[p + 1];
-//      for (int i = 0; i <= p; i++) {
-//        param[i] = 0;
-//      }
-//    }
-//
-//    double[] param2;
-//    try {
-//      OLSMultipleLinearRegression ols2 = new OLSMultipleLinearRegression();
-//      double[][] X2 = new double[size][p];
-//      double[] Y2 = new double[size];
-//      for (int i = 0; i < size; i++) {
-//        X2[i] = new double[p];
-//        for (int j = 0; j < p; j++) {
-//          X2[i][j] = ts_block[i + j][1];
-//        }
-//        Y2[i] = ts_block[i + p][1];
-//      }
-//      ols2.newSampleData(Y2, X2);
-//      param2 = ols2.estimateRegressionParameters(); // 结果的第1项是常数项, 之后依次序为各个特征的系数
-//      // System.out.println(Arrays.toString(param2));
-//    } catch (Exception exception) {
-//      param2 = new double[p + 1];
-//      for (int i = 0; i <= p; i++) {
-//        param2[i] = 0;
-//      }
-//    }
-//
-//    for (int i = 0; i <= p; i++) {
-//      coefficient[2 * i] = param[i];
-//      coefficient[2 * i + 1] = param2[i];
-//    }
-//  }
-
-  public static void terminate(int[][] ts_block, double[] coefficient, int p, int pre){
-    int length = ts_block.length;
-    assert length > p;
-    int size = length - p;
-
-    OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
-
-    RealMatrix matrix = new Array2DRowRealMatrix(size, p+1);
-    RealVector vector = new ArrayRealVector(size);
-
-    for (int i = 0; i < size; i++) {
-      for (int j = 0; j < p; j++) {
-        matrix.setEntry(i, j, ts_block[i + j][0]);
-      }
-      matrix.setEntry(i, p, 1);
-      vector.setEntry(i, ts_block[i + p][0]);
-    }
-
-
-    DecompositionSolver solver = new SingularValueDecomposition(matrix).getSolver();
-    RealVector solution1 = solver.solve(vector);
-
-    matrix = new Array2DRowRealMatrix(size, p+1);
-    vector = new ArrayRealVector(size);
-
-    for (int i = 0; i < size; i++) {
-      for (int j = 0; j < p; j++) {
-        matrix.setEntry(i, j, ts_block[i + j][1]);
-      }
-      matrix.setEntry(i, p, 1);
-      vector.setEntry(i, ts_block[i + p][1]);
-    }
-
-    DecompositionSolver solver1 = new SingularValueDecomposition(matrix).getSolver();
-    RealVector solution2 = solver1.solve(vector);
-
-//    coefficient[0] = solution1.getEntry(p);
-//    coefficient[1] = solution2.getEntry(p);
-//
-//    for (int i = 1; i <= p; i++) {
-//      coefficient[2 * i] =  decimalFloat(solution1.getEntry(p-i),pre);
-//      coefficient[2 * i + 1] = decimalFloat(solution2.getEntry(p-i),pre);
-//    }
-
-    for (int i = 0; i <= p; i++) {
-      coefficient[2 * i] =  solution1.getEntry(p-i);
-      coefficient[2 * i + 1] = solution2.getEntry(p-i);
-    }
-
-  }
-
-  public static int[][] deltaTSBlock(int[][] ts_block,
-                                     int[] delta_index,
-                                     int[] delta,
-                                     double[] theta,
-                                     int p){
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int timestamp_delta_max = Integer.MIN_VALUE;
-    int value_delta_max = Integer.MIN_VALUE;
-    int timestamp_delta_max_index = -1;
-    int value_delta_max_index = -1;
-    int block_size = ts_block.length;
-
-    int[][] ts_block_delta = new int[block_size][2];
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        timestamp_delta_min_index = j;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-        value_delta_min_index = j;
-      }
-      if (epsilon_r > timestamp_delta_max) {
-        timestamp_delta_max = (int) epsilon_r;
-        timestamp_delta_max_index = j;
-      }
-      if (epsilon_v > value_delta_max) {
-        value_delta_max = (int) epsilon_v;
-        value_delta_max_index = j;
-      }
-    }
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -=  (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -=  (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        timestamp_delta_min_index = j;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-        value_delta_min_index = j;
-      }
-      if (epsilon_r > timestamp_delta_max) {
-        timestamp_delta_max = (int) epsilon_r;
-        timestamp_delta_max_index = j;
-      }
-      if (epsilon_v > value_delta_max) {
-        value_delta_max = (int) epsilon_v;
-        value_delta_max_index = j;
-      }
-    }
-    delta_index[0] = timestamp_delta_max_index;
-    delta_index[1] = value_delta_max_index;
-    delta_index[2] = timestamp_delta_min_index;
-    delta_index[3] = value_delta_min_index;
-
-    delta[0] = timestamp_delta_max;
-    delta[1] = value_delta_max;
-    delta[2] = timestamp_delta_min;
-    delta[3] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  public static int[][] segmentBitPacking(
-      int[][] ts_block_delta, int block_size, int segment_size) {
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    return bit_width_segments;
-  }
-
-  public static void moveAlphaToBeta(int[][] ts_block, int alpha, int beta) {
-    int[] tmp_tv = ts_block[alpha];
-    if (beta < alpha) {
-      for (int u = alpha - 1; u >= beta; u--) {
-        ts_block[u + 1][0] = ts_block[u][0];
-        ts_block[u + 1][1] = ts_block[u][1];
-      }
-    } else {
-      for (int u = alpha + 1; u < beta; u++) {
-        ts_block[u - 1][0] = ts_block[u][0];
-        ts_block[u - 1][1] = ts_block[u][1];
-      }
-      beta--;
-    }
-    ts_block[beta][0] = tmp_tv[0];
-    ts_block[beta][1] = tmp_tv[1];
-  }
-
-  private static ArrayList<Integer> isMovable(int[] alpha_list, int[] beta_list) {
-    ArrayList<Integer> isMoveable = new ArrayList<>();
-    for (int i = 0; i < alpha_list.length; i++) {
-      if (alpha_list[i] != -1 && beta_list[i] != -1) {
-        isMoveable.add(i);
-      }
-    }
-    return isMoveable;
-  }
-
-  private static int getIstarClose(
-      int alpha, ArrayList<Integer> j_star_list, int[][] new_length_list, int[] raw_length) {
-    int min_i = 0;
-    int min_dis = Integer.MAX_VALUE;
-    for (int i = 0; i < j_star_list.size(); i++) {
-      if (abs(alpha - j_star_list.get(i)) < min_dis) {
-        min_i = j_star_list.get(i);
-        min_dis = abs(alpha - j_star_list.get(i));
-        raw_length[0] = new_length_list[i][0];
-        raw_length[3] = new_length_list[i][1];
-        raw_length[4] = new_length_list[i][2];
-      }
-    }
-    if (min_dis == 0) {
-      System.out.println("get IstarClose error");
-      return 0;
-    }
-    return min_i;
-  }
-
-  public static int getBetaP(
-      int[][] ts_block, int alpha, int block_size, int[] raw_length, double[] theta, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int max_timestamp = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int raw_timestamp_delta_max_index = -1;
-    int raw_value_delta_max_index = -1;
-
-    int raw_abs_sum = raw_length[0];
-
-    ArrayList<Integer> j_star_list = new ArrayList<>(); // beta list of min b phi alpha to j
-
-    int j_star = -1;
-
-    if (alpha == -1) {
-      return j_star;
-    }
-
-    int[] b;
-    int[][] new_length_list = new int[block_size][3];
-    int pos_new_length_list = 0;
-    int range = block_size / 32;
-
-    // alpha <= p
-    if (alpha < p) {
-
-      int j = 0;
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      int end_j = Math.min(alpha+range, block_size);
-      for (j = alpha + 2; j < alpha + p && j < end_j; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < end_j; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(block_size);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(block_size);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-
-    } // alpha == n
-    else if (alpha < block_size && alpha >= block_size - p) {
-
-      int j = 0;
-      for (; j < alpha - p; j++) {
-
-        b = adjustCase1(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      int end_j =  Math.min(alpha+range, block_size);
-      for (j = alpha + 2; j < alpha + p && j < end_j; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < end_j; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    } // p < alpha <= n-p
-    else {
-      int start_j = Math.max(alpha - range / 2, 1);
-      int end_j = Math.min(alpha + range / 2, block_size - 1);
-
-      int j = start_j;
-      for (; j < alpha - p; j++) {
-
-        b = adjustCase1(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < alpha; j++) {
-
-        b = adjustCase2(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (j = alpha + 2; j < alpha + p && j < end_j; j++) {
-
-        b = adjustCase3(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      for (; j < end_j; j++) {
-
-        b = adjustCase4(ts_block, alpha, j, theta, p);
-        if (b[0] < raw_abs_sum) {
-          raw_abs_sum = b[0];
-          j_star_list.clear();
-          j_star_list.add(j);
-          pos_new_length_list = 0;
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        } else if (b[0] == raw_abs_sum) {
-          j_star_list.add(j);
-          System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-          pos_new_length_list++;
-        }
-      }
-      b = adjustCase5(ts_block, alpha, theta, p);
-      if (b[0] < raw_abs_sum) {
-        raw_abs_sum = b[0];
-        j_star_list.clear();
-        j_star_list.add(0);
-        pos_new_length_list = 0;
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      } else if (b[0] == raw_abs_sum) {
-        j_star_list.add(0);
-        System.arraycopy(b, 0, new_length_list[pos_new_length_list], 0, 3);
-        pos_new_length_list++;
-      }
-    }
-
-    if (j_star_list.size() != 0) {
-      j_star = getIstarClose(alpha, j_star_list, new_length_list, raw_length);
-    }
-    return j_star;
-  }
-  private static void cloneTsblock(int[][] ts_block,int[][] tmp_ts_block){
-    for(int i=0;i<ts_block.length;i++){
-      tmp_ts_block[i][0] = ts_block[i][0];
-      tmp_ts_block[i][1] = ts_block[i][1];
-    }
-  }
-  private static int[] adjustCase1(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = new int[ts_block.length][2];
-    cloneTsblock(ts_block,tmp_ts_block);
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    int[] b = new int[3];
-    for (int u = alpha - 1; u >= j_star; u--) {
-      tmp_ts_block[u + 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u + 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int[] delta_index = new int[4];
-    int[] delta = new int[4];
-    int[][] ts_block_delta;
-    ts_block_delta =deltaTSBlock(tmp_ts_block, delta_index,delta, theta, p);
-
-    int timestamp_delta_min = delta[2];
-    int value_delta_min = delta[3];
-
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-
-    return b;
-  }
-
-  private static int[] adjustCase2(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = new int[ts_block.length][2];
-    cloneTsblock(ts_block,tmp_ts_block);
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha - 1; u >= j_star; u--) {
-      tmp_ts_block[u + 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u + 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int[] delta_index = new int[4];
-    int[] delta = new int[4];
-    int[][] ts_block_delta;
-    ts_block_delta =deltaTSBlock(tmp_ts_block, delta_index,delta, theta, p);
-
-    int timestamp_delta_min = delta[2];
-    int value_delta_min = delta[3];
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase3(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = new int[ts_block.length][2];
-    cloneTsblock(ts_block,tmp_ts_block);
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < j_star; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    j_star--;
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int[] delta_index = new int[4];
-    int[] delta = new int[4];
-    int[][] ts_block_delta;
-    ts_block_delta =deltaTSBlock(tmp_ts_block, delta_index,delta, theta, p);
-
-    int timestamp_delta_min = delta[2];
-    int value_delta_min = delta[3];
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase4(int[][] ts_block, int alpha, int j_star, double[] theta, int p) {
-    int[][] tmp_ts_block = new int[ts_block.length][2];
-    cloneTsblock(ts_block,tmp_ts_block);
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < j_star; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    j_star--;
-    tmp_ts_block[j_star][0] = tmp_tv[0];
-    tmp_ts_block[j_star][1] = tmp_tv[1];
-
-    int[] delta_index = new int[4];
-    int[] delta = new int[4];
-    int[][] ts_block_delta;
-    ts_block_delta =deltaTSBlock(tmp_ts_block, delta_index,delta, theta, p);
-
-    int timestamp_delta_min = delta[2];
-    int value_delta_min = delta[3];
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  private static int[] adjustCase5(int[][] ts_block, int alpha, double[] theta, int p) {
-    int[][] tmp_ts_block = new int[ts_block.length][2];
-    cloneTsblock(ts_block,tmp_ts_block);
-    int block_size = ts_block.length;
-    int[] tmp_tv = tmp_ts_block[alpha].clone();
-    for (int u = alpha + 1; u < block_size; u++) {
-      tmp_ts_block[u - 1][0] = tmp_ts_block[u][0];
-      tmp_ts_block[u - 1][1] = tmp_ts_block[u][1];
-    }
-    tmp_ts_block[block_size - 1][0] = tmp_tv[0];
-    tmp_ts_block[block_size - 1][1] = tmp_tv[1];
-    int[] delta_index = new int[4];
-    int[] delta = new int[4];
-    int[][] ts_block_delta;
-    ts_block_delta =deltaTSBlock(tmp_ts_block, delta_index,delta, theta, p);
-
-    int timestamp_delta_min = delta[2];
-    int value_delta_min = delta[3];
-    int length = 0;
-    for (int[] integers : ts_block_delta) {
-      length += getBitWith(integers[0] - timestamp_delta_min);
-      length += getBitWith(integers[1] - value_delta_min);
-    }
-    int[] b = new int[3];
-    b[0] = length;
-    b[1] = timestamp_delta_min;
-    b[2] = value_delta_min;
-    return b;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(int[][] bit_width_segments) {
-    int encoded_result = 0;
-
-    //    ArrayList<ArrayList<Integer>> run_length_time = new ArrayList<>();
-    //    ArrayList<ArrayList<Integer>> run_length_value = new ArrayList<>();
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 1;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-
-    encoded_result += (pos_time * 2);
-    encoded_result += (pos_value * 2);
-
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(
-      int[][] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-    intWord2Bytes(pos_time, pos_encode, encoded_result);
-    pos_encode += 2;
-    intWord2Bytes(pos_value, pos_encode, encoded_result);
-    pos_encode += 2;
-    //        System.out.println("pos_time="+pos_time);
-    //        System.out.println("pos_value="+pos_value);
-
-    //        System.out.println(Arrays.deepToString(run_length_time));
-    //        System.out.println(Arrays.deepToString(run_length_value));
-    for (int i = 0; i < pos_time; i++) {
-      int[] bit_width_time = run_length_time[i];
-      intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_time[0]="+bit_width_time[0]);
-      //            System.out.println("bit_width_time[1]="+bit_width_time[1]);
-    }
-    for (int i = 0; i < pos_value; i++) {
-      int[] bit_width_value = run_length_value[i];
-      intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_value[0]="+bit_width_value[0]);
-      //            System.out.println("bit_width_value[1]="+bit_width_value[1]);
-    }
-
-    return pos_encode;
-  }
-
-  private static int encodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      int p,
-      double[] theta,
-      int pos_encode,
-      byte[] encoded_result,
-      int pre) {
-
-    int block_size = delta_segments.length;
-    int segment_n = (block_size - p) / segment_size;
-    int2Bytes(delta_segments[0][0], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(delta_segments[0][1], pos_encode, encoded_result);
-    pos_encode += 4;
-    double2bytes(theta[0], pos_encode, encoded_result);
-    pos_encode += 8;
-
-    double2bytes(theta[1], pos_encode, encoded_result);
-    pos_encode += 8;
-//    pos_encode +=Math.ceil((double)(12+precision[pre])/(double)(4));
-
-
-    for (int i = 2; i < theta.length; i++) {
-      double2bytes(theta[i], pos_encode, encoded_result);
-      pos_encode += 8;
-    }
-
-    int2Bytes( raw_length[3], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(raw_length[4], pos_encode, encoded_result);
-    pos_encode += 4;
-    //        System.out.println(delta_segments[0][0]);
-    //        System.out.println(delta_segments[0][1]);
-    //        System.out.println(theta[0] + raw_length[3]);
-    //        System.out.println(theta[1]);
-    //        System.out.println(theta[2] + raw_length[4]);
-    //        System.out.println(theta[3]);
-
-    pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              0,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_time,
-              pos_encode,
-              encoded_result);
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              1,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_value,
-              pos_encode,
-              encoded_result);
-    }
-
-    return pos_encode;
-  }
-
-
-  public static int[][] getEncodeBitsRegressionNoTrain(
-      int[][] ts_block, int block_size, int[] raw_length, double[] theta, int segment_size, int p) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = (double) ts_block[j][0] - theta[0];
-      double epsilon_v = (double) ts_block[j][1] - theta[1];
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= theta[2 * pi] * (double) ts_block[j - pi][0];
-        epsilon_v -= theta[2 * pi + 1] * (double) ts_block[j - pi][1];
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta[j][0] = (int) epsilon_r;
-      ts_block_delta[j][1] = (int) epsilon_v;
-    }
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j >= 1; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(epsilon_r);
-      length += getBitWith(epsilon_v);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    return ts_block_delta;
-  }
-
-  private static int numberOfEncodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      int p,
-      double[] theta) {
-    ArrayList<Byte> encoded_result = new ArrayList<>();
-    int block_size = delta_segments.length;
-    int segment_n = (block_size - p) / segment_size;
-    int result = 0;
-    result += 8; // encode interval0 and value0
-    result += ((2 * p + 1) * 8); // encode theta
-    result += encodeRLEBitWidth2Bytes(bit_width_segments);
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      result += (segment_size * bit_width_time / 8);
-      result += (segment_size * bit_width_value / 8);
-    }
-
-    return result;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block,
-      ArrayList<Integer> min_index,
-      int block_size,
-      int index,
-      double[] theta,
-      int p,
-      int k) {
-
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int alpha = 0;
-
-    int[][] ts_block_delta = new int[block_size - 1][2];
-
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        //                timestamp_delta_min_index
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_v;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_r;
-      }
-    }
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      if (index == 0) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_v;
-      } else if (index == 1) {
-        ts_block_delta[j - 1][0] = j;
-        ts_block_delta[j - 1][1] = (int) epsilon_r;
-      }
-    }
-
-    min_index.add(timestamp_delta_min_index);
-    min_index.add(value_delta_min_index);
-    Arrays.sort(
-        ts_block_delta,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    //        Arrays.sort(ts_block_delta);
-    //    quickSort(ts_block_delta, 1, 0, block_size - 2);
-    int[] alpha_list = new int[k + 1];
-    //    ArrayList<Integer> alpha_list = new ArrayList<>();
-    alpha_list[0] = ts_block_delta[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta[block_size - 2 - k][0];
-    }
-    return alpha_list;
-  }
-
-  public static int[] getIStar(
-      int[][] ts_block,
-      ArrayList<Integer> min_index,
-      int block_size,
-      double[] theta,
-      int p,
-      int k) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int timestamp_delta_max_index = -1;
-    int value_delta_max_index = -1;
-    int timestamp_delta_min_index = -1;
-    int value_delta_min_index = -1;
-    int[] alpha_list = new int[2 * k + 2];
-
-    int[][] ts_block_delta_time = new int[block_size - 1][2];
-    int[][] ts_block_delta_value = new int[block_size - 1][2];
-    // regression residual
-    for (int j = 1; j < p; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-      for (int pi = 1; pi <= j; pi++) {
-        epsilon_r -= (double) (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (double) (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-        //                timestamp_delta_min_index
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = (int) epsilon_r;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = (int) epsilon_v;
-    }
-    for (int j = p; j < block_size; j++) {
-      double epsilon_r = ((double) ts_block[j][0] - theta[0]);
-      double epsilon_v = ((double) ts_block[j][1] - theta[1]);
-
-      for (int pi = 1; pi <= p; pi++) {
-        epsilon_r -= (theta[2 * pi] * (double) ts_block[j - pi][0]);
-        epsilon_v -= (theta[2 * pi + 1] * (double) ts_block[j - pi][1]);
-      }
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = (int) epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = (int) epsilon_v;
-      }
-      ts_block_delta_time[j - 1][0] = j;
-      ts_block_delta_time[j - 1][1] = (int) epsilon_r;
-      ts_block_delta_value[j - 1][0] = j;
-      ts_block_delta_value[j - 1][1] = (int) epsilon_v;
-    }
-
-    Arrays.sort(
-        ts_block_delta_time,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    min_index.add(ts_block_delta_time[0][0]);
-    alpha_list[0] = ts_block_delta_time[0][0];
-    for (int i = 0; i < k; i++) {
-      alpha_list[i + 1] = ts_block_delta_time[block_size - 2 - k][0];
-    }
-
-    Arrays.sort(
-        ts_block_delta_value,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-
-    int pos_alpha_list = k + 1;
-    //    quickSort(ts_block_delta_value, 1, 0, block_size - 2);
-    min_index.add(ts_block_delta_value[0][0]);
-    if (!containsValue(alpha_list, ts_block_delta_value[0][0])) {
-      alpha_list[pos_alpha_list] = ts_block_delta_value[0][0];
-      pos_alpha_list++;
-    }
-
-    for (int i = 0; i < k; i++) {
-      if (!containsValue(alpha_list, ts_block_delta_value[block_size - 2 - k][0])) {
-        alpha_list[pos_alpha_list] = ts_block_delta_value[block_size - 2 - k][0];
-        pos_alpha_list++;
-      }
-    }
-
-    return alpha_list;
-  }
-
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int i,
-      int block_size,
-      int supply_length,
-      int[] third_value,
-      int segment_size,
-      int k,
-      int p,
-      int pre,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    int[][] ts_block_partition;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      ts_block_partition = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-//        data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = data[j + i * block_size][0]- min_time;
-        ts_block[j][1] = data[j + i * block_size][1];
-        //      ts_block_reorder[j][0] = data[j + i * block_size][0];
-        //      ts_block_reorder[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      ts_block_partition = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-//        data[j + i * block_size][0] ;
-        ts_block[j][0] = data[j + i * block_size][0]- min_time;
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    //        System.out.println(Arrays.deepToString(data));
-    //        System.out.println(Arrays.deepToString(ts_block));
-
-    int[] reorder_length = new int[5];
-    double[] theta_reorder = new double[2 * p + 2];
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    double[] theta_time = new double[2 * p + 2];
-    int[] raw_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    double[] theta = new double[2 * p + 2];
-    int[][] ts_block_delta_reorder = new int[block_size][2];
-    int[][] bit_width_segments_value;
-    int[][] ts_block_delta_time = new int[block_size][2];
-    int[][] bit_width_segments_time;
-    int[][] ts_block_delta = new int[block_size][2];
-    int[][] bit_width_segments_partition;
-
-    terminate(ts_block, theta_time, p, pre);
-    ts_block_delta_time =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, time_length, theta_time, segment_size, p);
-    bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-//      time_length[0] =
-//          numberOfEncodeSegment2Bytes(
-//              ts_block_delta_time,
-//              bit_width_segments_time,
-//              time_length,
-//              segment_size,
-//              p,
-//              theta_time);
-
-    int pos_ts_block_partition = 0;
-    for (int[] datum : ts_block) {
-      if (datum[1] > third_value[third_value.length - 1]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-    for (int third_i = third_value.length - 1; third_i > 0; third_i--) {
-      for (int[] datum : ts_block) {
-        if (datum[1] <= third_value[third_i] && datum[1] > third_value[third_i - 1]) {
-          ts_block_partition[pos_ts_block_partition][0] = datum[0];
-          ts_block_partition[pos_ts_block_partition][1] = datum[1];
-          pos_ts_block_partition++;
-        }
-      }
-    }
-    for (int[] datum : ts_block) {
-      if (datum[1] <= third_value[0]) {
-        ts_block_partition[pos_ts_block_partition][0] = datum[0];
-        ts_block_partition[pos_ts_block_partition][1] = datum[1];
-        pos_ts_block_partition++;
-      }
-    }
-
-    terminate(ts_block_partition, theta, p, pre);
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(
-            ts_block_partition, block_size, raw_length, theta, segment_size, p);
-    bit_width_segments_partition = segmentBitPacking(ts_block_delta, block_size, segment_size);
-//      raw_length[0] =
-//          numberOfEncodeSegment2Bytes(
-//              ts_block_delta, bit_width_segments_partition, raw_length, segment_size, p, theta);
-
-    Arrays.sort(
-        ts_block,
-        (a, b) -> {
-          if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-          return Integer.compare(a[1], b[1]);
-        });
-    terminate(ts_block, theta_reorder, p, pre);
-    ts_block_delta_reorder =
-        getEncodeBitsRegressionNoTrain(
-            ts_block, block_size, reorder_length, theta_reorder, segment_size, p);
-    bit_width_segments_value =
-        segmentBitPacking(ts_block_delta_reorder, block_size, segment_size);
-//      reorder_length[0] =
-//          numberOfEncodeSegment2Bytes(
-//              ts_block_delta_reorder,
-//              bit_width_segments_value,
-//              reorder_length,
-//              segment_size,
-//              p,
-//              theta_reorder);
-    //        System.out.println(Arrays.deepToString(ts_block_delta));
-
-    int[] alpha_list;
-
-    int choose = min3(time_length[0], raw_length[0], reorder_length[0]);
-    ArrayList<Integer> min_index = new ArrayList<>();
-    int index_alpha_list = 0;
-
-    if (choose == 0) {
-      raw_length = time_length;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
-            return Integer.compare(a[0], b[0]);
-          });
-      theta = theta_time;
-    } else if (choose == 1) {
-      ts_block = ts_block_partition;
-    } else {
-      raw_length = reorder_length;
-      theta = theta_reorder;
-      Arrays.sort(
-          ts_block,
-          (a, b) -> {
-            if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
-            return Integer.compare(a[1], b[1]);
-          });
-      index_alpha_list = 1;
-    }
-
-    alpha_list = getIStar(ts_block, min_index, block_size, index_alpha_list, theta, p, k);
-    int[] beta_list = new int[alpha_list.length];
-    int[][] new_length_list = new int[alpha_list.length][5];
-    int pos_new_length_list = 0;
-
-    //    ArrayList<ArrayList<Integer>> new_length_list = new ArrayList<>();
-
-    for (int j = 0; j < alpha_list.length; j++) {
-      int alpha = alpha_list[j];
-      int[] new_length = new int[5];
-      System.arraycopy(raw_length, 0, new_length, 0, 5);
-      beta_list[j] = getBetaP(ts_block, alpha, block_size, new_length, theta, p);
-      System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-      pos_new_length_list++;
-    }
-    ArrayList<Integer> isMoveable = isMovable(alpha_list, beta_list);
-    int adjust_count = 0;
-    while (isMoveable.size() != 0) {
-      if (adjust_count < block_size / 2 && adjust_count <= 20) {
-        adjust_count++;
-      } else {
-        break;
-      }
-      ArrayList<ArrayList<Integer>> all_length = new ArrayList<>();
-
-      for (int isMoveable_i : isMoveable) {
-        ArrayList<Integer> tmp = new ArrayList<>();
-        tmp.add(isMoveable_i);
-        tmp.add(new_length_list[isMoveable_i][0]);
-        all_length.add(tmp);
-      }
-      quickSort(all_length, 1, 0, all_length.size() - 1);
-      if (all_length.get(0).get(1) <= raw_length[0]) {
-        int[][] new_ts_block = new int[ts_block.length][2];
-        cloneTsblock(ts_block,new_ts_block);
-//        int[][] new_ts_block = ts_block.clone();
-        moveAlphaToBeta(
-            new_ts_block,
-            alpha_list[all_length.get(0).get(0)],
-            beta_list[all_length.get(0).get(0)]);
-        int[] new_length = new int[5];
-        ts_block_delta =
-            getEncodeBitsRegressionNoTrain(new_ts_block, block_size, new_length, theta, segment_size, p);
-        int[][] bit_width_segments = segmentBitPacking(ts_block_delta, block_size, segment_size);
-        new_length[0] =
-            numberOfEncodeSegment2Bytes(
-                ts_block_delta, bit_width_segments, new_length, segment_size, p, theta);
-
-        if (new_length[0] <= raw_length[0]) {
-          raw_length = new_length;
-          ts_block = new_ts_block.clone();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-      alpha_list = getIStar(ts_block, min_index, block_size, theta, p, k);
-
-      int alpha_size = alpha_list.length;
-      for (int alpha_i = alpha_size - 1; alpha_i >= 0; alpha_i--) {
-        if (containsValue(beta_list, alpha_list[alpha_i])) {
-          alpha_list = removeElement(alpha_list, alpha_i);
-        }
-      }
-      beta_list = new int[alpha_list.length];
-      new_length_list = new int[alpha_list.length][5];
-      pos_new_length_list = 0;
-      for (int alpha_i = 0; alpha_i < alpha_list.length; alpha_i++) {
-        int alpha = alpha_list[alpha_i];
-        int[] new_length = new int[5];
-        System.arraycopy(raw_length, 0, new_length, 0, 5);
-        beta_list[alpha_i] = (getBetaP(ts_block, alpha, block_size, raw_length, theta, p));
-        System.arraycopy(new_length, 0, new_length_list[pos_new_length_list], 0, 5);
-        pos_new_length_list++;
-      }
-      isMoveable = isMovable(alpha_list, beta_list);
-    }
-
-    //        System.out.println("getEncodeBitsRegressionNoTrain before:" +
-    // Arrays.deepToString(ts_block_delta));
-
-    ts_block_delta =
-        getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta, segment_size, p);
-
-    //        System.out.println("getEncodeBitsRegressionNoTrain after:"
-    // +Arrays.deepToString(ts_block_delta));
-
-    //    ArrayList<ArrayList<Integer>> bit_width_segments = new ArrayList<>();
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-
-    //        System.out.println(Arrays.deepToString(ts_block_delta));
-    //        System.out.println(Arrays.deepToString(bit_width_segments));
-
-//    System.out.println(Arrays.toString(raw_length));
-//    System.out.println(Arrays.toString(theta));
-//    System.out.println(encode_pos);
-//    System.out.println(Arrays.deepToString(bit_width_segments));
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta,
-            bit_width_segments,
-            raw_length,
-            segment_size,
-            p,
-            theta,
-            encode_pos,
-            cur_byte,
-                pre);
-
-    //        System.out.println("encode_pos="+encode_pos);
-    return encode_pos;
-  }
-
-  public static int ReorderingRegressionEncoder(
-      int[][] data,
-      int block_size,
-      int[] third_value,
-      int segment_size,
-      int p,
-      int k,
-      int pre,
-      byte[] encoded_result) {
-//    for (int i = 0; i < p; i++)
-      block_size++;
-
-    int length_all = data.length;
-
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    intByte2Bytes(p, encode_pos, encoded_result);
-    encode_pos += 1;
-
-
-//    for (int i = 1; i < 2; i++) {
-    for (int i = 0; i < block_num; i++) {
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-                  i,
-              block_size,
-              0,
-              third_value,
-              segment_size,
-              k,
-              p,
-              pre,
-              encode_pos,
-              encoded_result);
-    }
-
-
-    int remaining_length = length_all - block_num * block_size;
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      while(p>=segment_size+1){
-        segment_size *= 2;
-      }
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-                  block_num,
-              block_size,
-              supple_length + remaining_length,
-              third_value,
-              segment_size,
-              k,
-              p,
-              pre,
-              encode_pos,
-              encoded_result);
-    }
-
-    return encode_pos;
-  }
-
-  public static double bytes2Double(ArrayList<Byte> encoded, int start, int num) {
-    if (num > 8) {
-      System.out.println("bytes2Doubleerror");
-      return 0;
-    }
-    long value = 0;
-    for (int i = 0; i < 8; i++) {
-      value |= ((long) (encoded.get(i + start) & 0xff)) << (8 * i);
-    }
-    return Double.longBitsToDouble(value);
-  }
-
-  public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded.get(i + start) & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  @Test
-  public void REGERPDoubleVaryP() throws IOException {
-
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/p_double_vary_p/";
-    String input_parent_dir = parent_dir + "trans_data/";
-
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-    dataset_name.add("FANYP-Sensors");
-    dataset_name.add("TRAJET-Transport");
-
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-    int[] dataset_12 = {652477};
-    int[] dataset_13 = {581388};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-    dataset_third.add(dataset_12);
-    dataset_third.add(dataset_13);
-
-    for (int i = 0; i < dataset_name.size(); i++) {
-      input_path_list.add(input_parent_dir + dataset_name.get(i));
-      dataset_block_size.add(1024);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    output_path_list.add(output_parent_dir + "/FANYP-Sensors_ratio.csv"); // 12
-    output_path_list.add(output_parent_dir + "/TRAJET-Transport_ratio.csv"); // 13
-
-    //        dataset_block_size.add(512);
-
-    int[] file_lists = {1,9}; //
-    for (int file_i : file_lists) {
-//    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-//              for (int file_i = 13; file_i < 14; file_i++) {
-
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-      System.out.println(inputPath);
-
-      // speed
-      int repeatTime = 1; // set repeat time
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "p",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      int count_csv =0;
-      for (File f : tempList) {
-        System.out.println(count_csv);
-        count_csv ++;
-        System.out.println(f);
-        //                for (int p = 8; p < 9; p++) {
-        for (int p = 1; p < 10; p++) {
-          System.out.println("p=" + p);
-
-          InputStream inputStream = Files.newInputStream(f.toPath());
-          CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-          ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-          ArrayList<ArrayList<Integer>> data_decoded = new ArrayList<>();
-
-          // add a column to "data"
-          loader.readHeaders();
-          data.clear();
-          while (loader.readRecord()) {
-            ArrayList<Integer> tmp = new ArrayList<>();
-            tmp.add(Integer.valueOf(loader.getValues()[0]));
-            tmp.add(Integer.valueOf(loader.getValues()[1]));
-            data.add(tmp);
-          }
-          inputStream.close();
-          ArrayList<Integer> result2 = new ArrayList<>();
-          splitTimeStamp3(data, result2);
-          int[][] data2_arr = new int[data.size()][2];
-          int min_time = data.get(0).get(0);
-          for (int i = 0; i < data.size(); i++) {
-            data2_arr[i][0] = data.get(i).get(0) - min_time;
-            data2_arr[i][1] = data.get(i).get(1);
-          }
-//          System.out.println(data2_arr[0][0]);
-          byte[] encoded_result = new byte[data2_arr.length * 8];
-
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int length = 0;
-
-          long s = System.nanoTime();
-
-          for (int repeat_i = 0; repeat_i < 1; repeat_i++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr,
-                    dataset_block_size.get(file_i),
-                    dataset_third.get(file_i),
-                    8,
-                    p,
-                    1,
-                    10,
-                    encoded_result);
-
-          long e = System.nanoTime();
-          encodeTime += ((e - s));
-          compressed_size += length;
-          double ratioTmp = (double) compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          e = System.nanoTime();
-          decodeTime += ((e - s));
-
-          String[] record = {
-            f.toString(),
-            "REGER-64-DOUBLE",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(p),
-            String.valueOf(compressed_size),
-            String.valueOf(ratio)
-          };
-
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-
-
-  public void REGERPDoubleVaryPrecision() throws IOException {
-
-    String parent_dir =
-            "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-            "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/double_vary_pre/";
-    String input_parent_dir = parent_dir + "trans_data/";
-
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-
-    ArrayList<int[]> dataset_third = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    int[] dataset_0 = {547, 2816};
-    int[] dataset_1 = {1719, 3731};
-    int[] dataset_2 = {-48, -11, 6, 25, 52};
-    int[] dataset_3 = {8681, 13584};
-    int[] dataset_4 = {79, 184, 274};
-    int[] dataset_5 = {17, 68};
-    int[] dataset_6 = {677};
-    int[] dataset_7 = {1047, 1725};
-    int[] dataset_8 = {227, 499, 614, 1013};
-    int[] dataset_9 = {474, 678};
-    int[] dataset_10 = {4, 30, 38, 49, 58};
-    int[] dataset_11 = {5182, 8206};
-
-    dataset_third.add(dataset_0);
-    dataset_third.add(dataset_1);
-    dataset_third.add(dataset_2);
-    dataset_third.add(dataset_3);
-    dataset_third.add(dataset_4);
-    dataset_third.add(dataset_5);
-    dataset_third.add(dataset_6);
-    dataset_third.add(dataset_7);
-    dataset_third.add(dataset_8);
-    dataset_third.add(dataset_9);
-    dataset_third.add(dataset_10);
-    dataset_third.add(dataset_11);
-
-    for (int i = 0; i < dataset_name.size(); i++) {
-      input_path_list.add(input_parent_dir + dataset_name.get(i));
-      dataset_block_size.add(128);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-//    int[] file_lists = {0,2,6,7}; //
-//    for (int file_i : file_lists) {
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-//    for (int file_i = input_path_list.size()-1; file_i < input_path_list.size(); file_i++) {
-
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-      System.out.println(inputPath);
-
-      // speed
-      int repeatTime = 1; // set repeat time
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-              "Input Direction",
-              "Encoding Algorithm",
-              "Encoding Time",
-              "Decoding Time",
-              "Points",
-              "precision",
-              "Compressed Size",
-              "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-//        for (int pre = 1; pre < 3; pre++) {
-        for (int pre = 1; pre < 10; pre++) {
-          System.out.println("precision=" + pre);
-
-          InputStream inputStream = Files.newInputStream(f.toPath());
-          CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-          ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-          ArrayList<ArrayList<Integer>> data_decoded = new ArrayList<>();
-
-          // add a column to "data"
-          loader.readHeaders();
-          data.clear();
-          while (loader.readRecord()) {
-            ArrayList<Integer> tmp = new ArrayList<>();
-            tmp.add(Integer.valueOf(loader.getValues()[0]));
-            tmp.add(Integer.valueOf(loader.getValues()[1]));
-            data.add(tmp);
-          }
-          inputStream.close();
-          ArrayList<Integer> result2 = new ArrayList<>();
-          splitTimeStamp3(data, result2);
-          int[][] data2_arr = new int[data.size()][2];
-          int min_time = data.get(0).get(0);
-          for (int i = 0; i < data.size(); i++) {
-            data2_arr[i][0] = data.get(i).get(0) - min_time;
-            data2_arr[i][1] = data.get(i).get(1);
-          }
-//          System.out.println(data2_arr[0][0]);
-          byte[] encoded_result = new byte[data2_arr.length * 8];
-
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int length = 0;
-
-          long s = System.nanoTime();
-
-          for (int repeat_i = 0; repeat_i < 1; repeat_i++)
-            length =
-                    ReorderingRegressionEncoder(
-                            data2_arr,
-                            dataset_block_size.get(file_i),
-                            dataset_third.get(file_i),
-                            8,
-                            1,
-                            1,
-                            pre,
-                            encoded_result);
-
-          long e = System.nanoTime();
-          encodeTime += ((e - s));
-          compressed_size += length;
-          double ratioTmp = (double) compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          e = System.nanoTime();
-          decodeTime += ((e - s));
-
-          String[] record = {
-                  f.toString(),
-                  "REGER-64-DOUBLE",
-                  String.valueOf(encodeTime),
-                  String.valueOf(decodeTime),
-                  String.valueOf(data.size()),
-                  String.valueOf(pre),
-                  String.valueOf(compressed_size),
-                  String.valueOf(ratio)
-          };
-
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-//        break;
-      }
-      writer.close();
-    }
-  }
-
-}
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerWithoutReorderingTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerWithoutReorderingTest.java
deleted file mode 100644
index 5c7a666..0000000
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/RegerWithoutReorderingTest.java
+++ /dev/null
@@ -1,1405 +0,0 @@
-package org.apache.iotdb.tsfile.encoding;
-
-import com.csvreader.CsvReader;
-import com.csvreader.CsvWriter;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-
-public class RegerWithoutReorderingTest {
-  public static int getBitWith(int num) {
-    if (num == 0) return 1;
-    else return 32 - Integer.numberOfLeadingZeros(num);
-  }
-
-  public static void int2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 24);
-    cur_byte[encode_pos + 1] = (byte) (integer >> 16);
-    cur_byte[encode_pos + 2] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 3] = (byte) (integer);
-  }
-
-  public static void intByte2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer);
-  }
-
-  public static void intWord2Bytes(int integer, int encode_pos, byte[] cur_byte) {
-    cur_byte[encode_pos] = (byte) (integer >> 8);
-    cur_byte[encode_pos + 1] = (byte) (integer);
-  }
-
-  public static int bytes2Integer(byte[] encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded[i + start] & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  private static int byte2Integer(byte[] encoded, int decode_pos) {
-    int value = 0;
-    int b = encoded[decode_pos] & 0xFF;
-    value |= b;
-    if (value == 0) return 256;
-    return value % 256;
-  }
-
-  public static void pack8Values(
-      ArrayList<Integer> values, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values.get(valueIdx) << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values.get(valueIdx) << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values.get(valueIdx) >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static void pack8Values(
-      int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) {
-    int bufIdx = 0;
-    int valueIdx = offset;
-    // remaining bits for the current unfinished Integer
-    int leftBit = 0;
-
-    while (valueIdx < 8 + offset) {
-      // buffer is used for saving 32 bits as a part of result
-      int buffer = 0;
-      // remaining size of bits in the 'buffer'
-      int leftSize = 32;
-
-      // encode the left bits of current Integer to 'buffer'
-      if (leftBit > 0) {
-        buffer |= (values[valueIdx][index] << (32 - leftBit));
-        leftSize -= leftBit;
-        leftBit = 0;
-        valueIdx++;
-      }
-
-      while (leftSize >= width && valueIdx < 8 + offset) {
-        // encode one Integer to the 'buffer'
-        buffer |= (values[valueIdx][index] << (leftSize - width));
-        leftSize -= width;
-        valueIdx++;
-      }
-      // If the remaining space of the buffer can not save the bits for one Integer,
-      if (leftSize > 0 && valueIdx < 8 + offset) {
-        // put the first 'leftSize' bits of the Integer into remaining space of the
-        // buffer
-        buffer |= (values[valueIdx][index] >>> (width - leftSize));
-        leftBit = width - leftSize;
-      }
-
-      // put the buffer into the final result
-      for (int j = 0; j < 4; j++) {
-        encoded_result[encode_pos] = (byte) ((buffer >>> ((3 - j) * 8)) & 0xFF);
-        encode_pos++;
-        bufIdx++;
-        if (bufIdx >= width) {
-          return;
-        }
-      }
-    }
-    //        return encode_pos;
-  }
-
-  public static int unpack8Values(
-      byte[] encoded, int offset, int width, int value_pos, int[] result_list) {
-    int byteIdx = offset;
-    //        int pos_encode = 0;
-    long buffer = 0;
-    // total bits which have read from 'buf' to 'buffer'. i.e.,
-    // number of available bits to be decoded.
-    int totalBits = 0;
-    int valueIdx = 0;
-
-    while (valueIdx < 8) {
-      // If current available bits are not enough to decode one Integer,
-      // then add next byte from buf to 'buffer' until totalBits >= width
-      while (totalBits < width) {
-        buffer = (buffer << 8) | (encoded[byteIdx] & 0xFF);
-        byteIdx++;
-        totalBits += 8;
-      }
-
-      // If current available bits are enough to decode one Integer,
-      // then decode one Integer one by one until left bits in 'buffer' is
-      // not enough to decode one Integer.
-      while (totalBits >= width && valueIdx < 8) {
-        result_list[value_pos] = (int) (buffer >>> (totalBits - width));
-        value_pos++;
-        valueIdx++;
-        totalBits -= width;
-        buffer = buffer & ((1L << totalBits) - 1);
-      }
-    }
-    return value_pos;
-  }
-
-  public static int bitPacking(
-      int[][] numbers,
-      int index,
-      int start,
-      int block_size,
-      int bit_width,
-      int encode_pos,
-      byte[] encoded_result) {
-    int block_num = block_size / 8;
-    for (int i = 0; i < block_num; i++) {
-      pack8Values(numbers, index, start + i * 8, bit_width, encode_pos, encoded_result);
-      encode_pos += bit_width;
-    }
-
-    return encode_pos;
-  }
-
-  public static int decodeBitPacking(
-      byte[] encoded, int decode_pos, int bit_width, int block_size, int[] result_list) {
-    //        int[] result_list = new int[];
-    int block_num = block_size / 8;
-    int value_pos = 0;
-
-    for (int i = 0; i < block_num; i++) { // bitpacking
-      value_pos = unpack8Values(encoded, decode_pos, bit_width, value_pos, result_list);
-      decode_pos += bit_width;
-    }
-    //        decode_pos_result.add(decode_pos);
-    return decode_pos;
-  }
-
-  public static void float2bytes(float f, int pos_encode, byte[] encode_result) {
-    int fbit = Float.floatToIntBits(f);
-    byte[] b = new byte[4];
-    for (int i = 0; i < 4; i++) {
-      b[i] = (byte) (fbit >> (24 - i * 8));
-    }
-    int len = b.length;
-
-    System.arraycopy(b, 0, encode_result, pos_encode, len);
-    byte temp;
-    for (int i = 0; i < len / 2; ++i) {
-      temp = encode_result[i + pos_encode];
-      encode_result[i + pos_encode] = encode_result[len - i - 1 + pos_encode];
-      encode_result[len - i - 1 + pos_encode] = temp;
-    }
-  }
-
-  public static float bytes2float(byte[] b, int index) {
-    int l;
-    l = b[index];
-    l &= 0xff;
-    l |= ((long) b[index + 1] << 8);
-    l &= 0xffff;
-    l |= ((long) b[index + 2] << 16);
-    l &= 0xffffff;
-    l |= ((long) b[index + 3] << 24);
-    return Float.intBitsToFloat(l);
-  }
-
-  public static int bytes2Integer(ArrayList<Byte> encoded, int start, int num) {
-    int value = 0;
-    if (num > 4) {
-      System.out.println("bytes2Integer error");
-      return 0;
-    }
-    for (int i = 0; i < num; i++) {
-      value <<= 8;
-      int b = encoded.get(i + start) & 0xFF;
-      value |= b;
-    }
-    return value;
-  }
-
-  public static int part(ArrayList<ArrayList<Integer>> arr, int index, int low, int high) {
-    ArrayList<Integer> tmp = arr.get(low);
-    while (low < high) {
-      while (low < high
-          && (arr.get(high).get(index) > tmp.get(index)
-              || (Objects.equals(arr.get(high).get(index), tmp.get(index))
-                  && arr.get(high).get(index ^ 1) >= tmp.get(index ^ 1)))) {
-        high--;
-      }
-      arr.set(low, arr.get(high));
-      while (low < high
-          && (arr.get(low).get(index) < tmp.get(index)
-              || (Objects.equals(arr.get(low).get(index), tmp.get(index))
-                  && arr.get(low).get(index ^ 1) <= tmp.get(index ^ 1)))) {
-        low++;
-      }
-      arr.set(high, arr.get(low));
-    }
-    arr.set(low, tmp);
-    return low;
-  }
-
-  public static int getCommon(int m, int n) {
-    int z;
-    while (m % n != 0) {
-      z = m % n;
-      m = n;
-      n = z;
-    }
-    return n;
-  }
-
-  public static void splitTimeStamp3(
-      ArrayList<ArrayList<Integer>> ts_block, ArrayList<Integer> result) {
-    int td_common = 0;
-    for (int i = 1; i < ts_block.size(); i++) {
-      int time_diffi = ts_block.get(i).get(0) - ts_block.get(i - 1).get(0);
-      if (td_common == 0) {
-        if (time_diffi != 0) {
-          td_common = time_diffi;
-        }
-        continue;
-      }
-      if (time_diffi != 0) {
-        td_common = getCommon(time_diffi, td_common);
-        if (td_common == 1) {
-          break;
-        }
-      }
-    }
-    if (td_common == 0) {
-      td_common = 1;
-    }
-
-    int t0 = ts_block.get(0).get(0);
-    for (int i = 0; i < ts_block.size(); i++) {
-      ArrayList<Integer> tmp = new ArrayList<>();
-      int interval_i = (ts_block.get(i).get(0) - t0) / td_common;
-      tmp.add(t0 + interval_i);
-      tmp.add(ts_block.get(i).get(1));
-      ts_block.set(i, tmp);
-    }
-    result.add(td_common);
-  }
-
-  // ------------------------------------------------basic
-  // function-------------------------------------------------------
-  public static int[][] getEncodeBitsRegression(
-      int[][] ts_block, int block_size, int[] raw_length, float[] theta) {
-    int timestamp_delta_min = Integer.MAX_VALUE;
-    int value_delta_min = Integer.MAX_VALUE;
-    int[][] ts_block_delta = new int[ts_block.length][2];
-    //        theta = new float[4];
-
-    long sum_X_r = 0;
-    long sum_Y_r = 0;
-    long sum_squ_X_r = 0;
-    long sum_squ_XY_r = 0;
-    long sum_X_v = 0;
-    long sum_Y_v = 0;
-    long sum_squ_X_v = 0;
-    long sum_squ_XY_v = 0;
-
-    for (int i = 1; i < block_size; i++) {
-      sum_X_r += ts_block[i - 1][0];
-      sum_X_v += ts_block[i - 1][1];
-      sum_Y_r += ts_block[i][0];
-      sum_Y_v += ts_block[i][1];
-      sum_squ_X_r += ((long) (ts_block[i - 1][0]) * (ts_block[i - 1][0]));
-      sum_squ_X_v += ((long) ts_block[i - 1][1] * ts_block[i - 1][1]);
-      sum_squ_XY_r += ((long) (ts_block[i - 1][0]) * (ts_block[i][0]));
-      sum_squ_XY_v += ((long) ts_block[i - 1][1] * ts_block[i][1]);
-    }
-
-    int m_reg = block_size - 1;
-    float theta0_r = 0.0F;
-    float theta1_r = 1.0F;
-    if (m_reg * sum_squ_X_r != sum_X_r * sum_X_r) {
-      theta0_r =
-          (float) (sum_squ_X_r * sum_Y_r - sum_X_r * sum_squ_XY_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-      theta1_r =
-          (float) (m_reg * sum_squ_XY_r - sum_X_r * sum_Y_r)
-              / (float) (m_reg * sum_squ_X_r - sum_X_r * sum_X_r);
-    }
-
-    float theta0_v = 0.0F;
-    float theta1_v = 1.0F;
-    if (m_reg * sum_squ_X_v != sum_X_v * sum_X_v) {
-      theta0_v =
-          (float) (sum_squ_X_v * sum_Y_v - sum_X_v * sum_squ_XY_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-      theta1_v =
-          (float) (m_reg * sum_squ_XY_v - sum_X_v * sum_Y_v)
-              / (float) (m_reg * sum_squ_X_v - sum_X_v * sum_X_v);
-    }
-
-    ts_block_delta[0][0] = ts_block[0][0];
-    ts_block_delta[0][1] = ts_block[0][1];
-
-    // delta to Regression
-    for (int j = 1; j < block_size; j++) {
-
-      int epsilon_r = (ts_block[j][0] - (int) (theta0_r + theta1_r * (float) ts_block[j - 1][0]));
-      int epsilon_v = (ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1]));
-
-      if (epsilon_r < timestamp_delta_min) {
-        timestamp_delta_min = epsilon_r;
-      }
-      if (epsilon_v < value_delta_min) {
-        value_delta_min = epsilon_v;
-      }
-      ts_block_delta[j][0] = epsilon_r;
-      ts_block_delta[j][1] = epsilon_v;
-    }
-
-    int max_interval = Integer.MIN_VALUE;
-    int max_value = Integer.MIN_VALUE;
-    int length = 0;
-    for (int j = block_size - 1; j > 0; j--) {
-      ts_block_delta[j][0] -= timestamp_delta_min;
-      int epsilon_r = ts_block_delta[j][0];
-      ts_block_delta[j][1] -= value_delta_min;
-      int epsilon_v = ts_block_delta[j][1];
-
-      length += getBitWith(ts_block_delta[j][0]);
-      length += getBitWith(ts_block_delta[j][1]);
-
-      if (epsilon_r > max_interval) {
-        max_interval = epsilon_r;
-      }
-      if (epsilon_v > max_value) {
-        max_value = epsilon_v;
-      }
-    }
-
-    int max_bit_width_interval = getBitWith(max_interval);
-    int max_bit_width_value = getBitWith(max_value);
-
-    //        raw_length = new int[5];
-    raw_length[0] = length;
-    raw_length[1] = max_bit_width_interval;
-    raw_length[2] = max_bit_width_value;
-    raw_length[3] = timestamp_delta_min;
-    raw_length[4] = value_delta_min;
-
-    theta[0] = theta0_r;
-    theta[1] = theta1_r;
-    theta[2] = theta0_v;
-    theta[3] = theta1_v;
-
-    return ts_block_delta;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(int[][] bit_width_segments) {
-    int encoded_result = 0;
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 1;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-
-    encoded_result += (pos_time * 2);
-    encoded_result += (pos_value * 2);
-
-    return encoded_result;
-  }
-
-  public static int encodeRLEBitWidth2Bytes(
-      int[][] bit_width_segments, int pos_encode, byte[] encoded_result) {
-
-    int count_of_time = 1;
-    int count_of_value = 1;
-    int pre_time = bit_width_segments[0][0];
-    int pre_value = bit_width_segments[0][1];
-    int size = bit_width_segments.length;
-    int[][] run_length_time = new int[size][2];
-    int[][] run_length_value = new int[size][2];
-
-    int pos_time = 0;
-    int pos_value = 0;
-
-    for (int i = 1; i < size; i++) {
-      int cur_time = bit_width_segments[i][0];
-      int cur_value = bit_width_segments[i][1];
-      if (cur_time != pre_time && count_of_time != 0) {
-        run_length_time[pos_time][0] = count_of_time;
-        run_length_time[pos_time][1] = pre_time;
-        pos_time++;
-        pre_time = cur_time;
-        count_of_time = 1;
-      } else {
-        count_of_time++;
-        pre_time = cur_time;
-        if (count_of_time == 256) {
-          run_length_time[pos_time][0] = count_of_time;
-          run_length_time[pos_time][1] = pre_time;
-          pos_time++;
-          count_of_time = 0;
-        }
-      }
-
-      if (cur_value != pre_value && count_of_value != 0) {
-        run_length_value[pos_value][0] = count_of_value;
-        run_length_value[pos_value][1] = pre_value;
-        pos_value++;
-
-        pre_value = cur_value;
-        count_of_value = 1;
-      } else {
-        count_of_value++;
-        pre_value = cur_value;
-        if (count_of_value == 256) {
-          run_length_value[pos_value][0] = count_of_value;
-          run_length_value[pos_value][1] = pre_value;
-          pos_value++;
-          count_of_value = 0;
-        }
-      }
-    }
-    if (count_of_time != 0) {
-      run_length_time[pos_time][0] = count_of_time;
-      run_length_time[pos_time][1] = pre_time;
-      pos_time++;
-    }
-    if (count_of_value != 0) {
-      run_length_value[pos_value][0] = count_of_value;
-      run_length_value[pos_value][1] = pre_value;
-      pos_value++;
-    }
-    intWord2Bytes(pos_time, pos_encode, encoded_result);
-    pos_encode += 2;
-    intWord2Bytes(pos_value, pos_encode, encoded_result);
-    pos_encode += 2;
-
-    for (int i = 0; i < pos_time; i++) {
-      int[] bit_width_time = run_length_time[i];
-      intByte2Bytes(bit_width_time[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_time[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_time[0]="+bit_width_time[0]);
-      //            System.out.println("bit_width_time[1]="+bit_width_time[1]);
-    }
-    for (int i = 0; i < pos_value; i++) {
-      int[] bit_width_value = run_length_value[i];
-      intByte2Bytes(bit_width_value[0], pos_encode, encoded_result);
-      pos_encode++;
-      intByte2Bytes(bit_width_value[1], pos_encode, encoded_result);
-      pos_encode++;
-
-      //            System.out.println("bit_width_value[0]="+bit_width_value[0]);
-      //            System.out.println("bit_width_value[1]="+bit_width_value[1]);
-    }
-
-    return pos_encode;
-  }
-
-  public static int[][] segmentBitPacking(
-      int[][] ts_block_delta, int block_size, int segment_size) {
-
-    int segment_n = (block_size - 1) / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = Integer.MIN_VALUE;
-      int bit_width_value = Integer.MIN_VALUE;
-
-      for (int data_i = segment_i * segment_size + 1;
-          data_i < (segment_i + 1) * segment_size + 1;
-          data_i++) {
-        int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]);
-        int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]);
-        if (cur_bit_width_time > bit_width_time) {
-          bit_width_time = cur_bit_width_time;
-        }
-        if (cur_bit_width_value > bit_width_value) {
-          bit_width_value = cur_bit_width_value;
-        }
-      }
-      bit_width_segments[segment_i][0] = bit_width_time;
-      bit_width_segments[segment_i][1] = bit_width_value;
-    }
-    return bit_width_segments;
-  }
-
-  private static int numberOfEncodeSegment2Bytes(
-      int[][] delta_segments, int[][] bit_width_segments, int segment_size) {
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int result = 0;
-    result += 8; // encode interval0 and value0
-    result += 16; // encode theta
-    result += encodeRLEBitWidth2Bytes(bit_width_segments);
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      result += (segment_size * bit_width_time / 8);
-      result += (segment_size * bit_width_value / 8);
-    }
-
-    return result;
-  }
-
-  private static int encodeSegment2Bytes(
-      int[][] delta_segments,
-      int[][] bit_width_segments,
-      int[] raw_length,
-      int segment_size,
-      float[] theta,
-      int pos_encode,
-      byte[] encoded_result) {
-
-    int block_size = delta_segments.length;
-    int segment_n = block_size / segment_size;
-    int2Bytes(delta_segments[0][0], pos_encode, encoded_result);
-    pos_encode += 4;
-    int2Bytes(delta_segments[0][1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[0] + raw_length[3], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[1], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[2] + raw_length[4], pos_encode, encoded_result);
-    pos_encode += 4;
-    float2bytes(theta[3], pos_encode, encoded_result);
-    pos_encode += 4;
-
-    pos_encode = encodeRLEBitWidth2Bytes(bit_width_segments, pos_encode, encoded_result);
-//    System.out.println(Arrays.deepToString(bit_width_segments));
-//    System.out.println("theta:"+ Arrays.toString(theta));
-//    System.out.println(pos_encode);
-//    System.out.println("encodeRLEBitWidth2Bytes:"+ Arrays.deepToString(bit_width_segments));
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              0,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_time,
-              pos_encode,
-              encoded_result);
-      pos_encode =
-          bitPacking(
-              delta_segments,
-              1,
-              segment_i * segment_size + 1,
-              segment_size,
-              bit_width_value,
-              pos_encode,
-              encoded_result);
-    }
-    //        System.out.println("value pos_encode:"+pos_encode);
-    return pos_encode;
-  }
-
-  private static int REGERBlockEncoder(
-      int[][] data,
-      int i,
-      int block_size,
-      int supply_length,
-      int segment_size,
-      int encode_pos,
-      byte[] cur_byte) {
-
-    int min_time = data[i * block_size][0];
-    int[][] ts_block;
-    if (supply_length == 0) {
-      ts_block = new int[block_size][2];
-      for (int j = 0; j < block_size; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-    } else {
-      ts_block = new int[supply_length][2];
-      int end = data.length - i * block_size;
-      for (int j = 0; j < end; j++) {
-        //                data[j + i * block_size][0] -= min_time;
-        ts_block[j][0] = (data[j + i * block_size][0] - min_time);
-        ts_block[j][1] = data[j + i * block_size][1];
-      }
-      for (int j = end; j < supply_length; j++) {
-        ts_block[j][0] = 0;
-        ts_block[j][1] = 0;
-      }
-      block_size = supply_length;
-    }
-
-    int[] time_length =
-        new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation
-    float[] theta_time = new float[4];
-    int[][] ts_block_delta_time;
-    int[][] bit_width_segments_time;
-
-    ts_block_delta_time = getEncodeBitsRegression(ts_block, block_size, time_length, theta_time);
-    bit_width_segments_time = segmentBitPacking(ts_block_delta_time, block_size, segment_size);
-//    System.out.println(Arrays.toString(time_length));
-    //    System.out.println(Arrays.deepToString(ts_block));
-//    time_length[0] =
-//        numberOfEncodeSegment2Bytes(ts_block_delta_time, bit_width_segments_time, segment_size);
-
-    encode_pos =
-        encodeSegment2Bytes(
-            ts_block_delta_time,
-            bit_width_segments_time,
-            time_length,
-            segment_size,
-            theta_time,
-            encode_pos,
-            cur_byte);
-
-//    System.out.println(encode_pos);
-    return encode_pos;
-  }
-
-  public static int ReorderingRegressionEncoder(
-      int[][] data, int block_size, int segment_size, byte[] encoded_result) {
-    block_size++;
-
-    int length_all = data.length;
-    int encode_pos = 0;
-    int2Bytes(length_all, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int2Bytes(block_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int2Bytes(segment_size, encode_pos, encoded_result);
-    encode_pos += 4;
-
-    int remaining_length = length_all - block_num * block_size;
-
-    for (int i = 0; i < block_num; i++) {
-//    for (int i = 44; i < 45; i++) {
-    encode_pos =
-          REGERBlockEncoder(data, i, block_size, 0, segment_size, encode_pos, encoded_result);
-      //            System.out.println(encode_pos);
-    }
-
-    if (remaining_length == 1) {
-      int2Bytes(data[data.length - 1][0], encode_pos, encoded_result);
-      encode_pos += 4;
-      int2Bytes(data[data.length - 1][1], encode_pos, encoded_result);
-      encode_pos += 4;
-    }
-    if (remaining_length != 0 && remaining_length != 1) {
-      int supple_length;
-      if (remaining_length % segment_size == 0) {
-        supple_length = 1;
-      } else if (remaining_length % segment_size == 1) {
-        supple_length = 0;
-      } else {
-        supple_length = segment_size + 1 - remaining_length % segment_size;
-      }
-      encode_pos =
-          REGERBlockEncoder(
-              data,
-              block_num,
-              block_size,
-              supple_length + remaining_length,
-              segment_size,
-              encode_pos,
-              encoded_result);
-    }
-    return encode_pos;
-  }
-
-  public static int REGERBlockDecoder(
-      byte[] encoded,
-      int decode_pos,
-      int[][] value_list,
-      int block_size,
-      int segment_size,
-      int[] value_pos_arr) {
-
-    int time0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = time0;
-    int value0 = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    value_list[value_pos_arr[0]][0] = value0;
-
-    value_pos_arr[0]++;
-
-    float theta_time0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_time1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    float theta_value0 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-    float theta_value1 = bytes2float(encoded, decode_pos);
-    decode_pos += 4;
-
-    int bit_width_time_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-    int bit_width_value_count = bytes2Integer(encoded, decode_pos, 2);
-    decode_pos += 2;
-
-    int count;
-    int num;
-    int segment_n = block_size / segment_size;
-    int[][] bit_width_segments = new int[segment_n][2];
-    int pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_time_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-
-      decode_pos++;
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][0] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    pos_bit_width_segments = 0;
-    for (int i = 0; i < bit_width_value_count; i++) {
-      count = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-      num = byte2Integer(encoded, decode_pos);
-      decode_pos++;
-
-      for (int j = 0; j < count; j++) {
-        bit_width_segments[pos_bit_width_segments][1] = num;
-        pos_bit_width_segments++;
-      }
-    }
-
-    int pre_time = time0;
-    int pre_value = value0;
-
-    for (int segment_i = 0; segment_i < segment_n; segment_i++) {
-      int bit_width_time = bit_width_segments[segment_i][0];
-      int bit_width_value = bit_width_segments[segment_i][1];
-      int[] decode_time_result = new int[segment_size];
-      int[] decode_value_result = new int[segment_size];
-
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_time, segment_size, decode_time_result);
-      int pos_time = value_pos_arr[0];
-      for (int delta_time : decode_time_result) {
-        pre_time = (int) (theta_time0 + theta_time1 * (double) delta_time) + pre_time;
-        value_list[pos_time][0] = pre_time;
-        pos_time++;
-      }
-      int pos_value = value_pos_arr[0];
-      decode_pos =
-          decodeBitPacking(encoded, decode_pos, bit_width_value, segment_size, decode_value_result);
-      for (int delta_value : decode_value_result) {
-        pre_value = (int) (theta_value0 + theta_value1 * (double) delta_value) + pre_value;
-        value_list[pos_value][1] = pre_value;
-        pos_value++;
-      }
-      value_pos_arr[0] = pos_value;
-    }
-
-    return decode_pos;
-  }
-
-  public static void REGERDecoder(byte[] encoded) {
-
-    int decode_pos = 0;
-    int length_all = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int block_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-    int segment_size = bytes2Integer(encoded, decode_pos, 4);
-    decode_pos += 4;
-
-    int block_num = length_all / block_size;
-    int remain_length = length_all - block_num * block_size;
-    int zero_number;
-    if (remain_length % segment_size == 0) {
-      zero_number = 1;
-    } else if (remain_length % segment_size == 1) {
-      zero_number = 0;
-    } else {
-      zero_number = segment_size + 1 - remain_length % segment_size;
-    }
-    int[][] value_list = new int[length_all + segment_size][2];
-
-    int[] value_pos_arr = new int[1];
-
-    //        for (int k = 0; k < 2; k++) {
-    for (int k = 0; k < block_num; k++) {
-      //            System.out.println("k="+k);
-      decode_pos =
-          REGERBlockDecoder(
-              encoded, decode_pos, value_list, block_size, segment_size, value_pos_arr);
-    }
-
-    if (remain_length == 1) {
-      for (int i = 0; i < remain_length; i++) {
-        int value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][0] = value_end;
-        value_end = bytes2Integer(encoded, decode_pos, 4);
-        decode_pos += 4;
-        value_list[value_pos_arr[0]][1] = value_end;
-        value_pos_arr[0]++;
-      }
-    } else {
-      REGERBlockDecoder(
-          encoded,
-          decode_pos,
-          value_list,
-          remain_length + zero_number,
-          segment_size,
-          value_pos_arr);
-    }
-  }
-
-  @Test
-  public void REGERWithoutReordering() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/reger_only_segment";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_block_size.add(512);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(128);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(4096);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(8192);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(2048);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.set(9,8192);
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(256);
-
-//    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-              for (int file_i = 2; file_i < 3; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-//        f = tempList[2];
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-//        System.out.println(data2_arr[0][0]);
-        byte[] encoded_result = new byte[data2_arr.length * 8];
-        long encodeTime = 0;
-        long decodeTime = 0;
-        double ratio = 0;
-        double compressed_size = 0;
-        int repeatTime2 = 1;
-        long s = System.nanoTime();
-        int length = 0;
-        for (int repeat = 0; repeat < repeatTime2; repeat++)
-          length =
-              ReorderingRegressionEncoder(
-                  data2_arr, dataset_block_size.get(file_i), 8, encoded_result);
-        long e = System.nanoTime();
-        encodeTime += ((e - s) / repeatTime2);
-        compressed_size += length;
-        double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-        ratio += ratioTmp;
-        s = System.nanoTime();
-        for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-        e = System.nanoTime();
-        decodeTime += ((e - s) / repeatTime2);
-
-        String[] record = {
-          f.toString(),
-          "REGER-Without-Reordering",
-          String.valueOf(encodeTime),
-          String.valueOf(decodeTime),
-          String.valueOf(data.size()),
-          String.valueOf(compressed_size),
-          String.valueOf(ratio)
-        };
-        writer.writeRecord(record);
-        System.out.println(ratio);
-
-                        break;
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERWithoutReorderingVaryBlockSize() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/block_size_only_segment";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    int[] file_lists = {0,2,11};
-    for (int file_i : file_lists) {
-//    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 9; file_i < 10; file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Block Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-//        System.out.println(data2_arr[0][0]);
-        //                for (int block_size_exp = 13; block_size_exp >= 12; block_size_exp--) {
-        for (int block_size_exp = 13; block_size_exp >= 4; block_size_exp--) {
-          int block_size = (int) Math.pow(2, block_size_exp);
-          System.out.println(block_size);
-
-          byte[] encoded_result = new byte[data2_arr.length * 12];
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int repeatTime2 = 1;
-          long s = System.nanoTime();
-          int length = 0;
-          for (int repeat = 0; repeat < repeatTime2; repeat++)
-            length = ReorderingRegressionEncoder(data2_arr, block_size, 8, encoded_result);
-          long e = System.nanoTime();
-          encodeTime += ((e - s) / repeatTime2);
-          compressed_size += length;
-          double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-          e = System.nanoTime();
-          decodeTime += ((e - s) / repeatTime2);
-
-          String[] record = {
-            f.toString(),
-            "REGER-Without-Reordering",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(compressed_size),
-            String.valueOf(block_size_exp),
-            String.valueOf(ratio)
-          };
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-
-  @Test
-  public void REGERWithoutReorderingVaryPackSize() throws IOException {
-    //        String parent_dir = "C:/Users/xiaoj/Desktop/test";
-    String parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/iotdb/iotdb-core/tsfile/src/test/resources/";
-    String output_parent_dir =
-        "/Users/xiaojinzhao/Documents/GitHub/encoding-reorder/compression_ratio/pack_size_only_segment";
-
-    String input_parent_dir = parent_dir + "trans_data/";
-    ArrayList<String> input_path_list = new ArrayList<>();
-    ArrayList<String> output_path_list = new ArrayList<>();
-    ArrayList<String> dataset_name = new ArrayList<>();
-    ArrayList<Integer> dataset_block_size = new ArrayList<>();
-    dataset_name.add("CS-Sensors");
-    dataset_name.add("Metro-Traffic");
-    dataset_name.add("USGS-Earthquakes");
-    dataset_name.add("YZ-Electricity");
-    dataset_name.add("GW-Magnetic");
-    dataset_name.add("TY-Fuel");
-    dataset_name.add("Cyber-Vehicle");
-    dataset_name.add("Vehicle-Charge");
-    dataset_name.add("Nifty-Stocks");
-    dataset_name.add("TH-Climate");
-    dataset_name.add("TY-Transport");
-    dataset_name.add("EPM-Education");
-
-    for (String value : dataset_name) {
-      input_path_list.add(input_parent_dir + value);
-      dataset_block_size.add(1024);
-    }
-
-    output_path_list.add(output_parent_dir + "/CS-Sensors_ratio.csv"); // 0
-    //        dataset_block_size.add(1024);
-
-    output_path_list.add(output_parent_dir + "/Metro-Traffic_ratio.csv"); // 1
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/USGS-Earthquakes_ratio.csv"); // 2
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/YZ-Electricity_ratio.csv"); // 3
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/GW-Magnetic_ratio.csv"); // 4
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/TY-Fuel_ratio.csv"); // 5
-    //        dataset_block_size.add(64);
-    output_path_list.add(output_parent_dir + "/Cyber-Vehicle_ratio.csv"); // 6
-    //        dataset_block_size.add(128);
-    output_path_list.add(output_parent_dir + "/Vehicle-Charge_ratio.csv"); // 7
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/Nifty-Stocks_ratio.csv"); // 8
-    //        dataset_block_size.add(256);
-    output_path_list.add(output_parent_dir + "/TH-Climate_ratio.csv"); // 9
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/TY-Transport_ratio.csv"); // 10
-    //        dataset_block_size.add(512);
-    output_path_list.add(output_parent_dir + "/EPM-Education_ratio.csv"); // 11
-    //        dataset_block_size.add(512);
-
-    for (int file_i = 0; file_i < input_path_list.size(); file_i++) {
-      //        for (int file_i = 6; file_i < input_path_list.size(); file_i++) {
-      String inputPath = input_path_list.get(file_i);
-      String Output = output_path_list.get(file_i);
-
-      File file = new File(inputPath);
-      File[] tempList = file.listFiles();
-
-      CsvWriter writer = new CsvWriter(Output, ',', StandardCharsets.UTF_8);
-
-      String[] head = {
-        "Input Direction",
-        "Encoding Algorithm",
-        "Encoding Time",
-        "Decoding Time",
-        "Points",
-        "Compressed Size",
-        "Block Size",
-        "Compression Ratio"
-      };
-      writer.writeRecord(head); // write header to output file
-
-      assert tempList != null;
-
-      for (File f : tempList) {
-        System.out.println(f);
-        InputStream inputStream = Files.newInputStream(f.toPath());
-        CsvReader loader = new CsvReader(inputStream, StandardCharsets.UTF_8);
-        ArrayList<ArrayList<Integer>> data = new ArrayList<>();
-
-        // add a column to "data"
-        loader.readHeaders();
-        while (loader.readRecord()) {
-          ArrayList<Integer> tmp = new ArrayList<>();
-          tmp.add(Integer.valueOf(loader.getValues()[0]));
-          tmp.add(Integer.valueOf(loader.getValues()[1]));
-          data.add(tmp);
-        }
-        inputStream.close();
-        ArrayList<Integer> result2 = new ArrayList<>();
-        splitTimeStamp3(data, result2);
-
-        int[][] data2_arr = new int[data.size()][2];
-        int min_time = data.get(0).get(0);
-        for (int i = 0; i < data.size(); i++) {
-          data2_arr[i][0] = data.get(i).get(0) - min_time;
-          data2_arr[i][1] = data.get(i).get(1);
-        }
-        System.out.println(data2_arr[0][0]);
-        for (int segment_size_exp = 6; segment_size_exp > 2; segment_size_exp--) {
-          int segment_size = (int) Math.pow(2, segment_size_exp);
-          System.out.println(segment_size);
-
-          byte[] encoded_result = new byte[data2_arr.length * 12];
-          long encodeTime = 0;
-          long decodeTime = 0;
-          double ratio = 0;
-          double compressed_size = 0;
-          int repeatTime2 = 1;
-          long s = System.nanoTime();
-          int length = 0;
-          for (int repeat = 0; repeat < repeatTime2; repeat++)
-            length =
-                ReorderingRegressionEncoder(
-                    data2_arr, dataset_block_size.get(file_i), segment_size, encoded_result);
-          long e = System.nanoTime();
-          encodeTime += ((e - s) / repeatTime2);
-          compressed_size += length;
-          double ratioTmp = compressed_size / (double) (data.size() * Integer.BYTES * 2);
-          ratio += ratioTmp;
-          s = System.nanoTime();
-          for (int repeat = 0; repeat < repeatTime2; repeat++) REGERDecoder(encoded_result);
-          e = System.nanoTime();
-          decodeTime += ((e - s) / repeatTime2);
-
-          String[] record = {
-            f.toString(),
-            "REGER-Without-Reordering",
-            String.valueOf(encodeTime),
-            String.valueOf(decodeTime),
-            String.valueOf(data.size()),
-            String.valueOf(compressed_size),
-            String.valueOf(segment_size_exp),
-            String.valueOf(ratio)
-          };
-          writer.writeRecord(record);
-          System.out.println(ratio);
-        }
-      }
-      writer.close();
-    }
-  }
-}