@antv/layout 1.0.0-alpha.0 → 1.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/types.d.ts CHANGED
@@ -1,102 +1,45 @@
1
- import type { Graph, PlainObject } from "@antv/graphlib";
2
- export interface Node extends PlainObject {
3
- id: string;
1
+ import { Graph as IGraph, Node as INode, Edge as IEdge, PlainObject } from "@antv/graphlib";
2
+ export interface NodeData extends PlainObject {
3
+ visible?: boolean;
4
+ size?: number | number[];
5
+ bboxSize?: number[];
4
6
  }
5
- export interface OutNode extends Node {
7
+ export interface OutNodeData extends NodeData {
6
8
  x: number;
7
9
  y: number;
8
- fx?: number;
9
- fy?: number;
10
- comboId?: string;
11
- layer?: number;
12
- _order?: number;
13
- layout?: boolean;
14
- size?: number | number[] | undefined;
15
- }
16
- export interface Edge {
17
- source: string;
18
- target: string;
19
- }
20
- export interface Combo {
21
- id: string;
22
- parentId?: string;
23
- x?: number;
24
- y?: number;
25
- name?: string | number;
26
- cx?: number;
27
- cy?: number;
28
- count?: number;
29
- depth?: number;
30
- children?: any[];
31
- empty?: boolean;
32
- minX?: number;
33
- maxX?: number;
34
- minY?: number;
35
- maxY?: number;
36
- size?: number;
37
- r?: number;
38
- itemType?: string;
39
- collapsed?: boolean;
40
- }
41
- export interface Model {
42
- nodes?: Node[];
43
- edges?: Edge[];
44
- combos?: Combo[];
45
- comboEdges?: Edge[];
46
- hiddenNodes?: Node[];
47
- hiddenEdges?: Edge[];
48
- hiddenCombos?: Combo[];
49
- vedges?: Edge[];
50
- }
51
- export interface OutModel extends Model {
52
- nodes?: OutNode[];
53
- }
54
- export interface Size {
55
- width: number;
56
- height: number;
57
10
  }
58
- export type IndexMap = {
59
- [key: string]: number;
60
- };
61
- export type INode = OutNode & {
62
- degree: number;
63
- size: number | PointTuple;
64
- };
65
- export type NodeMap = {
66
- [key: string]: INode;
67
- };
68
- export type Matrix = number[];
69
- export type Point = {
70
- x: number;
71
- y: number;
72
- };
11
+ export interface EdgeData extends PlainObject {
12
+ visible?: boolean;
13
+ virtual?: boolean;
14
+ }
15
+ /** input node */
16
+ export type Node = INode<NodeData>;
17
+ /** output node */
18
+ export type OutNode = INode<OutNodeData>;
19
+ /** input and output edge */
20
+ export type Edge = IEdge<EdgeData>;
73
21
  export type Degree = {
74
22
  in: number;
75
23
  out: number;
76
24
  all: number;
77
25
  };
78
- export interface ComboTree {
79
- id: string;
80
- children?: ComboTree[];
81
- depth?: number;
82
- parentId?: string;
83
- itemType?: "node" | "combo";
84
- [key: string]: unknown;
85
- }
86
- export interface ComboConfig {
87
- id: string;
88
- parentId?: string;
89
- children?: ComboTree[];
90
- depth?: number;
91
- }
26
+ export type IndexMap = {
27
+ [nodeId: string]: number;
28
+ };
29
+ export type Graph = IGraph<NodeData, EdgeData>;
92
30
  export type PointTuple = [number, number];
31
+ export type Point = {
32
+ x: number;
33
+ y: number;
34
+ };
35
+ export type Matrix = number[];
93
36
  export type LayoutMapping = {
94
37
  nodes: OutNode[];
95
38
  edges: Edge[];
96
39
  };
97
40
  export interface SyncLayout<LayoutOptions> {
98
- assign(graph: Graph<any, any>, options?: LayoutOptions): void;
99
- execute(graph: Graph<any, any>, options?: LayoutOptions): LayoutMapping;
41
+ assign(graph: Graph, options?: LayoutOptions): void;
42
+ execute(graph: Graph, options?: LayoutOptions): LayoutMapping;
100
43
  options: LayoutOptions;
101
44
  id: string;
102
45
  }
@@ -107,8 +50,13 @@ export interface LayoutSupervisor {
107
50
  start(): void;
108
51
  stop(): void;
109
52
  kill(): void;
53
+ isRunning(): boolean;
110
54
  }
111
- export interface CircularLayoutOptions {
55
+ interface CommonOptions {
56
+ layoutInvisibles?: boolean;
57
+ onLayoutEnd?: (data: LayoutMapping) => void;
58
+ }
59
+ export interface CircularLayoutOptions extends CommonOptions {
112
60
  center?: PointTuple;
113
61
  width?: number;
114
62
  height?: number;
@@ -119,10 +67,170 @@ export interface CircularLayoutOptions {
119
67
  divisions?: number;
120
68
  ordering?: "topology" | "topology-directed" | "degree" | null;
121
69
  angleRatio?: number;
122
- workerEnabled?: boolean;
123
70
  startAngle?: number;
124
71
  endAngle?: number;
125
- nodeSpacing?: ((d?: unknown) => number) | number;
126
- nodeSize?: number;
127
- onLayoutEnd?: () => void;
72
+ nodeSpacing?: ((node?: Node) => number) | number;
73
+ nodeSize?: number | number[];
74
+ }
75
+ export interface GridLayoutOptions extends CommonOptions {
76
+ width?: number;
77
+ height?: number;
78
+ begin?: PointTuple;
79
+ preventOverlap?: boolean;
80
+ nodeSize?: number | number[];
81
+ preventOverlapPadding?: number;
82
+ condense?: boolean;
83
+ rows?: number;
84
+ cols?: number;
85
+ sortBy?: string;
86
+ position?: ((node?: Node) => {
87
+ row?: number;
88
+ col?: number;
89
+ }) | undefined;
90
+ nodeSpacing?: ((node?: Node) => number) | number | undefined;
91
+ }
92
+ export interface RandomLayoutOptions extends CommonOptions {
93
+ center?: PointTuple;
94
+ width?: number;
95
+ height?: number;
96
+ }
97
+ export interface MDSLayoutOptions extends CommonOptions {
98
+ center?: PointTuple;
99
+ linkDistance?: number;
100
+ }
101
+ export interface ConcentricLayoutOptions extends CommonOptions {
102
+ center?: PointTuple;
103
+ preventOverlap?: boolean;
104
+ nodeSize?: number | PointTuple;
105
+ minNodeSpacing?: number;
106
+ sweep?: number;
107
+ equidistant?: boolean;
108
+ startAngle?: number;
109
+ clockwise?: boolean;
110
+ maxLevelDiff?: number;
111
+ sortBy?: string;
112
+ width?: number;
113
+ height?: number;
114
+ nodeSpacing?: number | number[] | ((node?: Node) => number) | undefined;
115
+ }
116
+ export interface RadialLayoutOptions extends CommonOptions {
117
+ center?: PointTuple;
118
+ width?: number;
119
+ height?: number;
120
+ linkDistance?: number;
121
+ maxIteration?: number;
122
+ focusNode?: string | Node | null;
123
+ unitRadius?: number | null;
124
+ preventOverlap?: boolean;
125
+ nodeSize?: number | number[] | undefined;
126
+ nodeSpacing?: number | Function | undefined;
127
+ maxPreventOverlapIteration?: number;
128
+ strictRadial?: boolean;
129
+ sortBy?: string | undefined;
130
+ sortStrength?: number;
131
+ }
132
+ export interface DagreLayoutOptions extends CommonOptions {
133
+ rankdir?: "TB" | "BT" | "LR" | "RL";
134
+ align?: "UL" | "UR" | "DL" | "DR";
135
+ begin?: PointTuple;
136
+ nodeSize?: number | number[] | undefined;
137
+ nodesep?: number;
138
+ ranksep?: number;
139
+ controlPoints?: boolean;
140
+ sortByCombo?: boolean;
141
+ edgeLabelSpace?: boolean;
142
+ nodeOrder?: string[];
143
+ radial?: boolean;
144
+ focusNode: string | Node | null;
145
+ preset?: {
146
+ nodes: OutNode[];
147
+ edges: Edge[];
148
+ };
149
+ nodesepFunc?: ((d?: Node) => number) | undefined;
150
+ ranksepFunc?: ((d?: Node) => number) | undefined;
151
+ }
152
+ export interface D3ForceLayoutOptions extends CommonOptions {
153
+ center?: PointTuple;
154
+ linkDistance?: number | ((edge?: Edge) => number) | undefined;
155
+ edgeStrength?: number | ((edge?: Edge) => number) | undefined;
156
+ nodeStrength?: number | ((node: Node, i: number, nodes: Node[]) => number) | undefined;
157
+ preventOverlap?: boolean;
158
+ collideStrength?: number;
159
+ nodeSize?: number | number[] | ((node?: Node) => number) | undefined;
160
+ nodeSpacing?: number | number[] | ((node?: Node) => number) | undefined;
161
+ alpha?: number;
162
+ alphaDecay?: number;
163
+ alphaMin?: number;
164
+ clustering?: boolean;
165
+ clusterNodeStrength?: number;
166
+ clusterEdgeStrength?: number;
167
+ clusterEdgeDistance?: number;
168
+ clusterNodeSize?: number;
169
+ clusterFociStrength?: number;
170
+ forceSimulation?: any;
171
+ onTick?: (data: LayoutMapping) => void;
172
+ }
173
+ export interface CentripetalOptions {
174
+ /** Force strength for leaf nodes. */
175
+ leaf?: number | ((node: Node, nodes: Node[], edges: Edge[]) => number);
176
+ /** Force strength for single nodes. */
177
+ single?: number | ((node: Node) => number);
178
+ /** Force strength for other nodes. */
179
+ others?: number | ((node: Node) => number);
180
+ /** Centri force's position and sterngth, points to the canvas center by default */
181
+ center?: (node: Node, nodes: Node[], edges: Edge[], width: number, height: number) => {
182
+ x: number;
183
+ y: number;
184
+ centerStrength?: number;
185
+ };
186
+ }
187
+ export interface ForceLayoutOptions extends CommonOptions {
188
+ center?: PointTuple;
189
+ width?: number;
190
+ height?: number;
191
+ linkDistance?: number | ((edge?: Edge, source?: any, target?: any) => number) | undefined;
192
+ nodeStrength?: number | ((d?: Node) => number) | undefined;
193
+ edgeStrength?: number | ((d?: Edge) => number) | undefined;
194
+ preventOverlap?: boolean;
195
+ nodeSize?: number | number[] | ((d?: Node) => number);
196
+ nodeSpacing?: number | ((d?: Node) => number);
197
+ minMovement?: number;
198
+ maxIteration?: number;
199
+ damping?: number;
200
+ maxSpeed?: number;
201
+ coulombDisScale?: number;
202
+ gravity?: number;
203
+ factor?: number;
204
+ interval?: number;
205
+ centripetalOptions?: CentripetalOptions;
206
+ leafCluster?: boolean;
207
+ clustering?: boolean;
208
+ nodeClusterBy?: string;
209
+ clusterNodeStrength?: number | ((node: Node) => number);
210
+ collideStrength?: number;
211
+ distanceThresholdMode?: "mean" | "max" | "min";
212
+ animate?: boolean;
213
+ onTick?: (data: LayoutMapping) => void;
214
+ getMass?: ((d: Node) => number) | undefined;
215
+ getCenter?: ((d?: Node, degree?: number) => number[]) | undefined;
216
+ monitor?: (params: {
217
+ energy: number;
218
+ nodes: Node[];
219
+ edges: Edge[];
220
+ iterations: number;
221
+ }) => void;
222
+ }
223
+ export interface FruchtermanLayoutOptions extends CommonOptions {
224
+ center?: PointTuple;
225
+ maxIteration?: number;
226
+ width?: number;
227
+ height?: number;
228
+ gravity?: number;
229
+ speed?: number;
230
+ clustering?: boolean;
231
+ clusterGravity?: number;
232
+ animate?: boolean;
233
+ nodeClusterBy?: string;
234
+ onTick?: (data: LayoutMapping) => void;
128
235
  }
236
+ export {};
@@ -1,6 +1,20 @@
1
+ import { Node } from "../types";
1
2
  export declare const isFunction: (val: unknown) => val is Function;
2
- export declare const getFunc: (value: number, defaultValue: number, func?: ((d?: any) => number) | undefined) => Function;
3
- export declare const getFuncByUnknownType: (defaultValue: number, value?: number | number[] | {
3
+ /**
4
+ * Format value with multiple types into a function returns number.
5
+ * @param defaultValue default value when value is invalid
6
+ * @param value value to be formatted
7
+ * @returns formatted result, a function returns number
8
+ */
9
+ export declare function formatNumberFn<T = unknown>(defaultValue: number, value: number | ((d?: T) => number) | undefined): (d?: T | undefined) => number;
10
+ /**
11
+ * Format size config with multiple types into a function returns number
12
+ * @param defaultValue default value when value is invalid
13
+ * @param value value to be formatted
14
+ * @param resultIsNumber whether returns number
15
+ * @returns formatted result, a function returns number
16
+ */
17
+ export declare function formatSizeFn<T extends Node>(defaultValue: number, value?: number | number[] | {
4
18
  width: number;
5
19
  height: number;
6
- } | ((d?: any) => number) | undefined, resultIsNumber?: boolean) => (d?: any) => number | number[];
20
+ } | ((d?: T) => number) | undefined, resultIsNumber?: boolean): (d: T) => number | number[];
package/lib/util/gpu.d.ts CHANGED
@@ -1,11 +1,4 @@
1
1
  import { OutNode, Edge } from "../types";
2
- /**
3
- * 将 number | Function 类型的参数转换为 return number 的 Function
4
- * @param {number | Function} value 需要被转换的值
5
- * @param {number} defaultV 返回函数的默认返回值
6
- * @return {Function} 转换后的函数
7
- */
8
- export declare const proccessToFunc: (value: number | Function | undefined, defaultV?: number) => (d?: any) => number;
9
2
  /**
10
3
  * 将节点和边数据转换为 GPU 可读的数组。并返回 maxEdgePerVetex,每个节点上最多的边数
11
4
  * @param {NodeConfig[]} nodes 需要被转换的值
@@ -1,11 +1,9 @@
1
- import { Matrix, Model, IndexMap, Edge, Node, OutNode, Degree, NodeMap } from "../types";
2
- export declare const getEdgeTerminal: (edge: Edge, type: "source" | "target") => any;
3
- export declare const getDegree: (n: number, nodeIdxMap: IndexMap, edges: Edge[] | null) => Degree[];
4
- export declare const getDegreeMap: (nodes: Node[], edges: Edge[] | null) => {
5
- [id: string]: Degree;
6
- };
1
+ import type { Matrix, Edge, Node, OutNode, Degree, Point } from "../types";
7
2
  export declare const floydWarshall: (adjMatrix: Matrix[]) => Matrix[];
8
- export declare const getAdjMatrix: (data: Model, directed: boolean) => Matrix[];
3
+ export declare const getAdjMatrix: (data: {
4
+ nodes: Node[];
5
+ edges: Edge[];
6
+ }, directed: boolean) => Matrix[];
9
7
  /**
10
8
  * scale matrix
11
9
  * @param matrix [ [], [], [] ]
@@ -41,8 +39,17 @@ export declare const getAvgNodePosition: (nodes: OutNode[]) => {
41
39
  };
42
40
  export declare const getCoreNodeAndRelativeLeafNodes: (type: "leaf" | "all", node: Node, edges: Edge[], nodeClusterBy: string, degreesMap: {
43
41
  [id: string]: Degree;
44
- }, nodeMap: NodeMap) => {
42
+ }, nodeMap: {
43
+ [id: string]: Node;
44
+ }) => {
45
45
  coreNode: Node;
46
46
  relativeLeafNodes: Node[];
47
47
  sameTypeLeafNodes: Node[];
48
48
  };
49
+ /**
50
+ * calculate the euclidean distance form p1 to p2
51
+ * @param p1
52
+ * @param p2
53
+ * @returns
54
+ */
55
+ export declare const getEuclideanDistance: (p1: Point, p2: Point) => number;
@@ -1,2 +1,10 @@
1
+ import { Node, Edge } from '../types';
1
2
  export declare const isObject: (val: unknown) => val is Record<any, any>;
2
3
  export declare const clone: <T>(target: T) => T;
4
+ /**
5
+ * Clone node or edge data and format it
6
+ * @param target node/edge to be cloned
7
+ * @param initRange whether init the x and y in data with the range, which means [xRange, yRange]
8
+ * @returns cloned node/edge
9
+ */
10
+ export declare const cloneFormatData: <T extends Node | Edge>(target: T, initRange?: [number, number]) => T;
package/lib/worker.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  import type { Payload } from "./supervisor";
2
- import type { LayoutMapping } from "./types";
3
- export declare function calculateLayout(payload: Payload, transferables: Float32Array[]): (Float32Array[] | LayoutMapping)[];
2
+ export declare function calculateLayout(payload: Payload, transferables: Float32Array[]): Promise<unknown>;
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@antv/layout",
3
- "version": "1.0.0-alpha.0",
3
+ "version": "1.0.0-alpha.10",
4
4
  "description": "graph layout algorithm",
5
5
  "main": "dist/index.min.js",
6
- "module": "dist/index.min.js",
6
+ "module": "esm/index.esm.js",
7
7
  "types": "lib/index.d.ts",
8
8
  "unpkg": "dist/index.min.js",
9
9
  "files": [
10
10
  "package.json",
11
11
  "dist",
12
+ "esm",
12
13
  "lib",
13
14
  "LICENSE",
14
15
  "README.md"
@@ -20,9 +21,12 @@
20
21
  "antv"
21
22
  ],
22
23
  "dependencies": {
23
- "@antv/graphlib": "^2.0.0-alpha.0",
24
+ "@antv/graphlib": "^2.0.0-alpha.2",
24
25
  "@naoak/workerize-transferable": "^0.1.0",
25
- "eventemitter3": "^4.0.0"
26
+ "d3-force": "^3.0.0",
27
+ "d3-quadtree": "^3.0.1",
28
+ "eventemitter3": "^4.0.0",
29
+ "ml-matrix": "^6.10.4"
26
30
  },
27
31
  "devDependencies": {
28
32
  "@babel/core": "^7.7.7",
@@ -36,6 +40,10 @@
36
40
  "workerize-loader": "^2.0.2"
37
41
  },
38
42
  "scripts": {
39
- "build:umd": "webpack --config webpack.config.js --mode production"
43
+ "dev": "webpack --config webpack.dev.config.js --mode development",
44
+ "build": "npm run build:esm && npm run build:umd",
45
+ "build:esm": "webpack --config webpack.esm.config.js --mode production",
46
+ "build:umd": "webpack --config webpack.config.js --mode production",
47
+ "publish:alpha": "npm publish --tag alpha"
40
48
  }
41
49
  }