@antv/layout 1.0.0-alpha.1 → 1.0.0-alpha.11

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,114 +1,93 @@
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
- export interface SyncLayout<LayoutOptions> {
98
- assign(graph: Graph<any, any>, options?: LayoutOptions): void;
99
- execute(graph: Graph<any, any>, options?: LayoutOptions): LayoutMapping;
40
+ export interface Layout<LayoutOptions> {
41
+ /**
42
+ * To directly assign the positions to the nodes.
43
+ */
44
+ assign(graph: Graph, options?: LayoutOptions): void;
45
+ /**
46
+ * Return the positions of nodes and edges(if needed).
47
+ */
48
+ execute(graph: Graph, options?: LayoutOptions): LayoutMapping;
49
+ /**
50
+ * Layout options, can be changed in runtime.
51
+ */
100
52
  options: LayoutOptions;
53
+ /**
54
+ * Unique ID, it will get registered and used on the webworker-side.
55
+ */
101
56
  id: string;
102
57
  }
103
- export interface SyncLayoutConstructor<LayoutOptions> {
104
- new (options?: LayoutOptions): SyncLayout<LayoutOptions>;
58
+ export declare function isLayoutWithIterations(layout: any): layout is LayoutWithIterations<any>;
59
+ export interface LayoutWithIterations<LayoutOptions> extends Layout<LayoutOptions> {
60
+ /**
61
+ * Some layout algorithm has n iterations so that the simulation needs to be stopped at any time.
62
+ * This method is useful for running the simulation manually.
63
+ * @see https://github.com/d3/d3-force#simulation_stop
64
+ */
65
+ stop: () => void;
66
+ /**
67
+ * Restarts the simulation’s internal timer and returns the simulation.
68
+ * @see https://github.com/d3/d3-force#simulation_restart
69
+ */
70
+ restart: () => void;
71
+ /**
72
+ * Manually steps the simulation by the specified number of iterations.
73
+ * @see https://github.com/d3/d3-force#simulation_tick
74
+ */
75
+ tick: (iterations?: number) => LayoutMapping;
76
+ }
77
+ export interface LayoutConstructor<LayoutOptions> {
78
+ new (options?: LayoutOptions): Layout<LayoutOptions>;
105
79
  }
106
80
  export interface LayoutSupervisor {
107
81
  start(): void;
108
82
  stop(): void;
109
83
  kill(): void;
84
+ isRunning(): boolean;
85
+ }
86
+ interface CommonOptions {
87
+ layoutInvisibles?: boolean;
88
+ onLayoutEnd?: (data: LayoutMapping) => void;
110
89
  }
111
- export interface CircularLayoutOptions {
90
+ export interface CircularLayoutOptions extends CommonOptions {
112
91
  center?: PointTuple;
113
92
  width?: number;
114
93
  height?: number;
@@ -119,10 +98,169 @@ export interface CircularLayoutOptions {
119
98
  divisions?: number;
120
99
  ordering?: "topology" | "topology-directed" | "degree" | null;
121
100
  angleRatio?: number;
122
- workerEnabled?: boolean;
123
101
  startAngle?: number;
124
102
  endAngle?: number;
125
- nodeSpacing?: ((d?: unknown) => number) | number;
126
- nodeSize?: number;
127
- onLayoutEnd?: () => void;
103
+ nodeSpacing?: ((node?: Node) => number) | number;
104
+ nodeSize?: number | number[];
105
+ }
106
+ export interface GridLayoutOptions extends CommonOptions {
107
+ width?: number;
108
+ height?: number;
109
+ begin?: PointTuple;
110
+ preventOverlap?: boolean;
111
+ nodeSize?: number | number[];
112
+ preventOverlapPadding?: number;
113
+ condense?: boolean;
114
+ rows?: number;
115
+ cols?: number;
116
+ sortBy?: string;
117
+ position?: ((node?: Node) => {
118
+ row?: number;
119
+ col?: number;
120
+ }) | undefined;
121
+ nodeSpacing?: ((node?: Node) => number) | number | undefined;
122
+ }
123
+ export interface RandomLayoutOptions extends CommonOptions {
124
+ center?: PointTuple;
125
+ width?: number;
126
+ height?: number;
127
+ }
128
+ export interface MDSLayoutOptions extends CommonOptions {
129
+ center?: PointTuple;
130
+ linkDistance?: number;
131
+ }
132
+ export interface ConcentricLayoutOptions extends CommonOptions {
133
+ center?: PointTuple;
134
+ preventOverlap?: boolean;
135
+ nodeSize?: number | PointTuple;
136
+ minNodeSpacing?: number;
137
+ sweep?: number;
138
+ equidistant?: boolean;
139
+ startAngle?: number;
140
+ clockwise?: boolean;
141
+ maxLevelDiff?: number;
142
+ sortBy?: string;
143
+ width?: number;
144
+ height?: number;
145
+ nodeSpacing?: number | number[] | ((node?: Node) => number) | undefined;
146
+ }
147
+ export interface RadialLayoutOptions extends CommonOptions {
148
+ center?: PointTuple;
149
+ width?: number;
150
+ height?: number;
151
+ linkDistance?: number;
152
+ maxIteration?: number;
153
+ focusNode?: string | Node | null;
154
+ unitRadius?: number | null;
155
+ preventOverlap?: boolean;
156
+ nodeSize?: number | number[] | undefined;
157
+ nodeSpacing?: number | Function | undefined;
158
+ maxPreventOverlapIteration?: number;
159
+ strictRadial?: boolean;
160
+ sortBy?: string | undefined;
161
+ sortStrength?: number;
162
+ }
163
+ export interface DagreLayoutOptions extends CommonOptions {
164
+ rankdir?: "TB" | "BT" | "LR" | "RL";
165
+ align?: "UL" | "UR" | "DL" | "DR";
166
+ begin?: PointTuple;
167
+ nodeSize?: number | number[] | undefined;
168
+ nodesep?: number;
169
+ ranksep?: number;
170
+ controlPoints?: boolean;
171
+ sortByCombo?: boolean;
172
+ edgeLabelSpace?: boolean;
173
+ nodeOrder?: string[];
174
+ radial?: boolean;
175
+ focusNode: string | Node | null;
176
+ preset?: {
177
+ nodes: OutNode[];
178
+ edges: Edge[];
179
+ };
180
+ nodesepFunc?: ((d?: Node) => number) | undefined;
181
+ ranksepFunc?: ((d?: Node) => number) | undefined;
182
+ }
183
+ export interface D3ForceLayoutOptions extends CommonOptions {
184
+ center?: PointTuple;
185
+ linkDistance?: number | ((edge?: Edge) => number) | undefined;
186
+ edgeStrength?: number | ((edge?: Edge) => number) | undefined;
187
+ nodeStrength?: number | ((node: Node, i: number, nodes: Node[]) => number) | undefined;
188
+ preventOverlap?: boolean;
189
+ collideStrength?: number;
190
+ nodeSize?: number | number[] | ((node?: Node) => number) | undefined;
191
+ nodeSpacing?: number | number[] | ((node?: Node) => number) | undefined;
192
+ alpha?: number;
193
+ alphaDecay?: number;
194
+ alphaMin?: number;
195
+ clustering?: boolean;
196
+ clusterNodeStrength?: number;
197
+ clusterEdgeStrength?: number;
198
+ clusterEdgeDistance?: number;
199
+ clusterNodeSize?: number;
200
+ clusterFociStrength?: number;
201
+ forceSimulation?: any;
202
+ onTick?: (data: LayoutMapping) => void;
203
+ }
204
+ export interface CentripetalOptions {
205
+ /** Force strength for leaf nodes. */
206
+ leaf?: number | ((node: Node, nodes: Node[], edges: Edge[]) => number);
207
+ /** Force strength for single nodes. */
208
+ single?: number | ((node: Node) => number);
209
+ /** Force strength for other nodes. */
210
+ others?: number | ((node: Node) => number);
211
+ /** Centri force's position and sterngth, points to the canvas center by default */
212
+ center?: (node: Node, nodes: Node[], edges: Edge[], width: number, height: number) => {
213
+ x: number;
214
+ y: number;
215
+ centerStrength?: number;
216
+ };
217
+ }
218
+ export interface ForceLayoutOptions extends CommonOptions {
219
+ center?: PointTuple;
220
+ width?: number;
221
+ height?: number;
222
+ linkDistance?: number | ((edge?: Edge, source?: any, target?: any) => number) | undefined;
223
+ nodeStrength?: number | ((d?: Node) => number) | undefined;
224
+ edgeStrength?: number | ((d?: Edge) => number) | undefined;
225
+ preventOverlap?: boolean;
226
+ nodeSize?: number | number[] | ((d?: Node) => number);
227
+ nodeSpacing?: number | ((d?: Node) => number);
228
+ minMovement?: number;
229
+ maxIteration?: number;
230
+ damping?: number;
231
+ maxSpeed?: number;
232
+ coulombDisScale?: number;
233
+ gravity?: number;
234
+ factor?: number;
235
+ interval?: number;
236
+ centripetalOptions?: CentripetalOptions;
237
+ leafCluster?: boolean;
238
+ clustering?: boolean;
239
+ nodeClusterBy?: string;
240
+ clusterNodeStrength?: number | ((node: Node) => number);
241
+ collideStrength?: number;
242
+ distanceThresholdMode?: "mean" | "max" | "min";
243
+ animate?: boolean;
244
+ onTick?: (data: LayoutMapping) => void;
245
+ getMass?: ((d: Node) => number) | undefined;
246
+ getCenter?: ((d?: Node, degree?: number) => number[]) | undefined;
247
+ monitor?: (params: {
248
+ energy: number;
249
+ nodes: Node[];
250
+ edges: Edge[];
251
+ iterations: number;
252
+ }) => void;
253
+ }
254
+ export interface FruchtermanLayoutOptions extends CommonOptions {
255
+ center?: PointTuple;
256
+ maxIteration?: number;
257
+ width?: number;
258
+ height?: number;
259
+ gravity?: number;
260
+ speed?: number;
261
+ clustering?: boolean;
262
+ clusterGravity?: number;
263
+ nodeClusterBy?: string;
264
+ onTick?: (data: LayoutMapping) => void;
128
265
  }
266
+ 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,3 @@
1
1
  import type { Payload } from "./supervisor";
2
- import type { LayoutMapping } from "./types";
3
- export declare function calculateLayout(payload: Payload, transferables: Float32Array[]): (LayoutMapping | Float32Array[])[];
2
+ export declare function stopLayout(): void;
3
+ 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.1",
3
+ "version": "1.0.0-alpha.11",
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,14 +21,18 @@
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",
29
33
  "@babel/plugin-proposal-class-properties": "^7.1.0",
30
34
  "@babel/preset-react": "^7.7.4",
35
+ "@types/d3-force": "^3.0.4",
31
36
  "babel-loader": "^8.0.6",
32
37
  "ts-loader": "^7.0.3",
33
38
  "typescript": "^4.0.3",
@@ -36,6 +41,10 @@
36
41
  "workerize-loader": "^2.0.2"
37
42
  },
38
43
  "scripts": {
39
- "build:umd": "webpack --config webpack.config.js --mode production"
44
+ "dev": "webpack --config webpack.dev.config.js --mode development",
45
+ "build": "npm run build:esm && npm run build:umd",
46
+ "build:esm": "webpack --config webpack.esm.config.js --mode production",
47
+ "build:umd": "webpack --config webpack.config.js --mode production",
48
+ "publish:alpha": "npm publish --tag alpha"
40
49
  }
41
50
  }