@graphty/layout 1.2.5 → 1.2.6
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/README.md +57 -1
- package/dist/layout.js +1762 -0
- package/dist/layout.js.map +1 -0
- package/package.json +2 -1
- package/dist/src/algorithms/index.d.ts +0 -5
- package/dist/src/algorithms/index.js +0 -6
- package/dist/src/algorithms/index.js.map +0 -1
- package/dist/src/algorithms/optimization/index.d.ts +0 -7
- package/dist/src/algorithms/optimization/index.js +0 -7
- package/dist/src/algorithms/optimization/index.js.map +0 -1
- package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +0 -32
- package/dist/src/algorithms/optimization/kamada-kawai-solver.js +0 -176
- package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +0 -1
- package/dist/src/algorithms/optimization/lbfgs.d.ts +0 -13
- package/dist/src/algorithms/optimization/lbfgs.js +0 -56
- package/dist/src/algorithms/optimization/lbfgs.js.map +0 -1
- package/dist/src/algorithms/optimization/line-search.d.ts +0 -15
- package/dist/src/algorithms/optimization/line-search.js +0 -37
- package/dist/src/algorithms/optimization/line-search.js.map +0 -1
- package/dist/src/algorithms/optimization/types.d.ts +0 -5
- package/dist/src/algorithms/optimization/types.js +0 -5
- package/dist/src/algorithms/optimization/types.js.map +0 -1
- package/dist/src/algorithms/planarity/check.d.ts +0 -17
- package/dist/src/algorithms/planarity/check.js +0 -30
- package/dist/src/algorithms/planarity/check.js.map +0 -1
- package/dist/src/algorithms/planarity/embedding.d.ts +0 -29
- package/dist/src/algorithms/planarity/embedding.js +0 -179
- package/dist/src/algorithms/planarity/embedding.js.map +0 -1
- package/dist/src/algorithms/planarity/index.d.ts +0 -7
- package/dist/src/algorithms/planarity/index.js +0 -8
- package/dist/src/algorithms/planarity/index.js.map +0 -1
- package/dist/src/algorithms/planarity/lr-test.d.ts +0 -15
- package/dist/src/algorithms/planarity/lr-test.js +0 -54
- package/dist/src/algorithms/planarity/lr-test.js.map +0 -1
- package/dist/src/algorithms/planarity/special-graphs.d.ts +0 -28
- package/dist/src/algorithms/planarity/special-graphs.js +0 -108
- package/dist/src/algorithms/planarity/special-graphs.js.map +0 -1
- package/dist/src/generators/basic.d.ts +0 -28
- package/dist/src/generators/basic.js +0 -79
- package/dist/src/generators/basic.js.map +0 -1
- package/dist/src/generators/bipartite.d.ts +0 -16
- package/dist/src/generators/bipartite.js +0 -40
- package/dist/src/generators/bipartite.js.map +0 -1
- package/dist/src/generators/grid.d.ts +0 -11
- package/dist/src/generators/grid.js +0 -37
- package/dist/src/generators/grid.js.map +0 -1
- package/dist/src/generators/index.d.ts +0 -8
- package/dist/src/generators/index.js +0 -9
- package/dist/src/generators/index.js.map +0 -1
- package/dist/src/generators/random.d.ts +0 -12
- package/dist/src/generators/random.js +0 -34
- package/dist/src/generators/random.js.map +0 -1
- package/dist/src/generators/scale-free.d.ts +0 -12
- package/dist/src/generators/scale-free.js +0 -62
- package/dist/src/generators/scale-free.js.map +0 -1
- package/dist/src/index.d.ts +0 -10
- package/dist/src/index.js +0 -15
- package/dist/src/index.js.map +0 -1
- package/dist/src/layouts/basic/index.d.ts +0 -4
- package/dist/src/layouts/basic/index.js +0 -5
- package/dist/src/layouts/basic/index.js.map +0 -1
- package/dist/src/layouts/basic/random.d.ts +0 -14
- package/dist/src/layouts/basic/random.js +0 -27
- package/dist/src/layouts/basic/random.js.map +0 -1
- package/dist/src/layouts/force-directed/arf.d.ts +0 -13
- package/dist/src/layouts/force-directed/arf.js +0 -103
- package/dist/src/layouts/force-directed/arf.js.map +0 -1
- package/dist/src/layouts/force-directed/forceatlas2.d.ts +0 -22
- package/dist/src/layouts/force-directed/forceatlas2.js +0 -340
- package/dist/src/layouts/force-directed/forceatlas2.js.map +0 -1
- package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +0 -19
- package/dist/src/layouts/force-directed/fruchterman-reingold.js +0 -131
- package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +0 -1
- package/dist/src/layouts/force-directed/index.d.ts +0 -8
- package/dist/src/layouts/force-directed/index.js +0 -9
- package/dist/src/layouts/force-directed/index.js.map +0 -1
- package/dist/src/layouts/force-directed/kamada-kawai.d.ts +0 -15
- package/dist/src/layouts/force-directed/kamada-kawai.js +0 -87
- package/dist/src/layouts/force-directed/kamada-kawai.js.map +0 -1
- package/dist/src/layouts/force-directed/spring.d.ts +0 -19
- package/dist/src/layouts/force-directed/spring.js +0 -23
- package/dist/src/layouts/force-directed/spring.js.map +0 -1
- package/dist/src/layouts/geometric/circular.d.ts +0 -14
- package/dist/src/layouts/geometric/circular.js +0 -67
- package/dist/src/layouts/geometric/circular.js.map +0 -1
- package/dist/src/layouts/geometric/index.d.ts +0 -6
- package/dist/src/layouts/geometric/index.js +0 -7
- package/dist/src/layouts/geometric/index.js.map +0 -1
- package/dist/src/layouts/geometric/shell.d.ts +0 -15
- package/dist/src/layouts/geometric/shell.js +0 -67
- package/dist/src/layouts/geometric/shell.js.map +0 -1
- package/dist/src/layouts/geometric/spiral.d.ts +0 -16
- package/dist/src/layouts/geometric/spiral.js +0 -73
- package/dist/src/layouts/geometric/spiral.js.map +0 -1
- package/dist/src/layouts/hierarchical/bfs.d.ts +0 -12
- package/dist/src/layouts/hierarchical/bfs.js +0 -62
- package/dist/src/layouts/hierarchical/bfs.js.map +0 -1
- package/dist/src/layouts/hierarchical/bipartite.d.ts +0 -16
- package/dist/src/layouts/hierarchical/bipartite.js +0 -72
- package/dist/src/layouts/hierarchical/bipartite.js.map +0 -1
- package/dist/src/layouts/hierarchical/index.d.ts +0 -6
- package/dist/src/layouts/hierarchical/index.js +0 -7
- package/dist/src/layouts/hierarchical/index.js.map +0 -1
- package/dist/src/layouts/hierarchical/multipartite.d.ts +0 -12
- package/dist/src/layouts/hierarchical/multipartite.js +0 -73
- package/dist/src/layouts/hierarchical/multipartite.js.map +0 -1
- package/dist/src/layouts/index.d.ts +0 -8
- package/dist/src/layouts/index.js +0 -9
- package/dist/src/layouts/index.js.map +0 -1
- package/dist/src/layouts/specialized/index.d.ts +0 -5
- package/dist/src/layouts/specialized/index.js +0 -6
- package/dist/src/layouts/specialized/index.js.map +0 -1
- package/dist/src/layouts/specialized/planar.d.ts +0 -14
- package/dist/src/layouts/specialized/planar.js +0 -47
- package/dist/src/layouts/specialized/planar.js.map +0 -1
- package/dist/src/layouts/specialized/spectral.d.ts +0 -14
- package/dist/src/layouts/specialized/spectral.js +0 -106
- package/dist/src/layouts/specialized/spectral.js.map +0 -1
- package/dist/src/types/embedding.d.ts +0 -9
- package/dist/src/types/embedding.js +0 -5
- package/dist/src/types/embedding.js.map +0 -1
- package/dist/src/types/graph.d.ts +0 -10
- package/dist/src/types/graph.js +0 -5
- package/dist/src/types/graph.js.map +0 -1
- package/dist/src/types/index.d.ts +0 -6
- package/dist/src/types/index.js +0 -7
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/layout.d.ts +0 -6
- package/dist/src/types/layout.js +0 -5
- package/dist/src/types/layout.js.map +0 -1
- package/dist/src/utils/graph.d.ts +0 -34
- package/dist/src/utils/graph.js +0 -69
- package/dist/src/utils/graph.js.map +0 -1
- package/dist/src/utils/index.d.ts +0 -8
- package/dist/src/utils/index.js +0 -9
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/numpy.d.ts +0 -17
- package/dist/src/utils/numpy.js +0 -101
- package/dist/src/utils/numpy.js.map +0 -1
- package/dist/src/utils/params.d.ts +0 -17
- package/dist/src/utils/params.js +0 -22
- package/dist/src/utils/params.js.map +0 -1
- package/dist/src/utils/random.d.ts +0 -14
- package/dist/src/utils/random.js +0 -42
- package/dist/src/utils/random.js.map +0 -1
- package/dist/src/utils/rescale.d.ts +0 -21
- package/dist/src/utils/rescale.js +0 -194
- package/dist/src/utils/rescale.js.map +0 -1
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -30
- package/dist/vitest.config.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kamada-kawai-solver.js","sourceRoot":"","sources":["../../../../src/algorithms/optimization/kamada-kawai-solver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* L-BFGS optimization utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Compute the search direction using L-BFGS approximation
|
|
6
|
-
*
|
|
7
|
-
* @param grad - Current gradient
|
|
8
|
-
* @param sList - List of position differences (s_k)
|
|
9
|
-
* @param yList - List of gradient differences (y_k)
|
|
10
|
-
* @param m - Memory size
|
|
11
|
-
* @returns Direction vector
|
|
12
|
-
*/
|
|
13
|
-
export declare function _lbfgsDirection(grad: number[], sList: number[][], yList: number[][], m: number): number[];
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* L-BFGS optimization utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Compute the search direction using L-BFGS approximation
|
|
6
|
-
*
|
|
7
|
-
* @param grad - Current gradient
|
|
8
|
-
* @param sList - List of position differences (s_k)
|
|
9
|
-
* @param yList - List of gradient differences (y_k)
|
|
10
|
-
* @param m - Memory size
|
|
11
|
-
* @returns Direction vector
|
|
12
|
-
*/
|
|
13
|
-
export function _lbfgsDirection(grad, sList, yList, m) {
|
|
14
|
-
if (sList.length === 0) {
|
|
15
|
-
// First iteration - use negative gradient
|
|
16
|
-
return grad.map(g => -g);
|
|
17
|
-
}
|
|
18
|
-
const q = grad.slice();
|
|
19
|
-
const alpha = Array(sList.length).fill(0);
|
|
20
|
-
const rho = [];
|
|
21
|
-
// Compute rho values
|
|
22
|
-
for (let i = 0; i < sList.length; i++) {
|
|
23
|
-
const s = sList[i];
|
|
24
|
-
const y = yList[i];
|
|
25
|
-
rho.push(1 / y.reduce((sum, val, j) => sum + val * s[j], 0));
|
|
26
|
-
}
|
|
27
|
-
// Forward pass
|
|
28
|
-
for (let i = sList.length - 1; i >= 0; i--) {
|
|
29
|
-
const s = sList[i];
|
|
30
|
-
alpha[i] = rho[i] * s.reduce((sum, val, j) => sum + val * q[j], 0);
|
|
31
|
-
for (let j = 0; j < q.length; j++) {
|
|
32
|
-
q[j] -= alpha[i] * yList[i][j];
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
// Scale initial Hessian approximation
|
|
36
|
-
let gamma = 1;
|
|
37
|
-
if (sList.length > 0 && yList.length > 0) {
|
|
38
|
-
const y = yList[yList.length - 1];
|
|
39
|
-
const s = sList[sList.length - 1];
|
|
40
|
-
gamma = s.reduce((sum, val, i) => sum + val * y[i], 0) /
|
|
41
|
-
y.reduce((sum, val) => sum + val * val, 0);
|
|
42
|
-
}
|
|
43
|
-
// Initialize direction with scaled negative gradient
|
|
44
|
-
const direction = q.map(val => -gamma * val);
|
|
45
|
-
// Backward pass
|
|
46
|
-
for (let i = 0; i < sList.length; i++) {
|
|
47
|
-
const s = sList[i];
|
|
48
|
-
const y = yList[i];
|
|
49
|
-
const beta = rho[i] * y.reduce((sum, val, j) => sum + val * direction[j], 0);
|
|
50
|
-
for (let j = 0; j < direction.length; j++) {
|
|
51
|
-
direction[j] += s[j] * (alpha[i] - beta);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return direction;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=lbfgs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lbfgs.js","sourceRoot":"","sources":["../../../../src/algorithms/optimization/lbfgs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Line search optimization utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Backtracking line search to find step size
|
|
6
|
-
*
|
|
7
|
-
* @param x - Current position
|
|
8
|
-
* @param direction - Search direction
|
|
9
|
-
* @param f - Function value at current position
|
|
10
|
-
* @param grad - Gradient at current position
|
|
11
|
-
* @param func - Function to evaluate cost
|
|
12
|
-
* @param alpha0 - Initial step size
|
|
13
|
-
* @returns Optimal step size
|
|
14
|
-
*/
|
|
15
|
-
export declare function _backtrackingLineSearch(x: number[], direction: number[], f: number, grad: number[], func: (x: number[]) => number, alpha0: number): number;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Line search optimization utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Backtracking line search to find step size
|
|
6
|
-
*
|
|
7
|
-
* @param x - Current position
|
|
8
|
-
* @param direction - Search direction
|
|
9
|
-
* @param f - Function value at current position
|
|
10
|
-
* @param grad - Gradient at current position
|
|
11
|
-
* @param func - Function to evaluate cost
|
|
12
|
-
* @param alpha0 - Initial step size
|
|
13
|
-
* @returns Optimal step size
|
|
14
|
-
*/
|
|
15
|
-
export function _backtrackingLineSearch(x, direction, f, grad, func, alpha0) {
|
|
16
|
-
const c1 = 1e-4;
|
|
17
|
-
const c2 = 0.9;
|
|
18
|
-
const initialSlope = grad.reduce((sum, g, i) => sum + g * direction[i], 0);
|
|
19
|
-
if (initialSlope >= 0) {
|
|
20
|
-
return 1e-8; // Direction is not a descent direction
|
|
21
|
-
}
|
|
22
|
-
let alpha = alpha0;
|
|
23
|
-
const maxIter = 20;
|
|
24
|
-
for (let i = 0; i < maxIter; i++) {
|
|
25
|
-
// Try step
|
|
26
|
-
const newX = x.map((val, i) => val + alpha * direction[i]);
|
|
27
|
-
const newF = func(newX);
|
|
28
|
-
// Check sufficient decrease condition (Armijo condition)
|
|
29
|
-
if (newF <= f + c1 * alpha * initialSlope) {
|
|
30
|
-
return alpha;
|
|
31
|
-
}
|
|
32
|
-
// Reduce step size
|
|
33
|
-
alpha *= c2;
|
|
34
|
-
}
|
|
35
|
-
return alpha; // Return last alpha even if not optimal
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=line-search.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"line-search.js","sourceRoot":"","sources":["../../../../src/algorithms/optimization/line-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CACrC,CAAW,EACX,SAAmB,EACnB,CAAS,EACT,IAAc,EACd,IAA6B,EAC7B,MAAc;IAEd,MAAM,EAAE,GAAG,IAAI,CAAC;IAChB,MAAM,EAAE,GAAG,GAAG,CAAC;IACf,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3E,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,CAAE,uCAAuC;IACvD,CAAC;IAED,IAAI,KAAK,GAAG,MAAM,CAAC;IACnB,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,WAAW;QACX,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAExB,yDAAyD;QACzD,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,YAAY,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mBAAmB;QACnB,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,CAAE,wCAAwC;AACzD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/algorithms/optimization/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main planarity checking function
|
|
3
|
-
*/
|
|
4
|
-
import { Graph, Node, Edge, Embedding } from '../../types';
|
|
5
|
-
/**
|
|
6
|
-
* Check if graph is planar using a simplified version of Boyer-Myrvold algorithm.
|
|
7
|
-
* Returns planarity and embedding information.
|
|
8
|
-
*
|
|
9
|
-
* @param G - Graph
|
|
10
|
-
* @param nodes - List of nodes
|
|
11
|
-
* @param edges - List of edges
|
|
12
|
-
* @returns Object containing isPlanar flag and embedding
|
|
13
|
-
*/
|
|
14
|
-
export declare function checkPlanarity(G: Graph, nodes: Node[], edges: Edge[]): {
|
|
15
|
-
isPlanar: boolean;
|
|
16
|
-
embedding: Embedding | null;
|
|
17
|
-
};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main planarity checking function
|
|
3
|
-
*/
|
|
4
|
-
import { isK5, isK33 } from './special-graphs';
|
|
5
|
-
import { lrPlanarityTest } from './lr-test';
|
|
6
|
-
import { createTriangulationEmbedding } from './embedding';
|
|
7
|
-
/**
|
|
8
|
-
* Check if graph is planar using a simplified version of Boyer-Myrvold algorithm.
|
|
9
|
-
* Returns planarity and embedding information.
|
|
10
|
-
*
|
|
11
|
-
* @param G - Graph
|
|
12
|
-
* @param nodes - List of nodes
|
|
13
|
-
* @param edges - List of edges
|
|
14
|
-
* @returns Object containing isPlanar flag and embedding
|
|
15
|
-
*/
|
|
16
|
-
export function checkPlanarity(G, nodes, edges) {
|
|
17
|
-
// For small graphs (n <= 4), all are planar
|
|
18
|
-
if (nodes.length <= 4) {
|
|
19
|
-
return { isPlanar: true, embedding: createTriangulationEmbedding(nodes, edges) };
|
|
20
|
-
}
|
|
21
|
-
// For K5 (complete graph with 5 nodes) and K3,3 (complete bipartite with 3,3 nodes)
|
|
22
|
-
// these are not planar by Kuratowski's theorem
|
|
23
|
-
if (isK5(nodes, edges) || isK33(nodes, edges)) {
|
|
24
|
-
return { isPlanar: false, embedding: null };
|
|
25
|
-
}
|
|
26
|
-
// For other graphs, use LR algorithm (Left-Right Planarity Test)
|
|
27
|
-
const result = lrPlanarityTest(nodes, edges);
|
|
28
|
-
return result;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=check.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../src/algorithms/planarity/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,CAAQ,EACR,KAAa,EACb,KAAa;IAEb,4CAA4C;IAC5C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IACnF,CAAC;IAED,oFAAoF;IACpF,+CAA+C;IAC/C,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,iEAAiE;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedding functions for planar graphs
|
|
3
|
-
*/
|
|
4
|
-
import { Node, Edge, Embedding, PositionMap } from '../../types';
|
|
5
|
-
/**
|
|
6
|
-
* Create a triangulation-based embedding for a planar graph
|
|
7
|
-
*
|
|
8
|
-
* @param nodes - List of nodes
|
|
9
|
-
* @param edges - List of edges
|
|
10
|
-
* @returns Embedding object
|
|
11
|
-
*/
|
|
12
|
-
export declare function createTriangulationEmbedding(nodes: Node[], edges: Edge[]): Embedding;
|
|
13
|
-
/**
|
|
14
|
-
* Find a simple cycle in the graph (for outer face)
|
|
15
|
-
*
|
|
16
|
-
* @param nodes - List of nodes
|
|
17
|
-
* @param edges - List of edges
|
|
18
|
-
* @param adjMap - Adjacency map
|
|
19
|
-
* @returns Cycle as array of nodes, or null if none found
|
|
20
|
-
*/
|
|
21
|
-
export declare function findCycle(nodes: Node[], edges: Edge[], adjMap: Record<Node, Set<Node>>): Node[] | null;
|
|
22
|
-
/**
|
|
23
|
-
* Convert a combinatorial embedding to node positions
|
|
24
|
-
*
|
|
25
|
-
* @param embedding - The embedding object
|
|
26
|
-
* @param nodes - List of nodes
|
|
27
|
-
* @returns Dictionary mapping nodes to positions
|
|
28
|
-
*/
|
|
29
|
-
export declare function combinatorialEmbeddingToPos(embedding: Embedding, nodes: Node[]): PositionMap;
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedding functions for planar graphs
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Create a triangulation-based embedding for a planar graph
|
|
6
|
-
*
|
|
7
|
-
* @param nodes - List of nodes
|
|
8
|
-
* @param edges - List of edges
|
|
9
|
-
* @returns Embedding object
|
|
10
|
-
*/
|
|
11
|
-
export function createTriangulationEmbedding(nodes, edges) {
|
|
12
|
-
// Create a simple embedding using the incremental approach
|
|
13
|
-
const embedding = {
|
|
14
|
-
nodeOrder: [...nodes],
|
|
15
|
-
faceList: [],
|
|
16
|
-
nodePositions: {}
|
|
17
|
-
};
|
|
18
|
-
// Create a map of adjacent nodes
|
|
19
|
-
const adjMap = {};
|
|
20
|
-
for (const node of nodes) {
|
|
21
|
-
adjMap[node] = new Set();
|
|
22
|
-
}
|
|
23
|
-
for (const [u, v] of edges) {
|
|
24
|
-
adjMap[u].add(v);
|
|
25
|
-
adjMap[v].add(u);
|
|
26
|
-
}
|
|
27
|
-
// Create outer face as a cycle (if possible)
|
|
28
|
-
const outerFace = findCycle(nodes, edges, adjMap) || nodes;
|
|
29
|
-
embedding.faceList.push(outerFace);
|
|
30
|
-
// Position nodes on a convex polygon (outer face)
|
|
31
|
-
const n = outerFace.length;
|
|
32
|
-
for (let i = 0; i < n; i++) {
|
|
33
|
-
const angle = 2 * Math.PI * i / n;
|
|
34
|
-
embedding.nodePositions[outerFace[i]] = [Math.cos(angle), Math.sin(angle)];
|
|
35
|
-
}
|
|
36
|
-
// Position interior nodes using barycentric coordinates
|
|
37
|
-
const interiorNodes = nodes.filter(node => !embedding.nodePositions[node]);
|
|
38
|
-
for (const node of interiorNodes) {
|
|
39
|
-
const neighbors = Array.from(adjMap[node]);
|
|
40
|
-
if (neighbors.length === 0) {
|
|
41
|
-
// Isolated node, place at center
|
|
42
|
-
embedding.nodePositions[node] = [0, 0];
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
// Average position of neighbors that have positions
|
|
46
|
-
let xSum = 0, ySum = 0, count = 0;
|
|
47
|
-
for (const neighbor of neighbors) {
|
|
48
|
-
if (embedding.nodePositions[neighbor]) {
|
|
49
|
-
xSum += embedding.nodePositions[neighbor][0];
|
|
50
|
-
ySum += embedding.nodePositions[neighbor][1];
|
|
51
|
-
count++;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (count > 0) {
|
|
55
|
-
// Place slightly away from center to avoid overlaps
|
|
56
|
-
const jitter = 0.1 * Math.random();
|
|
57
|
-
embedding.nodePositions[node] = [
|
|
58
|
-
xSum / count + jitter * (Math.random() - 0.5),
|
|
59
|
-
ySum / count + jitter * (Math.random() - 0.5)
|
|
60
|
-
];
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
// No neighbors have positions yet, place randomly inside unit circle
|
|
64
|
-
const r = 0.5 * Math.random();
|
|
65
|
-
const angle = 2 * Math.PI * Math.random();
|
|
66
|
-
embedding.nodePositions[node] = [r * Math.cos(angle), r * Math.sin(angle)];
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return embedding;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Find a simple cycle in the graph (for outer face)
|
|
74
|
-
*
|
|
75
|
-
* @param nodes - List of nodes
|
|
76
|
-
* @param edges - List of edges
|
|
77
|
-
* @param adjMap - Adjacency map
|
|
78
|
-
* @returns Cycle as array of nodes, or null if none found
|
|
79
|
-
*/
|
|
80
|
-
export function findCycle(nodes, edges, adjMap) {
|
|
81
|
-
if (nodes.length === 0)
|
|
82
|
-
return null;
|
|
83
|
-
if (nodes.length <= 2)
|
|
84
|
-
return nodes; // Not a real cycle but handle it
|
|
85
|
-
// Try to find a Hamiltonian cycle for simplicity (for small graphs)
|
|
86
|
-
if (nodes.length <= 8) {
|
|
87
|
-
const visited = new Set();
|
|
88
|
-
const path = [];
|
|
89
|
-
function hamiltonianCycleDFS(node) {
|
|
90
|
-
path.push(node);
|
|
91
|
-
visited.add(node);
|
|
92
|
-
if (path.length === nodes.length) {
|
|
93
|
-
// Check if it's a cycle (last node connects to first)
|
|
94
|
-
if (adjMap[node].has(path[0])) {
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
// Not a cycle
|
|
98
|
-
visited.delete(node);
|
|
99
|
-
path.pop();
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
for (const neighbor of adjMap[node]) {
|
|
103
|
-
if (!visited.has(neighbor)) {
|
|
104
|
-
if (hamiltonianCycleDFS(neighbor)) {
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
visited.delete(node);
|
|
110
|
-
path.pop();
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
if (hamiltonianCycleDFS(nodes[0])) {
|
|
114
|
-
return path;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Fallback: try to find any cycle using DFS
|
|
118
|
-
const visited = new Set();
|
|
119
|
-
const parent = {};
|
|
120
|
-
let cycleFound = null;
|
|
121
|
-
function findCycleDFS(node, parentNode) {
|
|
122
|
-
visited.add(node);
|
|
123
|
-
for (const neighbor of adjMap[node]) {
|
|
124
|
-
if (neighbor === parentNode)
|
|
125
|
-
continue;
|
|
126
|
-
if (visited.has(neighbor)) {
|
|
127
|
-
// Found a cycle
|
|
128
|
-
cycleFound = constructCycle(node, neighbor, parent);
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
parent[neighbor] = node;
|
|
132
|
-
if (findCycleDFS(neighbor, node)) {
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
function constructCycle(u, v, parent) {
|
|
139
|
-
const cycle = [v, u];
|
|
140
|
-
let current = u;
|
|
141
|
-
while (parent[current] !== undefined && parent[current] !== v) {
|
|
142
|
-
current = parent[current];
|
|
143
|
-
cycle.push(current);
|
|
144
|
-
}
|
|
145
|
-
return cycle;
|
|
146
|
-
}
|
|
147
|
-
// Try to find a cycle
|
|
148
|
-
for (const node of nodes) {
|
|
149
|
-
if (!visited.has(node)) {
|
|
150
|
-
parent[node] = null;
|
|
151
|
-
if (findCycleDFS(node, null)) {
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return cycleFound || nodes; // Fallback to all nodes if no cycle found
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Convert a combinatorial embedding to node positions
|
|
160
|
-
*
|
|
161
|
-
* @param embedding - The embedding object
|
|
162
|
-
* @param nodes - List of nodes
|
|
163
|
-
* @returns Dictionary mapping nodes to positions
|
|
164
|
-
*/
|
|
165
|
-
export function combinatorialEmbeddingToPos(embedding, nodes) {
|
|
166
|
-
const pos = {};
|
|
167
|
-
// Use the positions from the embedding
|
|
168
|
-
for (const node of nodes) {
|
|
169
|
-
if (embedding.nodePositions[node]) {
|
|
170
|
-
pos[node] = embedding.nodePositions[node];
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
// Fallback for any nodes without positions
|
|
174
|
-
pos[node] = [0, 0];
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return pos;
|
|
178
|
-
}
|
|
179
|
-
//# sourceMappingURL=embedding.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../../../src/algorithms/planarity/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Re-export all planarity algorithms
|
|
3
|
-
*/
|
|
4
|
-
export { checkPlanarity } from './check';
|
|
5
|
-
export { isK5, isK33, tryFindBipartitePartition } from './special-graphs';
|
|
6
|
-
export { lrPlanarityTest } from './lr-test';
|
|
7
|
-
export { createTriangulationEmbedding, findCycle, combinatorialEmbeddingToPos } from './embedding';
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Re-export all planarity algorithms
|
|
3
|
-
*/
|
|
4
|
-
export { checkPlanarity } from './check';
|
|
5
|
-
export { isK5, isK33, tryFindBipartitePartition } from './special-graphs';
|
|
6
|
-
export { lrPlanarityTest } from './lr-test';
|
|
7
|
-
export { createTriangulationEmbedding, findCycle, combinatorialEmbeddingToPos } from './embedding';
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/algorithms/planarity/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,4BAA4B,EAC5B,SAAS,EACT,2BAA2B,EAC5B,MAAM,aAAa,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Left-Right Planarity Test implementation
|
|
3
|
-
*/
|
|
4
|
-
import { Node, Edge, Embedding } from '../../types';
|
|
5
|
-
/**
|
|
6
|
-
* Left-Right Planarity Test for general graphs
|
|
7
|
-
*
|
|
8
|
-
* @param nodes - List of nodes
|
|
9
|
-
* @param edges - List of edges
|
|
10
|
-
* @returns Object containing isPlanar flag and embedding
|
|
11
|
-
*/
|
|
12
|
-
export declare function lrPlanarityTest(nodes: Node[], edges: Edge[]): {
|
|
13
|
-
isPlanar: boolean;
|
|
14
|
-
embedding: Embedding | null;
|
|
15
|
-
};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Left-Right Planarity Test implementation
|
|
3
|
-
*/
|
|
4
|
-
import { createTriangulationEmbedding } from './embedding';
|
|
5
|
-
/**
|
|
6
|
-
* Left-Right Planarity Test for general graphs
|
|
7
|
-
*
|
|
8
|
-
* @param nodes - List of nodes
|
|
9
|
-
* @param edges - List of edges
|
|
10
|
-
* @returns Object containing isPlanar flag and embedding
|
|
11
|
-
*/
|
|
12
|
-
export function lrPlanarityTest(nodes, edges) {
|
|
13
|
-
// Create adjacency list for the graph
|
|
14
|
-
const adjList = {};
|
|
15
|
-
for (const node of nodes) {
|
|
16
|
-
adjList[node] = [];
|
|
17
|
-
}
|
|
18
|
-
for (const [u, v] of edges) {
|
|
19
|
-
adjList[u].push(v);
|
|
20
|
-
adjList[v].push(u);
|
|
21
|
-
}
|
|
22
|
-
// Step 1: Perform DFS to get an st-numbering (ordering of nodes)
|
|
23
|
-
const visited = new Set();
|
|
24
|
-
const ordering = [];
|
|
25
|
-
function dfs(node) {
|
|
26
|
-
visited.add(node);
|
|
27
|
-
ordering.push(node);
|
|
28
|
-
for (const neighbor of adjList[node]) {
|
|
29
|
-
if (!visited.has(neighbor)) {
|
|
30
|
-
dfs(neighbor);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// Start DFS from first node
|
|
35
|
-
dfs(nodes[0]);
|
|
36
|
-
// If the graph is disconnected, it's still planar but we need to handle each component
|
|
37
|
-
if (ordering.length < nodes.length) {
|
|
38
|
-
// Create a simple triangulation embedding for disconnected graphs
|
|
39
|
-
return { isPlanar: true, embedding: createTriangulationEmbedding(nodes, edges) };
|
|
40
|
-
}
|
|
41
|
-
// Step 2: For a general implementation, we'll use a simplified approach
|
|
42
|
-
// since this would normally require implementing the entire LR algorithm
|
|
43
|
-
// For this implementation, since we can't fully implement Boyer-Myrvold,
|
|
44
|
-
// we'll create a reasonable planar embedding for most planar graphs
|
|
45
|
-
// We assume the graph is planar if it's sparse enough (|E| <= 3|V| - 6)
|
|
46
|
-
// This is a necessary but not sufficient condition for planar graphs
|
|
47
|
-
if (edges.length > 3 * nodes.length - 6) {
|
|
48
|
-
return { isPlanar: false, embedding: null };
|
|
49
|
-
}
|
|
50
|
-
// Create a planar embedding using a triangulation approach
|
|
51
|
-
const embedding = createTriangulationEmbedding(nodes, edges);
|
|
52
|
-
return { isPlanar: true, embedding };
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=lr-test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lr-test.js","sourceRoot":"","sources":["../../../../src/algorithms/planarity/lr-test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAa,EACb,KAAa;IAEb,sCAAsC;IACtC,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,iEAAiE;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAChC,MAAM,QAAQ,GAAW,EAAE,CAAC;IAE5B,SAAS,GAAG,CAAC,IAAU;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpB,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEd,uFAAuF;IACvF,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACnC,kEAAkE;QAClE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IACnF,CAAC;IAED,wEAAwE;IACxE,yEAAyE;IAEzE,yEAAyE;IACzE,oEAAoE;IAEpE,wEAAwE;IACxE,qEAAqE;IACrE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,2DAA2D;IAC3D,MAAM,SAAS,GAAG,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE7D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Special graph detection functions for planarity testing
|
|
3
|
-
*/
|
|
4
|
-
import { Node, Edge } from '../../types';
|
|
5
|
-
/**
|
|
6
|
-
* Check if graph is K5 (complete graph with 5 nodes)
|
|
7
|
-
*
|
|
8
|
-
* @param nodes - List of nodes
|
|
9
|
-
* @param edges - List of edges
|
|
10
|
-
* @returns True if graph is K5
|
|
11
|
-
*/
|
|
12
|
-
export declare function isK5(nodes: Node[], edges: Edge[]): boolean;
|
|
13
|
-
/**
|
|
14
|
-
* Check if graph is K3,3 (complete bipartite with 3,3 nodes)
|
|
15
|
-
*
|
|
16
|
-
* @param nodes - List of nodes
|
|
17
|
-
* @param edges - List of edges
|
|
18
|
-
* @returns True if graph is K3,3
|
|
19
|
-
*/
|
|
20
|
-
export declare function isK33(nodes: Node[], edges: Edge[]): boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Try to find a bipartite partition of the nodes
|
|
23
|
-
*
|
|
24
|
-
* @param nodes - List of nodes
|
|
25
|
-
* @param edges - List of edges
|
|
26
|
-
* @returns Array of two partitions, or null if not bipartite
|
|
27
|
-
*/
|
|
28
|
-
export declare function tryFindBipartitePartition(nodes: Node[], edges: Edge[]): [Node[], Node[]] | null;
|