@graphty/layout 1.2.2 → 1.2.4

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.
Files changed (200) hide show
  1. package/README.md +317 -237
  2. package/dist/src/algorithms/index.d.ts +5 -0
  3. package/dist/src/algorithms/index.js +6 -0
  4. package/dist/src/algorithms/index.js.map +1 -0
  5. package/dist/src/algorithms/optimization/index.d.ts +7 -0
  6. package/dist/src/algorithms/optimization/index.js +7 -0
  7. package/dist/src/algorithms/optimization/index.js.map +1 -0
  8. package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +32 -0
  9. package/dist/src/algorithms/optimization/kamada-kawai-solver.js +176 -0
  10. package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +1 -0
  11. package/dist/src/algorithms/optimization/lbfgs.d.ts +13 -0
  12. package/dist/src/algorithms/optimization/lbfgs.js +56 -0
  13. package/dist/src/algorithms/optimization/lbfgs.js.map +1 -0
  14. package/dist/src/algorithms/optimization/line-search.d.ts +15 -0
  15. package/dist/src/algorithms/optimization/line-search.js +37 -0
  16. package/dist/src/algorithms/optimization/line-search.js.map +1 -0
  17. package/dist/src/algorithms/optimization/types.d.ts +5 -0
  18. package/dist/src/algorithms/optimization/types.js +5 -0
  19. package/dist/src/algorithms/optimization/types.js.map +1 -0
  20. package/dist/src/algorithms/planarity/check.d.ts +17 -0
  21. package/dist/src/algorithms/planarity/check.js +30 -0
  22. package/dist/src/algorithms/planarity/check.js.map +1 -0
  23. package/dist/src/algorithms/planarity/embedding.d.ts +29 -0
  24. package/dist/src/algorithms/planarity/embedding.js +179 -0
  25. package/dist/src/algorithms/planarity/embedding.js.map +1 -0
  26. package/dist/src/algorithms/planarity/index.d.ts +7 -0
  27. package/dist/src/algorithms/planarity/index.js +8 -0
  28. package/dist/src/algorithms/planarity/index.js.map +1 -0
  29. package/dist/src/algorithms/planarity/lr-test.d.ts +15 -0
  30. package/dist/src/algorithms/planarity/lr-test.js +54 -0
  31. package/dist/src/algorithms/planarity/lr-test.js.map +1 -0
  32. package/dist/src/algorithms/planarity/special-graphs.d.ts +28 -0
  33. package/dist/src/algorithms/planarity/special-graphs.js +108 -0
  34. package/dist/src/algorithms/planarity/special-graphs.js.map +1 -0
  35. package/dist/src/generators/basic.d.ts +28 -0
  36. package/dist/src/generators/basic.js +79 -0
  37. package/dist/src/generators/basic.js.map +1 -0
  38. package/dist/src/generators/bipartite.d.ts +16 -0
  39. package/dist/src/generators/bipartite.js +40 -0
  40. package/dist/src/generators/bipartite.js.map +1 -0
  41. package/dist/src/generators/grid.d.ts +11 -0
  42. package/dist/src/generators/grid.js +37 -0
  43. package/dist/src/generators/grid.js.map +1 -0
  44. package/dist/src/generators/index.d.ts +8 -0
  45. package/dist/src/generators/index.js +9 -0
  46. package/dist/src/generators/index.js.map +1 -0
  47. package/dist/src/generators/random.d.ts +12 -0
  48. package/dist/src/generators/random.js +34 -0
  49. package/dist/src/generators/random.js.map +1 -0
  50. package/dist/src/generators/scale-free.d.ts +12 -0
  51. package/dist/src/generators/scale-free.js +62 -0
  52. package/dist/src/generators/scale-free.js.map +1 -0
  53. package/dist/src/index.d.ts +10 -0
  54. package/dist/src/index.js +15 -0
  55. package/dist/src/index.js.map +1 -0
  56. package/dist/src/layouts/basic/index.d.ts +4 -0
  57. package/dist/src/layouts/basic/index.js +5 -0
  58. package/dist/src/layouts/basic/index.js.map +1 -0
  59. package/dist/src/layouts/basic/random.d.ts +14 -0
  60. package/dist/src/layouts/basic/random.js +27 -0
  61. package/dist/src/layouts/basic/random.js.map +1 -0
  62. package/dist/src/layouts/force-directed/arf.d.ts +13 -0
  63. package/dist/src/layouts/force-directed/arf.js +103 -0
  64. package/dist/src/layouts/force-directed/arf.js.map +1 -0
  65. package/dist/src/layouts/force-directed/forceatlas2.d.ts +22 -0
  66. package/dist/src/layouts/force-directed/forceatlas2.js +322 -0
  67. package/dist/src/layouts/force-directed/forceatlas2.js.map +1 -0
  68. package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +19 -0
  69. package/dist/src/layouts/force-directed/fruchterman-reingold.js +131 -0
  70. package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +1 -0
  71. package/dist/src/layouts/force-directed/index.d.ts +8 -0
  72. package/dist/src/layouts/force-directed/index.js +9 -0
  73. package/dist/src/layouts/force-directed/index.js.map +1 -0
  74. package/dist/src/layouts/force-directed/kamada-kawai.d.ts +15 -0
  75. package/dist/src/layouts/force-directed/kamada-kawai.js +87 -0
  76. package/dist/src/layouts/force-directed/kamada-kawai.js.map +1 -0
  77. package/dist/src/layouts/force-directed/spring.d.ts +19 -0
  78. package/dist/src/layouts/force-directed/spring.js +23 -0
  79. package/dist/src/layouts/force-directed/spring.js.map +1 -0
  80. package/dist/src/layouts/geometric/circular.d.ts +14 -0
  81. package/dist/src/layouts/geometric/circular.js +67 -0
  82. package/dist/src/layouts/geometric/circular.js.map +1 -0
  83. package/dist/src/layouts/geometric/index.d.ts +6 -0
  84. package/dist/src/layouts/geometric/index.js +7 -0
  85. package/dist/src/layouts/geometric/index.js.map +1 -0
  86. package/dist/src/layouts/geometric/shell.d.ts +15 -0
  87. package/dist/src/layouts/geometric/shell.js +67 -0
  88. package/dist/src/layouts/geometric/shell.js.map +1 -0
  89. package/dist/src/layouts/geometric/spiral.d.ts +16 -0
  90. package/dist/src/layouts/geometric/spiral.js +73 -0
  91. package/dist/src/layouts/geometric/spiral.js.map +1 -0
  92. package/dist/src/layouts/hierarchical/bfs.d.ts +12 -0
  93. package/dist/src/layouts/hierarchical/bfs.js +62 -0
  94. package/dist/src/layouts/hierarchical/bfs.js.map +1 -0
  95. package/dist/src/layouts/hierarchical/bipartite.d.ts +16 -0
  96. package/dist/src/layouts/hierarchical/bipartite.js +72 -0
  97. package/dist/src/layouts/hierarchical/bipartite.js.map +1 -0
  98. package/dist/src/layouts/hierarchical/index.d.ts +6 -0
  99. package/dist/src/layouts/hierarchical/index.js +7 -0
  100. package/dist/src/layouts/hierarchical/index.js.map +1 -0
  101. package/dist/src/layouts/hierarchical/multipartite.d.ts +12 -0
  102. package/dist/src/layouts/hierarchical/multipartite.js +73 -0
  103. package/dist/src/layouts/hierarchical/multipartite.js.map +1 -0
  104. package/dist/src/layouts/index.d.ts +8 -0
  105. package/dist/src/layouts/index.js +9 -0
  106. package/dist/src/layouts/index.js.map +1 -0
  107. package/dist/src/layouts/specialized/index.d.ts +5 -0
  108. package/dist/src/layouts/specialized/index.js +6 -0
  109. package/dist/src/layouts/specialized/index.js.map +1 -0
  110. package/dist/src/layouts/specialized/planar.d.ts +14 -0
  111. package/dist/src/layouts/specialized/planar.js +47 -0
  112. package/dist/src/layouts/specialized/planar.js.map +1 -0
  113. package/dist/src/layouts/specialized/spectral.d.ts +14 -0
  114. package/dist/src/layouts/specialized/spectral.js +106 -0
  115. package/dist/src/layouts/specialized/spectral.js.map +1 -0
  116. package/dist/src/types/embedding.d.ts +9 -0
  117. package/dist/src/types/embedding.js +5 -0
  118. package/dist/src/types/embedding.js.map +1 -0
  119. package/dist/src/types/graph.d.ts +10 -0
  120. package/dist/src/types/graph.js +5 -0
  121. package/dist/src/types/graph.js.map +1 -0
  122. package/dist/src/types/index.d.ts +6 -0
  123. package/dist/src/types/index.js +7 -0
  124. package/dist/src/types/index.js.map +1 -0
  125. package/dist/src/types/layout.d.ts +6 -0
  126. package/dist/src/types/layout.js +5 -0
  127. package/dist/src/types/layout.js.map +1 -0
  128. package/dist/src/utils/graph.d.ts +34 -0
  129. package/dist/src/utils/graph.js +69 -0
  130. package/dist/src/utils/graph.js.map +1 -0
  131. package/dist/src/utils/index.d.ts +8 -0
  132. package/dist/src/utils/index.js +9 -0
  133. package/dist/src/utils/index.js.map +1 -0
  134. package/dist/src/utils/numpy.d.ts +17 -0
  135. package/dist/src/utils/numpy.js +101 -0
  136. package/dist/src/utils/numpy.js.map +1 -0
  137. package/dist/src/utils/params.d.ts +17 -0
  138. package/dist/src/utils/params.js +22 -0
  139. package/dist/src/utils/params.js.map +1 -0
  140. package/dist/src/utils/random.d.ts +14 -0
  141. package/dist/src/utils/random.js +42 -0
  142. package/dist/src/utils/random.js.map +1 -0
  143. package/dist/src/utils/rescale.d.ts +21 -0
  144. package/dist/src/utils/rescale.js +119 -0
  145. package/dist/src/utils/rescale.js.map +1 -0
  146. package/dist/vitest.config.js +1 -1
  147. package/dist/vitest.config.js.map +1 -1
  148. package/package.json +15 -1
  149. package/.env.example +0 -11
  150. package/.github/workflows/ci.yml +0 -101
  151. package/.releaserc.json +0 -22
  152. package/CHANGELOG.md +0 -45
  153. package/CLAUDE.md +0 -104
  154. package/CONTRIBUTING.md +0 -1
  155. package/DEPLOYMENT.md +0 -59
  156. package/commitlint.config.js +0 -37
  157. package/examples/3d-force-directed.html +0 -611
  158. package/examples/3d-kamada-kawai.html +0 -379
  159. package/examples/3d-layout-comparison.html +0 -448
  160. package/examples/3d-spherical-layout.html +0 -319
  161. package/examples/arf-layout.html +0 -524
  162. package/examples/bfs-layout.html +0 -487
  163. package/examples/bipartite-layout.html +0 -382
  164. package/examples/circular-layout.html +0 -292
  165. package/examples/forceatlas2-layout.html +0 -588
  166. package/examples/index.html +0 -241
  167. package/examples/kamada-kawai-layout.html +0 -425
  168. package/examples/layout-helpers.js +0 -486
  169. package/examples/multipartite-layout.html +0 -410
  170. package/examples/planar-layout.html +0 -388
  171. package/examples/random-layout.html +0 -328
  172. package/examples/shell-layout.html +0 -323
  173. package/examples/spectral-layout.html +0 -335
  174. package/examples/spiral-layout.html +0 -447
  175. package/examples/spring-layout.html +0 -313
  176. package/test/arf-layout.test.ts +0 -443
  177. package/test/bfs-layout.test.ts +0 -427
  178. package/test/bipartite-layout.test.ts +0 -344
  179. package/test/circular-layout.test.ts +0 -442
  180. package/test/forceatlas2-layout.test.ts +0 -405
  181. package/test/fruchterman-reingold-layout.test.ts +0 -477
  182. package/test/graph-generators.test.ts +0 -450
  183. package/test/kamada-kawai-layout.test.ts +0 -623
  184. package/test/multipartite-layout.test.ts +0 -404
  185. package/test/planar-layout.test.ts +0 -266
  186. package/test/random-layout.test.ts +0 -254
  187. package/test/rescale-layout.test.ts +0 -373
  188. package/test/shell-layout.test.ts +0 -347
  189. package/test/spectral-layout.test.ts +0 -378
  190. package/test/spiral-layout.test.ts +0 -338
  191. package/test/spring-layout.test.ts +0 -241
  192. package/test/test-utils.ts +0 -34
  193. package/test/utils-graph.test.ts +0 -155
  194. package/test/utils-index.test.ts +0 -77
  195. package/test/utils-numpy.test.ts +0 -272
  196. package/test/utils-params.test.ts +0 -99
  197. package/test/utils-random.test.ts +0 -229
  198. package/tsconfig.json +0 -16
  199. package/vite.config.js +0 -36
  200. package/vitest.config.ts +0 -30
@@ -0,0 +1,179 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../../../src/algorithms/planarity/embedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
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';
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,15 @@
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
+ };
@@ -0,0 +1,54 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,28 @@
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;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Special graph detection functions for planarity testing
3
+ */
4
+ /**
5
+ * Check if graph is K5 (complete graph with 5 nodes)
6
+ *
7
+ * @param nodes - List of nodes
8
+ * @param edges - List of edges
9
+ * @returns True if graph is K5
10
+ */
11
+ export function isK5(nodes, edges) {
12
+ if (nodes.length !== 5)
13
+ return false;
14
+ // K5 has exactly 10 edges
15
+ if (edges.length !== 10)
16
+ return false;
17
+ // Check if every pair of distinct nodes is connected
18
+ for (let i = 0; i < nodes.length; i++) {
19
+ for (let j = i + 1; j < nodes.length; j++) {
20
+ const hasEdge = edges.some(e => (e[0] === nodes[i] && e[1] === nodes[j]) ||
21
+ (e[0] === nodes[j] && e[1] === nodes[i]));
22
+ if (!hasEdge)
23
+ return false;
24
+ }
25
+ }
26
+ return true;
27
+ }
28
+ /**
29
+ * Check if graph is K3,3 (complete bipartite with 3,3 nodes)
30
+ *
31
+ * @param nodes - List of nodes
32
+ * @param edges - List of edges
33
+ * @returns True if graph is K3,3
34
+ */
35
+ export function isK33(nodes, edges) {
36
+ if (nodes.length !== 6)
37
+ return false;
38
+ // K3,3 has exactly 9 edges
39
+ if (edges.length !== 9)
40
+ return false;
41
+ // Try to find a bipartite partition
42
+ const nodePartitions = tryFindBipartitePartition(nodes, edges);
43
+ if (!nodePartitions)
44
+ return false;
45
+ const [part1, part2] = nodePartitions;
46
+ // Check if both partitions have size 3
47
+ if (part1.length !== 3 || part2.length !== 3)
48
+ return false;
49
+ // Check if every node in part1 is connected to every node in part2
50
+ for (const n1 of part1) {
51
+ for (const n2 of part2) {
52
+ const hasEdge = edges.some(e => (e[0] === n1 && e[1] === n2) ||
53
+ (e[0] === n2 && e[1] === n1));
54
+ if (!hasEdge)
55
+ return false;
56
+ }
57
+ }
58
+ return true;
59
+ }
60
+ /**
61
+ * Try to find a bipartite partition of the nodes
62
+ *
63
+ * @param nodes - List of nodes
64
+ * @param edges - List of edges
65
+ * @returns Array of two partitions, or null if not bipartite
66
+ */
67
+ export function tryFindBipartitePartition(nodes, edges) {
68
+ const colorMap = {};
69
+ const adjList = {};
70
+ // Create adjacency list
71
+ for (const node of nodes) {
72
+ adjList[node] = [];
73
+ }
74
+ for (const [u, v] of edges) {
75
+ adjList[u].push(v);
76
+ adjList[v].push(u);
77
+ }
78
+ // BFS to color nodes
79
+ const queue = [nodes[0]];
80
+ colorMap[nodes[0]] = 0;
81
+ while (queue.length > 0) {
82
+ const node = queue.shift();
83
+ const nodeColor = colorMap[node];
84
+ for (const neighbor of adjList[node]) {
85
+ if (colorMap[neighbor] === undefined) {
86
+ colorMap[neighbor] = 1 - nodeColor; // Toggle color (0/1)
87
+ queue.push(neighbor);
88
+ }
89
+ else if (colorMap[neighbor] === nodeColor) {
90
+ // Conflict: not bipartite
91
+ return null;
92
+ }
93
+ }
94
+ }
95
+ // Create partitions
96
+ const part0 = [];
97
+ const part1 = [];
98
+ for (const node of nodes) {
99
+ if (colorMap[node] === 0) {
100
+ part0.push(node);
101
+ }
102
+ else {
103
+ part1.push(node);
104
+ }
105
+ }
106
+ return [part0, part1];
107
+ }
108
+ //# sourceMappingURL=special-graphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"special-graphs.js","sourceRoot":"","sources":["../../../../src/algorithms/planarity/special-graphs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Basic graph generation functions
3
+ */
4
+ import { Graph } from '../types';
5
+ /**
6
+ * Create a complete graph with n nodes
7
+ * @param n - Number of nodes
8
+ * @returns Graph object with all nodes connected to all other nodes
9
+ */
10
+ export declare function completeGraph(n: number): Graph;
11
+ /**
12
+ * Create a cycle graph with n nodes
13
+ * @param n - Number of nodes
14
+ * @returns Graph object with nodes connected in a cycle
15
+ */
16
+ export declare function cycleGraph(n: number): Graph;
17
+ /**
18
+ * Create a star graph with n nodes (1 center + n-1 leaves)
19
+ * @param n - Total number of nodes
20
+ * @returns Graph object with star topology
21
+ */
22
+ export declare function starGraph(n: number): Graph;
23
+ /**
24
+ * Create a wheel graph with n nodes (1 center + n-1 rim nodes)
25
+ * @param n - Total number of nodes
26
+ * @returns Graph object with wheel topology
27
+ */
28
+ export declare function wheelGraph(n: number): Graph;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Basic graph generation functions
3
+ */
4
+ /**
5
+ * Create a complete graph with n nodes
6
+ * @param n - Number of nodes
7
+ * @returns Graph object with all nodes connected to all other nodes
8
+ */
9
+ export function completeGraph(n) {
10
+ const nodes = Array.from({ length: n }, (_, i) => i);
11
+ const edges = [];
12
+ for (let i = 0; i < n; i++) {
13
+ for (let j = i + 1; j < n; j++) {
14
+ edges.push([i, j]);
15
+ }
16
+ }
17
+ return {
18
+ nodes: () => nodes,
19
+ edges: () => edges
20
+ };
21
+ }
22
+ /**
23
+ * Create a cycle graph with n nodes
24
+ * @param n - Number of nodes
25
+ * @returns Graph object with nodes connected in a cycle
26
+ */
27
+ export function cycleGraph(n) {
28
+ const nodes = Array.from({ length: n }, (_, i) => i);
29
+ const edges = [];
30
+ for (let i = 0; i < n; i++) {
31
+ edges.push([i, (i + 1) % n]);
32
+ }
33
+ return {
34
+ nodes: () => nodes,
35
+ edges: () => edges
36
+ };
37
+ }
38
+ /**
39
+ * Create a star graph with n nodes (1 center + n-1 leaves)
40
+ * @param n - Total number of nodes
41
+ * @returns Graph object with star topology
42
+ */
43
+ export function starGraph(n) {
44
+ const nodes = Array.from({ length: n }, (_, i) => i);
45
+ const edges = [];
46
+ // Connect all nodes to node 0 (center)
47
+ for (let i = 1; i < n; i++) {
48
+ edges.push([0, i]);
49
+ }
50
+ return {
51
+ nodes: () => nodes,
52
+ edges: () => edges
53
+ };
54
+ }
55
+ /**
56
+ * Create a wheel graph with n nodes (1 center + n-1 rim nodes)
57
+ * @param n - Total number of nodes
58
+ * @returns Graph object with wheel topology
59
+ */
60
+ export function wheelGraph(n) {
61
+ const nodes = Array.from({ length: n }, (_, i) => i);
62
+ const edges = [];
63
+ // Connect all rim nodes to center (node 0)
64
+ for (let i = 1; i < n; i++) {
65
+ edges.push([0, i]);
66
+ }
67
+ // Connect rim nodes in a cycle
68
+ for (let i = 1; i < n - 1; i++) {
69
+ edges.push([i, i + 1]);
70
+ }
71
+ if (n > 2) {
72
+ edges.push([n - 1, 1]);
73
+ }
74
+ return {
75
+ nodes: () => nodes,
76
+ edges: () => edges
77
+ };
78
+ }
79
+ //# sourceMappingURL=basic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.js","sourceRoot":"","sources":["../../../src/generators/basic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Bipartite graph generation function
3
+ */
4
+ import { Graph, Node } from '../types';
5
+ /**
6
+ * Create a bipartite graph with two sets of nodes
7
+ * @param n1 - Number of nodes in first set
8
+ * @param n2 - Number of nodes in second set
9
+ * @param p - Probability of edge between nodes in different sets
10
+ * @param seed - Random seed for reproducibility
11
+ * @returns Graph object with bipartite structure and setA/setB properties
12
+ */
13
+ export declare function bipartiteGraph(n1: number, n2: number, p: number, seed?: number): Graph & {
14
+ setA: Node[];
15
+ setB: Node[];
16
+ };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Bipartite graph generation function
3
+ */
4
+ /**
5
+ * Create a bipartite graph with two sets of nodes
6
+ * @param n1 - Number of nodes in first set
7
+ * @param n2 - Number of nodes in second set
8
+ * @param p - Probability of edge between nodes in different sets
9
+ * @param seed - Random seed for reproducibility
10
+ * @returns Graph object with bipartite structure and setA/setB properties
11
+ */
12
+ export function bipartiteGraph(n1, n2, p, seed) {
13
+ const setA = Array.from({ length: n1 }, (_, i) => `A${i}`);
14
+ const setB = Array.from({ length: n2 }, (_, i) => `B${i}`);
15
+ const nodes = [...setA, ...setB];
16
+ const edges = [];
17
+ // Simple deterministic pseudo-random if seed provided
18
+ let currentSeed = seed;
19
+ let random = seed !== undefined
20
+ ? () => {
21
+ currentSeed = (currentSeed * 9301 + 49297) % 233280;
22
+ return currentSeed / 233280;
23
+ }
24
+ : Math.random;
25
+ // Only connect nodes between sets
26
+ for (const a of setA) {
27
+ for (const b of setB) {
28
+ if (random() < p) {
29
+ edges.push([a, b]);
30
+ }
31
+ }
32
+ }
33
+ return {
34
+ nodes: () => nodes,
35
+ edges: () => edges,
36
+ setA,
37
+ setB
38
+ };
39
+ }
40
+ //# sourceMappingURL=bipartite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bipartite.js","sourceRoot":"","sources":["../../../src/generators/bipartite.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,IAAa;IAC7E,MAAM,IAAI,GAAW,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,IAAI,GAAW,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,sDAAsD;IACtD,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,MAAM,GAAG,IAAI,KAAK,SAAS;QAC7B,CAAC,CAAC,GAAG,EAAE;YACH,WAAW,GAAG,CAAC,WAAY,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC;YACrD,OAAO,WAAW,GAAG,MAAM,CAAC;QAC9B,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAEhB,kCAAkC;IAClC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,IAAI;QACJ,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Grid graph generation function
3
+ */
4
+ import { Graph } from '../types';
5
+ /**
6
+ * Create a grid graph with rows x cols nodes
7
+ * @param rows - Number of rows
8
+ * @param cols - Number of columns
9
+ * @returns Graph object with grid topology
10
+ */
11
+ export declare function gridGraph(rows: number, cols: number): Graph;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Grid graph generation function
3
+ */
4
+ /**
5
+ * Create a grid graph with rows x cols nodes
6
+ * @param rows - Number of rows
7
+ * @param cols - Number of columns
8
+ * @returns Graph object with grid topology
9
+ */
10
+ export function gridGraph(rows, cols) {
11
+ const nodes = [];
12
+ const edges = [];
13
+ // Create nodes
14
+ for (let i = 0; i < rows; i++) {
15
+ for (let j = 0; j < cols; j++) {
16
+ nodes.push(`${i},${j}`);
17
+ }
18
+ }
19
+ // Create edges
20
+ for (let i = 0; i < rows; i++) {
21
+ for (let j = 0; j < cols; j++) {
22
+ // Connect to right neighbor
23
+ if (j < cols - 1) {
24
+ edges.push([`${i},${j}`, `${i},${j + 1}`]);
25
+ }
26
+ // Connect to bottom neighbor
27
+ if (i < rows - 1) {
28
+ edges.push([`${i},${j}`, `${i + 1},${j}`]);
29
+ }
30
+ }
31
+ }
32
+ return {
33
+ nodes: () => nodes,
34
+ edges: () => edges
35
+ };
36
+ }
37
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../../src/generators/grid.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY;IAClD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,eAAe;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,eAAe;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,4BAA4B;YAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,6BAA6B;YAC7B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC"}