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();
- }
- }
-}