This is an automated email from the ASF dual-hosted git repository. leirui pushed a commit to branch research/LTS-visualization in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 3f4796ae153362004a4e216d545ee145d085bb6c Author: Lei Rui <[email protected]> AuthorDate: Sun Jul 14 18:06:19 2024 +0800 add --- .../iotdb/db/query/simpiece/MySample_fsw.java | 88 +++++++++++++++++----- .../db/query/simpiece/MySample_shrinkingcone.java | 85 +++++++++++++++++---- .../iotdb/db/query/simpiece/MySample_simpiece.java | 31 ++++++-- 3 files changed, 163 insertions(+), 41 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_fsw.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_fsw.java index 854962e96a6..ed4eefe0b50 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_fsw.java +++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_fsw.java @@ -23,6 +23,7 @@ package org.apache.iotdb.db.query.simpiece; import java.io.FileInputStream; import java.io.FileWriter; +import java.io.IOException; import java.io.PrintWriter; import java.util.List; @@ -30,41 +31,48 @@ public class MySample_fsw { public static void main(String[] args) { String fileDir = "D:\\desktop\\NISTPV\\"; - boolean series = true; // 从1开始编号列而不是时间戳列 String[] datasetNameList = new String[] { - // "NISTPV-Ground-2015-Qloss_Ah", + "NISTPV-Ground-2015-Qloss_Ah", "NISTPV-Ground-2015-Pyra1_Wm2", - // "NISTPV-Ground-2015-RTD_C_3" + "NISTPV-Ground-2015-RTD_C_3" }; - - int[] noutList = new int[] {0}; - + int[] noutList = new int[] {100}; double[] r = new double[] {0.1, 0.5, 1.3}; + double[] epsilonList = new double[] {9.999999E-4, 284.4034399986267, 6.428162097930908}; for (int y = 0; y < datasetNameList.length; y++) { String datasetName = datasetNameList[y]; - // int start = (int) (10000000 / 2 - 2500000 * r[y]); // 从0开始计数 - // int end = (int) (10000000 / 2 + 2500000 * (1 - r[y])); - // int N = end - start; // -1 for all - - int start = 0; - int end = 10000; + int start = (int) (10000000 / 2 - 2500000 * r[y]); // 从0开始计数 + int end = (int) (10000000 / 2 + 2500000 * (1 - r[y])); int N = end - start; + // int start = 0; + // int end = 10000; + // int N = end - start; for (int nout : noutList) { - // apply Sim-Piece on the input file, outputting nout points saved in csvFile boolean hasHeader = false; try (FileInputStream inputStream = new FileInputStream(fileDir + datasetName + ".csv")) { String delimiter = ","; TimeSeries ts = TimeSeriesReader.getMyTimeSeries( - inputStream, delimiter, false, N, start, hasHeader, series); - - double epsilon = 0.1; + inputStream, delimiter, false, N, start, hasHeader, false); + // double epsilon = getFSWParam(nout, ts, 1e-6); + double epsilon = epsilonList[y]; List<Point> reducedPoints = FSW.reducePoints(ts.data, epsilon); + System.out.println( + datasetName + + ": n=" + + N + + ",m=" + + nout + + ",epsilon=" + + epsilon + + ",actual m=" + + reducedPoints.size()); try (PrintWriter writer = new PrintWriter( - new FileWriter(datasetName + "-" + N + "-" + reducedPoints.size() + "-sc.csv"))) { + new FileWriter( + datasetName + "-" + N + "-" + reducedPoints.size() + "-fsw.csv"))) { for (Point p : reducedPoints) { writer.println(p.getTimestamp() + "," + p.getValue()); } @@ -75,4 +83,50 @@ public class MySample_fsw { } } } + + public static double getFSWParam(int nout, TimeSeries ts, double accuracy) throws IOException { + double epsilon = 1; + boolean directLess = false; + boolean directMore = false; + while (true) { + List<Point> reducedPoints = FSW.reducePoints(ts.data, epsilon); + if (reducedPoints.size() > nout) { + if (directMore) { + break; + } + if (!directLess) { + directLess = true; + } + epsilon *= 2; + } else { + if (directLess) { + break; + } + if (!directMore) { + directMore = true; + } + epsilon /= 2; + } + } + double left = 0; + double right = 0; + if (directLess) { + left = epsilon / 2; + right = epsilon; + } + if (directMore) { + left = epsilon; + right = epsilon * 2; + } + while (Math.abs(right - left) > accuracy) { + double mid = (left + right) / 2; + List<Point> reducedPoints = FSW.reducePoints(ts.data, mid); + if (reducedPoints.size() > nout) { + left = mid; + } else { + right = mid; + } + } + return (left + right) / 2; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_shrinkingcone.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_shrinkingcone.java index 9abb7b748c6..d09641736fd 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_shrinkingcone.java +++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_shrinkingcone.java @@ -23,6 +23,7 @@ package org.apache.iotdb.db.query.simpiece; import java.io.FileInputStream; import java.io.FileWriter; +import java.io.IOException; import java.io.PrintWriter; import java.util.List; @@ -30,38 +31,44 @@ public class MySample_shrinkingcone { public static void main(String[] args) { String fileDir = "D:\\desktop\\NISTPV\\"; - boolean series = true; // 从1开始编号列而不是时间戳列 String[] datasetNameList = new String[] { - // "NISTPV-Ground-2015-Qloss_Ah", + "NISTPV-Ground-2015-Qloss_Ah", "NISTPV-Ground-2015-Pyra1_Wm2", - // "NISTPV-Ground-2015-RTD_C_3" + "NISTPV-Ground-2015-RTD_C_3" }; - - int[] noutList = new int[] {0}; - + int[] noutList = new int[] {100}; double[] r = new double[] {0.1, 0.5, 1.3}; + double[] epsilonList = new double[] {0.001, 408.55843019485474, 7.996772289276123}; for (int y = 0; y < datasetNameList.length; y++) { String datasetName = datasetNameList[y]; - // int start = (int) (10000000 / 2 - 2500000 * r[y]); // 从0开始计数 - // int end = (int) (10000000 / 2 + 2500000 * (1 - r[y])); - // int N = end - start; // -1 for all - - int start = 0; - int end = 100000; + int start = (int) (10000000 / 2 - 2500000 * r[y]); // 从0开始计数 + int end = (int) (10000000 / 2 + 2500000 * (1 - r[y])); int N = end - start; + // int start = 0; + // int end = 10000; + // int N = end - start; for (int nout : noutList) { - // apply Sim-Piece on the input file, outputting nout points saved in csvFile boolean hasHeader = false; try (FileInputStream inputStream = new FileInputStream(fileDir + datasetName + ".csv")) { String delimiter = ","; TimeSeries ts = TimeSeriesReader.getMyTimeSeries( - inputStream, delimiter, false, N, start, hasHeader, series); - - double epsilon = 10; + inputStream, delimiter, false, N, start, hasHeader, false); + // double epsilon = getSCParam(nout, ts, 1e-6); + double epsilon = epsilonList[y]; List<Point> reducedPoints = ShrinkingCone.reducePoints(ts.data, epsilon); + System.out.println( + datasetName + + ": n=" + + N + + ",m=" + + nout + + ",epsilon=" + + epsilon + + ",actual m=" + + reducedPoints.size()); try (PrintWriter writer = new PrintWriter( new FileWriter(datasetName + "-" + N + "-" + reducedPoints.size() + "-sc.csv"))) { @@ -75,4 +82,50 @@ public class MySample_shrinkingcone { } } } + + public static double getSCParam(int nout, TimeSeries ts, double accuracy) throws IOException { + double epsilon = 1; + boolean directLess = false; + boolean directMore = false; + while (true) { + List<Point> reducedPoints = ShrinkingCone.reducePoints(ts.data, epsilon); + if (reducedPoints.size() > nout) { + if (directMore) { + break; + } + if (!directLess) { + directLess = true; + } + epsilon *= 2; + } else { + if (directLess) { + break; + } + if (!directMore) { + directMore = true; + } + epsilon /= 2; + } + } + double left = 0; + double right = 0; + if (directLess) { + left = epsilon / 2; + right = epsilon; + } + if (directMore) { + left = epsilon; + right = epsilon * 2; + } + while (Math.abs(right - left) > accuracy) { + double mid = (left + right) / 2; + List<Point> reducedPoints = ShrinkingCone.reducePoints(ts.data, mid); + if (reducedPoints.size() > nout) { + left = mid; + } else { + right = mid; + } + } + return (left + right) / 2; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_simpiece.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_simpiece.java index 5d93d23bec7..9d7afe6fca8 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_simpiece.java +++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_simpiece.java @@ -32,20 +32,23 @@ public class MySample_simpiece { public static void main(String[] args) { String fileDir = "D:\\desktop\\NISTPV\\"; - boolean series = true; // 从1开始编号列而不是时间戳列 String[] datasetNameList = new String[] { "NISTPV-Ground-2015-Qloss_Ah", - // "NISTPV-Ground-2015-Pyra1_Wm2", - // "NISTPV-Ground-2015-RTD_C_3" + "NISTPV-Ground-2015-Pyra1_Wm2", + "NISTPV-Ground-2015-RTD_C_3" }; int[] noutList = new int[] {100}; double[] r = new double[] {0.1, 0.5, 1.3}; + double[] epsilonList = new double[] {0.0009999, 316.5642651891633, 9.186667042922977}; for (int y = 0; y < datasetNameList.length; y++) { String datasetName = datasetNameList[y]; int start = (int) (10000000 / 2 - 2500000 * r[y]); // 从0开始计数 int end = (int) (10000000 / 2 + 2500000 * (1 - r[y])); - int N = end - start; // -1 for all + int N = end - start; + // int start = 0; + // int end = 10000; + // int N = end - start; for (int nout : noutList) { // apply Sim-Piece on the input file, outputting nout points saved in csvFile @@ -54,14 +57,26 @@ public class MySample_simpiece { String delimiter = ","; TimeSeries ts = TimeSeriesReader.getMyTimeSeries( - inputStream, delimiter, false, N, start, hasHeader, series); - double epsilon = getSimPieceParam(nout, ts, 1e-6); - System.out.println(datasetName + ": n=" + N + ",m=" + nout + ",epsilon=" + epsilon); + inputStream, delimiter, false, N, start, hasHeader, false); + // double epsilon = getSimPieceParam(nout, ts, 1e-6); + double epsilon = epsilonList[y]; SimPiece simPiece = new SimPiece(ts.data, epsilon); + System.out.println( + datasetName + + ": n=" + + N + + ",m=" + + nout + + ",epsilon=" + + epsilon + + ",actual m=" + + simPiece.segments.size() * 2); List<SimPieceSegment> segments = simPiece.segments; segments.sort(Comparator.comparingLong(SimPieceSegment::getInitTimestamp)); try (PrintWriter writer = - new PrintWriter(new FileWriter(datasetName + "-" + N + "-" + nout + ".csv"))) { + new PrintWriter( + new FileWriter( + datasetName + "-" + N + "-" + segments.size() * 2 + "-simpiece.csv"))) { for (int i = 0; i < segments.size() - 1; i++) { // start point of this segment writer.println(segments.get(i).getInitTimestamp() + "," + segments.get(i).getB());
