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 54b9ed1181a013cc5d9c13a9bb6754fd173b1619
Author: Lei Rui <[email protected]>
AuthorDate: Fri Jan 17 20:40:51 2025 +0800

    add
---
 .../iotdb/db/query/simpiece/Visval_standard.java   | 100 +++++++++++----------
 .../db/query/simpiece/Visval_standard_slow.java    |  62 +++++++------
 2 files changed, 85 insertions(+), 77 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard.java 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard.java
index 80aa0995809..28f0f26618a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard.java
@@ -22,7 +22,6 @@ package org.apache.iotdb.db.query.simpiece;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.*;
-import java.util.stream.Collectors;
 
 // adapted from the open source C++ code
 // https://github.com/ofZach/Visvalingam-Whyatt/blob/master/src/testApp.cpp
@@ -127,9 +126,7 @@ public class Visval_standard {
         // 创建所有三角形并计算初始面积
         for (int i = 1; i < total - 1; i++) {
             int index1 = i - 1, index2 = i, index3 = i + 1;
-            double area =
-                    triArea(
-                            lineToSimplify.get(index1), 
lineToSimplify.get(index2), lineToSimplify.get(index3));
+            double area = triArea(lineToSimplify.get(index1), 
lineToSimplify.get(index2), lineToSimplify.get(index3));
             triangles[i - 1] = new Triangle(index1, index2, index3, area);
         }
 
@@ -140,8 +137,7 @@ public class Visval_standard {
         }
 
         // 使用优先队列构建 minHeap
-        PriorityQueue<Triangle> triangleHeap =
-                new PriorityQueue<>(Comparator.comparingDouble(t -> t.area));
+        PriorityQueue<Triangle> triangleHeap = new 
PriorityQueue<>(Comparator.comparingDouble(t -> t.area));
         Collections.addAll(triangleHeap, triangles); // complexity TODO
 
         double previousEA = -1;
@@ -163,6 +159,8 @@ public class Visval_standard {
             results.get(tri.indices[1]).z = previousEA;
             //      System.out.println(tri.indices[1] + "," + previousEA);
 
+            System.out.println(Arrays.toString(tri.indices) + "," + 
previousEA);
+
             // 更新相邻三角形
             if (tri.prev != null) {
                 // 1. 处理旧的tri.prev被标记删除的事情(角色替代)
@@ -170,21 +168,17 @@ public class Visval_standard {
                 tri.prev.markDeleted(); // O(1) 
这个点标记为废掉,前后关联都砍断,但是不remove因为那太耗时,只有poll到它就跳过就可以
 
                 Triangle newPre = new Triangle(tri.prev); // deep copy and 
inherit connection
-                tri.prev = newPre; // replace
+//                tri.prev = newPre; // replace TODO can omit
 
                 // 2. 处理pi被淘汰引起tri.prev被更新的事情
                 // 前一个三角形连到后一个三角形
                 tri.prev.next = tri.next; // ATTENTION!!!: 
这里的tri.next后面可能会因为处理旧的tri.next被标记删除的事情被换掉!到时候要重新赋值!
                 tri.prev.indices[2] = tri.indices[2];
-                tri.prev.area =
-                        triArea(
-                                lineToSimplify.get(tri.prev.indices[0]),
-                                lineToSimplify.get(tri.prev.indices[1]),
-                                lineToSimplify.get(tri.prev.indices[2]));
+                tri.prev.area = 
triArea(lineToSimplify.get(tri.prev.indices[0]), 
lineToSimplify.get(tri.prev.indices[1]), 
lineToSimplify.get(tri.prev.indices[2]));
 
                 // 重新加入堆
                 // 在 Java 的 PriorityQueue 中,修改元素的属性不会自动更新堆的顺序
-                // 所以必须通过add 来显式重新插入修改后的元素
+                // 所以必须通过add来显式重新插入修改后的元素
                 triangleHeap.add(tri.prev); // O(logn) 
注意加入的是一个新的对象isDeleted=false
             }
 
@@ -194,7 +188,7 @@ public class Visval_standard {
                 tri.next.markDeleted(); // O(1) 
这个点标记为废掉,前后关联都砍断,但是不remove因为那太耗时,只有poll到它就跳过就可以
 
                 Triangle newNext = new Triangle(tri.next); // deep copy and 
inherit connection
-                tri.next = newNext; // replace
+//                tri.next = newNext; // replace TODO can omit
 
                 if (tri.prev != null) {
                     tri.prev.next = tri.next; // ATTENTION!!!: 
这里的tri.next已经被换掉!所以之前的要重新赋值!
@@ -203,11 +197,7 @@ public class Visval_standard {
                 // 2. 处理pi被淘汰引起tri.next被更新的事情
                 tri.next.prev = tri.prev; // 
注意此时tri.prev已经是替代后的节点,tri.next也是,从而被标记为废点的前后关联真正砍断
                 tri.next.indices[0] = tri.indices[0];
-                tri.next.area =
-                        triArea(
-                                lineToSimplify.get(tri.next.indices[0]),
-                                lineToSimplify.get(tri.next.indices[1]),
-                                lineToSimplify.get(tri.next.indices[2]));
+                tri.next.area = 
triArea(lineToSimplify.get(tri.next.indices[0]), 
lineToSimplify.get(tri.next.indices[1]), 
lineToSimplify.get(tri.next.indices[2]));
 
                 // 重新加入堆
                 // 在 Java 的 PriorityQueue 中,修改元素的属性不会自动更新堆的顺序
@@ -221,13 +211,13 @@ public class Visval_standard {
         Polyline polyline = new Polyline();
         List<Polyline> polylineList = new ArrayList<>();
         Random rand = new Random(1);
-        int n = 10000; //1000_000;
+        int n = 100000; //1000_000;
 
         int p = 100;
         for (int i = 0; i < n; i += p) {
             Polyline polylineBatch = new Polyline();
             for (int j = i; j < Math.min(i + p, n); j++) {
-                double v = rand.nextInt(1000);
+                double v = rand.nextInt(1000000);
 
                 polyline.addVertex(new vPoint(j, v));
 
@@ -236,6 +226,20 @@ public class Visval_standard {
             polylineList.add(polylineBatch);
         }
 
+        try (FileWriter writer = new FileWriter("raw.csv")) {
+            // 写入CSV头部
+            writer.append("x,y,z\n");
+
+            // 写入每个点的数据
+            for (int i = 0; i < polyline.size(); i++) {
+                vPoint point = polyline.get(i);
+                writer.append(point.x + "," + point.y + "," + point.z + "\n");
+            }
+            System.out.println("Data has been written");
+        } catch (IOException e) {
+            System.out.println("Error writing to CSV file: " + e.getMessage());
+        }
+
         System.out.println("---------------------------------");
         List<vPoint> results = new ArrayList<>();
         // 计算运行时间
@@ -268,33 +272,33 @@ public class Visval_standard {
             System.out.println("Error writing to CSV file: " + e.getMessage());
         }
 
-        System.out.println("---------------------------------");
-        List<List<vPoint>> resultsBatchList = new ArrayList<>();
-        // 计算运行时间
-        int cnt = 0;
-        startTime = System.currentTimeMillis();
-        for (Polyline polylineBatch : polylineList) {
-            List<vPoint> resultsBatch = new ArrayList<>();
-            buildEffectiveArea(polylineBatch, resultsBatch);
-            cnt += resultsBatch.size();
-            resultsBatchList.add(resultsBatch);
-        }
-        // 输出结果
-        endTime = System.currentTimeMillis();
-        System.out.println("Time taken to reduce points: " + (endTime - 
startTime) + "ms");
-        System.out.println(cnt);
-
-        System.out.println("---------------------------------");
-        // 使用 Stream API 合并所有列表
-        List<vPoint> mergedList =
-                
resultsBatchList.stream().flatMap(List::stream).collect(Collectors.toList());
-        int sameCnt = 0;
-        for (int i = 0; i < mergedList.size(); i++) {
-            if (mergedList.get(i).z == results.get(i).z) {
-                sameCnt += 1;
-            }
-        }
-        System.out.println("sameCnt=" + sameCnt + ", percent=" + sameCnt * 1.0 
/ mergedList.size());
+//        System.out.println("---------------------------------");
+//        List<List<vPoint>> resultsBatchList = new ArrayList<>();
+//        // 计算运行时间
+//        int cnt = 0;
+//        startTime = System.currentTimeMillis();
+//        for (Polyline polylineBatch : polylineList) {
+//            List<vPoint> resultsBatch = new ArrayList<>();
+//            buildEffectiveArea(polylineBatch, resultsBatch);
+//            cnt += resultsBatch.size();
+//            resultsBatchList.add(resultsBatch);
+//        }
+//        // 输出结果
+//        endTime = System.currentTimeMillis();
+//        System.out.println("Time taken to reduce points: " + (endTime - 
startTime) + "ms");
+//        System.out.println(cnt);
+//
+//        System.out.println("---------------------------------");
+//        // 使用 Stream API 合并所有列表
+//        List<vPoint> mergedList =
+//                
resultsBatchList.stream().flatMap(List::stream).collect(Collectors.toList());
+//        int sameCnt = 0;
+//        for (int i = 0; i < mergedList.size(); i++) {
+//            if (mergedList.get(i).z == results.get(i).z) {
+//                sameCnt += 1;
+//            }
+//        }
+//        System.out.println("sameCnt=" + sameCnt + ", percent=" + sameCnt * 
1.0 / mergedList.size());
     }
 
     //    float[] vlist = new float[]{11346, 33839, 35469, 23108, 22812, 5519, 
5526, 4865, 5842,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard_slow.java
 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard_slow.java
index 929fa304568..33259cc4cff 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard_slow.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/simpiece/Visval_standard_slow.java
@@ -119,6 +119,8 @@
 //            // 而poll是删除堆顶元素,需要重新堆化以维护堆的性质,复杂度是O(logk),k是当前堆的大小
 //            Triangle tri = triangleHeap.poll(); // O(logn)
 //
+////            System.out.println(Arrays.toString(tri.indices));
+//
 //            // 更新当前点的重要性(z 轴存储effective area,这是一个单调增的指标)
 //            if (tri.area > previousEA) {
 //                previousEA = tri.area;
@@ -126,6 +128,8 @@
 //            results.get(tri.indices[1]).z = previousEA;
 //            //      System.out.println(tri.indices[1] + "," + previousEA);
 //
+//            System.out.println(Arrays.toString(tri.indices) + "," + 
previousEA);
+//
 //            // 更新相邻三角形
 //            if (tri.prev != null) {
 //                // 前一个三角形连到后一个三角形
@@ -166,13 +170,13 @@
 //        List<Polyline> polylineList = new ArrayList<>();
 //        Random rand = new Random(1);
 ////        int n = 1000_000;
-//        int n = 10000;
+//        int n = 100000;
 //
 //        int p = 100;
 //        for (int i = 0; i < n; i += p) {
 //            Polyline polylineBatch = new Polyline();
 //            for (int j = i; j < Math.min(i + p, n); j++) {
-//                double v = rand.nextInt(1000);
+//                double v = rand.nextInt(1000000);
 //
 //                polyline.addVertex(new vPoint(j, v));
 //
@@ -213,33 +217,33 @@
 //            System.out.println("Error writing to CSV file: " + 
e.getMessage());
 //        }
 //
-//        System.out.println("---------------------------------");
-//        List<List<vPoint>> resultsBatchList = new ArrayList<>();
-//        // 计算运行时间
-//        int cnt = 0;
-//        startTime = System.currentTimeMillis();
-//        for (Polyline polylineBatch : polylineList) {
-//            List<vPoint> resultsBatch = new ArrayList<>();
-//            buildEffectiveArea(polylineBatch, resultsBatch);
-//            cnt += resultsBatch.size();
-//            resultsBatchList.add(resultsBatch);
-//        }
-//        // 输出结果
-//        endTime = System.currentTimeMillis();
-//        System.out.println("Time taken to reduce points: " + (endTime - 
startTime) + "ms");
-//        System.out.println(cnt);
-//
-//        System.out.println("---------------------------------");
-//        // 使用 Stream API 合并所有列表
-//        List<vPoint> mergedList =
-//                
resultsBatchList.stream().flatMap(List::stream).collect(Collectors.toList());
-//        int sameCnt = 0;
-//        for (int i = 0; i < mergedList.size(); i++) {
-//            if (mergedList.get(i).z == results.get(i).z) {
-//                sameCnt += 1;
-//            }
-//        }
-//        System.out.println("sameCnt=" + sameCnt + ", percent=" + sameCnt * 
1.0 / mergedList.size());
+////        System.out.println("---------------------------------");
+////        List<List<vPoint>> resultsBatchList = new ArrayList<>();
+////        // 计算运行时间
+////        int cnt = 0;
+////        startTime = System.currentTimeMillis();
+////        for (Polyline polylineBatch : polylineList) {
+////            List<vPoint> resultsBatch = new ArrayList<>();
+////            buildEffectiveArea(polylineBatch, resultsBatch);
+////            cnt += resultsBatch.size();
+////            resultsBatchList.add(resultsBatch);
+////        }
+////        // 输出结果
+////        endTime = System.currentTimeMillis();
+////        System.out.println("Time taken to reduce points: " + (endTime - 
startTime) + "ms");
+////        System.out.println(cnt);
+////
+////        System.out.println("---------------------------------");
+////        // 使用 Stream API 合并所有列表
+////        List<vPoint> mergedList =
+////                
resultsBatchList.stream().flatMap(List::stream).collect(Collectors.toList());
+////        int sameCnt = 0;
+////        for (int i = 0; i < mergedList.size(); i++) {
+////            if (mergedList.get(i).z == results.get(i).z) {
+////                sameCnt += 1;
+////            }
+////        }
+////        System.out.println("sameCnt=" + sameCnt + ", percent=" + sameCnt * 
1.0 / mergedList.size());
 //
 //
 //

Reply via email to