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 33562646f9c53e92ec51358a21ad4fb15e046e84
Author: Lei Rui <1010953...@qq.com>
AuthorDate: Mon Jul 15 00:54:32 2024 +0800

    Add
---
 .../iotdb/db/query/simpiece/MySample_fsw_full.java | 198 ++++++++++++++++++++
 .../simpiece/MySample_shrinkingcone_full.java      | 195 ++++++++++++++++++++
 .../db/query/simpiece/MySample_simpiece_full.java  | 199 +++++++++++++++++++++
 3 files changed, 592 insertions(+)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_fsw_full.java
 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_fsw_full.java
new file mode 100644
index 00000000000..e4e581488dd
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_fsw_full.java
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Sim-Piece code forked from https://github.com/xkitsios/Sim-Piece.git
+
+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;
+
+public class MySample_fsw_full {
+
+  public static void main(String[] args) {
+    String fileDir = "D:\\desktop\\NISTPV\\";
+    String[] datasetNameList =
+        new String[] {
+          "NISTPV-Ground-2015-WindSpeed_ms",
+          "NISTPV-Ground-2015-Qloss_Ah",
+          "NISTPV-Ground-2015-Pyra1_Wm2",
+          "NISTPV-Ground-2015-RTD_C_3"
+        };
+    int[] noutList = new int[] {320, 360, 400, 440, 480, 520, 560, 600, 640};
+
+    double[][] epsilonArray = {
+      {
+        9.618271350860596,
+        9.101282596588135,
+        8.991526126861572,
+        8.62817907333374,
+        8.374999523162842,
+        8.202636241912842,
+        7.999906063079834,
+        7.947059154510498,
+        7.858933925628662
+      },
+      {
+        9.999275207519531E-4,
+        9.989738464355469E-4,
+        9.980201721191406E-4,
+        9.970664978027344E-4,
+        9.961128234863281E-4,
+        9.951591491699219E-4,
+        9.942054748535156E-4,
+        9.932518005371094E-4,
+        9.922981262207031E-4
+      },
+      {
+        440.0235962867737,
+        432.0247492790222,
+        423.55674982070923,
+        414.65001153945923,
+        405.77113008499146,
+        401.21820974349976,
+        396.7935194969177,
+        393.2065939903259,
+        392.30953645706177
+      },
+      {
+        9.295397281646729,
+        8.096678256988525,
+        7.536666393280029,
+        6.961357593536377,
+        6.473535060882568,
+        6.064479351043701,
+        5.743286609649658,
+        5.5219340324401855,
+        5.185042858123779
+      }
+    };
+
+    //    double[][] epsilonArray = new double[datasetNameList.length][];
+    //    for (int i = 0; i < datasetNameList.length; i++) {
+    //      epsilonArray[i] = new double[noutList.length];
+    //    }
+
+    for (int y = 0; y < datasetNameList.length; y++) {
+      String datasetName = datasetNameList[y];
+      int start = 0;
+      int end = 1000_0000;
+      int N = end - start;
+      boolean hasHeader = false;
+      try (FileInputStream inputStream = new FileInputStream(fileDir + 
datasetName + ".csv")) {
+        String delimiter = ",";
+        TimeSeries ts =
+            TimeSeriesReader.getMyTimeSeries(
+                inputStream, delimiter, false, N, start, hasHeader, false);
+        for (int x = 0; x < noutList.length; x++) {
+          int nout = noutList[x];
+          //          double epsilon = getFSWParam(nout, ts, 1e-6);
+          //          epsilonArray[y][x] = epsilon;
+
+          double epsilon = epsilonArray[y][x];
+
+          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
+                          + "-"
+                          + nout
+                          + "-"
+                          + reducedPoints.size()
+                          + "-fsw.csv"))) {
+            for (Point p : reducedPoints) {
+              writer.println(p.getTimestamp() + "," + p.getValue());
+            }
+          }
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+
+    for (int i = 0; i < epsilonArray.length; i++) { // 遍历行
+      for (int j = 0; j < epsilonArray[i].length; j++) { // 遍历列
+        System.out.print(epsilonArray[i][j] + ",");
+      }
+      System.out.println();
+    }
+  }
+
+  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_full.java
 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_shrinkingcone_full.java
new file mode 100644
index 00000000000..d0c7aeef63d
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_shrinkingcone_full.java
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Sim-Piece code forked from https://github.com/xkitsios/Sim-Piece.git
+
+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;
+
+public class MySample_shrinkingcone_full {
+
+  public static void main(String[] args) {
+    String fileDir = "D:\\desktop\\NISTPV\\";
+    String[] datasetNameList =
+        new String[] {
+          "NISTPV-Ground-2015-WindSpeed_ms",
+          "NISTPV-Ground-2015-Qloss_Ah",
+          "NISTPV-Ground-2015-Pyra1_Wm2",
+          "NISTPV-Ground-2015-RTD_C_3"
+        };
+    int[] noutList = new int[] {320, 360, 400, 440, 480, 520, 560, 600, 640};
+
+    //    double[] epsilonList = new double[]{0.001, 0.001, 0.001, 0.001, 
0.001, 0.001, 0.001,
+    // 0.001,
+    //        0.0009999999999999999};
+
+    double[][] epsilonArray = {
+      {
+        14.388325214385986,
+        13.768231868743896,
+        13.343345165252686,
+        13.091249942779541,
+        12.69767427444458,
+        12.391706943511963,
+        12.167190074920654,
+        11.972727298736572,
+        11.756273746490479
+      },
+      {0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 
0.0009999999999999999},
+      {
+        680.2196469306946,
+        665.2842917442322,
+        650.2610821723938,
+        636.7945942878723,
+        620.9016032218933,
+        604.7394433021545,
+        592.9867577552795,
+        578.6471419334412,
+        570.5106825828552
+      },
+      {
+        11.259880542755127,
+        10.37297010421753,
+        9.402754306793213,
+        8.867334842681885,
+        8.384315967559814,
+        7.915340900421143,
+        7.39516019821167,
+        6.892223834991455,
+        6.5178914070129395
+      }
+    };
+
+    //    double[][] epsilonArray = new double[datasetNameList.length][];
+    //    for (int i = 0; i < datasetNameList.length; i++) {
+    //      epsilonArray[i] = new double[noutList.length];
+    //    }
+
+    for (int y = 0; y < datasetNameList.length; y++) {
+      String datasetName = datasetNameList[y];
+      int start = 0;
+      int end = 1000_0000;
+      int N = end - start;
+      boolean hasHeader = false;
+      try (FileInputStream inputStream = new FileInputStream(fileDir + 
datasetName + ".csv")) {
+        String delimiter = ",";
+        TimeSeries ts =
+            TimeSeriesReader.getMyTimeSeries(
+                inputStream, delimiter, false, N, start, hasHeader, false);
+        for (int x = 0; x < noutList.length; x++) {
+          int nout = noutList[x];
+
+          //          double epsilon = getSCParam(nout, ts, 1e-6);
+          //          epsilonArray[y][x] = epsilon;
+
+          double epsilon = epsilonArray[y][x];
+
+          //          double epsilon = epsilonList[x]; // 单独给Qloss手调
+
+          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
+                          + "-"
+                          + nout
+                          + "-"
+                          + reducedPoints.size()
+                          + "-sc.csv"))) {
+            for (Point p : reducedPoints) {
+              writer.println(p.getTimestamp() + "," + p.getValue());
+            }
+          }
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+
+    for (int i = 0; i < epsilonArray.length; i++) { // 遍历行
+      for (int j = 0; j < epsilonArray[i].length; j++) { // 遍历列
+        System.out.print(epsilonArray[i][j] + ",");
+      }
+      System.out.println();
+    }
+  }
+
+  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_full.java
 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_simpiece_full.java
new file mode 100644
index 00000000000..e7a2cd19c43
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/MySample_simpiece_full.java
@@ -0,0 +1,199 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Sim-Piece code forked from https://github.com/xkitsios/Sim-Piece.git
+
+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.Comparator;
+import java.util.List;
+
+public class MySample_simpiece_full {
+
+  public static void main(String[] args) {
+    String fileDir = "D:\\desktop\\NISTPV\\";
+    String[] datasetNameList =
+        new String[] {
+          "NISTPV-Ground-2015-WindSpeed_ms",
+          "NISTPV-Ground-2015-Qloss_Ah",
+          "NISTPV-Ground-2015-Pyra1_Wm2",
+          "NISTPV-Ground-2015-RTD_C_3"
+        };
+    int[] noutList = new int[] {320, 360, 400, 440, 480, 520, 560, 600, 640};
+
+    double[][] epsilonArray = {
+      {
+        10.470000203704831,
+        9.973635465240477,
+        9.571347576141356,
+        9.339938166046142,
+        9.208912633514405,
+        9.135163892364506,
+        8.744444478607178,
+        8.61042620162964,
+        8.422101323699948
+      },
+      {
+        9.987499999999999E-4,
+        9.974999999999997E-4,
+        9.784999999999998E-4,
+        9.4425E-4,
+        9.255E-4,
+        8.8375E-4,
+        8.4775E-4,
+        7.865E-4,
+        7.3825E-4
+      },
+      {
+        502.0505219552564,
+        493.3274919509581,
+        485.91779255051347,
+        479.26180967157245,
+        463.5216509033579,
+        446.88677012006065,
+        441.2913785749938,
+        435.45897277584766,
+        426.0481592410648
+      },
+      {
+        13.678959740142822,
+        12.275238493499756,
+        11.224719192962645,
+        10.475999729766848,
+        9.741776887359617,
+        9.125823136444094,
+        8.625197060394289,
+        8.105121862335203,
+        7.743280215911865
+      }
+    };
+
+    //    double[][] epsilonArray = new double[datasetNameList.length][];
+    //    for (int i = 0; i < datasetNameList.length; i++) {
+    //      epsilonArray[i] = new double[noutList.length];
+    //    }
+
+    for (int y = 0; y < datasetNameList.length; y++) {
+      String datasetName = datasetNameList[y];
+      int start = 0;
+      int end = 1000_0000;
+      int N = end - start;
+      // 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, false);
+        for (int x = 0; x < noutList.length; x++) {
+          int nout = noutList[x];
+
+          //          double epsilon = getSimPieceParam(nout, ts, 1e-6);
+          //          epsilonArray[y][x] = epsilon;
+
+          double epsilon = epsilonArray[y][x];
+
+          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
+                          + "-"
+                          + 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());
+              // end point of this segment
+              double v =
+                  (segments.get(i + 1).getInitTimestamp() - 
segments.get(i).getInitTimestamp())
+                          * segments.get(i).getA()
+                      + segments.get(i).getB();
+              writer.println(segments.get(i + 1).getInitTimestamp() + "," + v);
+            }
+            // the two end points of the last segment
+            writer.println(
+                segments.get(segments.size() - 1).getInitTimestamp()
+                    + ","
+                    + segments.get(segments.size() - 1).getB());
+            double v =
+                (simPiece.lastTimeStamp - segments.get(segments.size() - 
1).getInitTimestamp())
+                        * segments.get(segments.size() - 1).getA()
+                    + segments.get(segments.size() - 1).getB();
+            writer.println(simPiece.lastTimeStamp + "," + v);
+          }
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+
+    for (int i = 0; i < epsilonArray.length; i++) { // 遍历行
+      for (int j = 0; j < epsilonArray[i].length; j++) { // 遍历列
+        System.out.print(epsilonArray[i][j] + ",");
+      }
+      System.out.println();
+    }
+  }
+
+  public static double getSimPieceParam(int nout, TimeSeries ts, double 
accuracy)
+      throws IOException {
+    double epsilon = ts.range * 0.001;
+    while (true) {
+      SimPiece simPiece = new SimPiece(ts.data, epsilon);
+      if (simPiece.segments.size() * 2 > nout) { // note *2 for disjoint
+        epsilon *= 2;
+      } else {
+        break;
+      }
+    }
+    double left = epsilon / 2;
+    double right = epsilon;
+    while (Math.abs(right - left) > accuracy) {
+      double mid = (left + right) / 2;
+      SimPiece simPiece = new SimPiece(ts.data, mid);
+      if (simPiece.segments.size() * 2 > nout) { // note *2 for disjoint
+        left = mid;
+      } else {
+        right = mid;
+      }
+    }
+    return (left + right) / 2;
+  }
+}

Reply via email to