This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch research/encoding-reorder in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit b9188de329444b9436d52dfd4ec7d38091c5bf33 Author: xjz17 <67282793+xj...@users.noreply.github.com> AuthorDate: Tue Nov 14 23:19:43 2023 +0800 update --- .../tsfile/encoding/KernelDensityEstimation.java | 49 +- ...pressTest.java => REGERCompress1ArrayTest.java} | 1348 ++++++++++---------- .../iotdb/tsfile/encoding/REGERCompressTest.java | 13 +- 3 files changed, 717 insertions(+), 693 deletions(-) diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/KernelDensityEstimation.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/KernelDensityEstimation.java index ed1f0855560..bcd5b0621bf 100644 --- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/KernelDensityEstimation.java +++ b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/KernelDensityEstimation.java @@ -6,25 +6,42 @@ import java.util.Map; public class KernelDensityEstimation { public static void main(String[] args) { - // 离散分布数据 - Map<Integer, Integer> discreteDistribution = new HashMap<>(); - discreteDistribution.put(2, 10); - discreteDistribution.put(3, 100); - discreteDistribution.put(1, 3); - discreteDistribution.put(4, 12); + // 第一个整数(正数) + int int1 = -12345; + // 第二个整数(负数) + int int2 = -67890; - // 计算核密度估计 - double[] kernelDensity = calculateKernelDensity(discreteDistribution); + // 将两个整数拼接成一个长整型数 + long combined = ((long) int1 << 32) | (int2 & 0xFFFFFFFFL); - // 打印核密度估计 - System.out.println("Kernel Density Estimation:"); - for (int i = 0; i < kernelDensity.length; i++) { - System.out.println("x=" + (i + 1) + ": " + kernelDensity[i]); - } + System.out.println("Combined long value: " + combined); + + // 将长整型数分解回两个整数 + int originalInt1 = (int) (combined >> 32); + int originalInt2 = (int) combined; + + System.out.println("Original Int 1: " + originalInt1); + System.out.println("Original Int 2: " + originalInt2); - // 寻找核密度估计的极小值点 - int[] minIndex = findMinIndex(kernelDensity); - System.out.println("Minimum point: x=" + (Arrays.toString(minIndex))); + // 离散分布数据 +// Map<Integer, Integer> discreteDistribution = new HashMap<>(); +// discreteDistribution.put(2, 10); +// discreteDistribution.put(3, 100); +// discreteDistribution.put(1, 3); +// discreteDistribution.put(4, 12); +// +// // 计算核密度估计 +// double[] kernelDensity = calculateKernelDensity(discreteDistribution); +// +// // 打印核密度估计 +// System.out.println("Kernel Density Estimation:"); +// for (int i = 0; i < kernelDensity.length; i++) { +// System.out.println("x=" + (i + 1) + ": " + kernelDensity[i]); +// } +// +// // 寻找核密度估计的极小值点 +// int[] minIndex = findMinIndex(kernelDensity); +// System.out.println("Minimum point: x=" + (Arrays.toString(minIndex))); } // 计算核密度估计 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/REGERCompress1ArrayTest.java similarity index 73% copy from iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompressTest.java copy to iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/encoding/REGERCompress1ArrayTest.java index 7f784dbeee9..4bd952f8665 100644 --- 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/REGERCompress1ArrayTest.java @@ -9,13 +9,13 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; import static java.lang.Math.abs; -import static org.apache.iotdb.tsfile.encoding.KernelDensityEstimation.calculateKernelDensity; -import static org.apache.iotdb.tsfile.encoding.KernelDensityEstimation.findMinIndex; -public class REGERCompressTest { +public class REGERCompress1ArrayTest { public static int getBitWith(int num) { if (num == 0) return 1; else return 32 - Integer.numberOfLeadingZeros(num); @@ -65,6 +65,18 @@ public class REGERCompressTest { 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); } @@ -144,7 +156,7 @@ public class REGERCompressTest { // return encode_pos; } - public static void pack8Values(int[][] values, int index, int offset, int width, int encode_pos, byte[] encoded_result) { + 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 @@ -158,7 +170,8 @@ public class REGERCompressTest { // encode the left bits of current Integer to 'buffer' if (leftBit > 0) { - buffer |= (values[valueIdx][index] << (32 - leftBit)); + + buffer |= (getInt(values[valueIdx],index) << (32 - leftBit)); leftSize -= leftBit; leftBit = 0; valueIdx++; @@ -166,7 +179,7 @@ public class REGERCompressTest { while (leftSize >= width && valueIdx < 8 + offset) { // encode one Integer to the 'buffer' - buffer |= (values[valueIdx][index] << (leftSize - width)); + buffer |= (getInt(values[valueIdx],index) << (leftSize - width)); leftSize -= width; valueIdx++; } @@ -174,7 +187,7 @@ public class REGERCompressTest { 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)); + buffer |= (getInt(values[valueIdx],index) >>> (width - leftSize)); leftBit = width - leftSize; } @@ -223,7 +236,7 @@ public class REGERCompressTest { 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) { + 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); @@ -337,6 +350,20 @@ public class REGERCompressTest { 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; @@ -348,11 +375,48 @@ public class REGERCompressTest { 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<ArrayList<Integer>> ts_block, ArrayList<Integer> result) { + ArrayList<Long> ts_block, ArrayList<Integer> result) { int td_common = 0; + long time_tmp = (1L << 32 - 1) << 32; + long value_tmp = (1L << 32 -1); 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); + int cur_value = (int) (ts_block.get(i)>>32); + int pre_value = (int) (ts_block.get(i-1)>>32); + int time_diffi = cur_value - pre_value; + if (td_common == 0) { if (time_diffi != 0) { td_common = time_diffi; @@ -370,31 +434,34 @@ public class REGERCompressTest { td_common = 1; } - int t0 = ts_block.get(0).get(0); + long t0 = (ts_block.get(0)>>32); 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); +// ArrayList<Integer> tmp = new ArrayList<>(); + long cur_value = ts_block.get(i)>>32; + long interval_i = ((cur_value - t0) / td_common); + ts_block.set(i, ((t0 + interval_i)<<32) + ((ts_block.get(i)<<32)>>32)); +// 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) { + 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]; - int min_delta_time = ts_block[i][0] - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]); + 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; 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]); + 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; @@ -407,19 +474,19 @@ public class REGERCompressTest { } - private static void adjust1ValueCost(int[][] ts_block, int i, int[] raw_length, ArrayList<Integer> min_index, float[] theta) { + 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 = ts_block[i][1] - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]); + 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; 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]); + 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; @@ -433,7 +500,7 @@ public class REGERCompressTest { } private static int[] adjust0MinChange( - int[][] ts_block, int j, float[] theta) { + long[] ts_block, int j, float[] theta) { int block_size = ts_block.length; assert j != block_size; @@ -442,7 +509,7 @@ public class REGERCompressTest { 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]; + long[] ts_block_delta = new long[block_size - 1]; float theta0_t = theta[0]; float theta1_t = theta[1]; @@ -455,22 +522,28 @@ public class REGERCompressTest { 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 = - ts_block[i][0] - - (int) (theta0_t + theta1_t * (float) ts_block[i - 1][0]); + getTime(tmp_i) + - (int) (theta0_t + theta1_t * (float) getTime(tmp_i_1)); value_delta_i = - ts_block[i][1] - - (int) (theta0_v + theta1_v * (float) ts_block[i - 1][1]); + 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 = - ts_block[j][0] - - (int) (theta0_t + theta1_t * (float) ts_block[0][0]); + getTime(tmp_j) + - (int) (theta0_t + theta1_t * (float) getTime(tmp_0)); value_delta_i = - ts_block[j][1] - - (int) (theta0_v + theta1_v * (float) ts_block[0][1]); + getValue(tmp_j) + - (int) (theta0_v + theta1_v * (float) getValue(tmp_0)); - ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i; - ts_block_delta[pos_ts_block_delta][1] = value_delta_i; + 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) { @@ -485,11 +558,11 @@ public class REGERCompressTest { 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]); + 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)); } - ts_block_delta[pos_ts_block_delta][0] = timestamp_delta_i; - ts_block_delta[pos_ts_block_delta][1] = value_delta_i; + 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) { @@ -507,9 +580,9 @@ public class REGERCompressTest { } 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); + 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; @@ -520,7 +593,7 @@ public class REGERCompressTest { } private static int[] adjust0MinChangeNo( - int[][] ts_block, int[] raw_length, int j, float[] theta) { + long[] ts_block, int[] raw_length, int j, float[] theta) { int block_size = ts_block.length; assert j != block_size; @@ -536,43 +609,54 @@ public class REGERCompressTest { 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]); + 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 = 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]); + 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 = 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]); + + 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); } - 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]); + 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); } - length += getBitWith(timestamp_delta_i - timestamp_delta_min); - length += getBitWith(value_delta_i - value_delta_min); b[0] = length; b[1] = timestamp_delta_min; @@ -584,7 +668,7 @@ public class REGERCompressTest { // adjust 0 to n private static int[] adjust0n1MinChange( - int[][] ts_block, float[] theta) { + long[] ts_block, float[] theta) { int block_size = ts_block.length; int[] b = new int[3]; int timestamp_delta_min = Integer.MAX_VALUE; @@ -595,16 +679,20 @@ public class REGERCompressTest { float theta0_v = theta[2]; float theta1_v = theta[3]; - int[][] ts_block_delta = new int[block_size - 1][2]; + 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; - 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; + 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++; @@ -617,10 +705,12 @@ public class REGERCompressTest { } 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; + 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) { @@ -630,9 +720,9 @@ public class REGERCompressTest { 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); + 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; @@ -642,7 +732,7 @@ public class REGERCompressTest { } private static int[] adjust0n1MinChangeNo( - int[][] ts_block, int[] raw_length, float[] theta) { + 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]; @@ -656,24 +746,33 @@ public class REGERCompressTest { 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]); + 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 = 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]); + 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); } - length += getBitWith(timestamp_delta_i - timestamp_delta_min); - length += getBitWith(value_delta_i - value_delta_min); + b[0] = length; b[1] = timestamp_delta_min; @@ -685,13 +784,13 @@ public class REGERCompressTest { // adjust n to no 0 private static int[] adjustnMinChange( - int[][] ts_block, int j, float[] theta) { + 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; - int[][] ts_block_delta = new int[block_size - 1][2]; + long[] ts_block_delta = new long[block_size - 1]; float theta0_t = theta[0]; float theta1_t = theta[1]; @@ -705,13 +804,18 @@ public class REGERCompressTest { 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]); + 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 { - 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; + 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; @@ -720,12 +824,11 @@ public class REGERCompressTest { 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)); - 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; + 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) { @@ -737,9 +840,9 @@ public class REGERCompressTest { } - for (int[] segment_max : ts_block_delta) { - length += getBitWith(segment_max[0] - timestamp_delta_min); - length += getBitWith(segment_max[1] - value_delta_min); + 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; @@ -749,7 +852,7 @@ public class REGERCompressTest { } private static int[] adjustnMinChangeNo( - int[][] ts_block, int[] raw_length, int j, float[] theta) { + long[] ts_block, int[] raw_length, int j, float[] theta) { int block_size = ts_block.length; assert j != 0; int[] b = new int[3]; @@ -763,45 +866,64 @@ public class REGERCompressTest { 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]); + + 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 = 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]); + + 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 = 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]); + 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); } - 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]); + + + + 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); } - length += getBitWith(timestamp_delta_i - timestamp_delta_min); - length += getBitWith(value_delta_i - value_delta_min); + b[0] = length; b[1] = timestamp_delta_min; @@ -811,8 +933,7 @@ public class REGERCompressTest { } // adjust n to 0 - private static int[] adjustn0MinChange( - int[][] ts_block, float[] theta) { + 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; @@ -822,7 +943,7 @@ public class REGERCompressTest { 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]; + long[] ts_block_delta = new long[block_size - 1]; int length = 0; @@ -830,10 +951,12 @@ public class REGERCompressTest { 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; + 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; @@ -843,12 +966,14 @@ public class REGERCompressTest { } } + 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 = 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; + 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) { @@ -857,9 +982,9 @@ public class REGERCompressTest { 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); + 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; @@ -869,7 +994,7 @@ public class REGERCompressTest { } private static int[] adjustn0MinChangeNo( - int[][] ts_block, int[] raw_length, float[] theta) { + 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]; @@ -881,26 +1006,35 @@ public class REGERCompressTest { 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]); + 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 = 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]); + 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); } - length += getBitWith(timestamp_delta_i - timestamp_delta_min); - length += getBitWith(value_delta_i - value_delta_min); + b[0] = length; b[1] = timestamp_delta_min; @@ -913,7 +1047,8 @@ public class REGERCompressTest { // adjust alpha to j private static int[] adjustAlphaToJMinChange( - int[][] ts_block, int alpha, int j, float[] theta) { + 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; @@ -927,28 +1062,34 @@ public class REGERCompressTest { 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]; + 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 = 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]); + 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 = 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]); + 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 = 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]); + 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 { - 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]); + 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][0] = timestamp_delta_i; - ts_block_delta[pos_ts_block_delta][1] = value_delta_i; + 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; @@ -959,9 +1100,9 @@ public class REGERCompressTest { } - for (int[] segment_max : ts_block_delta) { - length += getBitWith(segment_max[0] - timestamp_delta_min); - length += getBitWith(segment_max[1] - value_delta_min); + 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; @@ -972,7 +1113,8 @@ public class REGERCompressTest { } private static int[] adjustAlphaToJMinChangeNo( - int[][] ts_block, int[] raw_length, int alpha, int j, float[] theta) { + 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; @@ -990,67 +1132,76 @@ public class REGERCompressTest { 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]); + 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 = 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]); + 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 = 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]); + + 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 = 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]); + 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); } - 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_j_minus_1)); + value_delta_i = getValue(tmp_alpha) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_minus_1)); - 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; + }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)); - 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; + }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); } - 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; @@ -1060,7 +1211,8 @@ public class REGERCompressTest { // move alpha to 0 - private static int[] adjustTo0MinChange(int[][] ts_block, int alpha, float[] theta) { + 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; @@ -1073,25 +1225,27 @@ public class REGERCompressTest { float theta0_v = theta[2]; float theta1_v = theta[3]; - int[][] ts_block_delta = new int[block_size - 1][2]; + 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 = 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]); + 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) { - 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]); + 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 { - 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]); + 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][0] = timestamp_delta_i; - ts_block_delta[pos_ts_block_delta][1] = value_delta_i; + 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) { @@ -1104,9 +1258,9 @@ public class REGERCompressTest { } 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); + 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; @@ -1117,7 +1271,8 @@ public class REGERCompressTest { } private static int[] adjustTo0MinChangeNo( - int[][] ts_block, int[] raw_length, int alpha, float[] theta) { + 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; @@ -1131,46 +1286,52 @@ public class REGERCompressTest { 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]); + + 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 = 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]); + + 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 = 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]); - + 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); } - 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]); + 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); } - 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; @@ -1181,7 +1342,8 @@ public class REGERCompressTest { // move alpha to n private static int[] adjustTonMinChange( - int[][] ts_block, int alpha, float[] theta) { + 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; @@ -1193,7 +1355,7 @@ public class REGERCompressTest { 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]; + long[] ts_block_delta = new long[block_size - 1]; int pos_ts_block_delta = 0; int length = 0; @@ -1202,17 +1364,19 @@ public class REGERCompressTest { 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]); + 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) { - 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]); + 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 { - 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]); + 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][0] = timestamp_delta_i; - ts_block_delta[pos_ts_block_delta][1] = value_delta_i; + 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; @@ -1222,9 +1386,9 @@ public class REGERCompressTest { } } - for (int[] segment_max : ts_block_delta) { - length += getBitWith(segment_max[0] - timestamp_delta_min); - length += getBitWith(segment_max[1] - value_delta_min); + 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; @@ -1235,7 +1399,8 @@ public class REGERCompressTest { } private static int[] adjustTonMinChangeNo( - int[][] ts_block, int[] raw_length, int alpha, float[] theta) { + 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; @@ -1250,42 +1415,50 @@ public class REGERCompressTest { 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]); + 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 = 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]); + + + 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 = 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]); - + 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); } - 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]); + + + 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); } - length += getBitWith(timestamp_delta_i - timestamp_delta_min); - length += getBitWith(value_delta_i - value_delta_min); b[0] = length; b[1] = timestamp_delta_min; @@ -1314,15 +1487,7 @@ public class REGERCompressTest { 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]; - + 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; @@ -1333,14 +1498,22 @@ public class REGERCompressTest { 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]); + 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; @@ -1365,18 +1538,38 @@ public class REGERCompressTest { (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[] getEncodeBitsRegression( + long[] ts_block, + int block_size, + int[] raw_length, + float[] theta) { - ts_block_delta[0][0] = ts_block[0][0]; - ts_block_delta[0][1] = ts_block[0][1]; + long[] ts_block_delta = new long[ts_block.length]; + trainParameter( ts_block, block_size, theta); + 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; // 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 = - (ts_block[j][0] - - (int) (theta0_r + theta1_r * (float) ts_block[j - 1][0])); + (getTime(tmp_j)) + - (int) (theta0_r + theta1_r * (float) getTime(tmp_j_1)); int epsilon_v = - (ts_block[j][1] - (int) (theta0_v + theta1_v * (float) ts_block[j - 1][1])); + getValue(tmp_j) - (int) (theta0_v + theta1_v * (float) getValue(tmp_j_1 )); if (epsilon_r < timestamp_delta_min) { @@ -1385,8 +1578,8 @@ public class REGERCompressTest { 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; + ts_block_delta[j] = combine2Int(epsilon_r,epsilon_v); +// ts_block_delta[j][1] = epsilon_v; } @@ -1394,11 +1587,12 @@ public class REGERCompressTest { int max_interval = Integer.MIN_VALUE; int max_value = Integer.MIN_VALUE; int length = 0; + long delta_time = combine2Int(timestamp_delta_min,value_delta_min); 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]; + ts_block_delta[j] -= delta_time; + long tmp = ts_block_delta[j]; + int epsilon_r = getTime(tmp); + int epsilon_v = getValue(tmp); length += getBitWith(epsilon_r); length += getBitWith(epsilon_v); @@ -1421,50 +1615,35 @@ public class REGERCompressTest { 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, + public static long[] getEncodeBitsRegressionNoTrain( + long[] 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]; + 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]; -// 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; - + ts_block_delta[0] = ts_block[0]; + int timestamp_delta_min = Integer.MAX_VALUE; + int value_delta_min = Integer.MAX_VALUE; // 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]); + 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; @@ -1472,72 +1651,89 @@ public class REGERCompressTest { 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; - } - + 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 length = 0; + long delta_time = combine2Int(timestamp_delta_min,value_delta_min); 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; + long tmp_j = ts_block_delta[j]; + int epsilon_r = getTime(tmp_j) - timestamp_delta_min; + int epsilon_v = getValue(tmp_j) - value_delta_min; + ts_block_delta[j] = combine2Int(epsilon_r,epsilon_v); +// ts_block_delta[j] = delta_time; + +// +// long tmp = ts_block_delta[j]; +// int epsilon_r = getTime(tmp); +// int epsilon_v = getValue(tmp); + + 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; } - 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; + +// 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( - int[][] ts_block, + long[] ts_block, int alpha, ArrayList<Integer> min_index, int block_size, @@ -1665,15 +1861,20 @@ public class REGERCompressTest { 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); + 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); + 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]; @@ -1691,9 +1892,9 @@ public class REGERCompressTest { } if (min_index.contains(0)) {//|| min_index.contains(alpha) || min_index.contains(alpha + 1) - b = adjustTo0MinChange(ts_block, alpha, theta); + 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); + 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]; @@ -1708,9 +1909,9 @@ public class REGERCompressTest { 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); + 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); + b = adjustTonMinChangeNo(ts_block, raw_length, alpha, theta,tmp_alpha,tmp_alpha_plus_1,tmp_alpha_minus_1); } if (b[0] < raw_abs_sum) { @@ -1739,7 +1940,7 @@ public class REGERCompressTest { public static int[] getIStar( - int[][] ts_block, ArrayList<Integer> min_index, int block_size, int index, float[] theta, int k) { + long[] 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; @@ -1757,20 +1958,15 @@ public class REGERCompressTest { // 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]); + long tmp_j = ts_block[j]; + long tmp_j_1 = ts_block[j-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); + 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; @@ -1790,11 +1986,7 @@ public class REGERCompressTest { } 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){ @@ -1805,16 +1997,11 @@ public class REGERCompressTest { 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, + long[] ts_block, ArrayList<Integer> min_index, int block_size, float[] theta, @@ -1830,9 +2017,6 @@ public class REGERCompressTest { 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]; @@ -1840,13 +2024,14 @@ public class REGERCompressTest { 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; - + 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; @@ -1865,27 +2050,13 @@ public class REGERCompressTest { 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; + 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; @@ -1897,12 +2068,6 @@ public class REGERCompressTest { } -// 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); @@ -1911,14 +2076,15 @@ public class REGERCompressTest { public static int encodeRLEBitWidth2Bytes( - int[][] bit_width_segments) { + long[] 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]; + 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; @@ -1926,8 +2092,9 @@ public class REGERCompressTest { 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]; + 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; @@ -1970,12 +2137,14 @@ public class REGERCompressTest { } public static int encodeRLEBitWidth2Bytes( - int[][] bit_width_segments, int pos_encode, byte[] encoded_result) { + long[] 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]; + 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]; @@ -1984,8 +2153,9 @@ public class REGERCompressTest { 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]; + 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; @@ -2057,17 +2227,18 @@ public class REGERCompressTest { return pos_encode; } - public static int[][] segmentBitPacking(int[][] ts_block_delta, int block_size, int segment_size) { + public static long[] segmentBitPacking(long[] 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]; + 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++) { - int cur_bit_width_time = getBitWith(ts_block_delta[data_i][0]); - int cur_bit_width_value = getBitWith(ts_block_delta[data_i][1]); + long cur_data_i = ts_block_delta[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; } @@ -2075,32 +2246,28 @@ public class REGERCompressTest { 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; + bit_width_segments[segment_i] = combine2Int( bit_width_time, bit_width_value); } return bit_width_segments; } - public static void moveAlphaToBeta(int[][] ts_block, int alpha, int beta) { - int[] tmp_tv = ts_block[alpha]; + 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][0] = ts_block[u][0]; - ts_block[u + 1][1] = ts_block[u][1]; + ts_block[u + 1] = ts_block[u]; } } 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]; + ts_block[u - 1] = ts_block[u]; } beta--; } - ts_block[beta][0] = tmp_tv[0]; - ts_block[beta][1] = tmp_tv[1]; + ts_block[beta] = tmp_tv; } - private static int numberOfEncodeSegment2Bytes(int[][] delta_segments, int[][] bit_width_segments, int segment_size) { + 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; @@ -2108,8 +2275,9 @@ public class REGERCompressTest { 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]; + 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); } @@ -2117,14 +2285,12 @@ public class REGERCompressTest { 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) { + 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; - int2Bytes(delta_segments[0][0], pos_encode, encoded_result); - pos_encode += 4; - int2Bytes(delta_segments[0][1], pos_encode, encoded_result); - pos_encode += 4; + 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); @@ -2137,8 +2303,9 @@ public class REGERCompressTest { 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]; + 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); 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); } @@ -2146,16 +2313,17 @@ public class REGERCompressTest { return pos_encode; } - private static int[][] ReorderingTimeSeries(int[][] ts_block, int[] raw_length, float[] theta, int segment_size,int k) { + private static long[] ReorderingTimeSeries(long[] 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]; + long[] ts_block_delta = new long[block_size]; ArrayList<Integer> min_index = new ArrayList<>(); int index_alpha_list = 0; - getEncodeBitsRegression(ts_block, block_size, raw_length, theta); + trainParameter(ts_block,block_size,theta); + getEncodeBitsRegressionNoTrain(ts_block, block_size, raw_length, theta,segment_size); 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]; @@ -2199,11 +2367,11 @@ public class REGERCompressTest { }); if (all_length[0][1] <= raw_length[0]) { - int[][] new_ts_block = ts_block.clone(); + long[] 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); + long[] 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]) { @@ -2274,24 +2442,23 @@ public class REGERCompressTest { } - 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) { + private static int REGERBlockEncoder(long[] 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; + 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 int[block_size][2]; - ts_block_value = new int[block_size][2]; - ts_block_partition = new int[block_size][2]; + 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; 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[j] = data[j + i * block_size] - min_time; // if(ts_block[j][1]<min_value){ // min_value = ts_block[j][1]; // } @@ -2302,8 +2469,7 @@ public class REGERCompressTest { // }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]; +// 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); @@ -2330,17 +2496,15 @@ public class REGERCompressTest { // } // 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]; + 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++) { -// 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[j] = data[j + i * block_size] - min_time; // if(ts_block[j][1]<min_value){ // min_value = ts_block[j][1]; // } @@ -2351,12 +2515,10 @@ public class REGERCompressTest { // }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]; +// ts_block_value[j] = data[j + i * block_size] - (min_time); } for (int j = end; j < supply_length; j++) { - ts_block[j][0] = 0; - ts_block[j][1] = 0; + ts_block[j] = 0; // if(data_map.containsKey(ts_block[j][1])){ // int tmp = data_map.get(ts_block[j][1]); // tmp++; @@ -2364,8 +2526,7 @@ public class REGERCompressTest { // }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]; +// ts_block_value[j] =0; } // double[] kernelDensity = calculateKernelDensity(data_map); @@ -2373,49 +2534,50 @@ public class REGERCompressTest { 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[] partition_length = new int[5]; // length,max_bit_width_interval,max_bit_width_value,max_bit_width_deviation + float[] theta_partition = 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; + long[] bit_width_segments_time; int[][] bit_width_segments_partition; - ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length, theta_time, segment_size, k); + trainParameter(ts_block,block_size,theta_time); +// System.out.println(Arrays.toString(theta_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); + getEncodeBitsRegressionNoTrain(ts_block_partition, block_size, partition_length, theta_partition,segment_size); -// 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) -> { @@ -2429,16 +2591,23 @@ public class REGERCompressTest { // 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{ + long[] bit_width_segments = new long[segment_n]; +// System.out.println(Arrays.toString(partition_length)); +// System.out.println(Arrays.toString(time_length)); + + if(time_length[0] > partition_length[0]){ + long[] ts_block_delta_partition = ReorderingTimeSeries(ts_block_partition, partition_length, theta_partition, segment_size, k); + 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{ + long[] ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length, theta_time, segment_size, k); 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)); + } // if (choose == 0) { // bit_width_segments = segmentBitPacking(ts_block_delta_time, block_size, segment_size); @@ -2460,7 +2629,7 @@ public class REGERCompressTest { 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) { + public static int ReorderingRegressionEncoder(long[] 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; @@ -2476,16 +2645,15 @@ public class REGERCompressTest { int2Bytes(segment_size, encode_pos, encoded_result); encode_pos += 4; +// for (int i = 0; i < 1; i++) { 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; + long2Bytes(data[data.length - 1], encode_pos, encoded_result); + encode_pos += 8; } if (remaining_length != 0 && remaining_length != 1) { int supple_length; @@ -2635,186 +2803,6 @@ public class REGERCompressTest { } } - @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"; @@ -2926,25 +2914,39 @@ public class REGERCompressTest { 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<ArrayList<Integer>> data = new ArrayList<>(); + ArrayList<Long> data = new ArrayList<>(); // add a column to "data" loader.readHeaders(); + loader.readRecord(); +// ArrayList<Integer> tmp = new ArrayList<>(); + int time0 = Integer.parseInt(loader.getValues()[0]); +// tmp.add(0); + int value0 = Integer.parseInt(loader.getValues()[1]); +// tmp.add(value0); + data.add((long) value0); + 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); +// ArrayList<Integer> tmp = new ArrayList<>(); + long time_tmp = Integer.parseInt(loader.getValues()[0])-time0; + time_tmp <<=32; + time_tmp += Integer.parseInt(loader.getValues()[1]); + data.add(time_tmp); +// tmp.add(); +// tmp.add(); +// data.add(tmp); } +// System.out.println(data); inputStream.close(); ArrayList<Integer> result2 = new ArrayList<>(); splitTimeStamp3(data, result2); +// System.out.println(data); - int[][] data2_arr = new int[data.size()][2]; - int min_time = data.get(0).get(0); + 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][0] = data.get(i).get(0) - min_time; - data2_arr[i][1] = data.get(i).get(1); + data2_arr[i] = data.get(i) ; } // System.out.println(data2_arr[0][0]); byte[] encoded_result = new byte[data2_arr.length * 8]; 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 index 7f784dbeee9..8947ab182b4 100644 --- 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 @@ -990,6 +990,9 @@ public class REGERCompressTest { 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]); @@ -2387,7 +2390,8 @@ public class REGERCompressTest { int[][] bit_width_segments_partition; ts_block_delta_time = ReorderingTimeSeries(ts_block, time_length, theta_time, segment_size, k); - + System.out.println(Arrays.toString(time_length)); + System.out.println(Arrays.toString(theta_time)); // int pos_ts_block_partition = 0; // if(third_value.length>0){ // for (int[] datum : ts_block) { @@ -2476,6 +2480,7 @@ public class REGERCompressTest { int2Bytes(segment_size, encode_pos, encoded_result); encode_pos += 4; +// for (int i = 0; i < 1; i++) { 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); } @@ -2898,8 +2903,8 @@ public class REGERCompressTest { 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++) { +// 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); @@ -2952,7 +2957,7 @@ public class REGERCompressTest { long decodeTime = 0; double ratio = 0; double compressed_size = 0; - int repeatTime2 = 100; + int repeatTime2 = 1; long s = System.nanoTime(); int[] best_order = new int[3]; int length = 0;