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 068c3e6588231a1578d80f52ee2d41519516b551 Author: Lei Rui <[email protected]> AuthorDate: Tue Jan 21 18:28:23 2025 +0800 add --- .../org/apache/iotdb/db/query/eBUG/Polyline.java | 4 +- .../java/org/apache/iotdb/db/query/eBUG/Tool.java | 9 +- .../java/org/apache/iotdb/db/query/eBUG/eBUG.java | 120 +++++++++++++-------- 3 files changed, 86 insertions(+), 47 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Polyline.java b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Polyline.java index b6e2f231c14..9fa11b192cb 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Polyline.java +++ b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Polyline.java @@ -12,9 +12,11 @@ public class Polyline { } public List<Point> getVertices() { - return new ArrayList<>(vertices); +// return new ArrayList<>(vertices); + return vertices; } + public int size() { return vertices.size(); } diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Tool.java b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Tool.java index 48c1544e76b..0587b2fa39e 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/Tool.java +++ b/server/src/main/java/org/apache/iotdb/db/query/eBUG/Tool.java @@ -171,10 +171,11 @@ public class Tool { points.add(new Point(6, 0)); List<Point> points2 = new ArrayList<>(); - points2.add(points.get(0)); - points2.add(points.get(3)); - points2.add(points.get(6)); -// points2.add(points.get(5)); +// points2.add(points.get(0)); +// points2.add(points.get(3)); +// points2.add(points.get(6)); + points2.add(new Point(1,-10)); + points2.add(new Point(3,0)); double area = total_areal_displacement(points, points2, true); System.out.println("Total area: " + area); 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 cc512cbcc9c..12882823356 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 @@ -23,6 +23,7 @@ import java.io.FileWriter; import java.io.IOException; import java.util.*; +import static org.apache.iotdb.db.query.eBUG.Tool.total_areal_displacement; import static org.apache.iotdb.db.query.eBUG.Tool.triArea; @@ -31,9 +32,9 @@ public class eBUG { Point pa, Point pi, Point pb) { // TODO 寻找最近淘汰的e个点,并且是位于pa~pb之间的 // 性质:最近淘汰的那一个点一定是位于pa~pb之间,因为正是这个点的淘汰才使得pi的significance要更新! - // pi: point need significance updating - // pa: left adjacent non-eliminated point - // pb: right adjacent non-eliminated point + // pi: the point whose significance needs updating + // pa: left adjacent non-eliminated point of pi + // pb: right adjacent non-eliminated point of pi // return a list of points, containing pa,p,pb and points between pa&pa from the e most recently eliminated points, // order by time in ascending order List<Point> res = new ArrayList<>(); @@ -53,9 +54,13 @@ public class eBUG { return res; } - public static void buildEffectiveArea(Polyline lineToSimplify, List<Point> results, int e) { - results.clear(); - results.addAll(lineToSimplify.getVertices()); // TODO debug + public static List<Point> buildEffectiveArea(Polyline lineToSimplify, int e, boolean debug) { + if (e < 0) { + throw new IllegalArgumentException("Parameter e must be non-negative."); + } + + List<Point> results = lineToSimplify.getVertices(); // 浅复制 +// results.addAll(lineToSimplify.getVertices()); // TODO debug // TODO 需要一个东西来记录最近淘汰的点依次是谁 int[] recentEliminated = new int[e]; // init 0 points to the first point, skipped in findEliminated @@ -63,7 +68,7 @@ public class eBUG { int total = lineToSimplify.size(); if (total < 3) { - return; // 不足 3 个点无法形成三角形 + return results; // 不足 3 个点无法形成三角形 } int nTriangles = total - 2; @@ -84,7 +89,7 @@ public class eBUG { // 使用优先队列构建 minHeap PriorityQueue<Triangle> triangleHeap = new PriorityQueue<>(Comparator.comparingDouble(t -> t.area)); - Collections.addAll(triangleHeap, triangles); // complexity TODO + Collections.addAll(triangleHeap, triangles); // complexity TODO O(n) or O(nlogn)? double previousEA = -1; while (!triangleHeap.isEmpty()) { @@ -95,27 +100,33 @@ public class eBUG { // 如果该三角形已经被删除,跳过. Avoid using heap.remove(x) as it is O(n) complexity // 而且除了heap里,已经没有其他节点会和它关联了,所有的connections关系已经迁移到新的角色替代节点上 if (tri.isDeleted) { + if (debug) { + System.out.println(">>>bottom-up, remaining " + triangleHeap.size() + " triangles (including those marked for removal)"); + } continue; } // 真正的淘汰点 - //TODO 记录最近淘汰的点,注意不要重复记录也就是在上面执行之后再确认淘汰 -// popOrder.add(tri.indices[1]); - System.out.println("eliminate " + lineToSimplify.get(tri.indices[1])); - if (e > 0) { + // 记录最近淘汰的点,注意不要重复记录也就是在上面执行之后再确认淘汰 + if (debug) { + System.out.println("(1) eliminate " + lineToSimplify.get(tri.indices[1])); + } + if (e > 0) { // otherwise e=0 recentEliminated[recentEliminatedIdx] = tri.indices[1]; - recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 0~e-1 + recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 0~e-1 circulate + } + if (debug) { + System.out.println("the e most recently eliminated points:" + Arrays.toString(recentEliminated)); } - System.out.println(Arrays.toString(recentEliminated)); // 更新当前点的重要性(z 轴存储effective area,这是一个单调增的指标) if (tri.area > previousEA) { previousEA = tri.area; } - results.get(tri.indices[1]).z = previousEA; - // System.out.println(tri.indices[1] + "," + previousEA); - -// System.out.println(Arrays.toString(tri.indices) + "," + previousEA); + results.get(tri.indices[1]).z = previousEA; // dominated significance + if (debug) { + System.out.println(Arrays.toString(tri.indices) + ", Dominated Sig=" + previousEA); + } // 更新相邻三角形 if (tri.prev != null) { @@ -126,26 +137,37 @@ public class eBUG { tri.prev.markDeleted(); // O(1) 这个点标记为废掉,前后关联都砍断,但是不remove因为那太耗时,只要heap poll到它就跳过就可以 Triangle newPre = new Triangle(tri.prev); // deep copy and inherit connection -// tri.prev = newPre; // replace TODO can omit, because already done by new Triangle(tri.prev) +// tri.prev = newPre; // can omit, because already done by new Triangle(tri.prev) // 2. 处理pi被淘汰引起tri.prev被更新的事情 // 前一个三角形连到后一个三角形 tri.prev.next = tri.next; // ATTENTION!!!: 这里的tri.next后面可能会因为处理旧的tri.next被标记删除的事情被换掉!到时候要重新赋值! tri.prev.indices[2] = tri.indices[2]; - // TODO e parameter + // e parameter List<Point> pointsForSig = findEliminated(lineToSimplify, recentEliminated, lineToSimplify.get(tri.prev.indices[0]), lineToSimplify.get(tri.prev.indices[1]), - lineToSimplify.get(tri.prev.indices[2])); - System.out.println("for updating Point on the left " + lineToSimplify.get(tri.prev.indices[1])); - for (Point point : pointsForSig) { - System.out.println(point); + lineToSimplify.get(tri.prev.indices[2])); // TODO complexity ? + if (debug) { + System.out.println("(2) update point on the left " + lineToSimplify.get(tri.prev.indices[1])); + for (Point point : pointsForSig) { + System.out.println("\t" + point); + } + } + List<Point> baseLine = new ArrayList<>(); + baseLine.add(pointsForSig.get(0)); + baseLine.add(pointsForSig.get(pointsForSig.size() - 1)); // 直接连接左右两边最近的未被淘汰的点 + double sig = total_areal_displacement(pointsForSig, baseLine, false); + tri.prev.area = sig; + + if (debug) { + System.out.println("sig=" + sig); + double tmpTri = triArea(lineToSimplify.get(tri.prev.indices[0]), + lineToSimplify.get(tri.prev.indices[1]), + lineToSimplify.get(tri.prev.indices[2])); + System.out.println("\t" + "tri=" + tmpTri + ", " + ((tmpTri > sig) ? "over-estimated" : "equal/less-estimated")); } - - tri.prev.area = triArea(lineToSimplify.get(tri.prev.indices[0]), - lineToSimplify.get(tri.prev.indices[1]), - lineToSimplify.get(tri.prev.indices[2])); // 重新加入堆 // 在 Java 的 PriorityQueue 中,修改元素的属性不会自动更新堆的顺序 @@ -161,7 +183,7 @@ public class eBUG { tri.next.markDeleted(); // O(1) 这个点标记为废掉,前后关联都砍断,但是不remove因为那太耗时,只有poll到它就跳过就可以 Triangle newNext = new Triangle(tri.next); // deep copy and inherit connection -// tri.next = newNext; // replace TODO can omit, because already done by new Triangle(tri.prev) +// tri.next = newNext; // omit, because already done by new Triangle(tri.prev) if (tri.prev != null) { tri.prev.next = tri.next; // ATTENTION!!!: 这里的tri.next已经被换掉!所以之前的要重新赋值! @@ -171,27 +193,41 @@ public class eBUG { tri.next.prev = tri.prev; // 注意此时tri.prev已经是替代后的节点,tri.next也是,从而被标记为废点的前后关联真正砍断 tri.next.indices[0] = tri.indices[0]; - // TODO e parameter + // e parameter List<Point> pointsForSig = findEliminated(lineToSimplify, recentEliminated, lineToSimplify.get(tri.next.indices[0]), lineToSimplify.get(tri.next.indices[1]), - lineToSimplify.get(tri.next.indices[2])); - System.out.println("for updating Point on the right " + lineToSimplify.get(tri.next.indices[1])); - for (Point point : pointsForSig) { - System.out.println(point); + lineToSimplify.get(tri.next.indices[2])); // TODO complexity + if (debug) { + System.out.println("(2) updating point on the right " + lineToSimplify.get(tri.next.indices[1])); + for (Point point : pointsForSig) { + System.out.println("\t" + point); + } + } + List<Point> baseLine = new ArrayList<>(); + baseLine.add(pointsForSig.get(0)); + baseLine.add(pointsForSig.get(pointsForSig.size() - 1)); // 直接连接左右两边最近的未被淘汰的点 + double sig = total_areal_displacement(pointsForSig, baseLine, false); + tri.next.area = sig; + + if (debug) { + System.out.println("sig=" + sig); + double tmpTri = triArea(lineToSimplify.get(tri.next.indices[0]), + lineToSimplify.get(tri.next.indices[1]), + lineToSimplify.get(tri.next.indices[2])); + System.out.println("\t" + "tri=" + tmpTri + ", " + ((tmpTri > sig) ? "over-estimated" : "equal/less-estimated")); } - - tri.next.area = triArea(lineToSimplify.get(tri.next.indices[0]), - lineToSimplify.get(tri.next.indices[1]), - lineToSimplify.get(tri.next.indices[2])); // 重新加入堆 // 在 Java 的 PriorityQueue 中,修改元素的属性不会自动更新堆的顺序 // 所以必须通过add 来显式重新插入修改后的元素 triangleHeap.add(tri.next); // 注意加入的是一个新的对象isDeleted=false } - System.out.println(">>>"); + if (debug) { + System.out.println(">>>bottom-up, remaining " + triangleHeap.size() + " triangles (including those marked for removal)"); + } } + return results; // 注意这就是lineToSimplify.getVertices() } public static void main(String[] args) { @@ -228,11 +264,11 @@ public class eBUG { } System.out.println("---------------------------------"); - List<Point> results = new ArrayList<>(); +// List<Point> results = new ArrayList<>(); // 计算运行时间 - int eParam = 3; + int eParam = 1; long startTime = System.currentTimeMillis(); - buildEffectiveArea(polyline, results, eParam); + List<Point> results = buildEffectiveArea(polyline, eParam, false); // 输出结果 long endTime = System.currentTimeMillis(); System.out.println("Time taken to reduce points: " + (endTime - startTime) + "ms");
