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

Reply via email to