This is an automated email from the ASF dual-hosted git repository.

leirui pushed a commit to branch research/area-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5ee9e320f4c473516ff3cea64a2d07824f2af757
Author: Lei Rui <[email protected]>
AuthorDate: Thu Jan 23 18:34:02 2025 +0800

    return bottom-up order
---
 .../java/org/apache/iotdb/db/query/eBUG/Test1.java | 10 ++++-
 .../java/org/apache/iotdb/db/query/eBUG/Test2.java | 51 +++++++++++++---------
 .../java/org/apache/iotdb/db/query/eBUG/eBUG.java  | 25 ++++++++---
 3 files changed, 57 insertions(+), 29 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test1.java 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test1.java
index f53f5719217..91df7751e50 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test1.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test1.java
@@ -3,6 +3,7 @@ package org.apache.iotdb.db.query.eBUG;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Random;
 
@@ -13,8 +14,9 @@ public class Test1 {
     public static void main(String[] args) {
         Polyline polyline = new Polyline();
         List<Polyline> polylineList = new ArrayList<>();
-        Random rand = new Random(3);
+        Random rand = new Random(10);
         int n = 10000;
+        int eParam = 0;
 
         int p = 10;
         for (int i = 0; i < n; i += p) {
@@ -44,14 +46,18 @@ public class Test1 {
         }
 
         System.out.println("---------------------------------");
-        int eParam = 1;
         long startTime = System.currentTimeMillis();
+        // 注意现在返回的结果是按照Sig递增也就是bottom-up淘汰的顺序排列的,而不是按照时间戳递增排列
         List<Point> results = buildEffectiveArea(polyline, eParam, false);
         // 输出结果
         long endTime = System.currentTimeMillis();
         System.out.println("n=" + n + ", e=" + eParam + ", Time taken to 
reduce points: " + (endTime - startTime) + "ms");
         System.out.println(results.size());
 
+        // 注意现在返回的结果是按照Sig递增也就是bottom-up淘汰的顺序排列的,而不是按照时间戳递增排列
+        // 按照时间戳递增排序整理:
+        results.sort(Comparator.comparingDouble(point -> point.x));
+
         if (results.size() <= 100) {
             System.out.println("+++++++++++++++++++");
             for (int i = 0; i < results.size(); i++) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test2.java 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test2.java
index 589603525e5..fb7de582f17 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test2.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Test2.java
@@ -2,6 +2,7 @@ package org.apache.iotdb.db.query.eBUG;
 
 import io.jsonwebtoken.lang.Assert;
 
+import java.util.Comparator;
 import java.util.List;
 import java.util.Random;
 
@@ -10,32 +11,42 @@ import static 
org.apache.iotdb.db.query.eBUG.eBUG.buildEffectiveArea;
 public class Test2 {
     // 用于测试在线采样
     public static void main(String[] args) {
-        int n = 100000;
+        int n = 20;
         int eParam = 1;
 
-//        int m = 100; // >2代表在线采样,<=2代表预计算
-        for (int m = 9900; m <= n; m++) {
+        int m = 2; // >2代表在线采样,<=2代表预计算
+//        for (int m = 9900; m <= n; m++) {
 
-            Polyline polyline = new Polyline();
-            Random rand = new Random(2);
-            for (int i = 0; i < n; i++) {
-                double v = rand.nextInt(1000000);
-                polyline.addVertex(new Point(i, v));
-            }
+        Polyline polyline = new Polyline();
+        Random rand = new Random(2);
+        for (int i = 0; i < n; i++) {
+            double v = rand.nextInt(1000000);
+            polyline.addVertex(new Point(i, v));
+        }
 
-            long startTime = System.currentTimeMillis();
-            List<Point> results = buildEffectiveArea(polyline, eParam, false, 
m);
-            long endTime = System.currentTimeMillis();
-            System.out.println("n=" + n + ", e=" + eParam + ", Time taken to 
reduce points: " + (endTime - startTime) + "ms");
+        long startTime = System.currentTimeMillis();
+        List<Point> results = buildEffectiveArea(polyline, eParam, false, m);
+        long endTime = System.currentTimeMillis();
+        System.out.println("n=" + n + ", e=" + eParam + ", Time taken to 
reduce points: " + (endTime - startTime) + "ms");
 
-            System.out.println(results.size());
+        System.out.println(results.size());
+        if (m > 2 && m < n) {
             Assert.isTrue(results.size() == m);
+        } else {
+            Assert.isTrue(results.size() == n);
+        }
+        if (results.size() <= 100) {
+            System.out.println("+++++++++++++++++++");
+            for (Point point : results) {
+                System.out.println("Point: (" + point.x + ", " + point.y + ", 
" + point.z + ")");
+            }
+            // 注意现在返回的结果是按照Sig递增也就是bottom-up淘汰的顺序排列的,而不是按照时间戳递增排列
+            // 按照时间戳递增排序整理:
+            results.sort(Comparator.comparingDouble(point -> point.x));
+            System.out.println("+++++++++++++++++++");
+            for (Point point : results) {
+                System.out.println("Point: (" + point.x + ", " + point.y + ", 
" + point.z + ")");
+            }
         }
-//        if (results.size() <= 100) {
-//            System.out.println("+++++++++++++++++++");
-//            for (Point point : results) {
-//                System.out.println("Point: (" + point.x + ", " + point.y + 
", " + point.z + ")");
-//            }
-//        }
     }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java
index b9147e4c574..e177b1dcf20 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java
@@ -66,12 +66,17 @@ public class eBUG {
         }
 
         if (m > 2) {
-            System.out.println("online sampling mode, returning " + m + " 
sampled points");
+            System.out.println("online sampling mode, " +
+                    "returning " + m + " sampled points sorted by time in 
ascending order");
         } else {
-            System.out.println("offline precomputation mode, returning each 
point with dominated significance");
+            System.out.println("offline precomputation mode, " +
+                    "returning each point sorted by dominated significance 
(DS) in ascending order");
         }
 
-        List<Point> results = lineToSimplify.getVertices(); // 浅复制
+//        List<Point> results = lineToSimplify.getVertices(); // 浅复制
+        // TODO 预计算结果改成按照bottom-up逐点淘汰顺序(DS递增)排列而不是按照时间戳,这样省去在线时对DS排序的过程
+        //    add的是Point引用,所以没有多用一倍的空间
+        List<Point> resultsBottomUpEliminated = new ArrayList<>();
 
         // 存储的是点的引用,这样可以修改原来序列里点的淘汰状态
         // 存储的是距离当前最新状态的滞后的尚未施加、待施加的e个淘汰点
@@ -79,7 +84,7 @@ public class eBUG {
 
         int total = lineToSimplify.size();
         if (total < 3) {
-            return results; // 不足 3 个点无法形成三角形
+            return lineToSimplify.getVertices(); // 不足 3 个点无法形成三角形
         }
 
         int nTriangles = total - 2;
@@ -155,7 +160,9 @@ public class eBUG {
             if (tri.area > previousEA) {
                 previousEA = tri.area;
             }
-            results.get(tri.indices[1]).z = previousEA; // dominated 
significance
+//            results.get(tri.indices[1]).z = previousEA; // dominated 
significance
+            lineToSimplify.get(tri.indices[1]).z = previousEA; // dominated 
significance
+            resultsBottomUpEliminated.add(lineToSimplify.get(tri.indices[1])); 
// TODO add的是Point引用,所以没有多用一倍的空间
             if (debug) {
                 System.out.println(Arrays.toString(tri.indices) + ", Dominated 
Sig=" + previousEA);
             }
@@ -270,13 +277,17 @@ public class eBUG {
             Point start = lineToSimplify.get(0);
             Point end = lineToSimplify.get(lineToSimplify.size() - 1);
             while (start != end) { // 
Point类里增加prev&next指针,这样T'_max{0,k-e}里点的连接关系就有了,这样从Pa开始沿着指针,遍历点数一定不超过e+3
-                onlineSampled.add(start);
+                onlineSampled.add(start); // 注意未淘汰的点的Dominated 
significance尚未赋值,还都是infinity
                 start = start.next; // when e=0, only traversing three points 
pa pi pb
             }
             onlineSampled.add(end);
             return onlineSampled;
         } else { // offline precomputation mode, for precomputing the 
dominated significance of each point
-            return results; // 注意这就是lineToSimplify.getVertices()
+//            return results; // 注意这就是lineToSimplify.getVertices()
+            // TODO
+            resultsBottomUpEliminated.add(lineToSimplify.get(0)); // 全局首点
+            
resultsBottomUpEliminated.add(lineToSimplify.get(lineToSimplify.size() - 1)); 
// 全局尾点
+            return resultsBottomUpEliminated;
         }
     }
 

Reply via email to