edgesRoute = parse.getEdgesRoute();
+ // 我们在这里打印其中的每个线路的信息 TODO 我们将通过线路中的数据从映射表中取出详细数据
+ /*
+ * nodes映射表中的数据
+ * +----------+------------+
+ * | key | value |
+ * +----------+------------+
+ * | (-10,2) | zhao |
+ * | (20,20) | TY |
+ * +----------+------------+
+ *
+ *
+ * edges映射表中的数据
+ * +----------------------------------+------------------------------------+
+ * | key | value |
+ * +----------------------------------+------------------------------------+
+ * | (-10,2)(-10,2) -> (20,20)(20,20) | series [(-10,2), (20,20), 前任] |
+ * +----------------------------------+------------------- ----------------+
+ * */
+ edgesRoute.forEach(edge -> {
+ // 通过坐标名称 从节点映射表中 获取到起始节点与终止节点的数据Series
+ final Graph.GraphNodeSeries start = nodes.get(edge.getStartingCoordinateName());
+ final Graph.GraphNodeSeries end = nodes.get(edge.getEndPointCoordinateName());
+ System.out.println(
+ "当前线路:" + edge + '\n' +
+ "起始点:" + edge.getStartingCoordinate() +
+ // 由于上面构建节点Series的时候 第一个是坐标 第二个是名字 第三个是age
+ // 所以在这里也是相同的格式
+ "\t名称:" + start.getCell(1).getValue() + '\n' +
+ "终止点:" + edge.getEndPointCoordinate() + "\t名称:" + end.getCell(1) + '\n' +
+ "两个点之间的关系: " + edges.get(edge.toString())
+ );
+ });
+ }
+}
+```
+
+* In the construction of Series classes for the Graphx series, if the configuration items are all strings, we can avoid
+ explicitly specifying the "Cell" cell construction, which makes the construction operation more concise.
+
+```java
+package zhao.algorithmMagic;
+
+import zhao.algorithmMagic.operands.coordinate.IntegerCoordinateTwo;
+import zhao.algorithmMagic.operands.coordinateNet.Graph;
+
+public class MAIN1 {
+ public static void main(String[] args) {
+ // 首先创建出两个节点的坐标
+ final IntegerCoordinateTwo c1 = new IntegerCoordinateTwo(-10, 2), c2 = new IntegerCoordinateTwo(20, 20);
+ // 然后创建图对象
+ final Graph parse = Graph.create(
+ // 创建两个节点数据的表 TODO 在这里使用的是字符串,因此不需要使用 Cell 类的构造包装。
+ Graph.GraphNodeDF.create(
+ Graph.GraphNodeSeries.create(c1, "zhao", "20"),
+ Graph.GraphNodeSeries.create(c2, "TY", "22")
+ ),
+ // 创建出两个节点之间的边 TODO 在这里使用的是字符串,因此不需要使用 Cell 类的构造包装。
+ Graph.GraphEdgeDF.create(
+ // C1 <- 前任 -> C2 代表 C1的前任是C2 C2的前任是C1
+ Graph.GraphEdgeSeries.create(c1, c2, "前任")
+ )
+ );
+ }
+}
+```
+
+* 针对 DataFrame 以及其有关的模块,在此次更新中,将使用统一的序列化版本号来实现序列化操作数对象在不同版本的AS库被重复解析和读取的能力,拓展灵活性。
+
+```java
+package zhao.algorithmMagic;
+
+import zhao.algorithmMagic.algorithm.OperationAlgorithmManager;
+import zhao.algorithmMagic.operands.table.DataFrame;
+import zhao.algorithmMagic.operands.table.FDataFrame;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+public class MAIN1 {
+ public static void main(String[] args) throws IOException, ClassNotFoundException {
+ System.out.println(OperationAlgorithmManager.VERSION);
+ final ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("path"));
+ final DataFrame sfDataFrame = (FDataFrame) objectInputStream.readObject();
+ sfDataFrame.show();
+ }
+}
+```
+
+### Version update date : xx xx-xx-xx
\ No newline at end of file
diff --git a/src_code/pom.xml b/src_code/pom.xml
index 4beb0c1..51080a9 100644
--- a/src_code/pom.xml
+++ b/src_code/pom.xml
@@ -5,7 +5,7 @@
io.github.BeardedManZhao
algorithmStar
- 1.24
+ 1.25
jar
algorithmStar
algorithmStar-java
diff --git a/src_code/src/main/java/zhao/algorithmMagic/MAIN1.java b/src_code/src/main/java/zhao/algorithmMagic/MAIN1.java
index 761e70b..b174181 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/MAIN1.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/MAIN1.java
@@ -4,9 +4,10 @@
import zhao.algorithmMagic.core.ASDynamicLibrary;
import java.io.File;
+import java.io.IOException;
public class MAIN1 {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IOException, ClassNotFoundException {
System.out.println(OperationAlgorithmManager.VERSION);
if (args.length > 0) {
ASDynamicLibrary.addDllDir(new File(args[0]));
diff --git a/src_code/src/main/java/zhao/algorithmMagic/SerialVersionUID.java b/src_code/src/main/java/zhao/algorithmMagic/SerialVersionUID.java
new file mode 100644
index 0000000..9ad1e6a
--- /dev/null
+++ b/src_code/src/main/java/zhao/algorithmMagic/SerialVersionUID.java
@@ -0,0 +1,112 @@
+package zhao.algorithmMagic;
+
+/**
+ * 序列化ID编号枚举类,从 1.25 版本开始实现统一序列化ID,实现跨版本序列化数据传输。
+ *
+ * Serializing ID number enumeration classes, gradually implementing unified serialization of IDs starting from version 1.25, and achieving cross version serialization data transmission.
+ */
+public enum SerialVersionUID {
+
+ FINAL_DATA_FRAME {
+ @Override
+ public long getNum() {
+ return -4920746365198459100L;
+ }
+ },
+ SINGLETON_FINAL_DATA_FRAME {
+ @Override
+ public long getNum() {
+ return FINAL_DATA_FRAME.getNum() + SUBCLASS_CAPACITY;
+ }
+ },
+ GraphNodeDF {
+ /**
+ * @return 唯一的统一的序列号。
+ */
+ @Override
+ public long getNum() {
+ return FINAL_DATA_FRAME.getNum() + (SUBCLASS_CAPACITY << 1);
+ }
+ },
+ GraphEdgeDF {
+ /**
+ * @return 唯一的统一的序列号。
+ */
+ @Override
+ public long getNum() {
+ return 0;
+ }
+ },
+ FINAL_SERIES {
+ @Override
+ public long getNum() {
+ return 1846247159227732521L;
+ }
+ },
+ SINGLETON_SERIES {
+ @Override
+ public long getNum() {
+ return 2846247159227764522L;
+ }
+ },
+ GRAPH_NODE_SERIES {
+ /**
+ * @return 唯一的统一的序列号。
+ */
+ @Override
+ public long getNum() {
+ return SINGLETON_SERIES.getNum() + SUBCLASS_CAPACITY;
+ }
+ },
+ GRAPH_EDGE_SERIES {
+ /**
+ * @return 唯一的统一的序列号。
+ */
+ @Override
+ public long getNum() {
+ return SINGLETON_SERIES.getNum() + (SUBCLASS_CAPACITY << 1);
+ }
+ },
+ FINAL_CELL {
+ @Override
+ public long getNum() {
+ return -5865157582568079765L;
+ }
+ },
+ SINGLETON_CELL {
+ @Override
+ public long getNum() {
+ return FINAL_CELL.getNum() + SUBCLASS_CAPACITY;
+ }
+ },
+ FieldCell {
+ /**
+ * @return 唯一的统一的序列号。
+ */
+ @Override
+ public long getNum() {
+ return SINGLETON_CELL.getNum() + (SUBCLASS_CAPACITY << 1);
+ }
+ },
+ GRAPH {
+ @Override
+ public long getNum() {
+ return -1010101010101010101L;
+ }
+ },
+ ;
+
+ /**
+ * 每个子类会分配到指定此数量的名额,在序列号的规则中,
+ * 假设 A 是 B C D 三个类的父类
+ * 子类B的序列号 = 父类A + 此数值 × 1
+ * 子类C的序列号 = 父类A + 此数值 × 2
+ * 子类D的序列号 = 父类A + 此数值 × 4
+ */
+ private final static int SUBCLASS_CAPACITY = 100;
+
+ /**
+ * @return 唯一的统一的序列号。
+ */
+ public abstract long getNum();
+}
diff --git a/src_code/src/main/java/zhao/algorithmMagic/algorithm/OperationAlgorithmManager.java b/src_code/src/main/java/zhao/algorithmMagic/algorithm/OperationAlgorithmManager.java
index eb61e60..86cf186 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/algorithm/OperationAlgorithmManager.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/algorithm/OperationAlgorithmManager.java
@@ -21,7 +21,7 @@ public final class OperationAlgorithmManager implements OperationAlgorithm {
/**
* AS version
*/
- public final static float VERSION = 1.23f;
+ public final static float VERSION = 1.25f;
/**
* 计算组件的日志打印开关,当此处值为false的时候,计算组件中的日志将不会被打印,logger也不会被调用,一般来说,这里为了减少冗余的字符串实例化操作,会设置为false,当需要调试的时候才需要打开此处的数值。
diff --git a/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/DecisionTree.java b/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/DecisionTree.java
index 7441880..69233cc 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/DecisionTree.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/DecisionTree.java
@@ -69,7 +69,7 @@ public static DecisionTree getInstance(String Name) {
* In the decision scheme list, each element is an event filter, which represents the filtering channel between nodes. In the flow chart, the return value of the filter toString will be used as the channel name!
* @return 执行结果,是数据过滤的操作过程,其是一个Markdown流程图代码的字符串,您可以将其以 Markdown 语法解析出流程图!
*
- * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can parse it out of the flowchart with Markdown syntax!
+ * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can create it out of the flowchart with Markdown syntax!
*/
public static String executeGetString(int[][] ints, ArrayList arrayList) {
return executeGetString(ints, arrayList, false, false);
@@ -95,7 +95,7 @@ public static String executeGetString(int[][] ints, ArrayList
- * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can parse it out of the flowchart with Markdown syntax!
+ * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can create it out of the flowchart with Markdown syntax!
*/
public static String executeGetString(int[][] ints, ArrayList arrayList, boolean isLR, boolean isDetailed) {
StringBuilder stringBuilder = new StringBuilder(Math.max(10 + (arrayList.size() << 4), 100));
@@ -211,7 +211,7 @@ private static void initializeBuffer(StringBuilder stringBuilder2, String filter
* In the decision scheme list, each element is an event filter, which represents the filtering channel between nodes. In the flow chart, the return value of the filter toString will be used as the channel name!
* @return 执行结果,是数据过滤的操作过程,其是一个Markdown流程图代码的字符串,您可以将其以 Markdown 语法解析出流程图!
*
- * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can parse it out of the flowchart with Markdown syntax!
+ * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can create it out of the flowchart with Markdown syntax!
*/
public static String executeGetString(double[][] doubles, ArrayList arrayList) {
return executeGetString(doubles, arrayList, false, false);
@@ -237,7 +237,7 @@ public static String executeGetString(double[][] doubles, ArrayList
- * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can parse it out of the flowchart with Markdown syntax!
+ * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can create it out of the flowchart with Markdown syntax!
*/
public static String executeGetString(double[][] doubles, ArrayList arrayList, boolean isLR, boolean isDetailed) {
StringBuilder stringBuilder = new StringBuilder(Math.max(10 + (arrayList.size() << 4), 100));
diff --git a/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/RandomForest.java b/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/RandomForest.java
index 0beaba0..f0e2b43 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/RandomForest.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/algorithm/schemeAlgorithm/RandomForest.java
@@ -88,7 +88,7 @@ public static RandomForest getInstance(String Name) {
* How many pieces of data do you want each decision tree to process.
* @return 执行结果,是数据过滤的操作过程,其是一个Markdown流程图代码的字符串,您可以将其以 Markdown 语法解析出流程图!
*
- * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can parse it out of the flowchart with Markdown syntax!
+ * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can create it out of the flowchart with Markdown syntax!
*/
public static String executeGetString(int[][] ints, ArrayList arrayList, boolean isLR, boolean isDetailed, int seed, int layer, int rowOfLayer) {
// 对每一个矩阵使用决策树计算,最终将所有的树合并到一个根节点
@@ -132,7 +132,7 @@ public static String executeGetString(int[][] ints, ArrayList
- * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can parse it out of the flowchart with Markdown syntax!
+ * The execution result is the operation process of data filtering. It is a string of Markdown flowchart code. You can create it out of the flowchart with Markdown syntax!
*/
public static String executeGetString(double[][] doubles, ArrayList arrayList, boolean isLR, boolean isDetailed, int seed, int layer, int rowOfLayer) {
// 对每一个矩阵使用决策树计算,最终将所有的树合并到一个根节点
diff --git a/src_code/src/main/java/zhao/algorithmMagic/exception/CheckException.java b/src_code/src/main/java/zhao/algorithmMagic/exception/CheckException.java
new file mode 100644
index 0000000..6dfcd4c
--- /dev/null
+++ b/src_code/src/main/java/zhao/algorithmMagic/exception/CheckException.java
@@ -0,0 +1,15 @@
+package zhao.algorithmMagic.exception;
+
+/**
+ * 当检查函数中发生检查出来的错误的时候会抛出此异常。
+ *
+ * This exception is thrown when an error is detected in the check function.
+ *
+ * @author zhao
+ */
+public class CheckException extends AlgorithmMagicException {
+
+ public CheckException(String message) {
+ super(message);
+ }
+}
diff --git a/src_code/src/main/java/zhao/algorithmMagic/io/OutputSparkDF.scala b/src_code/src/main/java/zhao/algorithmMagic/io/OutputSparkDF.scala
index 8aa3a5f..20ad666 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/io/OutputSparkDF.scala
+++ b/src_code/src/main/java/zhao/algorithmMagic/io/OutputSparkDF.scala
@@ -1,7 +1,7 @@
package zhao.algorithmMagic.io
-import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{DoubleType, StringType, StructField, StructType}
+import org.apache.spark.sql.{Row, SparkSession}
import zhao.algorithmMagic.exception.OperatorOperationException
import zhao.algorithmMagic.operands.matrix.{ColorMatrix, ColumnDoubleMatrix, ColumnIntegerMatrix}
import zhao.algorithmMagic.operands.table.DataFrame
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/Graph.java b/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/Graph.java
new file mode 100644
index 0000000..bac175e
--- /dev/null
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/Graph.java
@@ -0,0 +1,346 @@
+package zhao.algorithmMagic.operands.coordinateNet;
+
+import zhao.algorithmMagic.SerialVersionUID;
+import zhao.algorithmMagic.operands.coordinate.IntegerCoordinateTwo;
+import zhao.algorithmMagic.operands.route.IntegerConsanguinityRoute2D;
+import zhao.algorithmMagic.operands.table.*;
+import zhao.algorithmMagic.utils.ASClass;
+
+import java.util.*;
+
+/**
+ * 图对象,在这里包含很多的数据,其中的数据以图的形式存在。
+ *
+ * The graph object contains a lot of data here, and the data exists in the form of a graph.
+ *
+ * @author zhao
+ */
+public class Graph extends IntegerRoute2DNet {
+
+ private static final long serialVersionUID = SerialVersionUID.GRAPH.getNum(); // 自定义序列化版本号
+
+ /**
+ * 节点映射表
+ */
+ private final HashMap nodes_hashMap = new HashMap<>();
+
+ /**
+ * 边数据映射表
+ */
+ private final HashMap edges_hashMap;
+
+ /**
+ * 构造出来一张线路网
+ *
+ * construct a network of lines
+ *
+ * @param nodeIter 这张网中所有的节点Series 组成的迭代器。
+ * @param edge 这张网中的所有线路
+ *
+ * All lines in this net
+ * @param edges_hashMap 这张网中要保存的边数据映射表。
+ */
+ protected Graph(Iterator nodeIter, Collection edge, HashMap edges_hashMap) {
+ super(edge);
+ // 在这里迭代每一个节点数据并构建节点映射表
+ while (nodeIter.hasNext()) {
+ final GraphNodeSeries next = nodeIter.next();
+ nodes_hashMap.put(next.coordinate_0.toString(), next);
+ }
+ this.edges_hashMap = edges_hashMap;
+ }
+
+ /**
+ * 通过指定的节点表 以及 边表来构造出一个图对象。
+ *
+ * @param nodeIter 节点表中的数据 其应包含每个节点的坐标 以及其对应的更多信息
+ * @param edgeIter 边表中的数据 其应该包含每个节点与节点之间的边的数据。
+ * @return 图对象
+ */
+ public static Graph create(GraphNodeDF nodeIter, GraphEdgeDF edgeIter) {
+ return Graph.create(
+ nodeIter.iterator(),
+ edgeIter.iterator()
+ );
+ }
+
+ /**
+ * 通过指定的节点表 以及 边表来构造出一个图对象。
+ * 需要注意的是 这里的迭代器中的每一个元素都应该是 GraphNodeSeries 以及 GraphEdgeSeries。
+ *
+ * @param nodeIter 节点表中的数据 其应包含每个节点的坐标 以及其对应的更多信息
+ * @param edgeIter 边表中的数据 其应该包含每个节点与节点之间的边的数据。
+ * @return 图对象
+ */
+ public static Graph create(Iterator nodeIter, Iterator edgeIter) {
+ List queue = new LinkedList<>();
+ HashMap edges_hashMap = new HashMap<>();
+ // 在这里迭代每一个边数据并构建边容器
+ while (edgeIter.hasNext()) {
+ final Series next = edgeIter.next();
+ final IntegerCoordinateTwo cell1;
+ final IntegerCoordinateTwo cell2;
+ cell1 = (IntegerCoordinateTwo) next.getCell(0).getValue();
+ cell2 = (IntegerCoordinateTwo) next.getCell(1).getValue();
+ final IntegerConsanguinityRoute2D parse = IntegerConsanguinityRoute2D.parse(
+ cell1.toString() + " -> " + cell2.toString(),
+ cell1, cell2);
+ queue.add(parse);
+ edges_hashMap.put(parse.toString(), (GraphEdgeSeries) next);
+ }
+ return new Graph(ASClass.transform(nodeIter), queue, edges_hashMap);
+ }
+
+ /**
+ * @return 当前图中已经包含的所有节点对象数据。
+ *
+ * All node object data already included in the current graph.
+ */
+ public HashMap getNodes() {
+ return ASClass.transform(this.nodes_hashMap.clone());
+ }
+
+ /**
+ * @return 当前图中已经包含的所有边对象数据。
+ *
+ * All edge object data already included in the current graph.
+ */
+ public HashMap getEdges() {
+ return ASClass.transform(this.edges_hashMap.clone());
+ }
+
+ /**
+ * @return 当前图中已经包含的所有边对象数据,值得注意的是这里返回的集合中的每一个元素就是一个线路对象,其中的起始与终止坐标点就是代表的边的两个端点。
+ *
+ * All edge object data already included in the current graph is worth noting that each element in the set returned here is a line object, where the starting and ending coordinate points represent the two endpoints of the edge.
+ */
+ public Collection getEdgesRoute() {
+ return super.getNetDataSet();
+ }
+
+ /**
+ * 图中的节点数据对象,其中包含的数据专用于图对象操作,该类专用于图对象数据存储功能
+ *
+ * Graph data objects, which contain data dedicated to graph object operations and are dedicated to graph object data storage functions
+ */
+ public static class GraphNodeSeries extends SingletonSeries {
+ private static final long serialVersionUID = SerialVersionUID.GRAPH_NODE_SERIES.getNum(); // 自定义序列化版本号
+ IntegerCoordinateTwo coordinate_0;
+
+ /**
+ * @param coordinateTwoCell 当前节点数据行中的坐标。
+ *
+ * The coordinates in the current node data row.
+ * @param cells 当前节点数据行中的所有数据配置。
+ *
+ * All data configurations in the current node data row.
+ */
+ protected GraphNodeSeries(IntegerCoordinateTwo coordinateTwoCell, Cell>... cells) {
+ super(
+ ASClass.mergeArray(
+ new Cell[cells.length + 1],
+ new FinalCell<>(coordinateTwoCell), cells
+ )
+ );
+ this.coordinate_0 = coordinateTwoCell;
+ }
+
+ /**
+ * @param cells 当前节点数据行中的所有数据配置。
+ *
+ * All data configurations in the current node data row.
+ */
+ protected GraphNodeSeries(Cell>... cells) {
+ super(ASClass.check(cells, kv -> {
+ final Cell>[] key = kv.getKey();
+ final StringBuilder sb = kv.getValue();
+ if (key.length >= 1) {
+ return true;
+ } else {
+ sb.append("您提供的数据格式有错误,请按照如下格式来进行参数传递。\nThe data format you provided is incorrect. Please pass the parameters in the following format.\n" +
+ "\tformat => [GraphEdgeSeries(IntegerCoordinateTwo, property1, property2, ......)]");
+ return false;
+ }
+ }));
+ this.coordinate_0 = (IntegerCoordinateTwo) cells[0].getValue();
+ }
+
+ /**
+ * 创建出一个节点数据行。
+ *
+ * @param coordinateTwoCell 当前节点在图中的坐标。
+ * @param cells 当前节点对应的其它属性数据。
+ * @return 一个节点对应的数据行 其中第一个单元格是节点的坐标。
+ */
+ public static GraphNodeSeries create(IntegerCoordinateTwo coordinateTwoCell, Cell>... cells) {
+ return new GraphNodeSeries(coordinateTwoCell, cells);
+ }
+
+ /**
+ * 创建出一个节点数据行。
+ *
+ * @param coordinateTwoCell 当前节点在图中的坐标。
+ * @param cells 当前节点对应的其它属性数据。
+ * @return 一个节点对应的数据行 其中第一个单元格是节点的坐标。
+ */
+ public static GraphNodeSeries create(IntegerCoordinateTwo coordinateTwoCell, String... cells) {
+ final ArrayList| > objects = new ArrayList<>(cells.length + 2);
+ objects.add(SingletonCell.$(coordinateTwoCell));
+ for (String cell : cells) {
+ objects.add(SingletonCell.$_String(cell));
+ }
+ return new GraphNodeSeries(objects.toArray(new Cell>[0]));
+ }
+ }
+
+ /**
+ * 图中的边数据对象,其中包含的数据专用于图对象操作,该类专用于图对象数据存储功能
+ *
+ * Graph data objects, which contain data dedicated to graph object operations and are dedicated to graph object data storage functions
+ */
+ public final static class GraphEdgeSeries extends SingletonSeries {
+ private static final long serialVersionUID = SerialVersionUID.GRAPH_EDGE_SERIES.getNum(); // 自定义序列化版本号
+ IntegerCoordinateTwo coordinate_0, coordinate_1;
+
+ /**
+ * @param start 当前边中的起始端点对象。
+ *
+ * The starting endpoint object in the current edge.
+ * @param End 当前边中的终止端点对象。
+ *
+ * The terminating endpoint object in the current edge.
+ * @param cells 当前节点数据行中的所有数据配置。
+ *
+ * All data configurations in the current node data row.
+ */
+ private GraphEdgeSeries(IntegerCoordinateTwo start, IntegerCoordinateTwo End, Cell>... cells) {
+ super(
+ ASClass.mergeArray(
+ new Cell[cells.length + 2],
+ new FinalCell[]{new FinalCell<>(start),
+ new FinalCell<>(End)},
+ cells
+ )
+ );
+ this.coordinate_0 = start;
+ this.coordinate_1 = End;
+ }
+
+ /**
+ * @param cells 当前节点数据行中的所有数据配置。
+ *
+ * All data configurations in the current node data row.
+ */
+ private GraphEdgeSeries(Cell>... cells) {
+ super(ASClass.check(cells, kv -> {
+ final Cell>[] key = kv.getKey();
+ final StringBuilder sb = kv.getValue();
+ if (key.length >= 2) {
+ return true;
+ } else {
+ sb.append("您提供的数据格式有错误,请按照如下格式来进行参数传递。\nThe data format you provided is incorrect. Please pass the parameters in the following format.\n" +
+ "\tformat => [GraphEdgeSeries(start, end, property1, property2, ......)]");
+ return false;
+ }
+ }));
+ this.coordinate_0 = (IntegerCoordinateTwo) cells[0].getValue();
+ this.coordinate_0 = (IntegerCoordinateTwo) cells[1].getValue();
+ }
+
+ /**
+ * 创建出一个节点数据行。
+ *
+ * @param start 当前边起始端点在图中的坐标。
+ * @param End 当前边结束端点在图中的坐标。
+ * @param cells 当前节点对应的其它属性数据。
+ * @return 一个边对应的数据行 其中第一和二个单元格是边的两个端点的坐标。
+ */
+ public static GraphEdgeSeries create(IntegerCoordinateTwo start, IntegerCoordinateTwo End, Cell>... cells) {
+ return new GraphEdgeSeries(start, End, cells);
+ }
+
+ /**
+ * 创建出一个节点数据行。
+ *
+ * @param start 当前边起始端点在图中的坐标。
+ * @param End 当前边结束端点在图中的坐标。
+ * @param cells 当前节点对应的其它属性数据。
+ * @return 一个节点对应的数据行 其中第一个单元格是节点的坐标。
+ */
+ public static GraphEdgeSeries create(IntegerCoordinateTwo start, IntegerCoordinateTwo End, String... cells) {
+ final ArrayList| > objects = new ArrayList<>(cells.length + 4);
+ objects.add(SingletonCell.$(start));
+ objects.add(SingletonCell.$(End));
+ for (String cell : cells) {
+ objects.add(SingletonCell.$_String(cell));
+ }
+ return new GraphEdgeSeries(objects.toArray(new Cell>[0]));
+ }
+ }
+
+ /**
+ * 图中的节点表数据对象
+ */
+ public static class GraphNodeDF extends FDataFrame {
+
+ private static final long serialVersionUID = SerialVersionUID.SINGLETON_SERIES.getNum(); // 自定义序列化版本号
+
+
+ private final static SingletonSeries COL_1 = SingletonSeries.parse(
+ "Coordinate", "Data(Series)"
+ );
+
+ /**
+ * @param colNameRow 当前 DF 对象中的列名行。
+ * @param primaryIndex 当前 DF 对象中的主键索引数值。
+ * @param arrayList 当前 DF 对象中的数据行。
+ */
+ protected GraphNodeDF(Series colNameRow, int primaryIndex, ArrayList arrayList) {
+ super(colNameRow, primaryIndex, arrayList);
+ }
+
+ /**
+ * 构建出来一个节点表数据对象
+ *
+ * @param graphNodeSeries 所有的节点数据行
+ * @return 节点表数据对象
+ */
+ public static GraphNodeDF create(GraphNodeSeries... graphNodeSeries) {
+ return new GraphNodeDF(
+ COL_1, 0, new ArrayList<>(Arrays.asList(graphNodeSeries))
+ );
+ }
+
+ }
+
+ /**
+ * 图中的边表数据对象
+ */
+ public final static class GraphEdgeDF extends GraphNodeDF {
+
+ private final static SingletonSeries COL_2 = SingletonSeries.parse(
+ "Coordinate(Start)", "Coordinate(End)", "Data(Series)"
+ );
+
+ /**
+ * @param colNameRow 当前 DF 对象中的列名行。
+ * @param primaryIndex 当前 DF 对象中的主键索引数值。
+ * @param arrayList 当前 DF 对象中的数据行。
+ */
+ private GraphEdgeDF(Series colNameRow, int primaryIndex, ArrayList arrayList) {
+ super(colNameRow, primaryIndex, arrayList);
+ }
+
+ /**
+ * 构建出来一个边表数据对象
+ *
+ * @param graphEdgeSeries 所有的边数据行
+ * @return 边表数据对象
+ */
+ public static GraphEdgeDF create(GraphEdgeSeries... graphEdgeSeries) {
+ return new GraphEdgeDF(
+ COL_2, 0, new ArrayList<>(Arrays.asList(graphEdgeSeries))
+ );
+ }
+ }
+}
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/IntegerRoute2DNet.java b/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/IntegerRoute2DNet.java
index 2fe0089..fd7d8ec 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/IntegerRoute2DNet.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/IntegerRoute2DNet.java
@@ -37,13 +37,13 @@ public class IntegerRoute2DNet implements RouteNet
* All lines in this net
*/
- private IntegerRoute2DNet(Collection route2DCollection) {
+ protected IntegerRoute2DNet(Collection route2DCollection) {
for (IntegerConsanguinityRoute2D integerConsanguinityRoute2D : route2DCollection) {
addRoute(integerConsanguinityRoute2D);
}
}
- private IntegerRoute2DNet(Map map) {
+ protected IntegerRoute2DNet(Map map) {
this.integerConsanguinityRoute2DHashMap.putAll(map);
}
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/RouteNet.java b/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/RouteNet.java
index a566550..2e7a1a3 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/RouteNet.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/coordinateNet/RouteNet.java
@@ -3,7 +3,6 @@
import zhao.algorithmMagic.operands.Operands;
import zhao.algorithmMagic.operands.coordinate.Coordinate;
-import javax.ws.rs.NotSupportedException;
import java.io.Serializable;
import java.util.HashSet;
@@ -22,7 +21,7 @@
public interface RouteNet, RouteType extends zhao.algorithmMagic.operands.route.Route>
extends Operands>, Serializable {
- RuntimeException NOT_SUP = new NotSupportedException("针对线路网络操作数数据类型,不支持多功能计算操作。\nMultifunctional calculation operations are not supported for line network operand data types.");
+ RuntimeException NOT_SUP = new UnsupportedOperationException("针对线路网络操作数数据类型,不支持多功能计算操作。\nMultifunctional calculation operations are not supported for line network operand data types.");
/**
* 判断一条线路是否存在于线路网中。
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/matrix/block/SpatialPlane.java b/src_code/src/main/java/zhao/algorithmMagic/operands/matrix/block/SpatialPlane.java
index e15051a..6749267 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/matrix/block/SpatialPlane.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/matrix/block/SpatialPlane.java
@@ -122,7 +122,7 @@ public final class SpatialPlane {
res[++count] = matrix.toArrays()[0];
}
// 返回新矩阵
- return ComplexNumberMatrix.parse(res);
+ return ComplexNumberMatrix.create(res);
};
/**
@@ -137,7 +137,7 @@ public final class SpatialPlane {
res[++count] = matrix.toArrays()[matrix.getRowCount() - 1];
}
// 返回新矩阵
- return ComplexNumberMatrix.parse(res);
+ return ComplexNumberMatrix.create(res);
};
*/
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/DataFrame.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/DataFrame.java
index b307462..d176f3f 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/DataFrame.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/DataFrame.java
@@ -21,6 +21,15 @@
*/
public interface DataFrame extends AggDataFrameData, Iterable, Serializable, Operands {
+ /**
+ * 刷新字段数据索引hash表,索引重构操作会有一定的性能消耗,一般情况下,会自动更新索引,若非必要请勿调用。
+ *
+ * Refreshing the field data index hash table will incur some performance consumption during index reconstruction operations. Generally, the index will be automatically updated. Do not call it unless necessary.
+ *
+ * @param rr 如果要刷新行索引则设置为 true
+ * @param rc 如果要刷新列索引则设置为 true
+ * @return 链式调用对象。
+ */
FDataFrame refreshField(boolean rr, boolean rc);
/**
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FDataFrame.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FDataFrame.java
index dcf2874..28b4e82 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FDataFrame.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FDataFrame.java
@@ -1,5 +1,6 @@
package zhao.algorithmMagic.operands.table;
+import zhao.algorithmMagic.SerialVersionUID;
import zhao.algorithmMagic.exception.OperatorOperationException;
import zhao.algorithmMagic.io.InputComponent;
import zhao.algorithmMagic.io.OutputComponent;
@@ -27,6 +28,8 @@
*/
public class FDataFrame implements DataFrame {
+ private static final long serialVersionUID = SerialVersionUID.FINAL_DATA_FRAME.getNum(); // 自定义序列化版本号
+
protected final List list;
protected final Series colNameRow;
protected final int primaryIndex;
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FieldCell.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FieldCell.java
index 6c34173..43d918a 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FieldCell.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FieldCell.java
@@ -1,5 +1,7 @@
package zhao.algorithmMagic.operands.table;
+import zhao.algorithmMagic.SerialVersionUID;
+
import java.util.HashMap;
/**
@@ -12,6 +14,7 @@
public class FieldCell extends FinalCell {
protected final static HashMap ASName = new HashMap<>();
+ private static final long serialVersionUID = SerialVersionUID.FieldCell.getNum(); // 自定义序列化版本号
private String AS;
/**
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalCell.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalCell.java
index 8c78f6d..eeccab7 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalCell.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalCell.java
@@ -1,5 +1,6 @@
package zhao.algorithmMagic.operands.table;
+import zhao.algorithmMagic.SerialVersionUID;
import zhao.algorithmMagic.exception.OperatorOperationException;
import zhao.algorithmMagic.utils.ASStr;
@@ -18,6 +19,7 @@
*/
public class FinalCell implements Cell {
+ private static final long serialVersionUID = SerialVersionUID.FINAL_CELL.getNum(); // 自定义序列化版本号
final valueType valueType;
final boolean isNumber;
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalSeries.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalSeries.java
index 805f19c..bf15e46 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalSeries.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/FinalSeries.java
@@ -1,5 +1,6 @@
package zhao.algorithmMagic.operands.table;
+import zhao.algorithmMagic.SerialVersionUID;
import zhao.algorithmMagic.exception.OperatorOperationException;
import zhao.algorithmMagic.utils.ASClass;
import zhao.algorithmMagic.utils.ASMath;
@@ -22,6 +23,9 @@
* 2023/3/7 22:01
*/
public class FinalSeries implements Series {
+
+ private static final long serialVersionUID = SerialVersionUID.FINAL_SERIES.getNum(); // 自定义序列化版本号
+
private final Cell>[] cells;
private final Cell length;
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/SFDataFrame.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/SFDataFrame.java
index 7ce95e8..e127303 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/SFDataFrame.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/SFDataFrame.java
@@ -1,5 +1,6 @@
package zhao.algorithmMagic.operands.table;
+import zhao.algorithmMagic.SerialVersionUID;
import zhao.algorithmMagic.exception.OperatorOperationException;
import zhao.algorithmMagic.io.InputComponent;
import zhao.algorithmMagic.utils.ASIO;
@@ -20,6 +21,9 @@
*/
public class SFDataFrame extends FDataFrame {
+ private static final long serialVersionUID = SerialVersionUID.SINGLETON_SERIES.getNum(); // 自定义序列化版本号
+
+
public SFDataFrame(Series colNameRow, int primaryIndex, ArrayList arrayList, HashMap rowHashMap, HashMap colHashMap) {
super(colNameRow, primaryIndex, arrayList, rowHashMap, colHashMap);
}
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonCell.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonCell.java
index 47e33ff..6e394ef 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonCell.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonCell.java
@@ -1,5 +1,6 @@
package zhao.algorithmMagic.operands.table;
+import zhao.algorithmMagic.SerialVersionUID;
import zhao.algorithmMagic.utils.ASClass;
import java.util.HashMap;
@@ -14,6 +15,8 @@
*/
public final class SingletonCell extends FinalCell {
+ private static final long serialVersionUID = SerialVersionUID.SINGLETON_CELL.getNum(); // 自定义序列化版本号
+
/**
* 单例哈希维护
*/
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonSeries.java b/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonSeries.java
index 00a0dd6..bb35c5d 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonSeries.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/table/SingletonSeries.java
@@ -1,5 +1,6 @@
package zhao.algorithmMagic.operands.table;
+import zhao.algorithmMagic.SerialVersionUID;
import zhao.algorithmMagic.exception.OperatorOperationException;
import zhao.algorithmMagic.utils.ASClass;
import zhao.algorithmMagic.utils.ASMath;
@@ -21,6 +22,10 @@
* 2023/4/12 18:15
*/
public class SingletonSeries implements Series {
+
+ private static final long serialVersionUID = SerialVersionUID.SINGLETON_SERIES.getNum(); // 自定义序列化版本号
+
+
private final Cell>[] cells;
private final Cell length;
diff --git a/src_code/src/main/java/zhao/algorithmMagic/operands/vector/SparkVector.scala b/src_code/src/main/java/zhao/algorithmMagic/operands/vector/SparkVector.scala
index 6bc5e26..6be0823 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/operands/vector/SparkVector.scala
+++ b/src_code/src/main/java/zhao/algorithmMagic/operands/vector/SparkVector.scala
@@ -137,14 +137,6 @@ final class SparkVector(sparkContext: SparkContext, vector: org.apache.spark.mll
*/
override def shuffle(seed: Long): SparkVector = SparkVector.parse(sparkContext, ASMath.shuffle(this.copyToNewArray(), seed, false))
- /**
- *
- * @return 将本对象中存储的向量序列数组拷贝到一个新数组并将新数组返回,这里返回的是一个新数组,支持修改等操作。
- *
- * Copy the vector sequence array stored in this object to a new array and return the new array. Here, a new array is returned, which supports modification and other operations.
- */
- override def copyToNewArray(): Array[Double] = vector.toArray
-
/**
* 将两个操作数进行求和的方法,具体用法请参阅API说明。
*
@@ -165,6 +157,14 @@ final class SparkVector(sparkContext: SparkContext, vector: org.apache.spark.mll
SparkVector.parse(sparkContext, doubles)
}
+ /**
+ *
+ * @return 将本对象中存储的向量序列数组拷贝到一个新数组并将新数组返回,这里返回的是一个新数组,支持修改等操作。
+ *
+ * Copy the vector sequence array stored in this object to a new array and return the new array. Here, a new array is returned, which supports modification and other operations.
+ */
+ override def copyToNewArray(): Array[Double] = vector.toArray
+
/**
* @return 向量中包含的维度数量
*
diff --git a/src_code/src/main/java/zhao/algorithmMagic/utils/ASClass.java b/src_code/src/main/java/zhao/algorithmMagic/utils/ASClass.java
index cf05459..55e4674 100644
--- a/src_code/src/main/java/zhao/algorithmMagic/utils/ASClass.java
+++ b/src_code/src/main/java/zhao/algorithmMagic/utils/ASClass.java
@@ -1,5 +1,6 @@
package zhao.algorithmMagic.utils;
+import zhao.algorithmMagic.exception.CheckException;
import zhao.algorithmMagic.exception.OperatorOperationException;
import zhao.algorithmMagic.exception.TargetNotRealizedException;
import zhao.algorithmMagic.operands.coordinate.DoubleCoordinateMany;
@@ -19,6 +20,7 @@
import zhao.algorithmMagic.operands.route.DoubleConsanguinityRoute2D;
import zhao.algorithmMagic.operands.route.IntegerConsanguinityRoute;
import zhao.algorithmMagic.operands.route.IntegerConsanguinityRoute2D;
+import zhao.algorithmMagic.utils.dataContainer.KeyValue;
import zhao.algorithmMagic.utils.transformation.Transformation;
import java.awt.*;
@@ -358,6 +360,20 @@ public static void extractedIndexMap(HashMap RowOrColIndex, Str
}
}
+ /**
+ * 将两个数组合并到同一个数组中。
+ *
+ * @param res 结果数组容器
+ * @param arr1 需要被合并的第一个元素
+ * @param arr2 需要被合并的第二个数组
+ * @param 数组中所包含的元素数据类型,此处为自动类型推断。
+ */
+ public static arr[] mergeArray(arr[] res, arr arr1, arr[] arr2) {
+ res[0] = arr1;
+ System.arraycopy(arr2, 0, res, 1, arr2.length);
+ return res;
+ }
+
/**
* 将两个数组合并到同一个数组中。
*
@@ -366,7 +382,7 @@ public static void extractedIndexMap(HashMap RowOrColIndex, Str
* @param arr2 需要被合并的第二个数组
* @param 数组中所包含的元素数据类型,此处为自动类型推断。
*/
- public static void mergeArray(arr[] res, arr[] arr1, arr[] arr2) {
+ public static arr[] mergeArray(arr[] res, arr[] arr1, arr[] arr2) {
int length1 = arr1.length;
int length2 = arr2.length;
if (length1 == length2) {
@@ -375,7 +391,7 @@ public static void mergeArray(arr[] res, arr[] arr1, arr[] arr2) {
res[i1] = arr1[i1];
res[i2] = arr2[i2c++];
}
- return;
+ return res;
}
if (length1 < length2) {
int i2 = length1, i2c = 0;
@@ -398,6 +414,7 @@ public static void mergeArray(arr[] res, arr[] arr1, arr[] arr2) {
res[i1] = arr1[i1++];
}
}
+ return res;
}
/**
@@ -748,4 +765,22 @@ public static void matToArray(boolean useCopy, DoubleMatrix[] res, DoubleMatrix
Arrays.fill(res, w_lay);
}
}
+
+ /**
+ * 检查一个对象是否满足指定的逻辑,如果不满足将会直接抛出异常。
+ *
+ * @param value 需要被检查的数据对象。
+ * @param checkFunction 检查函数。
+ * @param 被检查数据的数据类型。
+ * @return 如果检查无误在这里会返回被检查的 value 数据对象。
+ * @throws CheckException 当在检查中发现了错误的时候会抛出这个异常对象。
+ */
+ public static T check(T value, Transformation, Boolean> checkFunction) {
+ final StringBuilder errorMsg = new StringBuilder();
+ if (!checkFunction.function(new KeyValue<>(value, errorMsg))) {
+ throw new CheckException(errorMsg.toString());
+ } else {
+ return value;
+ }
+ }
}
\ No newline at end of file
diff --git a/src_code/update/1.22-1.23.md b/src_code/update/1.22-1.23.md
index 16dc169..7e12a5b 100644
--- a/src_code/update/1.22-1.23.md
+++ b/src_code/update/1.22-1.23.md
@@ -76,9 +76,9 @@ public class MAIN1 {
final File file = new File("C:\\Users\\zhao\\Desktop\\wifi.bmp");
// Parse the File object through the basic image processing library of AS. TODO sets the size here and in all grayscale parsing functions later.
ColorMatrix.parseGrayscale(file, 200, 100).show("colorMat");
- // parse the File object through the AS's hash image processing library
+ // create the File object through the AS's hash image processing library
HashColorMatrix.parseGrayscale(file, 200, 100).show("HashMat");
- // parse the File object through the image matrix processing library of the AS
+ // create the File object through the image matrix processing library of the AS
ImageMatrix.parseGrayscale(file, 200, 100).show("imageMat");
}
}
diff --git a/src_code/update/1.23-1.24-Chinese.md b/src_code/update/1.23-1.24-Chinese.md
new file mode 100644
index 0000000..baa7a5c
--- /dev/null
+++ b/src_code/update/1.23-1.24-Chinese.md
@@ -0,0 +1,14 @@
+#  算法之星-机器大脑
+
+- Switch to [English Document](https://github.com/BeardedManZhao/algorithmStar/blob/Zhao-develop/src_code/README.md)
+- knowledge base
+
+
+
+
+### 更新日志
+
+* 框架版本:1.23 - 1.24
+* 紧急修复:针对 AS图像处理库 中的show 函数生成的窗口关闭之后会退出程序的问题进行了优化和处理,使得窗口点击关闭之后不会退出程序。
+
+### Version update date : 2023-08-28
\ No newline at end of file
diff --git a/src_code/update/1.23-1.24.md b/src_code/update/1.23-1.24.md
new file mode 100644
index 0000000..71e0c9d
--- /dev/null
+++ b/src_code/update/1.23-1.24.md
@@ -0,0 +1,15 @@
+#  Algorithm Star-MachineBrain
+
+- 切换到 [中文文档](https://github.com/BeardedManZhao/algorithmStar/blob/Zhao-develop/src_code/README-Chinese.md)
+- knowledge base
+
+
+
+
+### Update log:
+
+* Framework version: 1.23 - 1.24
+* Emergency fix: Optimized and addressed the issue of the window generated by the show function in the AS image
+ processing library exiting the program after closing, so that clicking to close the window will not exit the program.
+
+### Version update date : 2023-08-28
\ No newline at end of file
| |