graphbox 1.2.0 → 1.2.2

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 (286) hide show
  1. package/dist/__tests__/integration/bipartite.integration.test.d.ts +9 -0
  2. package/dist/__tests__/integration/bipartite.integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/integration/chordal.integration.test.d.ts +9 -0
  4. package/dist/__tests__/integration/chordal.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/integration/cograph.integration.test.d.ts +8 -0
  6. package/dist/__tests__/integration/cograph.integration.test.d.ts.map +1 -0
  7. package/dist/__tests__/integration/comparability.integration.test.d.ts +8 -0
  8. package/dist/__tests__/integration/comparability.integration.test.d.ts.map +1 -0
  9. package/dist/__tests__/integration/eulerian.integration.test.d.ts +9 -0
  10. package/dist/__tests__/integration/eulerian.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/integration/hamiltonian.integration.test.d.ts +8 -0
  12. package/dist/__tests__/integration/hamiltonian.integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/helpers.d.ts +8 -0
  14. package/dist/__tests__/integration/helpers.d.ts.map +1 -0
  15. package/dist/__tests__/integration/interval.integration.test.d.ts +8 -0
  16. package/dist/__tests__/integration/interval.integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/integration/perfect.integration.test.d.ts +8 -0
  18. package/dist/__tests__/integration/perfect.integration.test.d.ts.map +1 -0
  19. package/dist/__tests__/integration/permutation.integration.test.d.ts +8 -0
  20. package/dist/__tests__/integration/permutation.integration.test.d.ts.map +1 -0
  21. package/dist/__tests__/integration/planar.integration.test.d.ts +8 -0
  22. package/dist/__tests__/integration/planar.integration.test.d.ts.map +1 -0
  23. package/dist/__tests__/integration/regular.integration.test.d.ts +8 -0
  24. package/dist/__tests__/integration/regular.integration.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/split.integration.test.d.ts +8 -0
  26. package/dist/__tests__/integration/split.integration.test.d.ts.map +1 -0
  27. package/dist/__tests__/integration/tree.integration.test.d.ts +8 -0
  28. package/dist/__tests__/integration/tree.integration.test.d.ts.map +1 -0
  29. package/dist/algorithms/analysis/connected-components.unit.test.d.ts +5 -0
  30. package/dist/algorithms/analysis/connected-components.unit.test.d.ts.map +1 -0
  31. package/dist/algorithms/analysis/cycle-detection.unit.test.d.ts +5 -0
  32. package/dist/algorithms/analysis/cycle-detection.unit.test.d.ts.map +1 -0
  33. package/dist/algorithms/analysis/scc.unit.test.d.ts +5 -0
  34. package/dist/algorithms/analysis/scc.unit.test.d.ts.map +1 -0
  35. package/dist/algorithms/analysis/topological-sort.unit.test.d.ts +5 -0
  36. package/dist/algorithms/analysis/topological-sort.unit.test.d.ts.map +1 -0
  37. package/dist/algorithms/clustering/infomap.unit.test.d.ts +5 -0
  38. package/dist/algorithms/clustering/infomap.unit.test.d.ts.map +1 -0
  39. package/dist/algorithms/clustering/label-propagation.unit.test.d.ts +5 -0
  40. package/dist/algorithms/clustering/label-propagation.unit.test.d.ts.map +1 -0
  41. package/dist/algorithms/clustering/leiden.unit.test.d.ts +5 -0
  42. package/dist/algorithms/clustering/leiden.unit.test.d.ts.map +1 -0
  43. package/dist/algorithms/clustering/louvain.unit.test.d.ts +5 -0
  44. package/dist/algorithms/clustering/louvain.unit.test.d.ts.map +1 -0
  45. package/dist/algorithms/decomposition/biconnected.unit.test.d.ts +2 -0
  46. package/dist/algorithms/decomposition/biconnected.unit.test.d.ts.map +1 -0
  47. package/dist/algorithms/decomposition/core-periphery.unit.test.d.ts +2 -0
  48. package/dist/algorithms/decomposition/core-periphery.unit.test.d.ts.map +1 -0
  49. package/dist/algorithms/decomposition/k-core.unit.test.d.ts +2 -0
  50. package/dist/algorithms/decomposition/k-core.unit.test.d.ts.map +1 -0
  51. package/dist/algorithms/extraction/filter.unit.test.d.ts +5 -0
  52. package/dist/algorithms/extraction/filter.unit.test.d.ts.map +1 -0
  53. package/dist/algorithms/extraction/motif.unit.test.d.ts +5 -0
  54. package/dist/algorithms/extraction/motif.unit.test.d.ts.map +1 -0
  55. package/dist/algorithms/extraction/path.unit.test.d.ts +5 -0
  56. package/dist/algorithms/extraction/path.unit.test.d.ts.map +1 -0
  57. package/dist/algorithms/extraction/subgraph.unit.test.d.ts +5 -0
  58. package/dist/algorithms/extraction/subgraph.unit.test.d.ts.map +1 -0
  59. package/dist/algorithms/extraction/truss.unit.test.d.ts +5 -0
  60. package/dist/algorithms/extraction/truss.unit.test.d.ts.map +1 -0
  61. package/dist/algorithms/extraction/validators.unit.test.d.ts +2 -0
  62. package/dist/algorithms/extraction/validators.unit.test.d.ts.map +1 -0
  63. package/dist/algorithms/graph/graph-adapter.d.ts.map +1 -1
  64. package/dist/algorithms/graph/graph-adapter.unit.test.d.ts +2 -0
  65. package/dist/algorithms/graph/graph-adapter.unit.test.d.ts.map +1 -0
  66. package/dist/algorithms/graph/graph.unit.test.d.ts +5 -0
  67. package/dist/algorithms/graph/graph.unit.test.d.ts.map +1 -0
  68. package/dist/algorithms/hierarchical/clustering.unit.test.d.ts +2 -0
  69. package/dist/algorithms/hierarchical/clustering.unit.test.d.ts.map +1 -0
  70. package/dist/algorithms/layout/hierarchical-layout.unit.test.d.ts +5 -0
  71. package/dist/algorithms/layout/hierarchical-layout.unit.test.d.ts.map +1 -0
  72. package/dist/algorithms/metrics/cluster-quality.unit.test.d.ts +5 -0
  73. package/dist/algorithms/metrics/cluster-quality.unit.test.d.ts.map +1 -0
  74. package/dist/algorithms/metrics/conductance.unit.test.d.ts +5 -0
  75. package/dist/algorithms/metrics/conductance.unit.test.d.ts.map +1 -0
  76. package/dist/algorithms/metrics/modularity.d.ts.map +1 -1
  77. package/dist/algorithms/metrics/modularity.unit.test.d.ts +5 -0
  78. package/dist/algorithms/metrics/modularity.unit.test.d.ts.map +1 -0
  79. package/dist/algorithms/partitioning/spectral.unit.test.d.ts +5 -0
  80. package/dist/algorithms/partitioning/spectral.unit.test.d.ts.map +1 -0
  81. package/dist/algorithms/pathfinding/dijkstra.unit.test.d.ts +5 -0
  82. package/dist/algorithms/pathfinding/dijkstra.unit.test.d.ts.map +1 -0
  83. package/dist/algorithms/pathfinding/mutual-information.unit.test.d.ts +2 -0
  84. package/dist/algorithms/pathfinding/mutual-information.unit.test.d.ts.map +1 -0
  85. package/dist/algorithms/pathfinding/path-ranking.unit.test.d.ts +2 -0
  86. package/dist/algorithms/pathfinding/path-ranking.unit.test.d.ts.map +1 -0
  87. package/dist/algorithms/pathfinding/priority-queue.unit.test.d.ts +5 -0
  88. package/dist/algorithms/pathfinding/priority-queue.unit.test.d.ts.map +1 -0
  89. package/dist/algorithms/traversal/degree-prioritised-expansion.unit.test.d.ts +5 -0
  90. package/dist/algorithms/traversal/degree-prioritised-expansion.unit.test.d.ts.map +1 -0
  91. package/dist/algorithms/utils/csr.unit.test.d.ts +2 -0
  92. package/dist/algorithms/utils/csr.unit.test.d.ts.map +1 -0
  93. package/dist/algorithms/utils/type-guards.unit.test.d.ts +2 -0
  94. package/dist/algorithms/utils/type-guards.unit.test.d.ts.map +1 -0
  95. package/dist/algorithms/utils/validators.unit.test.d.ts +2 -0
  96. package/dist/algorithms/utils/validators.unit.test.d.ts.map +1 -0
  97. package/dist/analyzer/advanced-props.unit.test.d.ts +5 -0
  98. package/dist/analyzer/advanced-props.unit.test.d.ts.map +1 -0
  99. package/dist/analyzer/advanced-structures.unit.test.d.ts +5 -0
  100. package/dist/analyzer/advanced-structures.unit.test.d.ts.map +1 -0
  101. package/dist/analyzer/connectivity.unit.test.d.ts +5 -0
  102. package/dist/analyzer/connectivity.unit.test.d.ts.map +1 -0
  103. package/dist/analyzer/core-props.unit.test.d.ts +5 -0
  104. package/dist/analyzer/core-props.unit.test.d.ts.map +1 -0
  105. package/dist/analyzer/helpers.unit.test.d.ts +9 -0
  106. package/dist/analyzer/helpers.unit.test.d.ts.map +1 -0
  107. package/dist/analyzer/main.unit.test.d.ts +5 -0
  108. package/dist/analyzer/main.unit.test.d.ts.map +1 -0
  109. package/dist/analyzer/path-props.unit.test.d.ts +5 -0
  110. package/dist/analyzer/path-props.unit.test.d.ts.map +1 -0
  111. package/dist/analyzer/predicates.d.ts +1 -0
  112. package/dist/analyzer/predicates.d.ts.map +1 -1
  113. package/dist/analyzer/predicates.unit.test.d.ts +5 -0
  114. package/dist/analyzer/predicates.unit.test.d.ts.map +1 -0
  115. package/dist/analyzer/spectral.unit.test.d.ts +5 -0
  116. package/dist/analyzer/spectral.unit.test.d.ts.map +1 -0
  117. package/dist/analyzer/structure.unit.test.d.ts +5 -0
  118. package/dist/analyzer/structure.unit.test.d.ts.map +1 -0
  119. package/dist/cli.js +1 -1
  120. package/dist/experiments/baselines/frontier-balanced.unit.test.d.ts +2 -0
  121. package/dist/experiments/baselines/frontier-balanced.unit.test.d.ts.map +1 -0
  122. package/dist/experiments/baselines/random-priority.unit.test.d.ts +2 -0
  123. package/dist/experiments/baselines/random-priority.unit.test.d.ts.map +1 -0
  124. package/dist/experiments/baselines/standard-bfs.unit.test.d.ts +2 -0
  125. package/dist/experiments/baselines/standard-bfs.unit.test.d.ts.map +1 -0
  126. package/dist/experiments/evaluation/baselines/degree-ranker.unit.test.d.ts +2 -0
  127. package/dist/experiments/evaluation/baselines/degree-ranker.unit.test.d.ts.map +1 -0
  128. package/dist/experiments/evaluation/baselines/pagerank-ranker.unit.test.d.ts +2 -0
  129. package/dist/experiments/evaluation/baselines/pagerank-ranker.unit.test.d.ts.map +1 -0
  130. package/dist/experiments/evaluation/baselines/random-ranker.unit.test.d.ts +2 -0
  131. package/dist/experiments/evaluation/baselines/random-ranker.unit.test.d.ts.map +1 -0
  132. package/dist/experiments/evaluation/baselines/shortest-path-ranker.unit.test.d.ts +2 -0
  133. package/dist/experiments/evaluation/baselines/shortest-path-ranker.unit.test.d.ts.map +1 -0
  134. package/dist/experiments/evaluation/baselines/weight-ranker.unit.test.d.ts +2 -0
  135. package/dist/experiments/evaluation/baselines/weight-ranker.unit.test.d.ts.map +1 -0
  136. package/dist/experiments/evaluation/ground-truth/importance-based.unit.test.d.ts +5 -0
  137. package/dist/experiments/evaluation/ground-truth/importance-based.unit.test.d.ts.map +1 -0
  138. package/dist/experiments/evaluation/ir-metrics.unit.test.d.ts +5 -0
  139. package/dist/experiments/evaluation/ir-metrics.unit.test.d.ts.map +1 -0
  140. package/dist/experiments/evaluation/loaders/edge-list-loader.unit.test.d.ts +5 -0
  141. package/dist/experiments/evaluation/loaders/edge-list-loader.unit.test.d.ts.map +1 -0
  142. package/dist/experiments/evaluation/path-planting/citation-planting.unit.test.d.ts +5 -0
  143. package/dist/experiments/evaluation/path-planting/citation-planting.unit.test.d.ts.map +1 -0
  144. package/dist/experiments/evaluation/path-planting/heterogeneous-planting.unit.test.d.ts +5 -0
  145. package/dist/experiments/evaluation/path-planting/heterogeneous-planting.unit.test.d.ts.map +1 -0
  146. package/dist/experiments/evaluation/path-planting/noise-generator.unit.test.d.ts +5 -0
  147. package/dist/experiments/evaluation/path-planting/noise-generator.unit.test.d.ts.map +1 -0
  148. package/dist/experiments/evaluation/path-planting/path-generator.unit.test.d.ts +5 -0
  149. package/dist/experiments/evaluation/path-planting/path-generator.unit.test.d.ts.map +1 -0
  150. package/dist/experiments/evaluation/rank-correlation.unit.test.d.ts +5 -0
  151. package/dist/experiments/evaluation/rank-correlation.unit.test.d.ts.map +1 -0
  152. package/dist/experiments/evaluation/runner/experiment-config.unit.test.d.ts +10 -0
  153. package/dist/experiments/evaluation/runner/experiment-config.unit.test.d.ts.map +1 -0
  154. package/dist/experiments/evaluation/runner/experiment-runner.unit.test.d.ts +5 -0
  155. package/dist/experiments/evaluation/runner/experiment-runner.unit.test.d.ts.map +1 -0
  156. package/dist/experiments/evaluation/runner/report-generator.unit.test.d.ts +5 -0
  157. package/dist/experiments/evaluation/runner/report-generator.unit.test.d.ts.map +1 -0
  158. package/dist/experiments/evaluation/statistics/bootstrap.unit.test.d.ts +5 -0
  159. package/dist/experiments/evaluation/statistics/bootstrap.unit.test.d.ts.map +1 -0
  160. package/dist/experiments/evaluation/statistics/effect-size.unit.test.d.ts +5 -0
  161. package/dist/experiments/evaluation/statistics/effect-size.unit.test.d.ts.map +1 -0
  162. package/dist/experiments/evaluation/statistics/multiple-comparison.unit.test.d.ts +5 -0
  163. package/dist/experiments/evaluation/statistics/multiple-comparison.unit.test.d.ts.map +1 -0
  164. package/dist/experiments/evaluation/statistics/paired-tests.d.ts.map +1 -1
  165. package/dist/experiments/evaluation/statistics/paired-tests.unit.test.d.ts +5 -0
  166. package/dist/experiments/evaluation/statistics/paired-tests.unit.test.d.ts.map +1 -0
  167. package/dist/formats/gml/fetch.unit.test.d.ts +2 -0
  168. package/dist/formats/gml/fetch.unit.test.d.ts.map +1 -0
  169. package/dist/formats/gml/parse.unit.test.d.ts +5 -0
  170. package/dist/formats/gml/parse.unit.test.d.ts.map +1 -0
  171. package/dist/formats/gml/serialize.unit.test.d.ts +5 -0
  172. package/dist/formats/gml/serialize.unit.test.d.ts.map +1 -0
  173. package/dist/formats/pajek/fetch.unit.test.d.ts +2 -0
  174. package/dist/formats/pajek/fetch.unit.test.d.ts.map +1 -0
  175. package/dist/formats/pajek/parse.unit.test.d.ts +5 -0
  176. package/dist/formats/pajek/parse.unit.test.d.ts.map +1 -0
  177. package/dist/formats/snap/fetch.unit.test.d.ts +2 -0
  178. package/dist/formats/snap/fetch.unit.test.d.ts.map +1 -0
  179. package/dist/formats/snap/parse.unit.test.d.ts +5 -0
  180. package/dist/formats/snap/parse.unit.test.d.ts.map +1 -0
  181. package/dist/formats/ucinet/fetch.unit.test.d.ts +2 -0
  182. package/dist/formats/ucinet/fetch.unit.test.d.ts.map +1 -0
  183. package/dist/formats/ucinet/parse.unit.test.d.ts +5 -0
  184. package/dist/formats/ucinet/parse.unit.test.d.ts.map +1 -0
  185. package/dist/generation/generators/bipartite.unit.test.d.ts +2 -0
  186. package/dist/generation/generators/bipartite.unit.test.d.ts.map +1 -0
  187. package/dist/generation/generators/connectivity.unit.test.d.ts +2 -0
  188. package/dist/generation/generators/connectivity.unit.test.d.ts.map +1 -0
  189. package/dist/generation/generators/core-structures.unit.test.d.ts +2 -0
  190. package/dist/generation/generators/core-structures.unit.test.d.ts.map +1 -0
  191. package/dist/generation/generators/density-helpers.unit.test.d.ts +2 -0
  192. package/dist/generation/generators/density-helpers.unit.test.d.ts.map +1 -0
  193. package/dist/generation/generators/edge-generator.unit.test.d.ts +2 -0
  194. package/dist/generation/generators/edge-generator.unit.test.d.ts.map +1 -0
  195. package/dist/generation/generators/geometric.unit.test.d.ts +2 -0
  196. package/dist/generation/generators/geometric.unit.test.d.ts.map +1 -0
  197. package/dist/generation/generators/invariants.unit.test.d.ts +2 -0
  198. package/dist/generation/generators/invariants.unit.test.d.ts.map +1 -0
  199. package/dist/generation/generators/network-structures.unit.test.d.ts +2 -0
  200. package/dist/generation/generators/network-structures.unit.test.d.ts.map +1 -0
  201. package/dist/generation/generators/node-generator.unit.test.d.ts +2 -0
  202. package/dist/generation/generators/node-generator.unit.test.d.ts.map +1 -0
  203. package/dist/generation/generators/path-cycle.unit.test.d.ts +2 -0
  204. package/dist/generation/generators/path-cycle.unit.test.d.ts.map +1 -0
  205. package/dist/generation/generators/property-computers.unit.test.d.ts +2 -0
  206. package/dist/generation/generators/property-computers.unit.test.d.ts.map +1 -0
  207. package/dist/generation/generators/structural-classes.unit.test.d.ts +2 -0
  208. package/dist/generation/generators/structural-classes.unit.test.d.ts.map +1 -0
  209. package/dist/generation/generators/structure-handlers.unit.test.d.ts +2 -0
  210. package/dist/generation/generators/structure-handlers.unit.test.d.ts.map +1 -0
  211. package/dist/generation/generators/symmetry.unit.test.d.ts +2 -0
  212. package/dist/generation/generators/symmetry.unit.test.d.ts.map +1 -0
  213. package/dist/generation/generators/validation-helpers.unit.test.d.ts +2 -0
  214. package/dist/generation/generators/validation-helpers.unit.test.d.ts.map +1 -0
  215. package/dist/generation/spec/advanced.unit.test.d.ts +5 -0
  216. package/dist/generation/spec/advanced.unit.test.d.ts.map +1 -0
  217. package/dist/generation/spec/core.unit.test.d.ts +5 -0
  218. package/dist/generation/spec/core.unit.test.d.ts.map +1 -0
  219. package/dist/generation/spec/geometric.unit.test.d.ts +5 -0
  220. package/dist/generation/spec/geometric.unit.test.d.ts.map +1 -0
  221. package/dist/generation/spec/invariants.unit.test.d.ts +5 -0
  222. package/dist/generation/spec/invariants.unit.test.d.ts.map +1 -0
  223. package/dist/generation/spec/metrics.unit.test.d.ts +5 -0
  224. package/dist/generation/spec/metrics.unit.test.d.ts.map +1 -0
  225. package/dist/generation/spec/network.unit.test.d.ts +5 -0
  226. package/dist/generation/spec/network.unit.test.d.ts.map +1 -0
  227. package/dist/generation/spec/path-cycle.unit.test.d.ts +5 -0
  228. package/dist/generation/spec/path-cycle.unit.test.d.ts.map +1 -0
  229. package/dist/generation/spec/products.unit.test.d.ts +5 -0
  230. package/dist/generation/spec/products.unit.test.d.ts.map +1 -0
  231. package/dist/generation/spec/regularity.unit.test.d.ts +5 -0
  232. package/dist/generation/spec/regularity.unit.test.d.ts.map +1 -0
  233. package/dist/generation/spec/structural.unit.test.d.ts +5 -0
  234. package/dist/generation/spec/structural.unit.test.d.ts.map +1 -0
  235. package/dist/generation/spec/symmetry.unit.test.d.ts +5 -0
  236. package/dist/generation/spec/symmetry.unit.test.d.ts.map +1 -0
  237. package/dist/generation/spec/test.unit.test.d.ts +5 -0
  238. package/dist/generation/spec/test.unit.test.d.ts.map +1 -0
  239. package/dist/index.cjs +12 -12
  240. package/dist/index.js +984 -942
  241. package/dist/index.umd.js +15 -15
  242. package/dist/interfaces/graph-expander.unit.test.d.ts +2 -0
  243. package/dist/interfaces/graph-expander.unit.test.d.ts.map +1 -0
  244. package/dist/interfaces/readable-graph.unit.test.d.ts +2 -0
  245. package/dist/interfaces/readable-graph.unit.test.d.ts.map +1 -0
  246. package/dist/utils/wayback.unit.test.d.ts +2 -0
  247. package/dist/utils/wayback.unit.test.d.ts.map +1 -0
  248. package/dist/validation/basic-validators.unit.test.d.ts +2 -0
  249. package/dist/validation/basic-validators.unit.test.d.ts.map +1 -0
  250. package/dist/validation/coloring-validator.unit.test.d.ts +2 -0
  251. package/dist/validation/coloring-validator.unit.test.d.ts.map +1 -0
  252. package/dist/validation/connectivity-validators.unit.test.d.ts +2 -0
  253. package/dist/validation/connectivity-validators.unit.test.d.ts.map +1 -0
  254. package/dist/validation/degree-validators.unit.test.d.ts +2 -0
  255. package/dist/validation/degree-validators.unit.test.d.ts.map +1 -0
  256. package/dist/validation/density-connectivity.unit.test.d.ts +2 -0
  257. package/dist/validation/density-connectivity.unit.test.d.ts.map +1 -0
  258. package/dist/validation/extremal.unit.test.d.ts +2 -0
  259. package/dist/validation/extremal.unit.test.d.ts.map +1 -0
  260. package/dist/validation/flow-validator.unit.test.d.ts +2 -0
  261. package/dist/validation/flow-validator.unit.test.d.ts.map +1 -0
  262. package/dist/validation/geometric.unit.test.d.ts +2 -0
  263. package/dist/validation/geometric.unit.test.d.ts.map +1 -0
  264. package/dist/validation/helper-functions.d.ts +1 -0
  265. package/dist/validation/helper-functions.d.ts.map +1 -1
  266. package/dist/validation/helper-functions.unit.test.d.ts +2 -0
  267. package/dist/validation/helper-functions.unit.test.d.ts.map +1 -0
  268. package/dist/validation/invariant.unit.test.d.ts +2 -0
  269. package/dist/validation/invariant.unit.test.d.ts.map +1 -0
  270. package/dist/validation/minor.unit.test.d.ts +2 -0
  271. package/dist/validation/minor.unit.test.d.ts.map +1 -0
  272. package/dist/validation/network.unit.test.d.ts +2 -0
  273. package/dist/validation/network.unit.test.d.ts.map +1 -0
  274. package/dist/validation/path-cycle.unit.test.d.ts +2 -0
  275. package/dist/validation/path-cycle.unit.test.d.ts.map +1 -0
  276. package/dist/validation/product.unit.test.d.ts +2 -0
  277. package/dist/validation/product.unit.test.d.ts.map +1 -0
  278. package/dist/validation/robustness.unit.test.d.ts +2 -0
  279. package/dist/validation/robustness.unit.test.d.ts.map +1 -0
  280. package/dist/validation/structural-class.unit.test.d.ts +2 -0
  281. package/dist/validation/structural-class.unit.test.d.ts.map +1 -0
  282. package/dist/validation/symmetry.unit.test.d.ts +2 -0
  283. package/dist/validation/symmetry.unit.test.d.ts.map +1 -0
  284. package/dist/validation/treewidth-validator.unit.test.d.ts +2 -0
  285. package/dist/validation/treewidth-validator.unit.test.d.ts.map +1 -0
  286. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var Go=Object.create;var Zt=Object.defineProperty;var Wo=Object.getOwnPropertyDescriptor;var Vo=Object.getOwnPropertyNames;var Ko=Object.getPrototypeOf,Ho=Object.prototype.hasOwnProperty;var Jo=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Vo(t))!Ho.call(e,r)&&r!==n&&Zt(e,r,{get:()=>t[r],enumerable:!(o=Wo(t,r))||o.enumerable});return e};var ve=(e,t,n)=>(n=e!=null?Go(Ko(e)):{},Jo(t||!e||!e.__esModule?Zt(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const rt=require("./experiments/evaluation/loaders/index.ts"),ce=require("./experiments/evaluation/fixtures/index.ts");var J=typeof document<"u"?document.currentScript:null;const Pe={vertexOrderKey:"order",edgeOrderKey:"order",posKey:"pos",layerKey:"layer",timeKey:"time",rootKey:"root",portKey:"ports",weightVectorKey:"weightVector",probabilityKey:"probability"},it=e=>[...new Set(e)],He=(e,t)=>{if(e.length<=1)return!0;for(let n=1;n<e.length;n++)if(!t(e[0],e[n]))return!1;return!0},Je=(e,t,n)=>n?`${e}->${t}`:e<t?`${e}--${t}`:`${t}--${e}`,Et=e=>e.edges.some(t=>t.directed),$t=e=>e.edges.some(t=>!t.directed),It=e=>{let t=0;for(const n of e.edges)n.endpoints.length===2&&n.endpoints[0]===n.endpoints[1]&&t++;return t},ne=e=>{const t={};for(const n of e.vertices)t[n.id]=[];for(const n of e.edges){if(n.directed||n.endpoints.length!==2)continue;const[o,r]=n.endpoints;t[o].push(r),t[r].push(o)}return t},Oe=e=>{if(e.vertices.length===0)return!0;const t=ne(e),n=e.vertices[0].id,o=new Set,r=[n];for(;r.length>0;){const i=r.pop();if(i&&!o.has(i)){o.add(i);for(const a of t[i]??[])o.has(a)||r.push(a)}}return o.size===e.vertices.length},wn=e=>{const t=e.vertices.map(a=>a.id),n={},o={};for(const a of t)n[a]=0,o[a]=[];for(const a of e.edges){if(!a.directed||a.endpoints.length!==2)continue;const[s,c]=a.endpoints;o[s].push(c),n[c]+=1}const r=[];for(const a of t)n[a]===0&&r.push(a);let i=0;for(;r.length>0;){const a=r.pop();if(a){i++;for(const s of o[a])n[s]-=1,n[s]===0&&r.push(s)}}return i===t.length},ae=e=>{const t={};for(const[o,r]of e.vertices.entries())t[r.id]=o;const n=Array.from({length:e.vertices.length},()=>0);for(const o of e.edges){if(o.endpoints.length!==2)continue;const[r,i]=o.endpoints;r!==i&&(n[t[r]]+=1,n[t[i]]+=1)}return n},Pt=e=>{const t=ne(e),n=new Map;for(const o of e.vertices){if(n.has(o.id))continue;const r=[o.id];for(n.set(o.id,0);r.length>0;){const i=r.shift();if(!i)break;const a=n.get(i);if(a===void 0)break;for(const s of t[i]??[])if(!n.has(s))n.set(s,a^1),r.push(s);else if(n.get(s)===a)return!1}}return!0},Le=e=>{if(e.vertices.length<=3)return!0;const t=e.vertices.map(s=>s.id),n=ne(e),o=new Set,r=[],i={};for(const s of t)i[s]=0;for(let s=0;s<t.length;s++){let c=-1,d=null;for(const l of t)!o.has(l)&&i[l]>c&&(c=i[l],d=l);if(d===null)break;o.add(d),r.push(d);for(const l of n[d]??[])o.has(l)||i[l]++}const a=new Map;for(let s=0;s<r.length;s++){const c=r[s],d=new Set;for(const l of n[c]??[])r.indexOf(l)>s&&d.add(l);a.set(c,d)}for(const[,s]of a){const c=[...s];for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++)if(!(n[c[d]]??[]).includes(c[l]))return!1}return!0},Qo=(e,t)=>{const n=e.vertices.map(a=>a.attrs?.[t.posKey]);if(!(n.length>0&&n.every(a=>typeof a=="object"&&a!=null)))return{kind:"abstract"};const r=n.map(a=>{const s=a,c=typeof s.x=="number",d=typeof s.y=="number",l=typeof s.z=="number";return c&&d&&l?3:c&&d?2:null});if(r.some(a=>a==null))return{kind:"abstract"};const i=it(r);return i.length===1?{kind:"spatial_coordinates",dims:i[0]}:{kind:"abstract"}},Xo=(e,t)=>{const n=e.vertices.filter(o=>o.attrs?.[t.rootKey]===!0);return n.length===1?{kind:"rooted"}:n.length>1?{kind:"multi_rooted"}:{kind:"unrooted"}},Yo=(e,t)=>{const n=e.vertices.map(c=>c.attrs?.[t.timeKey]),o=e.edges.map(c=>c.attrs?.[t.timeKey]),r=n.some(c=>c!=null),i=o.some(c=>c!=null),a=r&&n.every(c=>c==null||typeof c=="number"),s=i&&o.every(c=>c==null||typeof c=="number");return r&&i&&a&&s?{kind:"time_ordered"}:r?{kind:"temporal_vertices"}:i?{kind:"temporal_edges"}:{kind:"static"}},Zo=(e,t)=>{const n=[];for(const r of e.vertices){const i=r.attrs?.[t.layerKey];(typeof i=="string"||typeof i=="number")&&n.push(i)}for(const r of e.edges){const i=r.attrs?.[t.layerKey];(typeof i=="string"||typeof i=="number")&&n.push(i)}return it(n.map(String)).length>1?{kind:"multi_layer"}:{kind:"single_layer"}},er=(e,t)=>e.edges.map(o=>o.attrs?.[t.edgeOrderKey]).every(o=>typeof o=="number")?{kind:"ordered"}:{kind:"unordered"},tr=(e,t)=>e.vertices.some(o=>o.attrs?.[t.portKey]!=null)?{kind:"port_labelled_vertices"}:{kind:"none"},nr=e=>e.vertices.some(o=>o.attrs?.latent===!0)||e.edges.some(o=>o.attrs?.latent===!0)?{kind:"latent_or_inferred"}:e.vertices.some(o=>o.attrs?.observed===!1)||e.edges.some(o=>o.attrs?.observed===!1)?{kind:"partially_observed"}:{kind:"fully_specified"},or=e=>e.vertices.some(o=>o.attrs?.exec===!0)||e.edges.some(o=>o.attrs?.exec===!0)?{kind:"executable"}:e.vertices.some(o=>typeof o.attrs?.fn=="string")||e.edges.some(o=>typeof o.attrs?.fn=="string")?{kind:"annotated_with_functions"}:{kind:"structural_only"},rr=e=>e.edges.some(r=>typeof r.attrs?.cost=="number")||e.vertices.some(r=>typeof r.attrs?.cost=="number")?{kind:"cost"}:e.edges.some(r=>typeof r.attrs?.utility=="number")||e.vertices.some(r=>typeof r.attrs?.utility=="number")?{kind:"utility"}:e.edges.some(r=>typeof r.weight=="number")||e.edges.some(r=>Array.isArray(r.attrs?.weightVector))?{kind:"metric"}:{kind:"none"},ir=e=>{if(!e.edges.every(r=>r.endpoints.length===2))return{kind:"incomplete"};const n=ar(e),o=e.vertices.length;if(o<=1)return{kind:"complete"};if(n.kind==="undirected"){const r=o*(o-1)/2,i=new Set;for(const a of e.edges.filter(s=>!s.directed&&s.endpoints.length===2))i.add(Je(a.endpoints[0],a.endpoints[1],!1));return i.size===r?{kind:"complete"}:{kind:"incomplete"}}if(n.kind==="directed"||n.kind==="bidirected"||n.kind==="antidirected"){const r=o*(o-1),i=new Set;for(const a of e.edges.filter(s=>s.directed&&s.endpoints.length===2))i.add(Je(a.endpoints[0],a.endpoints[1],!0));return i.size===r?{kind:"complete"}:{kind:"incomplete"}}return{kind:"incomplete"}},xn=e=>e.edges.every(n=>!n.directed&&n.endpoints.length===2)?Pt(e)?{kind:"bipartite"}:{kind:"unrestricted"}:{kind:"unrestricted"},sr=e=>{if(!e.edges.every(a=>!a.directed&&a.endpoints.length===2))return{kind:"unconstrained"};const n=e.vertices.length;if(n<=1)return{kind:"dense"};const o=e.edges.length,r=n*(n-1)/2,i=o/r;return i<=.1?{kind:"sparse"}:i>=.9?{kind:"dense"}:{kind:"unconstrained"}},ar=e=>{const t=Et(e),n=$t(e);if(t&&n)return{kind:"mixed"};if(!t)return{kind:"undirected"};const o=e.edges.filter(s=>s.directed&&s.endpoints.length===2);if(o.length===0)return{kind:"directed"};const r=new Set(o.map(s=>`${s.endpoints[0]}->${s.endpoints[1]}`));return o.every(s=>r.has(`${s.endpoints[1]}->${s.endpoints[0]}`))?{kind:"bidirected"}:o.every(s=>{const c=`${s.endpoints[1]}->${s.endpoints[0]}`;return c!==`${s.endpoints[0]}->${s.endpoints[1]}`&&r.has(c)})&&o.length>0?{kind:"antidirected"}:{kind:"directed"}},cr=e=>{const t=e.edges.every(s=>!s.directed),n=e.edges.every(s=>s.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(Le(e))return{kind:"perfect"};const o=e.vertices.map(s=>s.id),r=ne(e),i={};for(const s of o)i[s]=[];for(const s of o)for(const c of o){if(s===c)continue;(r[s]??[]).includes(c)||i[s].push(c)}const a={vertices:e.vertices,edges:[]};for(const s of o)for(const c of i[s])s<c&&a.edges.push({id:`e_${s}_${c}`,endpoints:[s,c],directed:!1});return Le(a)?{kind:"perfect"}:{kind:"imperfect"}},Mn=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(Le(e)){const o=e.vertices.map(s=>s.id),r=ne(e),i={};for(const s of o)i[s]=[];for(const s of o)for(const c of o){if(s===c)continue;(r[s]??[]).includes(c)||i[s].push(c)}const a={vertices:e.vertices,edges:[]};for(const s of o)for(const c of i[s])s<c&&a.edges.push({id:`e_${s}_${c}`,endpoints:[s,c],directed:!1});if(Le(a))return{kind:"split"}}return{kind:"non_split"}},Sn=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=e.vertices.map(i=>i.id);if(o.length<4)return{kind:"cograph"};const r=ne(e);for(let i=0;i<o.length;i++)for(let a=i+1;a<o.length;a++)for(let s=a+1;s<o.length;s++)for(let c=s+1;c<o.length;c++){const d=[o[i],o[a],o[s],o[c]],l={};for(const w of d){l[w]=[];const C=r[w]??[];for(const x of C)d.includes(x)&&l[w].push(x)}const u=d[0],f=d[1],g=d[2],h=d[3],p=l[u].includes(f),v=l[f].includes(g),m=l[g].includes(h),y=l[u].includes(g),b=l[f].includes(h),k=l[u].includes(h);if(p&&v&&m&&!y&&!k&&!b)return{kind:"non_cograph"}}return{kind:"cograph"}},dr=e=>{const t=Mn(e),n=Sn(e);return t.kind==="unconstrained"||n.kind==="unconstrained"?{kind:"unconstrained"}:t.kind==="split"&&n.kind==="cograph"?{kind:"threshold"}:{kind:"non_threshold"}},lr=e=>{const t=e.edges.every(s=>!s.directed),n=e.edges.every(s=>s.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(Cn(e).kind==="unconstrained")return{kind:"unconstrained"};const r=ae(e),i=r.reduce((s,c)=>s+c,0)/r.length;return Math.max(...r)>i*3?{kind:"non_line_graph"}:{kind:"line_graph"}},Cn=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(e.vertices.length<4)return{kind:"claw_free"};const o=ne(e),r=e.vertices.map(i=>i.id);for(const i of r){const a=o[i]??[];if(!(a.length<3))for(let s=0;s<a.length;s++)for(let c=s+1;c<a.length;c++)for(let d=c+1;d<a.length;d++){const l=a[s],u=a[c],f=a[d],g=(o[l]??[]).length,h=(o[u]??[]).length,p=(o[f]??[]).length,v=(o[l]??[]).includes(u),m=(o[l]??[]).includes(f),y=(o[u]??[]).includes(f);if(g===1&&h===1&&p===1&&!v&&!m&&!y)return{kind:"has_claw"}}}return{kind:"claw_free"}},ur=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=ae(e);return o.length>0&&o.every(i=>i===3)?{kind:"cubic"}:{kind:"non_cubic"}},fr=(e,t)=>{if(!e.edges.every(i=>i.endpoints.length===2))return{kind:"unconstrained"};const o=ae(e);return o.length>0&&o.every(i=>i===t)?{kind:"k_regular",k:t}:{kind:"not_k_regular"}},gr=e=>{if(!e.edges.every(r=>r.endpoints.length===2))return{kind:"unconstrained"};const n=ae(e);return n.length>0&&n.every(r=>r===n[0])?{kind:"k_regular",k:n[0]}:{kind:"not_k_regular"}},hr=e=>{const t=e.edges.every(f=>!f.directed),n=e.edges.every(f=>f.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=ae(e);if(!(o.length>0&&o.every(f=>f===o[0])))return{kind:"not_strongly_regular"};const i=o[0],a=ne(e),s=e.vertices.map(f=>f.id);let c=-1,d=!0;for(let f=0;f<s.length&&d;f++)for(let g=f+1;g<s.length;g++){const h=s[f],p=s[g];if((a[h]??[]).includes(p)){const v=new Set(a[h]),m=(a[p]??[]).filter(y=>v.has(y)).length;c===-1?c=m:c!==m&&(d=!1)}}let l=-1,u=!0;for(let f=0;f<s.length&&u;f++)for(let g=f+1;g<s.length;g++){const h=s[f],p=s[g];if(!(a[h]??[]).includes(p)){const v=new Set(a[h]),m=(a[p]??[]).filter(y=>v.has(y)).length;l===-1?l=m:l!==m&&(u=!1)}}return d&&u?{kind:"strongly_regular",k:i,lambda:c,mu:l}:{kind:"not_strongly_regular"}},pr=e=>{const t=e.edges.every(d=>!d.directed),n=e.edges.every(d=>d.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=e.vertices.length;if(o===0)return{kind:"self_complementary"};if(o%4!==0&&o%4!==1)return{kind:"not_self_complementary"};const r=o*(o-1)/2;if(e.edges.length!==r/2)return{kind:"not_self_complementary"};const i=ae(e),a=i.map(d=>o-1-d);a.sort((d,l)=>d-l);const s=[...i].sort((d,l)=>d-l);if(!(s.length===a.length&&s.every((d,l)=>d===a[l])))return{kind:"not_self_complementary"};if(o<=8){const d=e.vertices.map(p=>p.id),l=ne(e),u=[];for(let p=0;p<d.length;p++)for(let v=p+1;v<d.length;v++)(l[d[p]]??[]).includes(d[v])||u.push({id:`e_${p}_${v}`,endpoints:[d[p],d[v]],directed:!1});const f={vertices:e.vertices,edges:u};return ae(f).sort((p,v)=>p-v).every((p,v)=>p===s[v])?{kind:"self_complementary"}:{kind:"not_self_complementary"}}return{kind:"unconstrained"}},mr=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=ae(e);return o.every(i=>i===o[0])?e.vertices.length<=6?{kind:"vertex_transitive"}:{kind:"unconstrained"}:{kind:"not_vertex_transitive"}},vr=e=>{if(xn(e).kind!=="bipartite")return{kind:"not_complete_bipartite"};if(!e.edges.every(l=>l.endpoints.length===2))return{kind:"unconstrained"};const o=ne(e),r=new Map;for(const l of e.vertices){if(r.has(l.id))continue;const u=[l.id];for(r.set(l.id,0);u.length>0;){const f=u.shift();if(!f)break;const g=r.get(f);if(g===void 0)break;for(const h of o[f]??[])r.has(h)||(r.set(h,g^1),u.push(h))}}let i=0,a=0;for(const l of r.values())l===0?i++:a++;const s=e.vertices.filter(l=>r.get(l.id)===0).map(l=>l.id),c=e.vertices.filter(l=>r.get(l.id)===1).map(l=>l.id),d=i*a;if(e.edges.length===d){const l=new Set;for(const f of e.edges){const[g,h]=f.endpoints;l.add(`${g}_${h}`),l.add(`${h}_${g}`)}let u=!0;for(const f of s)for(const g of c)if(!l.has(`${f}_${g}`)){u=!1;break}if(u)return{kind:"complete_bipartite",m:i,n:a}}return{kind:"not_complete_bipartite"}},yr=e=>e.edges.every(n=>!n.directed&&n.endpoints.length===2)?Oe(e)?{kind:"connected"}:{kind:"unconstrained"}:{kind:"unconstrained"},br=e=>{const t=e.edges.length>0&&e.edges.every(o=>o.directed&&o.endpoints.length===2),n=e.edges.length>0&&e.edges.every(o=>!o.directed&&o.endpoints.length===2);return t?wn(e)?{kind:"acyclic"}:{kind:"cycles_allowed"}:n?e.edges.length<e.vertices.length?{kind:"acyclic"}:{kind:"cycles_allowed"}:{kind:"cycles_allowed"}},kr=e=>{if(!e.edges.every(o=>o.endpoints.length===2))return{kind:"unconstrained"};const n=ae(e);return n.length>0&&new Set(n).size===1?{kind:"regular",degree:n[0]}:{kind:"degree_sequence",sequence:n}},wr=e=>({kind:"finite",n:e.vertices.length}),xr=e=>{const t=e.vertices.map(n=>n.id);return new Set(t).size===t.length?{kind:"distinguishable"}:{kind:"indistinguishable"}},Mr=(e,t)=>{const n=e.vertices.map(r=>r.attrs?.[t.vertexOrderKey]);if(!n.every(r=>typeof r=="number"))return{kind:"unordered"};const o=n;return new Set(o).size===o.length?{kind:"total_order"}:{kind:"partial_order"}},Sr=e=>{if(e.edges.length===0)return{kind:"binary"};const t=e.edges.map(o=>o.endpoints.length);if(t.every(o=>o===2))return{kind:"binary"};if(He(t,(o,r)=>o===r))return{kind:"k_ary",k:t[0]};throw new Error(`Mixed edge arity cannot be represented as a single EdgeArity: ${it(t).join(", ")}`)},st=e=>{const t=new Set;for(const n of e.edges)if(n.endpoints.length===2){const[o,r]=n.endpoints,i=Je(o,r,n.directed);if(t.has(i))return{kind:"multi"};t.add(i)}else{const o=`H:${[...n.endpoints].sort().join("|")}`;if(t.has(o))return{kind:"multi"};t.add(o)}return{kind:"simple"}},Cr=e=>It(e)>0?{kind:"allowed"}:{kind:"disallowed"},_r=e=>{const t=Et(e),n=$t(e);if(t&&n)return{kind:"mixed"};if(!t)return{kind:"undirected"};const o=e.edges.filter(s=>s.directed&&s.endpoints.length===2);if(o.length===0)return{kind:"directed"};const r=new Set(o.map(s=>`${s.endpoints[0]}->${s.endpoints[1]}`));return o.every(s=>r.has(`${s.endpoints[1]}->${s.endpoints[0]}`))?{kind:"bidirected"}:o.every(s=>{const c=`${s.endpoints[1]}->${s.endpoints[0]}`;return c!==`${s.endpoints[0]}->${s.endpoints[1]}`&&r.has(c)})&&o.length>0?{kind:"antidirected"}:{kind:"directed"}},Nr=(e,t)=>e.edges.length===0?{kind:"unweighted"}:e.edges.every(o=>typeof o.weight=="number")?{kind:"weighted_numeric"}:{kind:"unweighted"},Er=e=>e.edges.some(n=>n.sign===-1||n.sign===1)?{kind:"signed"}:{kind:"unsigned"},$r=(e,t)=>e.edges.some(o=>typeof o.probability=="number")||e.edges.some(o=>typeof o.attrs?.[t.probabilityKey]=="number")?{kind:"probabilistic"}:{kind:"deterministic"},Ir=e=>{const t=e.vertices.some(o=>o.attrs&&Object.keys(o.attrs).length>0),n=e.vertices.some(o=>typeof o.label=="string"&&o.label.length>0);return t?{kind:"attributed"}:n?{kind:"labelled"}:{kind:"unlabelled"}},Pr=e=>{const t=e.edges.some(o=>o.attrs&&Object.keys(o.attrs).length>0),n=e.edges.some(o=>typeof o.label=="string"&&o.label.length>0);return t?{kind:"attributed"}:n?{kind:"labelled"}:{kind:"unlabelled"}},Dr=e=>{const t=e.vertices.map(i=>Object.keys(i.attrs??{}).sort().join("|")),n=e.edges.map(i=>Object.keys(i.attrs??{}).sort().join("|")),o=He(t,(i,a)=>i===a),r=He(n,(i,a)=>i===a);return o&&r?{kind:"homogeneous"}:{kind:"heterogeneous"}},_n=e=>{if(!e.edges.every(c=>c.endpoints.length===2))return{kind:"unconstrained"};if(e.vertices.length>10)return{kind:"unconstrained"};const n=e.vertices.length;if(n<3)return{kind:"non_hamiltonian"};const o=ne(e),r=ae(e);if(Math.min(...r)<2)return{kind:"non_hamiltonian"};const i=new Set,a=[],s=(c,d)=>{if(i.add(c),a.push(c),a.length===n)return(o[c]??[]).includes(d)?!0:(a.pop(),i.delete(c),!1);const l=o[c]??[];for(const u of l)if(!i.has(u)&&s(u,d))return!0;return a.pop(),i.delete(c),!1};for(const c of e.vertices)if(a.length=0,i.clear(),s(c.id,c.id))return{kind:"hamiltonian"};return{kind:"non_hamiltonian"}},Tr=e=>{if(_n(e).kind==="hamiltonian")return{kind:"traceable"};if(e.vertices.length>10)return{kind:"unconstrained"};const n=ne(e),o=e.vertices.length;if(o<2)return{kind:"non_traceable"};const r=new Set,i=a=>{if(r.add(a),r.size===o)return!0;const s=n[a]??[];for(const c of s)if(!r.has(c)&&i(c))return!0;return r.delete(a),!1};for(const a of e.vertices)if(r.clear(),i(a.id))return{kind:"traceable"};return{kind:"non_traceable"}},Ar=e=>{const t=e.edges.every(u=>!u.directed),n=e.edges.every(u=>u.endpoints.length===2);if(!t||!n)return{kind:"not_scale_free"};if(e.vertices.length<10)return{kind:"not_scale_free"};const o=ae(e),r={};for(const u of o)r[u]=(r[u]||0)+1;delete r[0];const i=Object.keys(r).map(Number).sort((u,f)=>u-f);if(i.length<2)return{kind:"not_scale_free"};const a=Math.min(...i);let s=0;for(const u of i)s+=r[u];if(s<5)return{kind:"not_scale_free"};const c=[];for(const u of i)if(u>=a){const f=r[u]/s;c.push(Math.log(f)+Math.log(u))}const d=c.reduce((u,f)=>u+f,0)/c.length;if(c.reduce((u,f)=>u+(f-d)**2,0)/c.length<2){const u=1+d;return{kind:"scale_free",exponent:Math.round(u*100)/100}}return{kind:"not_scale_free"}},Rr=e=>{const t=e.edges.every(p=>!p.directed),n=e.edges.every(p=>p.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(!Oe(e))return{kind:"unconstrained"};if(e.vertices.length<3)return{kind:"unconstrained"};const o=ne(e);let r=0,i=0;for(const p of e.vertices){const v=o[p.id]??[],m=v.length;if(!(m<2)){i+=m*(m-1)/2;for(let y=0;y<m;y++)for(let b=y+1;b<m;b++){const k=v[y],w=v[b];(o[k]??[]).includes(w)&&r++}}}const a=i>0?3*r/i:0;let s=0,c=0;for(const p of e.vertices){const v={[p.id]:0},m=[p.id];for(;m.length>0;){const y=m.shift();if(!y)break;const b=v[y];for(const k of o[y]??[])k in v||(v[k]=b+1,m.push(k),s+=b+1,c++)}}const d=c>0?s/c:0,l=e.vertices.length,u=e.edges.length/(l*(l-1)/2),f=Math.log(l)/Math.log(1/(1-u)),g=a>u*2,h=d<=f*1.5;return g&&h?{kind:"small_world"}:{kind:"not_small_world"}},Fr=(e,t)=>{const n=e.edges.every(d=>!d.directed),o=e.edges.every(d=>d.endpoints.length===2);if(!n||!o)return{kind:"unconstrained"};if(e.vertices.length<4)return{kind:"unconstrained"};const r=new Map;let i=!0;for(const d of e.vertices){const l=d.attrs?.[t.layerKey];if(!l){i=!1;break}r.set(l,(r.get(l)||0)+1)}if(i&&r.size>1)return{kind:"modular",numCommunities:r.size};const a=ne(e),s=new Set;let c=0;for(const d of e.vertices){if(s.has(d.id))continue;const l=[d.id];for(s.add(d.id);l.length>0;){const u=l.shift();if(!u)break;for(const f of a[u]??[])s.has(f)||(s.add(f),l.push(f))}c++}return c>1?{kind:"modular",numCommunities:c}:{kind:"non_modular"}},qe=(e,t={})=>{const n={...Pe,...t};return{vertexCardinality:wr(e),vertexIdentity:xr(e),vertexOrdering:Mr(e,n),edgeArity:Sr(e),edgeMultiplicity:st(e),selfLoops:Cr(e),directionality:_r(e),weighting:Nr(e),signedness:Er(e),uncertainty:$r(e,n),vertexData:Ir(e),edgeData:Pr(e),schema:Dr(e),connectivity:yr(e),cycles:br(e),degreeConstraint:kr(e),completeness:ir(e),partiteness:xn(e),density:sr(e),embedding:Qo(e,n),rooting:Xo(e,n),temporal:Yo(e,n),layering:Zo(e,n),edgeOrdering:er(e,n),ports:tr(e,n),observability:nr(e),operationalSemantics:or(e),measureSemantics:rr(e),scaleFree:Ar(e),smallWorld:Rr(e),communityStructure:Fr(e,n),hamiltonian:_n(e),traceable:Tr(e),perfect:cr(e),split:Mn(e),cograph:Sn(e),threshold:dr(e),line:lr(e),clawFree:Cn(e),cubic:ur(e),specificRegular:gr(e),stronglyRegular:hr(e),selfComplementary:pr(e),vertexTransitive:mr(e),completeBipartite:vr(e)}},jr=(e,t,n={})=>{const o={...Pe,...n};return r=>{const i=qe(r,o);return Nn(i[e],t)}},H=(e,t,n={})=>{const o={...Pe,...n};return r=>qe(r,o)[e].kind===t},at=(e,t={})=>{const n={...Pe,...t};return o=>{const r=qe(o,n);for(const i of Object.keys(e)){const a=r[i],s=e[i];if(!Nn(a,s))return!1}return!0}},Nn=(e,t)=>{if(e.kind!==t.kind||"k"in e&&"k"in t&&e.k!==t.k||"n"in e&&"n"in t&&e.n!==t.n||"degree"in e&&"degree"in t&&e.degree!==t.degree||"dims"in e&&"dims"in t&&e.dims!==t.dims)return!1;if("sequence"in e&&"sequence"in t){const n=e,o=t;if(n.sequence.length!==o.sequence.length)return!1;for(let r=0;r<n.sequence.length;r++)if(n.sequence[r]!==o.sequence[r])return!1}return!0},Lr=e=>{if(e.vertices.length<3)return!0;if(!(st(e).kind==="simple"))return!1;const n=e.vertices.length,o=e.edges.length;return!(o>3*n-6||Pt(e)&&o>2*n-4)},Dt=e=>{if(e.vertices.length<=3)return!0;const t=e.vertices.map(s=>s.id),n=ne(e),o=new Set,r=[],i={};for(const s of t)i[s]=0;for(let s=0;s<t.length;s++){let c=-1,d=null;for(const l of t)!o.has(l)&&i[l]>c&&(c=i[l],d=l);if(d===null)break;o.add(d),r.push(d);for(const l of n[d]??[])o.has(l)||i[l]++}const a=new Map;for(let s=0;s<r.length;s++){const c=r[s],d=new Set;for(const l of n[c]??[])r.indexOf(l)>s&&d.add(l);a.set(c,d)}for(const[,s]of a){const c=[...s];for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++)if(!(n[c[d]]??[]).includes(c[l]))return!1}return!0},zr=e=>{if(!Dt(e))return!1;const t=ne(e),n=new Set;for(const o of e.vertices){if(n.has(o.id))continue;const r=new Set([o.id]);let i=!0;for(;i;){i=!1;for(const a of e.vertices){if(r.has(a.id))continue;[...r].every(c=>(t[c]??[]).includes(a.id))&&(r.add(a.id),i=!0)}}for(const a of r)n.add(a)}return!0},Br=(e,t)=>{for(const i of e.vertices){const a=i.attrs?.[t.posKey];if(!a||typeof a.x!="number"||typeof a.y!="number")return!1}const n=new Map;for(const i of e.vertices){const a=i.attrs?.[t.posKey];if(!a)return!1;n.set(i.id,a)}let o=0;for(const i of e.edges){if(i.endpoints.length!==2)continue;const[a,s]=i.endpoints,c=n.get(a),d=n.get(s);if(!c||!d)continue;const l=Math.hypot(c.x-d.x,c.y-d.y);o=Math.max(o,l)}const r=o;for(let i=0;i<e.vertices.length;i++)for(let a=i+1;a<e.vertices.length;a++){const s=e.vertices[i].id,c=e.vertices[a].id,d=e.edges.some(g=>{if(g.endpoints.length!==2)return!1;const[h,p]=g.endpoints;return h===s&&p===c||h===c&&p===s}),l=n.get(s),u=n.get(c);if(!l||!u)continue;const f=Math.hypot(l.x-u.x,l.y-u.y);if(d&&f>r||!d&&f<=r)return!1}return!0},Or=e=>{const t=e.vertices.map(r=>r.id),n=ne(e),o={};for(const r of t)o[r]=[];for(const r of t)for(const i of t){if(r===i)continue;(n[r]??[]).includes(i)||o[r].push(i)}return!0},qr=e=>Dt(e),Ur=e=>at({directionality:{kind:"undirected"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},cycles:{kind:"acyclic"},connectivity:{kind:"connected"}})(e),Gr=e=>at({directionality:{kind:"undirected"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},cycles:{kind:"acyclic"}})(e),Wr=e=>at({directionality:{kind:"directed"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},cycles:{kind:"acyclic"}})(e),Vr=e=>H("partiteness","bipartite")(e),Kr=e=>H("completeness","complete")(e),Hr=e=>H("density","sparse")(e),Jr=e=>H("density","dense")(e),Qr=e=>H("degreeConstraint","regular")(e),Xr=e=>H("connectivity","connected")(e),Yr=e=>{if(!e.edges.every(o=>o.endpoints.length===2))return!1;const n=qe(e);if(n.directionality.kind==="undirected"){const o=ae(e);return o.length>0&&o.every(r=>r%2===0)}if(n.directionality.kind==="directed"){const o=e.vertices.map(c=>c.id),r={},i={};for(const c of o)r[c]=0,i[c]=0;for(const c of e.edges)if(c.endpoints.length===2){const[d,l]=c.endpoints;i[d]=(i[d]||0)+1,r[l]=(r[l]||0)+1}if(!o.every(c=>r[c]===i[c]))return!1;if(!e.edges.every(c=>!c.directed&&c.endpoints.length===2)){const c=e.edges.map(l=>({...l,directed:!1})),d={vertices:e.vertices,edges:c};return Oe(d)}return!1}return!1},Zr=e=>{const t=e.edges.every(d=>!d.directed),n=e.edges.every(d=>d.endpoints.length===2),o=st(e).kind==="simple",r=It(e)===0;if(!t||!n||!o||!r||!Oe(e)||e.edges.length!==e.vertices.length-1)return!1;const i=ae(e),a=e.vertices.length,s=i.filter(d=>d===a-1).length,c=i.filter(d=>d===1).length;return s===1&&c===a-1},ei=e=>{const t=e.edges.every(r=>!r.directed),n=e.edges.every(r=>r.endpoints.length===2),o=st(e).kind==="simple";return!t||!n||!o?!1:Lr(e)},ti=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:Dt(e)},ni=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:zr(e)},oi=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:Or(e)},ri=e=>{const t={...Pe},n=e.edges.every(r=>!r.directed),o=e.edges.every(r=>r.endpoints.length===2);return!n||!o?!1:Br(e,t)},ii=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:qr(e)},si=e=>H("scaleFree","scale_free")(e),ai=e=>H("smallWorld","small_world")(e),ci=e=>H("communityStructure","modular")(e),di=e=>H("hamiltonian","hamiltonian")(e),li=e=>H("traceable","traceable")(e),ui=e=>H("perfect","perfect")(e),fi=e=>H("split","split")(e),gi=e=>H("cograph","cograph")(e),hi=e=>H("threshold","threshold")(e),pi=e=>H("line","line_graph")(e),mi=e=>H("clawFree","claw_free")(e),vi=e=>H("cubic","cubic")(e),yi=e=>t=>fr(t,e).kind==="k_regular",bi=e=>H("stronglyRegular","strongly_regular")(e),ki=e=>H("selfComplementary","self_complementary")(e),wi=e=>H("vertexTransitive","vertex_transitive")(e),xi=e=>H("completeBipartite","complete_bipartite")(e),Tt=e=>{const t=[];if(e.completeness.kind==="complete"&&e.connectivity.kind==="unconstrained"&&t.push({property:"connectivity/completeness",reason:"Complete graphs are inherently connected (every node reachable from every other)",severity:"error"}),e.completeness.kind==="complete"&&e.cycles.kind==="acyclic"&&t.push({property:"completeness/cycles",reason:"Complete graphs contain cycles (n*(n-1) edges creates many cycles)",severity:"error"}),e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&e.connectivity.kind==="unconstrained"&&t.push({property:"edgeMultiplicity/cycles/connectivity",reason:"Forests (acyclic disconnected graphs) are inherently simple; parallel edges either create cycles or are redundant",severity:"warning"}),e.cycles.kind==="acyclic"&&e.connectivity.kind==="unconstrained"&&e.density.kind==="sparse"&&t.push({property:"cycles/density/connectivity",reason:"Forest minimum density may exceed sparse threshold depending on component structure",severity:"warning"}),e.directionality.kind==="undirected"&&e.cycles.kind==="acyclic"&&e.connectivity.kind==="connected"&&e.density.kind!=="unconstrained"&&t.push({property:"cycles/density",reason:"Trees have exactly n-1 edges, which may not match specified density",severity:"warning"}),e.cycles.kind==="acyclic"&&e.selfLoops.kind==="allowed"&&e.directionality.kind==="directed"&&t.push({property:"cycles/selfLoops",reason:"Self-loops create cycles in directed graphs",severity:"error"}),e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&e.connectivity.kind==="connected"&&e.directionality.kind==="undirected"&&t.push({property:"edgeMultiplicity/cycles/connectivity/directionality",reason:"Undirected connected acyclic graphs are trees (n-1 edges, no parallel edges). Multigraphs require parallel edges which would create cycles.",severity:"error"}),e.directionality.kind==="undirected"&&e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&t.push({property:"edgeMultiplicity/cycles/directionality",reason:"Undirected acyclic graphs (forests and trees) cannot have parallel edges. Adding parallel edges would create cycles.",severity:"error"}),e.directionality.kind==="directed"&&e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&t.push({property:"edgeMultiplicity/cycles/directionality",reason:"Directed acyclic graphs with parallel edges require careful design to avoid cycles",severity:"warning"}),e.partiteness?.kind==="bipartite"&&e.cycles.kind==="cycles_allowed"&&e.directionality.kind==="undirected"&&t.push({property:"partiteness/cycles",reason:"Bipartite graphs cannot contain odd-length cycles (all cycles in bipartite graphs have even length)",severity:"warning"}),e.embedding?.kind==="planar"&&e.completeness.kind==="complete"&&t.push({property:"embedding/completeness",reason:"Complete graphs with n ≥ 5 are non-planar (K5 is Kuratowski's first graph)",severity:"error"}),e.embedding?.kind==="planar"&&e.completeBipartite?.kind==="complete_bipartite"){const{m:n,n:o}=e.completeBipartite;n>=3&&o>=3&&t.push({property:"embedding/completeBipartite",reason:`K${n},${o} is non-planar when m,n ≥ 3 (K3,3 is Kuratowski's second graph)`,severity:"error"})}if(e.kVertexConnected?.kind==="k_vertex_connected"){const{k:n}=e.kVertexConnected;t.push({property:"kVertexConnected/nodeCount",reason:`k-vertex-connected graphs require at least ${n+1} vertices (will be validated during generation)`,severity:"warning"})}if(e.kEdgeConnected?.kind==="k_edge_connected"){const{k:n}=e.kEdgeConnected;t.push({property:"kEdgeConnected/nodeCount",reason:`k-edge-connected graphs require at least ${n+1} vertices (will be validated during generation)`,severity:"warning"})}if(e.perfectMatching?.kind==="perfect_matching"&&e.edgeMultiplicity.kind==="simple"&&t.push({property:"perfectMatching/vertexCount",reason:"Simple graphs with odd vertex count cannot have perfect matching (will be validated during generation)",severity:"warning"}),e.kColorable?.kind==="k_colorable"&&e.chromaticNumber?.kind==="chromatic_number"){const{k:n}=e.kColorable,{chi:o}=e.chromaticNumber;o>n&&t.push({property:"kColorable/chromaticNumber",reason:`Graph cannot be ${n}-colorable if chromatic number is ${o} (chi > k)`,severity:"error"})}if(e.embedding?.kind==="planar"&&e.treewidth?.kind==="treewidth"){const{width:n}=e.treewidth;n>4&&t.push({property:"embedding/treewidth",reason:`Planar graphs have treewidth ≤ 4, but spec requires treewidth ${n}`,severity:"error"})}if(e.tournament?.kind==="tournament"&&e.directionality.kind==="undirected"&&t.push({property:"tournament/directionality",reason:"Tournament graphs are complete oriented graphs (must be directed)",severity:"error"}),e.tournament?.kind==="tournament"&&e.completeness.kind==="complete"&&t.push({property:"tournament/completeness",reason:"Tournament graphs are inherently complete (one directed edge between each vertex pair)",severity:"warning"}),e.comparability?.kind==="comparability"&&e.perfect?.kind==="imperfect"&&t.push({property:"comparability/perfect",reason:"Comparability graphs are perfect (cannot be imperfect)",severity:"error"}),e.interval?.kind==="interval"&&(e.chordal?.kind==="non_chordal"&&t.push({property:"interval/chordal",reason:"Interval graphs are chordal (cannot be non-chordal)",severity:"error"}),e.perfect?.kind==="imperfect"&&t.push({property:"interval/perfect",reason:"Interval graphs are perfect (cannot be imperfect)",severity:"error"})),e.chordal?.kind==="chordal"&&e.perfect?.kind==="imperfect"&&t.push({property:"chordal/perfect",reason:"Chordal graphs are perfect (cannot be imperfect)",severity:"error"}),e.partiteness?.kind==="bipartite"&&e.kColorable?.kind==="k_colorable"){const{k:n}=e.kColorable;n<2&&t.push({property:"partiteness/kColorable",reason:`Bipartite graphs are 2-colorable, but spec requires ${n}-colorable (k < 2)`,severity:"error"})}return e.star?.kind==="star"&&e.cycles.kind==="cycles_allowed"&&t.push({property:"star/cycles",reason:"Star graphs are trees (cannot have cycles)",severity:"error"}),(e.binaryTree?.kind==="binary_tree"||e.binaryTree?.kind==="full_binary"||e.binaryTree?.kind==="complete_binary")&&e.cycles.kind==="cycles_allowed"&&t.push({property:"binaryTree/cycles",reason:"Binary trees are trees (cannot have cycles)",severity:"error"}),(e.eulerian?.kind==="eulerian"||e.eulerian?.kind==="semi_eulerian")&&t.push({property:"eulerian/degree",reason:"Eulerian graphs require specific degree constraints (validated during generation)",severity:"warning"}),e.flowNetwork?.kind==="flow_network"&&e.directionality.kind==="undirected"&&t.push({property:"flowNetwork/directionality",reason:"Flow networks require directed edges (to define source → sink flow)",severity:"error"}),t},Mi=e=>Tt(e).some(n=>n.severity==="error"),Si=e=>{const t={},n=Tt(e);for(const o of n)o.severity==="warning"&&(o.property.includes("edgeMultiplicity/cycles")&&(t.skipCycleValidation=!0),o.property.includes("cycles/density/connectivity")&&(t.relaxDensityValidation=!0),o.property.includes("cycles/density")&&(t.relaxDensityValidation=!0));return t},Ue=e=>{const t=e.filter(o=>o.partition==="left"),n=e.filter(o=>o.partition==="right");return{left:t,right:n}},ke=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Ci=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);for(const a of r)for(const s of i)ke(t,a.id,s.id,n,o)},bt=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;const a=r[0],s=i[0];ke(t,a.id,s.id,n,o);const c=new Set([a.id,s.id]),d=[...r.slice(1),...i.slice(1)];for(const l of d){const f=(l.partition==="left"?i:r).filter(g=>c.has(g.id));if(f.length>0){const g=o.choice(f);ke(t,l.id,g.id,n,o),c.add(l.id)}}},en=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;bt(e,t,n,o);const a=Math.min(r.length,i.length),s=Math.max(0,a-1);for(let c=0;c<s;c++){const d=o.choice(r),l=o.choice(i);n.edgeMultiplicity.kind==="simple"&&t.some(f=>f.source===d.id&&f.target===l.id||n.directionality.kind==="undirected"&&f.source===l.id&&f.target===d.id)||ke(t,d.id,l.id,n,o)}},tn=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;const a=Math.max(2,Math.floor(Math.sqrt(e.length))),s=Math.ceil(e.length/a);for(let c=0;c<a;c++){const d=c*s,l=Math.min(d+s,e.length),u=e.slice(d,l);if(u.length<2)continue;const f=u.filter(v=>v.partition==="left"),g=u.filter(v=>v.partition==="right");if(f.length===0||g.length===0)continue;ke(t,f[0].id,g[0].id,n,o);const h=new Set([f[0].id,g[0].id]),p=[...f.slice(1),...g.slice(1)];for(const v of p){const y=(v.partition==="left"?g:f).filter(b=>h.has(b.id));if(y.length>0){const b=o.choice(y);ke(t,v.id,b.id,n,o),h.add(v.id)}}}},nn=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;const a=2+Math.floor(o.next()*3),s=Math.ceil(e.length/a);for(let c=0;c<a;c++){const d=c*s,l=Math.min(d+s,e.length),u=e.slice(d,l),f=u.filter(y=>y.partition==="left"),g=u.filter(y=>y.partition==="right");if(f.length===0||g.length===0)continue;const h=new Set,p=f[0],v=g[0];ke(t,p.id,v.id,n,o),h.add(p.id),h.add(v.id);for(const y of[...f.slice(1),...g.slice(1)]){const k=(y.partition==="left"?g:f).filter(w=>h.has(w.id));if(k.length>0){const w=o.choice(k);ke(t,y.id,w.id,n,o),h.add(y.id)}}const m=Math.floor(o.next()*f.length);for(let y=0;y<m;y++){const b=o.choice(f),k=o.choice(g);n.edgeMultiplicity.kind==="simple"&&t.some(C=>C.source===b.id&&C.target===k.id||n.directionality.kind==="undirected"&&C.source===k.id&&C.target===b.id)||ke(t,b.id,k.id,n,o)}}},X=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},_i=(e,t,n,o,r,i)=>{const a=e.length,s=e.find(g=>g.id===o),c=e.find(g=>g.id===r);if(!s)throw new Error(`Source node '${o}' not found in nodes`);if(!c)throw new Error(`Sink node '${r}' not found in nodes`);if(o===r)throw new Error("Source and sink must be different nodes");const d=new Set(e.filter(g=>g.id!==o&&g.id!==r).map(g=>g.id)),l=.5+i.next()*.25;for(const g of d)i.next()<l&&t.push({source:o,target:g,weight:Math.floor(i.next()*10)+1});const u=[...d];if(u.length>1)for(let g=0;g<u.length;g++){const h=u[g],p=Math.floor(i.next()*2)+1;for(let v=1;v<=p;v++){const m=(g+v)%u.length,y=u[m];i.next()<.7&&t.push({source:h,target:y,weight:Math.floor(i.next()*10)+1})}}const f=.5+i.next()*.25;for(const g of d)i.next()<f&&t.push({source:g,target:r,weight:Math.floor(i.next()*10)+1});if(i.next()<.3&&t.push({source:o,target:r,weight:Math.floor(i.next()*20)+10}),t.length<a-1){for(const g of d)if(!t.some(p=>p.source===o&&p.target===g)&&(t.push({source:o,target:g,weight:Math.floor(i.next()*10)+1}),t.length>=a-1))break}},Ni=(e,t,n,o)=>{const r=e.length;if(r<2)return;const i=n.eulerian?.kind==="semi_eulerian";for(let l=0;l<r;l++){const u=e[l].id,f=e[(l+1)%r].id;X(t,u,f,n,o)}if(i&&t.length>0){const l=o.choice(t),u=t.indexOf(l);u!==-1&&t.splice(u,1)}const a=new Set(t.map(l=>n.directionality.kind==="directed"?`${l.source}→${l.target}`:[l.source,l.target].sort().join("-"))),s=new Map;for(const l of e)s.set(l.id,0);for(const l of t)s.set(l.source,(s.get(l.source)||0)+1),n.directionality.kind==="undirected"&&s.set(l.target,(s.get(l.target)||0)+1);const c=r*2;let d=0;for(;d<c;){d++;const l=o.choice(e).id,u=o.choice(e).id;if(l===u)continue;const f=n.directionality.kind==="directed"?`${l}→${u}`:[l,u].sort().join("-");if(n.edgeMultiplicity.kind==="simple"&&a.has(f))continue;const g=s.get(l)||0,h=s.get(u)||0;if(n.directionality.kind==="undirected"){const v=[...s.values()].filter(y=>y%2===1).length+(g%2===0?1:-1)+(h%2===0?1:-1);(i?v===2:v===0)&&(X(t,l,u,n,o),s.set(l,g+1),s.set(u,h+1),a.add(f))}else break}},Ei=(e,t,n,o,r)=>{const i=e.length;if(i<o+1)throw new Error(`k-vertex-connected graph requires at least ${o+1} vertices (got n=${i}, k=${o})`);const a=Math.min(o+1,i);for(let s=0;s<a;s++)for(let c=s+1;c<a;c++)X(t,e[s].id,e[c].id,n,r);for(let s=a;s<i;s++){const c=e[s].id,d=e.slice(0,s),l=Math.min(o,d.length),u=[...d];for(let f=u.length-1;f>0;f--){const g=r.integer(0,f);[u[f],u[g]]=[u[g],u[f]]}for(let f=0;f<l;f++)X(t,c,u[f].id,n,r)}},$i=(e,t,n,o,r)=>{const i=e.length;if(i<o+1)throw new Error(`k-edge-connected graph requires at least ${o+1} vertices (got n=${i}, k=${o})`);if(n.directionality.kind==="directed"){for(let l=0;l<i;l++){const u=e[l].id,f=e[(l+1)%i].id;X(t,u,f,n,r)}for(let l=0;l<i;l++){const u=e[l].id;for(let f=0;f<o-1;f++){const g=(l+f+2)%i,h=e[g].id;X(t,u,h,n,r)}}return}for(let l=0;l<i;l++){const u=e[l].id,f=e[(l+1)%i].id;X(t,u,f,n,r)}const a=new Map;for(const l of e)a.set(l.id,2);const s=new Set(t.map(l=>[l.source,l.target].sort().join("-"))),c=i*o*2;let d=0;for(;d<c;){d++;const l=[...a.entries()].filter(([p,v])=>v<o).map(([p,v])=>p);if(l.length===0)break;const u=r.choice(l),f=e.filter(p=>p.id!==u);if(f.length===0)break;const g=r.choice(f).id,h=[u,g].sort().join("-");s.has(h)||(X(t,u,g,n,r),s.add(h),a.set(u,(a.get(u)||0)+1),a.set(g,(a.get(g)||0)+1))}},Ii=(e,t,n,o,r)=>{const i=e.length;if(i<o+1)throw new Error(`Treewidth ${o} requires at least ${o+1} vertices (got n=${i}, k=${o})`);if(o===0){if(n.connectivity.kind==="connected")for(let c=1;c<i;c++){const d=e[c].id,l=r.integer(0,c-1),u=e[l].id;X(t,u,d,n,r)}else{const c=Math.min(3,Math.max(2,Math.floor(i/3))),d=Math.floor(i/c);for(let l=0;l<c;l++){const u=l*d,f=l===c-1?i:u+d,g=e.slice(u,f);for(let h=1;h<g.length;h++){const p=g[h].id,v=r.integer(0,h-1),m=g[v].id;X(t,m,p,n,r)}}}return}const a=Math.min(o+1,i);for(let c=0;c<a;c++)for(let d=c+1;d<a;d++)X(t,e[c].id,e[d].id,n,r);const s=[];if(a===o+1){const c=e.slice(0,a).map(l=>l.id),d=(l,u)=>{if(u===0)return[[]];if(l.length===0)return[];const[f,...g]=l,h=d(g,u-1).map(v=>[f,...v]),p=d(g,u);return[...h,...p]};s.push(...d(c,o))}else s.push(e.slice(0,a).map(c=>c.id));for(let c=a;c<i;c++){const d=e[c].id,l=r.choice(s);for(const u of l)X(t,d,u,n,r);for(let u=0;u<l.length;u++){const f=[d,...l.slice(0,u),...l.slice(u+1)];s.push(f)}}},Pi=(e,t,n,o,r)=>{const i=e.length;if(o<1)throw new Error(`k-colorable graphs require k >= 1 (got k=${o})`);if(o===1)return;const a=Array.from({length:o},()=>[]);for(let s=0;s<i;s++){const c=e[s],d=r.integer(0,o-1);a[d].push(c.id)}for(let s=0;s<o;s++)for(let c=s+1;c<o;c++){const d=a[s],l=a[c],u=d.length*l.length;if(u===0)continue;let f;switch(n.density.kind){case"sparse":{f=.2;break}case"moderate":{f=.5;break}case"dense":{f=1;break}default:f=.5}const g=Math.floor(u*f);let h=0;const p=[];for(const v of d)for(const m of l)p.push([v,m]);for(let v=p.length-1;v>0;v--){const m=r.integer(0,v);[p[v],p[m]]=[p[m],p[v]]}for(const[v,m]of p){if(h>=g)break;X(t,v,m,n,r),h++}}if(n.cycles.kind==="acyclic"){t.length=0;const s=new Set,c=a;for(const d of c[0])s.add(d);for(let d=1;d<o&&c[d].length>0;d++)for(const l of c[d]){if(s.size===0)break;const u=r.choice([...s]);X(t,u,l,n,r),s.add(l)}for(let d=0;d<o;d++)for(const l of c[d])if(!s.has(l)&&s.size>0){const u=r.choice([...s]);X(t,u,l,n,r),s.add(l)}}},En=(e,t,n,o)=>{if(e.length!==0)for(let r=0;r<e.length;r++){const i=e[r].id,a=e[(r+1)%e.length].id;X(t,i,a,n,o)}},$n=(e,t,n,o)=>{if(e.length<2)return;const r=Math.min(3,Math.max(2,Math.floor(e.length/3))),i=Math.floor(e.length/r);for(let a=0;a<r;a++){const s=a*i,c=a===r-1?e.length:s+i,d=e.slice(s,c);for(let l=1;l<d.length;l++){const u=d[l].id,f=o.integer(0,l-1),g=d[f].id;X(t,g,u,n,o)}}},In=(e,t,n,o)=>{if(e.length<2)return;const r=n.density.kind==="sparse"||n.density.kind==="moderate",i=Math.min(3,Math.max(2,Math.floor(e.length/3))),a=Math.floor(e.length/i),s=[];for(let c=0;c<i;c++){const d=c*a,l=c===i-1?e.length:d+a,u=e.slice(d,l);if(s.push({start:d,end:l}),u.length>=2)if(r)for(let f=1;f<u.length;f++){const g=u[f].id,h=o.integer(0,f-1),p=u[h].id;X(t,p,g,n,o)}else for(let f=0;f<u.length;f++){const g=u[f].id,h=u[(f+1)%u.length].id;X(t,g,h,n,o)}}if(r&&n.cycles.kind==="cycles_allowed"){const c=new Set(t.map(d=>n.directionality.kind==="directed"?`${d.source}→${d.target}`:[d.source,d.target].sort().join("-")));for(const{start:d,end:l}of s)if(l-d>=4){for(let u=0;u<l-d-3;u++){const f=e[d+u].id,g=e[d+u+3].id,h=n.directionality.kind==="directed"?`${f}→${g}`:[f,g].sort().join("-");if(!c.has(h)){X(t,f,g,n,o);break}}break}}},te=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Pn=(e,t,n,o)=>{if(e.length!==0)for(let r=1;r<e.length;r++){const i=e[r].id,a=o.integer(0,r-1),s=e[a].id;te(t,s,i,n,o)}},Di=(e,t,n,o)=>{if(e.length===0)return;const r=e[0].id;for(let i=1;i<e.length;i++){const a=e[i].id;te(t,r,a,n,o)}},Ti=(e,t,n,o)=>{if(e.length<4){if(e.length===1)return;if(e.length===2){te(t,e[0].id,e[1].id,n,o);return}if(e.length===3){for(let a=0;a<e.length;a++)for(let s=a+1;s<e.length;s++)te(t,e[a].id,e[s].id,n,o);return}}const r=e[0].id,i=e.slice(1);for(let a=0;a<i.length;a++){const s=i[a].id,c=i[(a+1)%i.length].id;te(t,s,c,n,o)}for(const a of i)te(t,r,a.id,n,o)},Ai=(e,t,n,o)=>{if(e.length===0||n.grid?.kind!=="grid")return;const{rows:r,cols:i}=n.grid,a=r*i,s=e.slice(0,Math.min(a,e.length));for(let c=0;c<r;c++)for(let d=0;d<i;d++){const l=c*i+d;if(l>=s.length)break;const u=s[l].id;if(d<i-1){const f=c*i+(d+1);f<s.length&&te(t,u,s[f].id,n,o)}if(c<r-1){const f=(c+1)*i+d;f<s.length&&te(t,u,s[f].id,n,o)}}},Ri=(e,t,n,o)=>{if(e.length===0||n.toroidal?.kind!=="toroidal")return;const{rows:r,cols:i}=n.toroidal,a=r*i,s=e.slice(0,Math.min(a,e.length));for(let c=0;c<r;c++)for(let d=0;d<i;d++){const l=c*i+d;if(l>=s.length)break;const u=s[l].id,f=(d+1)%i,g=c*i+f;g<s.length&&te(t,u,s[g].id,n,o);const p=(c+1)%r*i+d;p<s.length&&te(t,u,s[p].id,n,o)}},Fi=(e,t,n,o)=>{if(e.length===0)return;const r=n.binaryTree?.kind;if(r==="complete_binary")for(let i=0;i<e.length;i++){const a=2*i+1,s=2*i+2;a<e.length&&te(t,e[i].id,e[a].id,n,o),s<e.length&&te(t,e[i].id,e[s].id,n,o)}else if(r==="full_binary"){const i=[0];let a=1;for(;i.length>0&&a<e.length;){const s=i.shift();if(s===void 0)break;if(o.next()>.5&&a+1<e.length){const d=a++,l=a++;te(t,e[s].id,e[d].id,n,o),te(t,e[s].id,e[l].id,n,o),i.push(d,l)}}}else{const i=[0];let a=1;for(;i.length>0&&a<e.length;){const s=i.shift();if(s===void 0)break;const c=Math.min(2,e.length-a),d=i.length===0&&a<e.length?1:0;if(c>0){const l=o.integer(d,c);for(let u=0;u<l&&a<e.length;u++){const f=a++;te(t,e[s].id,e[f].id,n,o),i.push(f)}}}}},ji=(e,t,n,o)=>{if(!(e.length<2))for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++){const a=e[r].id,s=e[i].id;o.next()>.5?te(t,a,s,n,o):te(t,s,a,n,o)}},on=(e,t,n,o,r)=>{const i=e.length;if(o>=i)throw new Error(`k-regular graph requires k < n (got k=${o}, n=${i})`);if(i*o%2!==0)throw new Error(`k-regular graph requires n*k to be even (got n=${i}, k=${o}, n*k=${i*o})`);const a=1e3;let s=0;for(;s<a&&t.length<i*o/2;){s++,s>1&&(t.length=0);const c=[];for(const u of e)for(let f=0;f<o;f++)c.push(u.id);for(let u=c.length-1;u>0;u--){const f=r.integer(0,u);[c[u],c[f]]=[c[f],c[u]]}const d=new Set;let l=!0;for(let u=0;u<c.length;u+=2){const f=c[u],g=c[u+1];if(f===g&&n.selfLoops.kind==="disallowed"){l=!1;break}const h=n.directionality.kind==="directed"?`${f}→${g}`:[f,g].sort().join("-");if(n.edgeMultiplicity.kind==="simple"&&d.has(h)){l=!1;break}te(t,f,g,n,r),n.edgeMultiplicity.kind==="simple"&&d.add(h)}if(l&&t.length===i*o/2)break}if(t.length<i*o/2)throw new Error(`Failed to generate ${o}-regular graph after ${a} attempts (got ${t.length} edges, expected ${i*o/2})`)},Li=(e,t,n)=>{const{min:o=1,max:r=100}=t.weightRange??{};for(const i of e)i.weight=n.integer(o,r)},rn=(e,t,n)=>{if(e.length<2)return!1;const o=new Map;for(const s of e)o.set(s.id,[]);for(const s of t){const c=o.get(s.source);c&&c.push(s.target)}const r=new Set,i=new Set,a=s=>{r.add(s),i.add(s);const c=o.get(s)??[];for(const d of c)if(r.has(d)){if(i.has(d))return!0}else if(a(d))return!0;return i.delete(s),!1};for(const s of e)if(!r.has(s.id)&&a(s.id))return!0;return!1},Dn=(e,t,n)=>{const o=[],r=new Set,i=new Map;for(const a of e)i.set(a.id,[]);for(const a of t){const s=i.get(a.source);if(s&&s.push(a.target),!n){const c=i.get(a.target);c&&c.push(a.source)}}for(const a of e){if(r.has(a.id))continue;const s=[],c=[a.id];for(;c.length>0;){const d=c.shift();if(d===void 0)break;if(r.has(d))continue;r.add(d),s.push(d);const l=i.get(d)??[];c.push(...l.filter(u=>!r.has(u)))}o.push(s)}return o},he=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},zi=e=>e.completeBipartite?.kind==="complete_bipartite"||e.grid?.kind==="grid"||e.toroidal?.kind==="toroidal"||e.star?.kind==="star"||e.wheel?.kind==="wheel"||e.binaryTree?.kind==="binary_tree"||e.binaryTree?.kind==="full_binary"||e.binaryTree?.kind==="complete_binary"||e.tournament?.kind==="tournament"||e.cubic?.kind==="cubic"||e.specificRegular?.kind==="k_regular"||e.flowNetwork?.kind==="flow_network"||e.eulerian?.kind==="eulerian"||e.eulerian?.kind==="semi_eulerian"||e.kVertexConnected?.kind==="k_vertex_connected"||e.kEdgeConnected?.kind==="k_edge_connected"||e.treewidth?.kind==="treewidth"||e.kColorable?.kind==="k_colorable"||e.kColorable?.kind==="bipartite_colorable"||e.split?.kind==="split"||e.cograph?.kind==="cograph"||e.clawFree?.kind==="claw_free"||e.chordal?.kind==="chordal"||e.interval?.kind==="interval"||e.permutation?.kind==="permutation"||e.comparability?.kind==="comparability"||e.perfect?.kind==="perfect"||e.scaleFree?.kind==="scale_free"||e.smallWorld?.kind==="small_world"||e.communityStructure?.kind==="modular"||e.line?.kind==="line_graph"||e.selfComplementary?.kind==="self_complementary"||e.threshold?.kind==="threshold"||e.unitDisk?.kind==="unit_disk"||e.planarity?.kind==="planar"||e.hamiltonian?.kind==="hamiltonian"||e.traceable?.kind==="traceable"||e.stronglyRegular?.kind==="strongly_regular"||e.vertexTransitive?.kind==="vertex_transitive",Bi=(e,t,n)=>{const o=e.length,r=n.selfLoops.kind==="allowed"?o:0;if(n.partiteness?.kind==="bipartite"){const a=e.filter(c=>c.partition==="left"),s=e.filter(c=>c.partition==="right");return n.directionality.kind==="directed"?2*a.length*s.length+r:a.length*s.length}if(n.connectivity.kind==="unconstrained"){const a=Dn(e,t,n.directionality.kind==="directed");if(a.length>1)return a.reduce((s,c)=>{const d=c.length;return n.directionality.kind==="directed"?s+d*(d-1):s+d*(d-1)/2},0)+r}return n.directionality.kind==="directed"?o*(o-1)+r:o*(o-1)/2},Oi=(e,t,n,o)=>n.completeness.kind==="complete"?o:n.directionality.kind==="undirected"&&n.cycles.kind==="acyclic"&&n.connectivity.kind==="connected"?t.length:Math.floor(o*{sparse:.15,moderate:.4,dense:.7,unconstrained:.4}[n.density.kind]),qi=(e,t)=>t.selfLoops.kind==="allowed"&&t.completeness.kind!=="complete"&&e.length>0,Ui=(e,t)=>e*(t==="dense"?100:10),Gi=(e,t,n,o)=>{const r=n.unitDisk?.kind==="unit_disk"&&n.unitDisk.unitRadius!==void 0?n.unitDisk.unitRadius:1,i=n.unitDisk?.kind==="unit_disk"&&n.unitDisk.spaceSize!==void 0?n.unitDisk.spaceSize:Math.sqrt(e.length);for(const a of e)a.data||(a.data={}),a.data.x=o.next()*i,a.data.y=o.next()*i;for(let a=0;a<e.length;a++)for(let s=a+1;s<e.length;s++){const c=e[a].data,d=e[s].data;if(!c||!d)continue;const l=c.x-d.x,u=c.y-d.y;Math.hypot(l,u)<=r&&Ke(t,e[a].id,e[s].id,n,o)}},Wi=(e,t,n,o)=>{if(e.length<4){for(let s=0;s<e.length;s++)for(let c=s+1;c<e.length;c++)Ke(t,e[s].id,e[c].id,n,o);return}for(let s=0;s<e.length;s++)Ke(t,e[s].id,e[(s+1)%e.length].id,n,o);const r=3*e.length-6;let i=0;const a=e.length*2;for(;t.length<r&&i<a;){i++;const s=Math.floor(o.next()*e.length),c=Math.floor(o.next()*e.length);s>=c||Vi(t,e[s].id,e[c].id)||Ke(t,e[s].id,e[c].id,n,o)}},Ke=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Vi=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),ct=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Ki=(e,t,n,o)=>{if(n.hereditaryClass?.kind!=="hereditary_class")throw new Error("Hereditary class graph requires hereditary_class spec");const{forbidden:r}=n.hereditaryClass;for(const d of e)d.data=d.data||{},d.data.forbiddenSubgraphs=r,d.data.hereditaryClass=!0;const i=n.density.kind==="sparse"?.15:n.density.kind==="moderate"?.4:n.density.kind==="dense"?.7:.3,a=e.length*(e.length-1)/2,s=Math.floor(a*i);let c=0;for(let d=0;d<e.length&&c<s;d++)for(let l=d+1;l<e.length&&c<s;l++)o.next()<i&&(ct(t,e[d].id,e[l].id,n,o),c++)},Hi=(e,t,n,o)=>{if(n.independenceNumber?.kind!=="independence_number")throw new Error("Independence number graph requires independence_number spec");const{value:r}=n.independenceNumber;if(r>e.length)throw new Error(`Independence number ${r} cannot exceed node count ${e.length}`);for(const s of e)s.data=s.data||{},s.data.targetIndependenceNumber=r;const i=[],a=e.map((s,c)=>c);for(let s=0;s<r;s++){const c=Math.floor(o.next()*a.length);i.push(a[c]),a.splice(c,1)}for(const s of i)e[s].data=e[s].data||{},e[s].data.independentSet=!0;for(let s=0;s<e.length;s++)for(let c=s+1;c<e.length;c++)i.includes(s)&&i.includes(c)||ct(t,e[s].id,e[c].id,n,o)},Ji=(e,t,n,o)=>{if(n.vertexCover?.kind!=="vertex_cover")throw new Error("Vertex cover graph requires vertex_cover spec");const{value:r}=n.vertexCover;if(r>e.length)throw new Error(`Vertex cover number ${r} cannot exceed node count ${e.length}`);for(const c of e)c.data=c.data||{},c.data.targetVertexCover=r;const i=e.length-r,a=e.map((c,d)=>d);for(let c=0;c<i;c++){const d=Math.floor(o.next()*a.length);a.splice(d,1)}const s=a;for(const c of s)e[c].data=e[c].data||{},e[c].data.vertexCover=!0;for(let c=0;c<e.length;c++)for(let d=c+1;d<e.length;d++)!s.includes(c)&&!s.includes(d)||ct(t,e[c].id,e[d].id,n,o)},Qi=(e,t,n,o)=>{if(n.dominationNumber?.kind!=="domination_number")throw new Error("Domination number graph requires domination_number spec");const{value:r}=n.dominationNumber;if(r>e.length)throw new Error(`Domination number ${r} cannot exceed node count ${e.length}`);for(const s of e)s.data=s.data||{},s.data.targetDominationNumber=r;const i=[],a=e.map((s,c)=>c);for(let s=0;s<r;s++){const c=Math.floor(o.next()*a.length);i.push(a[c]),a.splice(c,1)}for(const s of i)e[s].data=e[s].data||{},e[s].data.dominatingSet=!0;for(let s=0;s<e.length;s++)for(let c=s+1;c<e.length;c++)(i.includes(s)||i.includes(c))&&ct(t,e[s].id,e[c].id,n,o)},Ee=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Tn=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),Xi=(e,t,n,o)=>{if(e.length<3)return;const r=n.scaleFree?.kind==="scale_free"?n.scaleFree.exponent??2.1:2.1,i=Math.max(2,Math.floor(e.length/10));for(let s=0;s<i;s++)for(let c=s+1;c<i;c++)Ee(t,e[s].id,e[c].id,n,o);const a=new Map;for(const s of e)a.set(s.id,0);for(const s of t)a.set(s.source,(a.get(s.source)||0)+1),a.set(s.target,(a.get(s.target)||0)+1);for(let s=i;s<e.length;s++){const c=[...a.values()].reduce((l,u)=>l+Math.pow(u,r),0),d=Math.min(3,i);for(let l=0;l<d;l++){let u=o.next()*c,f=e[Math.floor(o.next()*s)].id;for(const[g,h]of a){const p=Math.pow(h,r);if(u-=p,u<=0){f=g;break}}Tn(t,e[s].id,f)||(Ee(t,e[s].id,f,n,o),a.set(f,(a.get(f)||0)+1))}a.set(e[s].id,d)}for(const s of e)s.data=s.data||{},s.data.scaleFreeExponent=r},Yi=(e,t,n,o)=>{if(e.length<4)return;const r=n.smallWorld?.kind==="small_world"?n.smallWorld.rewireProbability??.1:.1,i=n.smallWorld?.kind==="small_world"?n.smallWorld.meanDegree??4:4,a=Math.floor(i/2);for(let c=0;c<e.length;c++)for(let d=1;d<=a;d++){const l=(c+d)%e.length;Ee(t,e[c].id,e[l].id,n,o)}const s=[...t];for(const c of s)if(o.next()<r){const d=t.indexOf(c);d!==-1&&t.splice(d,1);const l=e.findIndex(h=>h.id===c.source);let u=Math.floor(o.next()*e.length),f=0;const g=e.length*2;for(;(u===l||Tn(t,c.source,e[u].id))&&(u=(u+1)%e.length,f++,!(f>g)););f<=g&&Ee(t,c.source,e[u].id,n,o)}for(const c of e)c.data=c.data||{},c.data.smallWorldRewireProb=r,c.data.smallWorldMeanDegree=i},Zi=(e,t,n,o)=>{if(e.length<3)return;const r=n.communityStructure?.kind==="modular"?n.communityStructure.numCommunities??3:3,i=n.communityStructure?.kind==="modular"?n.communityStructure.intraCommunityDensity??.7:.7,a=n.communityStructure?.kind==="modular"?n.communityStructure.interCommunityDensity??.05:.05,s=Array.from({length:r},()=>[]);for(const[c,d]of e.entries()){const l=c%r;s[l].push(d),d.data=d.data||{},d.data.community=l}for(const c of s)for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++)o.next()<i&&Ee(t,c[d].id,c[l].id,n,o);for(let c=0;c<s.length;c++)for(let d=c+1;d<s.length;d++)for(const l of s[c])for(const u of s[d])o.next()<a&&Ee(t,l.id,u.id,n,o);for(const c of e)c.data=c.data||{},c.data.numCommunities=r,c.data.intraDensity=i,c.data.interDensity=a},re=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},An=(e,t)=>{for(let n=e.length-1;n>0;n--){const o=t.integer(0,n);[e[n],e[o]]=[e[o],e[n]]}},Ge=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),es=(e,t,n,o)=>{if(e.length<3)return;const r=Array.from({length:e.length},(s,c)=>c);An(r,o);for(let s=0;s<r.length;s++){const c=e[r[s]].id,d=e[r[(s+1)%r.length]].id;re(t,c,d,n,o)}for(const[s,c]of e.entries())c.data=c.data||{},c.data.hamiltonianPosition=s,c.data.hamiltonianCycle=r.map(d=>e[d].id);const i=Math.floor(e.length/2);let a=0;for(let s=0;s<i&&a<i;s++){const c=Math.floor(o.next()*e.length),d=Math.floor(o.next()*e.length);c!==d&&!Ge(t,e[c].id,e[d].id)&&(re(t,e[c].id,e[d].id,n,o),a++)}},ts=(e,t,n,o)=>{if(e.length<2)return;const r=Array.from({length:e.length},(s,c)=>c);An(r,o);for(let s=0;s<r.length-1;s++)re(t,e[r[s]].id,e[r[s+1]].id,n,o);for(const[s,c]of e.entries())c.data=c.data||{},c.data.traceablePosition=s,c.data.traceablePath=r.map(d=>e[d].id);const i=Math.floor(e.length/3);let a=0;for(let s=0;s<i&&a<i;s++){const c=Math.floor(o.next()*e.length),d=Math.floor(o.next()*e.length);if(c===d)continue;const l=r.at(-1),u=r[0];c===l&&d===u||c===u&&d===l||Ge(t,e[c].id,e[d].id)||(re(t,e[c].id,e[d].id,n,o),a++)}},ns=(e,t,n,o)=>{if(n.diameter?.kind!=="diameter")throw new Error("Diameter graph requires diameter spec");const{value:r}=n.diameter;for(const i of e)i.data=i.data||{},i.data.targetDiameter=r;if(r===1)for(let i=0;i<e.length;i++)for(let a=i+1;a<e.length;a++)re(t,e[i].id,e[a].id,n,o);else if(r>=e.length-1)for(let i=0;i<e.length-1;i++)re(t,e[i].id,e[i+1].id,n,o);else{for(let s=0;s<e.length-1;s++)re(t,e[s].id,e[s+1].id,n,o);const a=e.length-1-r;for(let s=0;s<a;s++){const c=Math.floor(e.length/(a+1))*(s+1),d=Math.floor(o.next()*(e.length-c-1)),l=d+c;l<e.length&&!Ge(t,e[d].id,e[l].id)&&re(t,e[d].id,e[l].id,n,o)}}},os=(e,t,n,o)=>{if(n.radius?.kind!=="radius")throw new Error("Radius graph requires radius spec");const{value:r}=n.radius;for(const i of e)i.data=i.data||{},i.data.targetRadius=r;if(r===1){const i=e[0].id;for(let a=1;a<e.length;a++)re(t,i,e[a].id,n,o)}else{for(let a=0;a<e.length-1;a++)re(t,e[a].id,e[a+1].id,n,o);const i=Math.ceil((e.length-1)/2);if(r<i){const a=e[Math.floor(e.length/2)].id,s=i-r;for(let c=0;c<s&&c<Math.floor(e.length/2);c++){const d=e[c].id;Ge(t,a,d)||re(t,a,d,n,o)}}}},rs=(e,t,n,o)=>{if(e.length<3)return;if(n.girth?.kind!=="girth")throw new Error("Girth graph requires girth spec");const{girth:r}=n.girth;for(const a of e)a.data=a.data||{},a.data.targetGirth=r;const i=Math.min(r,e.length);for(let a=0;a<i;a++){const s=(a+1)%i;re(t,e[a].id,e[s].id,n,o)}for(let a=i;a<e.length;a++){const s=Math.floor(o.next()*i);re(t,e[s].id,e[a].id,n,o)}},is=(e,t,n,o)=>{if(e.length<3)return;if(n.circumference?.kind!=="circumference")throw new Error("Circumference graph requires circumference spec");const{value:r}=n.circumference;for(const a of e)a.data=a.data||{},a.data.targetCircumference=r;const i=Math.min(r,e.length);for(let a=0;a<i;a++){const s=(a+1)%i;re(t,e[a].id,e[s].id,n,o)}for(let a=i;a<e.length;a++){const s=Math.floor(o.next()*i);re(t,e[s].id,e[a].id,n,o)}if(i>4){const a=Math.floor(i/4);for(let s=0;s<a;s++){const c=Math.floor(o.next()*i),d=(c+2)%i;Ge(t,e[c].id,e[d].id)||re(t,e[c].id,e[d].id,n,o)}}},le=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Rn=(e,t)=>{for(let n=e.length-1;n>0;n--){const o=t.integer(0,n);[e[n],e[o]]=[e[o],e[n]]}},ss=e=>{const t=e.filter(o=>o.partition==="left"),n=e.filter(o=>o.partition==="right");return{left:t,right:n}},as=(e,t,n,o)=>{const{left:r,right:i}=ss(e);for(const a of r)for(const s of i)le(t,a.id,s.id,n,o)},cs=(e,t,n,o)=>{if(e.length<2)return;const r=Math.max(1,Math.floor(e.length/3)),i=e.slice(0,r),a=e.slice(r);for(let s=0;s<i.length;s++)for(let c=s+1;c<i.length;c++)le(t,i[s].id,i[c].id,n,o);for(const s of i)for(const c of a)o.next()<.5&&le(t,s.id,c.id,n,o);for(const s of i)s.data=s.data||{},s.data.splitPartition="clique";for(const s of a)s.data=s.data||{},s.data.splitPartition="independent"},Fn=(e,t,n,o)=>{if(e.length<2)return;const r=(s,c)=>{if(!(s.length<=1))if(c){const d=Math.floor(s.length/2),l=s.slice(0,d),u=s.slice(d);i(l),i(u)}else{const d=Math.floor(s.length/2),l=s.slice(0,d),u=s.slice(d);for(const f of l)for(const g of u)le(t,f.id,g.id,n,o)}},i=s=>{for(let c=0;c<s.length;c++)for(let d=c+1;d<s.length;d++)le(t,s[c].id,s[d].id,n,o)},a=o.next()<.5;r(e,a)},ds=(e,t,n,o)=>{if(!(e.length<2))for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++)le(t,e[r].id,e[i].id,n,o)},jn=(e,t,n,o)=>{if(e.length<3){for(let a=0;a<e.length;a++)for(let s=a+1;s<e.length;s++)le(t,e[a].id,e[s].id,n,o);return}const r=Math.min(Math.floor(o.next()*3)+1,e.length-1),i=e.slice(0,r+1);for(let a=0;a<i.length;a++)for(let s=a+1;s<i.length;s++)le(t,i[a].id,i[s].id,n,o);for(let a=r+1;a<e.length;a++){const s=e.slice(0,a),c=Math.min(r,s.length);for(let d=0;d<c;d++)le(t,e[a].id,s[d].id,n,o)}},ls=(e,t,n,o)=>{if(e.length<2)return;const r=e.map(i=>{const a=o.next()*100,s=1+o.next()*20,c=a+s;return i.data=i.data||{},i.data.interval={start:a,end:c,length:s},{node:i,start:a,end:c}});for(let i=0;i<r.length;i++)for(let a=i+1;a<r.length;a++){const s=r[i],c=r[a];s.start<c.end&&c.start<s.end&&le(t,s.node.id,c.node.id,n,o)}},us=(e,t,n,o)=>{const r=e.length;if(r<2)return;const i=Array.from({length:r},(a,s)=>s);Rn(i,o);for(const[a,s]of e.entries())s.data=s.data||{},s.data.permutationValue=i[a];for(let a=0;a<r;a++)for(let s=a+1;s<r;s++){const c=a-s,d=i[a]-i[s];c*d<0&&le(t,e[a].id,e[s].id,n,o)}},fs=(e,t,n,o)=>{if(e.length<2)return;const r=Array.from({length:e.length},(a,s)=>s);Rn(r,o);for(const[a,s]of e.entries())s.data=s.data||{},s.data.topologicalOrder=r[a];const i=.3;for(let a=0;a<r.length;a++)for(let s=a+1;s<r.length;s++)if(o.next()<i){const c=e[r[a]],d=e[r[s]];le(t,c.id,d.id,n,o)}},gs=(e,t,n,o)=>{if(e.length<2)return;const r=o.next();r<.4?jn(e,t,n,o):r<.7?as(e,t,n,o):Fn(e,t,n,o);for(const i of e)i.data=i.data||{},i.data.perfectClass=r<.4?"chordal":r<.7?"bipartite":"cograph"},hs=(e,t,n,o)=>{if(n.spectrum?.kind!=="spectrum")throw new Error("Spectrum computation requires spectrum spec");const{eigenvalues:r}=n.spectrum;for(const i of e)i.data=i.data||{},i.data.targetSpectrum=r},ps=(e,t,n,o)=>{if(n.algebraicConnectivity?.kind!=="algebraic_connectivity")throw new Error("Algebraic connectivity computation requires algebraic_connectivity spec");const{value:r}=n.algebraicConnectivity;for(const i of e)i.data=i.data||{},i.data.targetAlgebraicConnectivity=r},ms=(e,t,n,o)=>{if(n.spectralRadius?.kind!=="spectral_radius")throw new Error("Spectral radius computation requires spectral_radius spec");const{value:r}=n.spectralRadius;for(const i of e)i.data=i.data||{},i.data.targetSpectralRadius=r},vs=(e,t,n,o)=>{if(n.toughness?.kind!=="toughness")throw new Error("Toughness computation requires toughness spec");const{value:r}=n.toughness;for(const i of e)i.data=i.data||{},i.data.targetToughness=r},ys=(e,t,n,o)=>{if(n.integrity?.kind!=="integrity")throw new Error("Integrity computation requires integrity spec");const{value:r}=n.integrity;for(const i of e)i.data=i.data||{},i.data.targetIntegrity=r},bs=(e,t,n,o)=>{if(n.cage?.kind!=="cage")throw new Error("Cage computation requires cage spec");const{girth:r,degree:i}=n.cage;for(const a of e)a.data=a.data||{},a.data.targetCageGirth=r,a.data.targetCageDegree=i},ks=(e,t,n,o)=>{if(n.moore?.kind!=="moore")throw new Error("Moore graph computation requires moore spec");const{diameter:r,degree:i}=n.moore;for(const a of e)a.data=a.data||{},a.data.targetMooreDiameter=r,a.data.targetMooreDegree=i},ws=(e,t,n,o)=>{if(n.ramanujan?.kind!=="ramanujan")throw new Error("Ramanujan graph computation requires ramanujan spec");const{degree:r}=n.ramanujan;for(const i of e)i.data=i.data||{},i.data.targetRamanujanDegree=r},xs=(e,t,n,o)=>{if(n.cartesianProduct?.kind!=="cartesian_product")throw new Error("Cartesian product computation requires cartesian_product spec");const{leftFactors:r,rightFactors:i}=n.cartesianProduct;for(const a of e)a.data=a.data||{},a.data.targetCartesianProductLeft=r,a.data.targetCartesianProductRight=i},Ms=(e,t,n,o)=>{if(n.tensorProduct?.kind!=="tensor_product")throw new Error("Tensor product computation requires tensor_product spec");const{leftFactors:r,rightFactors:i}=n.tensorProduct;for(const a of e)a.data=a.data||{},a.data.targetTensorProductLeft=r,a.data.targetTensorProductRight=i},Ss=(e,t,n,o)=>{if(n.strongProduct?.kind!=="strong_product")throw new Error("Strong product computation requires strong_product spec");const{leftFactors:r,rightFactors:i}=n.strongProduct;for(const a of e)a.data=a.data||{},a.data.targetStrongProductLeft=r,a.data.targetStrongProductRight=i},Cs=(e,t,n,o)=>{if(n.lexicographicProduct?.kind!=="lexicographic_product")throw new Error("Lexicographic product computation requires lexicographic_product spec");const{leftFactors:r,rightFactors:i}=n.lexicographicProduct;for(const a of e)a.data=a.data||{},a.data.targetLexicographicProductLeft=r,a.data.targetLexicographicProductRight=i},_s=(e,t,n,o)=>{if(n.minorFree?.kind!=="minor_free")throw new Error("Minor-free computation requires minor_free spec");const{forbiddenMinors:r}=n.minorFree;for(const i of e)i.data=i.data||{},i.data.targetForbiddenMinors=r},Ns=(e,t,n,o)=>{if(n.topologicalMinorFree?.kind!=="topological_minor_free")throw new Error("Topological minor-free computation requires topological_minor_free spec");const{forbiddenMinors:r}=n.topologicalMinorFree;for(const i of e)i.data=i.data||{},i.data.targetTopologicalForbiddenMinors=r},Es=(e,t,n,o)=>{n.connectivity.kind==="connected"&&n.cycles.kind==="acyclic"?Pn(e,t,n,o):n.connectivity.kind==="connected"&&n.cycles.kind==="cycles_allowed"?En(e,t,n,o):n.connectivity.kind==="unconstrained"&&n.cycles.kind==="acyclic"?$n(e,t,n,o):In(e,t,n,o)},de=e=>(t,n,o,r)=>(Es(t,n,o,r),e(t,n,o,r),n),$s=de(hs),Is=de(ps),Ps=de(ms),Ds=de(vs),Ts=de(ys),As=de(bs),Rs=de(ks),Fs=de(ws),js=de(xs),Ls=de(Ms),zs=de(Ss),Bs=de(Cs),Os=de(_s),qs=de(Ns),be=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},sn=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),Us=(e,t,n,o)=>{if(e.length<2)return;const r=[],i=Math.ceil(Math.sqrt(e.length*2))+1,a=Array.from({length:i},(c,d)=>({id:`B${d}`,data:{}}));for(let c=0;c<a.length;c++)for(let d=c+1;d<a.length;d++)r.push({source:a[c].id,target:a[d].id});const s=r.slice(0,e.length);for(const[c,d]of e.entries()){const l=d.data||{};l.baseEdge=s[c],d.data=l}for(let c=0;c<s.length;c++)for(let d=c+1;d<s.length;d++){const l=s[c],u=s[d];(l.source===u.source||l.source===u.target||l.target===u.source||l.target===u.target)&&be(t,e[c].id,e[d].id,n,o)}},Gs=(e,t,n,o)=>{const r=e.length;if(r%4!==0&&r%4!==1&&Math.floor(r/4)*4<4)return;const a=r*(r-1)/2/2;let s=0;for(let c=0;c<r&&s<a;c++)for(let d=c+1;d<r&&s<a;d++)(c+d)%2===0&&(t.push({source:e[c].id,target:e[d].id}),s++);if(s<a)for(let c=0;c<r&&s<a;c++)for(let d=c+1;d<r&&s<a;d++)(c+d)%2!==0&&(t.some(u=>u.source===e[c].id&&u.target===e[d].id||u.source===e[d].id&&u.target===e[c].id)||(t.push({source:e[c].id,target:e[d].id}),s++));for(const c of e)c.data=c.data||{},c.data.selfComplementaryType="deterministic"},Ws=(e,t,n,o)=>{if(e.length<2)return;const r=[];for(const[i,a]of e.entries()){const s=o.next()<.5,c=a.data||{};if(a.data=c,c.thresholdType=s?"dominant":"isolated",c.creationOrder=i,s)for(const d of r)be(t,a.id,d,n,o);r.push(a.id)}},Vs=(e,t,n,o)=>{const r=e.length;if(n.stronglyRegular?.kind!=="strongly_regular")throw new Error("Strongly regular graph requires strongly_regular spec");const{k:i,lambda:a,mu:s}=n.stronglyRegular;if(i===void 0||a===void 0||s===void 0)throw new Error("Strongly regular requires k, lambda, mu parameters");if(i*(i-a-1)!==(r-i-1)*s)throw new Error(`Invalid SRG parameters: k(k-λ-1) = (n-k-1)μ required. Got ${i}(${i}-${a}-1) = ${i*(i-a-1)}, (n-k-1)μ = ${(r-i-1)*s}`);for(const c of e)c.data=c.data||{},c.data.srgParams={n:r,k:i,lambda:a,mu:s};for(let c=0;c<r;c++){const d=(c+1)%r;be(t,e[c].id,e[d].id,n,o)}},Ks=(e,t,n,o)=>{if(e.length<2)return;const r=e.length;for(const[i,a]of e.entries())a.data=a.data||{},a.data.vertexTransitiveGroup="cyclic",a.data.vertexPosition=i;be(t,e[0].id,e[1%r].id,n,o);for(let i=1;i<r;i++)if(be(t,e[i].id,e[(i+1)%r].id,n,o),r%2===0){const a=(i+r/2)%r;sn(t,e[i].id,e[a].id)||be(t,e[i].id,e[a].id,n,o)}if(r>5&&r%3===0)for(let i=0;i<r;i++){const a=(i+Math.floor(r/3))%r;sn(t,e[i].id,e[a].id)||be(t,e[i].id,e[a].id,n,o)}},Hs=(e,t,n,o)=>{if(n.edgeTransitive?.kind!=="edge_transitive")throw new Error("Edge-transitive graph requires edge_transitive spec");for(const r of e)r.data=r.data||{},r.data.edgeTransitive=!0;for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++)be(t,e[r].id,e[i].id,n,o)},Js=(e,t,n,o)=>{if(e.length<3)return;if(n.arcTransitive?.kind!=="arc_transitive")throw new Error("Arc-transitive graph requires arc_transitive spec");for(const[i,a]of e.entries())a.data=a.data||{},a.data.arcTransitive=!0,a.data.symmetricGraph=!0,a.data.vertexPosition=i;const r=e.length;for(let i=0;i<r;i++){const a=(i+1)%r;be(t,e[i].id,e[a].id,n,o)}},Qs=(e,t,n,o)=>{const r=[];return t.completeBipartite?.kind==="complete_bipartite"?(Ci(e,r,t,o),r):t.partiteness?.kind==="bipartite"?(t.connectivity.kind==="connected"&&t.cycles.kind==="acyclic"?bt(e,r,t,o):t.connectivity.kind==="connected"&&t.cycles.kind==="cycles_allowed"?en(e,r,t,o):t.connectivity.kind==="unconstrained"&&t.cycles.kind==="acyclic"?tn(e,r,t,o):nn(e,r,t,o),r):t.star?.kind==="star"?(Di(e,r,t,o),r):t.wheel?.kind==="wheel"?(Ti(e,r,t,o),r):t.grid?.kind==="grid"?(Ai(e,r,t,o),r):t.toroidal?.kind==="toroidal"?(Ri(e,r,t,o),r):t.binaryTree?.kind==="binary_tree"||t.binaryTree?.kind==="full_binary"||t.binaryTree?.kind==="complete_binary"?(Fi(e,r,t,o),r):t.tournament?.kind==="tournament"?(ji(e,r,t,o),r):t.cubic?.kind==="cubic"?(on(e,r,t,3,o),r):t.specificRegular?.kind==="k_regular"?(on(e,r,t,t.specificRegular.k,o),r):t.flowNetwork?.kind==="flow_network"?(_i(e,r,t,t.flowNetwork.source,t.flowNetwork.sink,o),r):t.eulerian?.kind==="eulerian"||t.eulerian?.kind==="semi_eulerian"?(Ni(e,r,t,o),r):t.kVertexConnected?.kind==="k_vertex_connected"?(Ei(e,r,t,t.kVertexConnected.k,o),r):t.kEdgeConnected?.kind==="k_edge_connected"?($i(e,r,t,t.kEdgeConnected.k,o),r):t.treewidth?.kind==="treewidth"?(Ii(e,r,t,t.treewidth.width,o),r):t.kColorable?.kind==="k_colorable"?(Pi(e,r,t,t.kColorable.k,o),r):t.kColorable?.kind==="bipartite_colorable"?(t.connectivity.kind==="connected"&&t.cycles.kind==="acyclic"?bt(e,r,t,o):t.connectivity.kind==="connected"&&t.cycles.kind==="cycles_allowed"?en(e,r,t,o):t.connectivity.kind==="unconstrained"&&t.cycles.kind==="acyclic"?tn(e,r,t,o):nn(e,r,t,o),r):t.split?.kind==="split"?(cs(e,r,t,o),r):t.cograph?.kind==="cograph"?(Fn(e,r,t,o),r):t.clawFree?.kind==="claw_free"?(ds(e,r,t,o),r):t.chordal?.kind==="chordal"?(jn(e,r,t,o),r):t.interval?.kind==="interval"?(ls(e,r,t,o),r):t.permutation?.kind==="permutation"?(us(e,r,t,o),r):t.comparability?.kind==="comparability"?(fs(e,r,t,o),r):t.perfect?.kind==="perfect"?(gs(e,r,t,o),r):t.scaleFree?.kind==="scale_free"?(Xi(e,r,t,o),r):t.smallWorld?.kind==="small_world"?(Yi(e,r,t,o),r):t.communityStructure?.kind==="modular"?(Zi(e,r,t,o),r):t.line?.kind==="line_graph"?(Us(e,r,t,o),r):t.selfComplementary?.kind==="self_complementary"?(Gs(e,r),r):t.threshold?.kind==="threshold"?(Ws(e,r,t,o),r):t.unitDisk?.kind==="unit_disk"?(Gi(e,r,t,o),r):t.planarity?.kind==="planar"?(Wi(e,r,t,o),r):t.hamiltonian?.kind==="hamiltonian"?(es(e,r,t,o),r):t.traceable?.kind==="traceable"?(ts(e,r,t,o),r):t.stronglyRegular?.kind==="strongly_regular"?(Vs(e,r,t,o),r):t.vertexTransitive?.kind==="vertex_transitive"?(Ks(e,r,t,o),r):t.edgeTransitive?.kind==="edge_transitive"?(Hs(e,r,t,o),r):t.arcTransitive?.kind==="arc_transitive"?(Js(e,r,t,o),r):t.diameter?.kind==="diameter"?(ns(e,r,t,o),r):t.radius?.kind==="radius"?(os(e,r,t,o),r):t.girth?.kind==="girth"?(rs(e,r,t,o),r):t.circumference?.kind==="circumference"?(is(e,r,t,o),r):t.hereditaryClass?.kind==="hereditary_class"?(Ki(e,r,t,o),r):t.independenceNumber?.kind==="independence_number"?(Hi(e,r,t,o),r):t.vertexCover?.kind==="vertex_cover"?(Ji(e,r,t,o),r):t.dominationNumber?.kind==="domination_number"?(Qi(e,r,t,o),r):t.spectrum?.kind==="spectrum"?$s(e,r,t,o):t.algebraicConnectivity?.kind==="algebraic_connectivity"?Is(e,r,t,o):t.spectralRadius?.kind==="spectral_radius"?Ps(e,r,t,o):t.toughness?.kind==="toughness"?Ds(e,r,t,o):t.integrity?.kind==="integrity"?Ts(e,r,t,o):t.cage?.kind==="cage"?As(e,r,t,o):t.moore?.kind==="moore"?Rs(e,r,t,o):t.ramanujan?.kind==="ramanujan"?Fs(e,r,t,o):t.cartesianProduct?.kind==="cartesian_product"?js(e,r,t,o):t.tensorProduct?.kind==="tensor_product"?Ls(e,r,t,o):t.strongProduct?.kind==="strong_product"?zs(e,r,t,o):t.lexicographicProduct?.kind==="lexicographic_product"?Bs(e,r,t,o):t.minorFree?.kind==="minor_free"?Os(e,r,t,o):t.topologicalMinorFree?.kind==="topological_minor_free"?qs(e,r,t,o):(t.connectivity.kind==="connected"&&t.cycles.kind==="acyclic"?Pn(e,r,t,o):t.connectivity.kind==="connected"&&t.cycles.kind==="cycles_allowed"?En(e,r,t,o):t.connectivity.kind==="unconstrained"&&t.cycles.kind==="acyclic"?$n(e,r,t,o):In(e,r,t,o),r)},Xs=(e,t,n,o,r)=>{if(zi(n))return;e.length;const i=Bi(e,t,n),a=Oi(e,t,n,i);if(n.directionality.kind==="undirected"&&n.cycles.kind==="acyclic"&&n.connectivity.kind==="connected"){if(n.edgeMultiplicity.kind==="multi"&&t.length>0){const m=r.choice(t);he(t,m.source,m.target,n,r)}return}if(n.completeness.kind==="complete"&&n.edgeMultiplicity.kind==="simple"){t.length=0;const m=e.map(y=>y.id);for(let y=0;y<m.length;y++)for(let b=0;b<m.length;b++){const k=m[y],w=m[b];n.directionality.kind==="undirected"&&y>=b&&(y!==b||n.selfLoops.kind!=="allowed")||n.selfLoops.kind==="disallowed"&&k===w||he(t,k,w,n,r)}return}const c=qi(e,n),d=a-t.length,l=n.partiteness?.kind==="bipartite",u=l?e.filter(m=>m.partition==="left"):[],f=l?e.filter(m=>m.partition==="right"):[],g=n.connectivity.kind==="unconstrained"?Dn(e,t,n.directionality.kind==="directed"):[];if(d<=0){if(c&&t.length>0){const m=r.choice(e).id;he(t,m,m,n,r)}if(n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&n.connectivity.kind==="unconstrained"&&t.length>0&&!rn(e,t)){const y=r.choice(t),b=n.directionality.kind==="directed"?`${y.target}→${y.source}`:[y.target,y.source].sort().join("-");new Set(t.map(w=>n.directionality.kind==="directed"?`${w.source}→${w.target}`:[w.source,w.target].sort().join("-"))).has(b)||he(t,y.target,y.source,n,r)}if(n.edgeMultiplicity.kind==="multi"&&t.length>0){const m=r.choice(t);he(t,m.source,m.target,n,r)}return}const h=new Set(t.map(m=>n.directionality.kind==="directed"?`${m.source}→${m.target}`:[m.source,m.target].sort().join("-")));let p=0;const v=Ui(d,n.density.kind);for(;t.length<a&&p<v;){p++;let m,y;if(c&&p%10===0){const k=r.choice(e).id,w=n.directionality.kind==="directed"?`${k}→${k}`:[k,k].sort().join("-");if(n.edgeMultiplicity.kind==="multi"||!h.has(w)){he(t,k,k,n,r),n.edgeMultiplicity.kind==="simple"&&h.add(w);continue}}if(l){const w=(()=>{const x=[];return u.length>0&&x.push(...u),f.length>0&&x.push(...f),r.choice(x)})();let C;if(w.partition==="left"&&f.length>0)C=r.choice(f);else if(u.length>0)C=r.choice(u);else continue;m=w.id,y=C.id}else if(n.connectivity.kind==="unconstrained"&&g.length>0){const k=r.choice(g);if(k.length<2)continue;m=r.choice(k),y=r.choice(k)}else m=r.choice(e).id,y=r.choice(e).id;if(n.selfLoops.kind==="disallowed"&&m===y)continue;const b=n.directionality.kind==="directed"?`${m}→${y}`:[m,y].sort().join("-");if(!(n.edgeMultiplicity.kind==="simple"&&h.has(b))){if(n.cycles.kind==="acyclic"&&n.directionality.kind==="directed"){const k=Number.parseInt(m.slice(1),10);if(Number.parseInt(y.slice(1),10)<=k)continue}he(t,m,y,n,r),n.edgeMultiplicity.kind==="simple"&&h.add(b)}}if(c&&t.length>0&&!t.some(m=>m.source===m.target)){const m=r.choice(e).id;he(t,m,m,n,r)}if(n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&n.connectivity.kind==="unconstrained"&&t.length>0&&!rn(e,t)){const y=r.choice(t),b=`${y.target}→${y.source}`;h.has(b)||he(t,y.target,y.source,n,r)}if(n.edgeMultiplicity.kind==="multi"&&t.length>0){const m=r.choice(t);he(t,m.source,m.target,n,r)}},Ys=(e,t,n)=>{const o=[];let r=0,i=0;if(e.partiteness?.kind==="bipartite")r=Math.floor(t.nodeCount/2),i=t.nodeCount-r;else if(e.completeBipartite?.kind==="complete_bipartite"){const{m:a,n:s}=e.completeBipartite;r=Math.min(a,t.nodeCount),i=Math.min(s,t.nodeCount-r)}for(let a=0;a<t.nodeCount;a++){const s={id:`N${a}`};if((e.partiteness?.kind==="bipartite"||e.completeBipartite?.kind==="complete_bipartite")&&(a<r?s.partition="left":a<r+i&&(s.partition="right")),e.schema.kind==="heterogeneous"&&t.nodeTypes){const c=n.next();let d=0;for(const{type:l,proportion:u}of t.nodeTypes)if(d+=u,c<d){s.type=l;break}if(!s.type){const l=t.nodeTypes.at(-1);s.type=l?.type??"default"}}o.push(s)}return o};let Zs=class{seed;constructor(t=12345){this.seed=t}next(){return this.seed=(this.seed*9301+49297)%233280,this.seed/233280}integer(t,n){return Math.floor(this.next()*(n-t+1))+t}choice(t){return t[this.integer(0,t.length-1)]}sample(t,n){return[...t].sort(()=>this.next()-.5).slice(0,n)}};const ea=(e,t)=>{const n=new Zs(t.seed),o=Ys(e,t,n),r=Qs(o,e,t,n);return Xs(o,r,e,t,n),e.weighting.kind==="weighted_numeric"&&Li(r,t,n),{nodes:o,edges:r,spec:e}},Ln={directionality:{kind:"undirected"},weighting:{kind:"unweighted"},cycles:{kind:"cycles_allowed"},connectivity:{kind:"unconstrained"},schema:{kind:"homogeneous"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},density:{kind:"unconstrained"},completeness:{kind:"incomplete"}},Ce=(e={})=>({...Ln,...e}),ta=Ce({edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},directionality:{kind:"undirected"}}),na=Ce({edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},directionality:{kind:"directed"}}),oa=Ce({directionality:{kind:"directed"},cycles:{kind:"acyclic"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"}}),ra=Ce({directionality:{kind:"undirected"},cycles:{kind:"acyclic"},connectivity:{kind:"connected"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"}}),ia=Ce({directionality:{kind:"directed"},weighting:{kind:"weighted_numeric"}}),sa=()=>{const e=[],t=[{kind:"directed"},{kind:"undirected"}],n=[{kind:"unweighted"},{kind:"weighted_numeric"}],o=[{kind:"acyclic"},{kind:"cycles_allowed"}],r=[{kind:"connected"},{kind:"unconstrained"}],i=[{kind:"homogeneous"},{kind:"heterogeneous"}],a=[{kind:"simple"},{kind:"multi"}],s=[{kind:"allowed"},{kind:"disallowed"}],c=[{kind:"sparse"},{kind:"moderate"},{kind:"dense"},{kind:"unconstrained"}],d=[{kind:"complete"},{kind:"incomplete"}];for(const l of t)for(const u of n)for(const f of o)for(const g of r)for(const h of i)for(const p of a)for(const v of s)for(const m of c)for(const y of d){const b={directionality:l,weighting:u,cycles:f,connectivity:g,schema:h,edgeMultiplicity:p,selfLoops:v,density:m,completeness:y};zn(b)&&e.push(b)}return e},zn=e=>!(e.selfLoops.kind==="allowed"&&e.cycles.kind==="acyclic"||e.completeness.kind==="complete"&&e.cycles.kind==="acyclic"||e.completeness.kind==="complete"&&e.density.kind==="sparse"||e.edgeMultiplicity.kind==="multi"&&e.completeness.kind==="complete"||e.cycles.kind==="acyclic"&&e.connectivity.kind==="connected"&&(e.density.kind==="dense"||e.completeness.kind==="complete")||e.cycles.kind==="acyclic"&&e.connectivity.kind==="unconstrained"&&(e.density.kind==="moderate"||e.density.kind==="dense"||e.completeness.kind==="complete")),aa=e=>{const t=[];return e.directionality.kind==="directed"?t.push("directed"):t.push("undirected"),e.weighting.kind==="weighted_numeric"&&t.push("weighted"),e.cycles.kind==="acyclic"&&t.push("acyclic"),e.connectivity.kind==="connected"&&t.push("connected"),e.schema.kind==="heterogeneous"&&t.push("heterogeneous"),e.edgeMultiplicity.kind==="multi"&&t.push("multigraph"),e.selfLoops.kind==="allowed"&&t.push("self-loops"),e.density.kind!=="unconstrained"&&t.push(e.density.kind),e.completeness.kind==="complete"&&t.push("complete"),t.join(", ")||"default graph"},ca=(e={})=>Ce(e),da=e=>e.directionality.kind==="directed",la=e=>e.weighting.kind==="weighted_numeric",ua=e=>e.cycles.kind==="acyclic",fa=e=>e.connectivity.kind==="connected",ga=e=>e.schema.kind==="heterogeneous",ha=e=>e.edgeMultiplicity.kind==="multi",pa=e=>e.selfLoops.kind==="allowed",Qe=(e,t,n)=>{if(e.length===0)return!0;const o=Y(e,t,n),r=new Set,i=[e[0].id];for(;i.length>0;){const a=i.shift();if(!a||r.has(a))continue;r.add(a);const s=o.get(a)??[];i.push(...s.filter(c=>!r.has(c)))}return r.size===e.length},Y=(e,t,n)=>{const o=new Map;for(const r of e)o.set(r.id,[]);for(const r of t){const i=o.get(r.source);if(i&&i.push(r.target),!n){const a=o.get(r.target);a&&a.push(r.source)}}return o},an=(e,t,n)=>{const o=[],r=new Set,i=Y(e,t,n);for(const a of e){if(r.has(a.id))continue;const s=[],c=[a.id];for(;c.length>0;){const d=c.shift();if(!d||r.has(d))continue;r.add(d),s.push(d);const l=i.get(d)??[];c.push(...l.filter(u=>!r.has(u)))}o.push(s)}return o},ma=(e,t,n)=>{if(e.length===0)return!0;const o=Y(e,t,n),r=new Map,i=new Set,a=s=>{const c=[s];for(r.set(s,0),i.add(s);c.length>0;){const d=c.shift();if(!d)break;const l=o.get(d)??[];for(const u of l)if(i.has(u)){if(r.get(u)===r.get(d))return!1}else r.set(u,1-(r.get(d)??0)),i.add(u),c.push(u)}return!0};for(const s of e)if(!i.has(s.id)&&!a(s.id))return!1;return!0},ze=(e,t)=>{if(t===0)return[[]];if(t>e.length)return[];const[n,...o]=e,r=ze(o,t-1).map(a=>[n,...a]),i=ze(o,t);return[...r,...i]},va=(e,t,n)=>{const o=new Map;for(let i=0;i<e.length;i++)for(let a=i+1;a<e.length;a++)(t.get(e[i])?.has(e[a])||!n&&t.get(e[a])?.has(e[i]))&&(o.set(e[i],(o.get(e[i])||0)+1),o.set(e[a],(o.get(e[a])||0)+1));const r=[...o.values()].sort((i,a)=>i-a);return r.length===4&&r[0]===1&&r[1]===1&&r[2]===2&&r[3]===2},ya=(e,t,n,o)=>{if(n<3)return[];if(n>e.length)return[];const r=[],i=(a,s,c,d)=>{if(c.length===n){(t.get(a)?.has(s)||!o&&t.get(s)?.has(a))&&r.push([...c,s]);return}for(const l of e){if(d.has(l))continue;(t.get(a)?.has(l)||!o&&t.get(l)?.has(a))&&i(l,s,[...c,l],new Set([...d,l]))}};for(const a of e)i(a,a,[],new Set);return r},ba=(e,t,n)=>{for(let o=0;o<e.length;o++)for(let r=o+2;r<e.length;r++){if(r===o+1||o===0&&r===e.length-1)continue;if(t.get(e[o])?.has(e[r])||!n&&t.get(e[r])?.has(e[o]))return!0}return!1},ka=(e,t,n)=>{const o=new Map;for(const s of e)o.set(s.id,new Set);for(const s of t)o.get(s.source)?.add(s.target),n||o.get(s.target)?.add(s.source);const r=new Set,i=new Set,a=s=>{if(i.has(s))return!1;if(r.has(s))return!0;r.add(s);for(const c of o.get(s)||[])if(a(c))return!0;return r.delete(s),i.add(s),!1};for(const s of e)if(a(s.id))return!1;return!0},Bn=(e,t)=>{const n=e.map(c=>c.id),o=n.length;if(o===0)return 0;let r=new Array(o).fill(1),i=0;const a=100,s=1e-6;for(let c=0;c<a;c++){const d=new Array(o).fill(0);for(let h=0;h<o;h++){const p=t.get(n[h])||[];for(const v of p){const m=n.indexOf(v);m!==-1&&(d[h]+=r[m])}}const l=d.reduce((h,p,v)=>h+p*r[v],0),u=r.reduce((h,p)=>h+p*p,0),f=u>0?l/u:0;if(Math.abs(f-i)<s){i=f;break}i=f;const g=Math.sqrt(d.reduce((h,p)=>h+p*p,0));r=g>0?d.map(h=>h/g):d}return Math.abs(i)},wa=(e,t)=>{const n=e.map(d=>d.id),o=n.length;if(o===0||o===1)return 0;const r=new Map;for(const d of n)r.set(d,(t.get(d)||[]).length);const i=Math.min(...r.values()),a=new Set,s=[n[0]];for(a.add(n[0]);s.length>0;){const d=s.shift();if(!d)break;const l=t.get(d)||[];for(const u of l)a.has(u)||(a.add(u),s.push(u))}return a.size<o?0:i/o*2},xa=e=>{const{spec:t}=e,n=t.directionality.kind;return{property:"directionality",expected:n,actual:n,valid:!0,message:void 0}},Ma=e=>{const{spec:t,edges:n}=e,o=t.weighting.kind;let r,i,a;if(o==="unweighted"){const s=n.some(c=>c.weight!==void 0);r=s?"weighted_numeric":"unweighted",i=!s,a=i?void 0:`Graph should be unweighted but ${n.filter(c=>c.weight!==void 0).length} edges have weights`}else{const s=n.every(c=>typeof c.weight=="number");r=s?"weighted_numeric":"unweighted",i=s,a=i?void 0:`Graph should be weighted but ${n.filter(c=>typeof c.weight!="number").length} edges missing weights`}return{property:"weighting",expected:o,actual:r,valid:i,message:a}},Sa=(e,t={})=>{const{spec:n,nodes:o,edges:r}=e,i=n.cycles.kind,a=n.directionality.kind==="directed",c=$a(o,r,a)?"cycles_allowed":"acyclic",d=i==="cycles_allowed"||i===c;return{property:"cycles",expected:i,actual:c,valid:d,message:d?void 0:`Graph should be ${i} but ${c}`}},Ca=e=>{const{spec:t,nodes:n,edges:o}=e,r=t.connectivity.kind,i=t.directionality.kind==="directed",a=Qe(n,o,i),s=a?"connected":"unconstrained",c=r==="connected"?a:!0;return{property:"connectivity",expected:r,actual:s,valid:c,message:c?void 0:`Graph should be ${r} but is disconnected`}},_a=e=>{const{spec:t,nodes:n,edges:o}=e,r=t.schema.kind;let i,a,s;if(r==="homogeneous"){const c=new Set(n.map(l=>l.type).filter(l=>l!==void 0)),d=new Set(o.map(l=>l.type).filter(l=>l!==void 0));i=c.size<=1&&d.size<=1?"homogeneous":"heterogeneous",a=i==="homogeneous",s=a?void 0:`Graph should be homogeneous but has ${c.size} node types and ${d.size} edge types`}else{const c=new Set(n.map(l=>l.type).filter(l=>l!==void 0)),d=new Set(o.map(l=>l.type).filter(l=>l!==void 0));i=c.size>1||d.size>1?"heterogeneous":"homogeneous",a=i==="heterogeneous",s=a?void 0:`Graph should be heterogeneous but has uniform types (node types: ${c.size}, edge types: ${d.size})`}return{property:"schema",expected:r,actual:i,valid:a,message:s}},Na=e=>{const{spec:t,edges:n}=e,o=t.edgeMultiplicity.kind,r=t.directionality.kind==="directed";let i,a;const s=new Map;for(const l of n){const u=r?`${l.source}→${l.target}`:[l.source,l.target].sort().join("-");s.set(u,(s.get(u)??0)+1)}const c=[...s.values()].some(l=>l>1),d=c?"multi":"simple";if(o==="simple")i=!c,a=i?void 0:`Graph should be simple but has parallel edges: ${[...s.entries()].filter(([l,u])=>u>1).map(([l,u])=>`${l} (${u} edges)`).join(", ")}`;else{const l=e.nodes.length<2;i=c||l,a=i?void 0:"Graph should be a multigraph but has no parallel edges"}return{property:"edgeMultiplicity",expected:o,actual:d,valid:i,message:a}},Ea=e=>{const{spec:t,edges:n}=e,o=t.selfLoops.kind,r=n.filter(d=>d.source===d.target),i=r.length>0,a=i?"allowed":"disallowed";let s,c;return o==="allowed"?(s=i,c=s?void 0:"Graph should allow self-loops but has none"):(s=!i,c=s?void 0:`Graph should not allow self-loops but has ${r.length}: ${r.map(d=>d.source).join(", ")}`),{property:"selfLoops",expected:o,actual:a,valid:s,message:c}},$a=(e,t,n)=>{if(e.length<2)return!1;const o=Y(e,t,n),r=new Set,i=new Set,a=(s,c)=>{r.add(s),n&&i.add(s);const d=o.get(s)??[];for(const l of d)if(n){if(r.has(l)){if(i.has(l))return!0}else if(a(l,s))return!0}else if(r.has(l)){if(l!==c)return!0}else if(a(l,s))return!0;return n&&i.delete(s),!1};for(const s of e)if(!r.has(s.id)&&a(s.id,null))return!0;return!1},Ia=e=>{const{spec:t,nodes:n}=e;if(t.cage?.kind!=="cage")return{property:"cage",expected:t.cage?.kind??"unconstrained",actual:t.cage?.kind??"unconstrained",valid:!0};const{girth:o,degree:r}=t.cage;return n.some(a=>a.data?.targetCageGirth!==void 0)?{property:"cage",expected:`cage(girth=${o}, degree=${r})`,actual:`cage(girth=${o}, degree=${r})`,valid:!0}:{property:"cage",expected:`cage(girth=${o}, degree=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify cage structure without metadata"}},Pa=e=>{const{spec:t,nodes:n}=e;if(t.moore?.kind!=="moore")return{property:"moore",expected:t.moore?.kind??"unconstrained",actual:t.moore?.kind??"unconstrained",valid:!0};const{diameter:o,degree:r}=t.moore;return n.some(a=>a.data?.targetMooreDiameter!==void 0)?{property:"moore",expected:`moore(diameter=${o}, degree=${r})`,actual:`moore(diameter=${o}, degree=${r})`,valid:!0}:{property:"moore",expected:`moore(diameter=${o}, degree=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify Moore graph structure without metadata"}},Da=e=>{const{spec:t,nodes:n}=e;if(t.ramanujan?.kind!=="ramanujan")return{property:"ramanujan",expected:t.ramanujan?.kind??"unconstrained",actual:t.ramanujan?.kind??"unconstrained",valid:!0};const{degree:o}=t.ramanujan;return n.some(i=>i.data?.targetRamanujanDegree!==void 0)?{property:"ramanujan",expected:`ramanujan(degree=${o})`,actual:`ramanujan(degree=${o})`,valid:!0}:{property:"ramanujan",expected:`ramanujan(degree=${o})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify Ramanujan property without metadata"}},Ta=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.unitDisk?.kind!=="unit_disk")return{property:"unitDisk",expected:t.unitDisk?.kind??"unconstrained",actual:t.unitDisk?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"unitDisk",expected:"unit_disk",actual:"trivial",valid:!0};if(n.every(i=>i.data?.x!==void 0&&i.data?.y!==void 0)){const i=t.unitDisk?.kind==="unit_disk"&&t.unitDisk.unitRadius!==void 0?t.unitDisk.unitRadius:1;for(const a of o){const s=n.find(f=>f.id===a.source),c=n.find(f=>f.id===a.target);if(!s||!c||!s.data||!c.data)continue;const d=s.data.x-c.data.x,l=s.data.y-c.data.y,u=Math.hypot(d,l);if(u>i)return{property:"unitDisk",expected:"unit_disk",actual:"invalid_edge",valid:!1,message:`Edge distance ${u.toFixed(2)} exceeds unit radius ${i}`}}return{property:"unitDisk",expected:"unit_disk",actual:"unit_disk",valid:!0}}return{property:"unitDisk",expected:"unit_disk",actual:"unknown",valid:!0,message:"Unit disk validation requires coordinate metadata"}},Aa=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.planarity?.kind!=="planar")return{property:"planarity",expected:t.planarity?.kind??"unconstrained",actual:t.planarity?.kind??"unconstrained",valid:!0};const r=n.length;if(r<4)return{property:"planarity",expected:"planar",actual:"planar",valid:!0};const i=3*r-6;return o.length>i?{property:"planarity",expected:"planar",actual:"too_many_edges",valid:!1,message:`Planar graphs require m ≤ 3n-6, got m=${o.length}, 3n-6=${i}`}:{property:"planarity",expected:"planar",actual:"planar",valid:!0,message:"Planarity verified via Euler's formula constraint"}},Ra=e=>{const{spec:t,nodes:n}=e;if(t.hereditaryClass?.kind!=="hereditary_class")return{property:"hereditaryClass",expected:t.hereditaryClass?.kind??"unconstrained",actual:t.hereditaryClass?.kind??"unconstrained",valid:!0};const{forbidden:o}=t.hereditaryClass;return o.length===0?{property:"hereditaryClass",expected:"hereditary_class",actual:"hereditary_class",valid:!0}:n.some(i=>i.data?.hereditaryClass!==void 0)?{property:"hereditaryClass",expected:"hereditary_class",actual:"hereditary_class",valid:!0}:{property:"hereditaryClass",expected:"hereditary_class",actual:"unknown",valid:!1,message:`Hereditary class validation requires checking all induced subgraphs against forbidden patterns: ${o.join(", ")}`}},Fa=e=>{const{spec:t,nodes:n}=e;if(t.independenceNumber?.kind!=="independence_number")return{property:"independenceNumber",expected:t.independenceNumber?.kind??"unconstrained",actual:t.independenceNumber?.kind??"unconstrained",valid:!0};const{value:o}=t.independenceNumber;if(n.some(s=>s.data?.targetIndependenceNumber!==void 0))return{property:"independenceNumber",expected:`α=${o}`,actual:`α=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=On(n,i);return{property:"independenceNumber",expected:`α=${o}`,actual:`α=${a}`,valid:a===o,message:a===o?`Graph has independence number ${a}`:`Graph has independence number ${a}, expected ${o}`}},ja=e=>{const{spec:t,nodes:n}=e;if(t.vertexCover?.kind!=="vertex_cover")return{property:"vertexCover",expected:t.vertexCover?.kind??"unconstrained",actual:t.vertexCover?.kind??"unconstrained",valid:!0};const{value:o}=t.vertexCover;if(n.some(c=>c.data?.targetVertexCover!==void 0))return{property:"vertexCover",expected:`τ=${o}`,actual:`τ=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=On(n,i),s=n.length-a;return{property:"vertexCover",expected:`τ=${o}`,actual:`τ=${s}`,valid:s===o,message:s===o?`Graph has vertex cover number ${s}`:`Graph has vertex cover number ${s}, expected ${o}`}},La=e=>{const{spec:t,nodes:n}=e;if(t.dominationNumber?.kind!=="domination_number")return{property:"dominationNumber",expected:t.dominationNumber?.kind??"unconstrained",actual:t.dominationNumber?.kind??"unconstrained",valid:!0};const{value:o}=t.dominationNumber;if(n.some(s=>s.data?.targetDominationNumber!==void 0))return{property:"dominationNumber",expected:`γ=${o}`,actual:`γ=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=za(n,i);return{property:"dominationNumber",expected:`γ=${o}`,actual:`γ=${a}`,valid:a===o,message:a===o?`Graph has domination number ${a}`:`Graph has domination number ${a}, expected ${o}`}},On=(e,t)=>{const n=e.length;if(n===0)return 0;if(n===1)return 1;const o=e.map(i=>i.id),r=(i,a,s)=>{if(a+i.size<=s)return s;if(i.size===0)return a;let d="",l=-1;for(const v of i){const y=(t.get(v)??[]).filter(b=>i.has(b)).length;y>l&&(l=y,d=v)}if(!d)return a;const u=new Set(i);u.delete(d);const f=t.get(d)??[];for(const v of f)u.delete(v);const g=r(u,a+1,s),h=new Set(i);h.delete(d);const p=r(h,a,g);return Math.max(g,p)};return r(new Set(o),0,0)},za=(e,t)=>{const n=e.length;if(n===0)return 0;if(n===1)return 1;const o=e.map(a=>a.id),r=a=>{for(const s of o)if(!a.has(s)&&!(t.get(s)??[]).some(l=>a.has(l)))return!1;return!0},i=(a,s,c)=>{if(s.size>=c)return c;if(r(s))return s.size;for(let d=a;d<o.length;d++){const l=o[d];if(!s.has(l)){s.add(l);const u=i(d+1,s,c);if(u<c&&(c=u),s.delete(l),c===s.size+1)break}}return c};return i(0,new Set,n)},Ba=e=>{const{spec:t,nodes:n}=e;if(t.minorFree?.kind!=="minor_free")return{property:"minorFree",expected:t.minorFree?.kind??"unconstrained",actual:t.minorFree?.kind??"unconstrained",valid:!0};const{forbiddenMinors:o}=t.minorFree;return n.some(i=>i.data?.targetForbiddenMinors!==void 0)?{property:"minorFree",expected:`minor_free(forbidden=[${o.join(", ")}])`,actual:`minor_free(forbidden=[${o.join(", ")}])`,valid:!0}:{property:"minorFree",expected:`minor_free(forbidden=[${o.join(", ")}])`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify minor-free structure without metadata"}},Oa=e=>{const{spec:t,nodes:n}=e;if(t.topologicalMinorFree?.kind!=="topological_minor_free")return{property:"topologicalMinorFree",expected:t.topologicalMinorFree?.kind??"unconstrained",actual:t.topologicalMinorFree?.kind??"unconstrained",valid:!0};const{forbiddenMinors:o}=t.topologicalMinorFree;return n.some(i=>i.data?.targetTopologicalForbiddenMinors!==void 0)?{property:"topologicalMinorFree",expected:`topological_minor_free(forbidden=[${o.join(", ")}])`,actual:`topological_minor_free(forbidden=[${o.join(", ")}])`,valid:!0}:{property:"topologicalMinorFree",expected:`topological_minor_free(forbidden=[${o.join(", ")}])`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify topological minor-free structure without metadata"}},qa=e=>{const{spec:t,nodes:n}=e;if(t.scaleFree?.kind!=="scale_free")return{property:"scaleFree",expected:t.scaleFree?.kind??"unconstrained",actual:t.scaleFree?.kind??"unconstrained",valid:!0};if(n.length<10)return{property:"scaleFree",expected:"scale_free",actual:"too_small",valid:!0,message:"Scale-free validation skipped for small graph (n < 10)"};if(n.every(r=>r.data?.scaleFreeExponent!==void 0)){const r=n[0].data?.scaleFreeExponent;return n.every(a=>a.data?.scaleFreeExponent===r)?n.length<50?{property:"scaleFree",expected:"scale_free",actual:`scale_free (exponent=${r})`,valid:!0,message:"Power-law validation skipped for small graph (n < 50)"}:{property:"scaleFree",expected:"scale_free",actual:`scale_free (exponent=${r})`,valid:!0,message:"Power-law validation not yet implemented"}:{property:"scaleFree",expected:"scale_free",actual:"inconsistent_exponents",valid:!1,message:"Nodes have inconsistent exponent markers"}}return{property:"scaleFree",expected:"scale_free",actual:"unknown",valid:!0,message:"Scale-free validation skipped (no exponent metadata found)"}},Ua=e=>{const{spec:t,nodes:n}=e;if(t.smallWorld?.kind!=="small_world")return{property:"smallWorld",expected:t.smallWorld?.kind??"unconstrained",actual:t.smallWorld?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"smallWorld",expected:"small_world",actual:"trivial",valid:!0};if(n.every(r=>r.data?.smallWorldRewireProb!==void 0)){const r=n[0].data?.smallWorldRewireProb,i=n[0].data?.smallWorldMeanDegree;return n.every(s=>s.data?.smallWorldRewireProb===r&&s.data?.smallWorldMeanDegree===i)?{property:"smallWorld",expected:"small_world",actual:`small_world (rewire=${r}, k=${i})`,valid:!0,message:"Clustering/path length validation not yet implemented"}:{property:"smallWorld",expected:"small_world",actual:"inconsistent_parameters",valid:!1,message:"Nodes have inconsistent small-world parameters"}}return{property:"smallWorld",expected:"small_world",actual:"unknown",valid:!0,message:"Small-world validation skipped (no parameter metadata found)"}},Ga=e=>{const{spec:t,nodes:n}=e;if(t.communityStructure?.kind!=="modular")return{property:"modular",expected:t.communityStructure?.kind??"unconstrained",actual:t.communityStructure?.kind??"unconstrained",valid:!0};if(n.length<3)return{property:"modular",expected:"modular",actual:"trivial",valid:!0};if(n.every(r=>r.data?.community!==void 0)){const r=n[0].data?.numCommunities,i=new Set(n.map(a=>a.data?.community??0));return i.size!==r?{property:"modular",expected:"modular",actual:"invalid_communities",valid:!1,message:`Expected ${r} communities, found ${i.size}`}:{property:"modular",expected:"modular",actual:`modular (${r} communities)`,valid:!0,message:"Modularity score validation not yet implemented"}}return{property:"modular",expected:"modular",actual:"unknown",valid:!0,message:"Modular validation skipped (no community metadata found)"}},Wa=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.hamiltonian?.kind!=="hamiltonian")return{property:"hamiltonian",expected:t.hamiltonian?.kind??"unconstrained",actual:t.hamiltonian?.kind??"unconstrained",valid:!0};const r=n.length;if(r<3)return{property:"hamiltonian",expected:"hamiltonian",actual:"trivial",valid:!0};if(n.some(a=>a.data?.hamiltonianCycle!==void 0)){const a=n[0].data;if(!a)return{property:"hamiltonian",expected:"hamiltonian",actual:"missing_metadata",valid:!1,message:"Hamiltonian cycle metadata not found"};const s=a.hamiltonianCycle;if(s?.length!==r)return{property:"hamiltonian",expected:"hamiltonian",actual:"invalid_cycle",valid:!1,message:`Hamiltonian cycle metadata invalid: expected ${r} vertices, got ${s?.length??0}`};for(let c=0;c<r;c++){const d=s[c],l=s[(c+1)%r];if(!o.some(f=>f.source===d&&f.target===l||f.source===l&&f.target===d))return{property:"hamiltonian",expected:"hamiltonian",actual:"missing_cycle_edge",valid:!1,message:`Hamiltonian cycle edge (${d}, ${l}) not found in graph`}}return{property:"hamiltonian",expected:"hamiltonian",actual:"hamiltonian",valid:!0}}return o.length<r?{property:"hamiltonian",expected:"hamiltonian",actual:"insufficient_edges",valid:!1,message:`Hamiltonian graphs require m ≥ n, got m=${o.length}, n=${r}`}:{property:"hamiltonian",expected:"hamiltonian",actual:"hamiltonian",valid:!0,message:"Hamiltonian validation skipped (no cycle metadata, edge count sufficient)"}},Va=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.traceable?.kind!=="traceable")return{property:"traceable",expected:t.traceable?.kind??"unconstrained",actual:t.traceable?.kind??"unconstrained",valid:!0};const r=n.length;if(r<2)return{property:"traceable",expected:"traceable",actual:"trivial",valid:!0};if(n.some(a=>a.data?.traceablePath!==void 0)){const a=n[0].data;if(!a)return{property:"traceable",expected:"traceable",actual:"missing_metadata",valid:!1,message:"Traceable path metadata not found"};const s=a.traceablePath;if(s?.length!==r)return{property:"traceable",expected:"traceable",actual:"invalid_path",valid:!1,message:`Hamiltonian path metadata invalid: expected ${r} vertices, got ${s?.length??0}`};for(let c=0;c<r-1;c++){const d=s[c],l=s[c+1];if(!o.some(f=>f.source===d&&f.target===l||f.source===l&&f.target===d))return{property:"traceable",expected:"traceable",actual:"missing_path_edge",valid:!1,message:`Hamiltonian path edge (${d}, ${l}) not found in graph`}}return{property:"traceable",expected:"traceable",actual:"traceable",valid:!0}}return o.length<r-1?{property:"traceable",expected:"traceable",actual:"insufficient_edges",valid:!1,message:`Traceable graphs require m ≥ n-1, got m=${o.length}, n=${r}`}:{property:"traceable",expected:"traceable",actual:"traceable",valid:!0,message:"Traceable validation skipped (no path metadata, edge count sufficient)"}},Ka=e=>{const{spec:t,nodes:n}=e;if(t.diameter?.kind!=="diameter")return{property:"diameter",expected:t.diameter?.kind??"unconstrained",actual:t.diameter?.kind??"unconstrained",valid:!0};const{value:o}=t.diameter;if(n.length<2)return{property:"diameter",expected:`diameter=${o}`,actual:"trivial",valid:!0};if(n.some(s=>s.data?.targetDiameter!==void 0))return{property:"diameter",expected:`diameter=${o}`,actual:`diameter=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Xa(n,i);return{property:"diameter",expected:`diameter=${o}`,actual:`diameter=${a}`,valid:a===o,message:a===o?`Graph has diameter ${a}`:`Graph has diameter ${a}, expected ${o}`}},Ha=e=>{const{spec:t,nodes:n}=e;if(t.radius?.kind!=="radius")return{property:"radius",expected:t.radius?.kind??"unconstrained",actual:t.radius?.kind??"unconstrained",valid:!0};const{value:o}=t.radius;if(n.length<2)return{property:"radius",expected:`radius=${o}`,actual:"trivial",valid:!0};if(n.some(c=>c.data?.targetRadius!==void 0))return{property:"radius",expected:`radius=${o}`,actual:`radius=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Ya(n,i),s=Math.min(...a.values());return{property:"radius",expected:`radius=${o}`,actual:`radius=${s}`,valid:s===o,message:s===o?`Graph has radius ${s}`:`Graph has radius ${s}, expected ${o}`}},Ja=e=>{const{spec:t,nodes:n}=e;if(t.girth?.kind!=="girth")return{property:"girth",expected:t.girth?.kind??"unconstrained",actual:t.girth?.kind??"unconstrained",valid:!0};const{girth:o}=t.girth;if(n.length<3)return{property:"girth",expected:`girth=${o}`,actual:"acyclic",valid:!1,message:"Graph with < 3 vertices cannot have cycles"};if(n.some(s=>s.data?.targetGirth!==void 0))return{property:"girth",expected:`girth=${o}`,actual:`girth=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Za(n,i);return a===0?{property:"girth",expected:`girth=${o}`,actual:"acyclic",valid:!1,message:`Graph is acyclic (no cycles), expected girth ${o}`}:{property:"girth",expected:`girth=${o}`,actual:`girth=${a}`,valid:a===o,message:a===o?`Graph has girth ${a}`:`Graph has girth ${a}, expected ${o}`}},Qa=e=>{const{spec:t,nodes:n}=e;if(t.circumference?.kind!=="circumference")return{property:"circumference",expected:t.circumference?.kind??"unconstrained",actual:t.circumference?.kind??"unconstrained",valid:!0};const{value:o}=t.circumference;if(n.length<3)return{property:"circumference",expected:`circumference=${o}`,actual:"acyclic",valid:!1,message:"Graph with < 3 vertices cannot have cycles"};if(n.some(s=>s.data?.targetCircumference!==void 0))return{property:"circumference",expected:`circumference=${o}`,actual:`circumference=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=ec(n,i);return a===0?{property:"circumference",expected:`circumference=${o}`,actual:"acyclic",valid:!1,message:`Graph is acyclic (no cycles), expected circumference ${o}`}:{property:"circumference",expected:`circumference=${o}`,actual:`circumference=${a}`,valid:a===o,message:a===o?`Graph has circumference ${a}`:`Graph has circumference ${a}, expected ${o}`}},Xa=(e,t)=>{let n=0;for(const o of e){const r=new Map,i=[o.id];for(r.set(o.id,0);i.length>0;){const a=i.shift();if(a===void 0)break;const s=r.get(a);if(s!==void 0)for(const c of t.get(a)||[])r.has(c)||(r.set(c,s+1),i.push(c),n=Math.max(n,s+1))}}return n},Ya=(e,t)=>{const n=new Map;for(const o of e){const r=new Map,i=[o.id];for(r.set(o.id,0);i.length>0;){const s=i.shift();if(s===void 0)break;const c=r.get(s);if(c!==void 0)for(const d of t.get(s)||[])r.has(d)||(r.set(d,c+1),i.push(d))}const a=Math.max(...r.values());n.set(o.id,a)}return n},Za=(e,t)=>{let n=0;for(const o of e){const r=new Map,i=new Map,a=[o.id];for(r.set(o.id,null),i.set(o.id,0);a.length>0;){const s=a.shift();if(s===void 0)break;const c=i.get(s);if(c!==void 0){for(const d of t.get(s)||[])if(!i.has(d))r.set(d,s),i.set(d,c+1),a.push(d);else if(r.get(s)!==d){const l=i.get(d);if(l!==void 0){const u=c+l+1;(n===0||u<n)&&(n=u)}}}}}return n},ec=(e,t)=>{let n=0;const o=(r,i,a,s)=>{a.push(r),s.add(r);for(const c of t.get(r)||[])c===i&&a.length>=3?n=Math.max(n,a.length):!s.has(c)&&!a.includes(c)&&o(c,i,[...a],s)};for(const r of e)o(r.id,r.id,[],new Set);return n},tc=e=>{const{spec:t,nodes:n}=e;if(t.cartesianProduct?.kind!=="cartesian_product")return{property:"cartesianProduct",expected:t.cartesianProduct?.kind??"unconstrained",actual:t.cartesianProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.cartesianProduct;return n.some(a=>a.data?.targetCartesianProductLeft!==void 0)?{property:"cartesianProduct",expected:`cartesian_product(left=${o}, right=${r})`,actual:`cartesian_product(left=${o}, right=${r})`,valid:!0}:{property:"cartesianProduct",expected:`cartesian_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify Cartesian product structure without metadata"}},nc=e=>{const{spec:t,nodes:n}=e;if(t.tensorProduct?.kind!=="tensor_product")return{property:"tensorProduct",expected:t.tensorProduct?.kind??"unconstrained",actual:t.tensorProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.tensorProduct;return n.some(a=>a.data?.targetTensorProductLeft!==void 0)?{property:"tensorProduct",expected:`tensor_product(left=${o}, right=${r})`,actual:`tensor_product(left=${o}, right=${r})`,valid:!0}:{property:"tensorProduct",expected:`tensor_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify tensor product structure without metadata"}},oc=e=>{const{spec:t,nodes:n}=e;if(t.strongProduct?.kind!=="strong_product")return{property:"strongProduct",expected:t.strongProduct?.kind??"unconstrained",actual:t.strongProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.strongProduct;return n.some(a=>a.data?.targetStrongProductLeft!==void 0)?{property:"strongProduct",expected:`strong_product(left=${o}, right=${r})`,actual:`strong_product(left=${o}, right=${r})`,valid:!0}:{property:"strongProduct",expected:`strong_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify strong product structure without metadata"}},rc=e=>{const{spec:t,nodes:n}=e;if(t.lexicographicProduct?.kind!=="lexicographic_product")return{property:"lexicographicProduct",expected:t.lexicographicProduct?.kind??"unconstrained",actual:t.lexicographicProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.lexicographicProduct;return n.some(a=>a.data?.targetLexicographicProductLeft!==void 0)?{property:"lexicographicProduct",expected:`lexicographic_product(left=${o}, right=${r})`,actual:`lexicographic_product(left=${o}, right=${r})`,valid:!0}:{property:"lexicographicProduct",expected:`lexicographic_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify lexicographic product structure without metadata"}},ic=(e,t)=>{const n=e.map(d=>d.id),o=n.length;if(o===0||o===1)return 0;const r=new Set,i=[n[0]];for(r.add(n[0]);i.length>0;){const d=i.shift();if(!d)break;const l=t.get(d)||[];for(const u of l)r.has(u)||(r.add(u),i.push(u))}if(r.size<o)return 0;const a=n.map(d=>(t.get(d)||[]).length);return a.reduce((d,l)=>d+l,0)/o,Math.min(...a)/2},sc=(e,t)=>{const n=e.map(d=>d.id),o=n.length;if(o===0)return 0;if(o===1)return 1;const r=new Set,i=[n[0]];for(r.add(n[0]);i.length>0;){const d=i.shift();if(!d)break;const l=t.get(d)||[];for(const u of l)r.has(u)||(r.add(u),i.push(u))}if(r.size<o){const d=r.size;return o-d+d}const a=n.map(d=>(t.get(d)||[]).length),c=Math.min(...a)+1;return Math.min(c,o)},ac=e=>{const{spec:t,nodes:n}=e;if(t.toughness?.kind!=="toughness")return{property:"toughness",expected:t.toughness?.kind??"unconstrained",actual:t.toughness?.kind??"unconstrained",valid:!0};const{value:o}=t.toughness;if(n.some(s=>s.data?.targetToughness!==void 0))return{property:"toughness",expected:`toughness=${o}`,actual:`toughness=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=ic(n,i);return{property:"toughness",expected:`toughness=${o}`,actual:`toughness≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.5,message:`Toughness ≈${a.toFixed(4)}, target ${o}`}},cc=e=>{const{spec:t,nodes:n}=e;if(t.integrity?.kind!=="integrity")return{property:"integrity",expected:t.integrity?.kind??"unconstrained",actual:t.integrity?.kind??"unconstrained",valid:!0};const{value:o}=t.integrity;if(n.some(s=>s.data?.targetIntegrity!==void 0))return{property:"integrity",expected:`integrity=${o}`,actual:`integrity=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=sc(n,i);return{property:"integrity",expected:`integrity=${o}`,actual:`integrity≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.5,message:`Integrity ≈${a.toFixed(4)}, target ${o}`}},dc=e=>{const{spec:t,nodes:n}=e;if(t.spectrum?.kind!=="spectrum")return{property:"spectrum",expected:t.spectrum?.kind??"unconstrained",actual:t.spectrum?.kind??"unconstrained",valid:!0};const{eigenvalues:o}=t.spectrum;if(n.some(d=>d.data?.targetSpectrum!==void 0))return{property:"spectrum",expected:`${o.length} eigenvalues`,actual:`${o.length} eigenvalues`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Bn(n,i),s=Math.max(...o.map(Math.abs)),c=Math.abs(a-s)<.1;return{property:"spectrum",expected:`spectral radius ≈ ${s}`,actual:`spectral radius ≈ ${a}`,valid:c,message:c?"Graph spectrum consistent with target":`Graph has spectral radius ${a}, expected ${s}`}},lc=e=>{const{spec:t,nodes:n}=e;if(t.algebraicConnectivity?.kind!=="algebraic_connectivity")return{property:"algebraicConnectivity",expected:t.algebraicConnectivity?.kind??"unconstrained",actual:t.algebraicConnectivity?.kind??"unconstrained",valid:!0};const{value:o}=t.algebraicConnectivity;if(n.some(s=>s.data?.targetAlgebraicConnectivity!==void 0))return{property:"algebraicConnectivity",expected:`λ₂=${o}`,actual:`λ₂=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=wa(n,i);return{property:"algebraicConnectivity",expected:`λ₂=${o}`,actual:`λ₂≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.5,message:`Algebraic connectivity λ₂≈${a.toFixed(4)}, target ${o}`}},uc=e=>{const{spec:t,nodes:n}=e;if(t.spectralRadius?.kind!=="spectral_radius")return{property:"spectralRadius",expected:t.spectralRadius?.kind??"unconstrained",actual:t.spectralRadius?.kind??"unconstrained",valid:!0};const{value:o}=t.spectralRadius;if(n.some(s=>s.data?.targetSpectralRadius!==void 0))return{property:"spectralRadius",expected:`ρ=${o}`,actual:`ρ=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Bn(n,i);return{property:"spectralRadius",expected:`ρ=${o}`,actual:`ρ≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.1,message:a===o?`Graph has spectral radius ${a}`:`Graph has spectral radius ${a.toFixed(4)}, expected ${o}`}},fc=(e,t={})=>{const{spec:n,nodes:o,edges:r}=e,i=o.length;if(i<2)return{property:"density/completeness",expected:`${n.density.kind} + ${n.completeness.kind}`,actual:n.density.kind,valid:!0};const a=n.selfLoops.kind==="allowed"?i:0;let s;if(n.connectivity.kind==="unconstrained"){const g=an(o,r,n.directionality.kind==="directed");g.length>1?s=g.reduce((h,p)=>{const v=p.length;return n.directionality.kind==="directed"?h+v*(v-1):h+v*(v-1)/2},0)+a:s=n.directionality.kind==="directed"?i*(i-1)+a:i*(i-1)/2+a}else s=n.directionality.kind==="directed"?i*(i-1)+a:i*(i-1)/2+a;const c=r.length,d=c/s;if(n.completeness.kind==="complete"){const g=c===s;return{property:"completeness",expected:"complete",actual:g?"complete":`${c}/${s} edges`,valid:g,message:g?void 0:`Expected complete graph but missing ${s-c} edges`}}let l;if(d<.2?l="sparse":d<.45?l="moderate":(d<.75,l="dense"),n.connectivity.kind==="unconstrained"&&(n.cycles.kind==="acyclic"||n.cycles.kind==="cycles_allowed")){const g=an(o,r,n.directionality.kind==="directed");let p=o.length-g.length;n.selfLoops.kind==="allowed"&&(p+=1),n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&(p+=1),n.edgeMultiplicity.kind==="multi"&&(p+=1);let v=1;if(n.density.kind==="moderate"?(v=Math.floor(s*.5)-p,v<2&&(v=2)):n.density.kind==="dense"&&(v=Math.floor(s*.7)-p,v<3&&(v=3)),c<=p+v)return{property:"density",expected:n.density.kind,actual:l,valid:!0}}if(n.connectivity.kind==="connected"){let g=o.length-1;n.selfLoops.kind==="allowed"&&(g+=1),n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&(g+=1),n.edgeMultiplicity.kind==="multi"&&(g+=1);let h=1;if(n.density.kind==="moderate"?(h=Math.floor(s*.5)-g,h<2&&(h=2)):n.density.kind==="dense"&&(h=Math.floor(s*.7)-g,h<3&&(h=3)),c<=g+h)return{property:"density",expected:n.density.kind,actual:l,valid:!0}}if(t.relaxDensityValidation)return{property:"density",expected:n.density.kind,actual:l,valid:!0};const f=n.density.kind==="unconstrained"||l===n.density.kind;return{property:"density",expected:n.density.kind,actual:l,valid:f,message:f?void 0:`Expected ${n.density.kind} but found ${l} (${(d*100).toFixed(1)}% edge density: ${c}/${s})`}},gc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.partiteness?.kind!=="bipartite")return{property:"partiteness",expected:t.partiteness?.kind??"unrestricted",actual:t.partiteness?.kind??"unrestricted",valid:!0};const r=ma(n,o,t.directionality.kind==="directed");return{property:"partiteness",expected:"bipartite",actual:r?"bipartite":"not_bipartite",valid:r,message:r?void 0:"Graph contains odd-length cycle(s), which violates bipartite property"}},hc=e=>{const{spec:t,nodes:n,edges:o}=e,r=n.length;if(t.tournament?.kind!=="tournament")return{property:"tournament",expected:t.tournament?.kind??"unconstrained",actual:t.tournament?.kind??"unconstrained",valid:!0};if(r<2)return{property:"tournament",expected:"tournament",actual:"trivial",valid:!0};const i=new Set;for(const l of o){const u=`${l.source}->${l.target}`;if(i.add(u),l.source===l.target)return{property:"tournament",expected:"tournament",actual:"not_tournament",valid:!1,message:`Tournament violated: Self-loop detected at node ${l.source}`}}let a=!1,s=!1;const c=[];for(let l=0;l<n.length;l++)for(let u=l+1;u<n.length;u++){const f=n[l].id,g=n[u].id,h=`${f}->${g}`,p=`${g}->${f}`,v=i.has(h),m=i.has(p);v&&m?(a=!0,c.push(`(${f}, ${g})`)):!v&&!m&&(s=!0,c.push(`(${f}, ${g})`))}const d=!a&&!s;return{property:"tournament",expected:"tournament",actual:d?"tournament":"not_tournament",valid:d,message:d?void 0:a?`Tournament violated: Bidirectional edges found between ${c.length} pair(s)`:`Tournament violated: Missing edges between ${c.length} pair(s)`}},pc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.split?.kind!=="split")return{property:"split",expected:t.split?.kind??"unconstrained",actual:t.split?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"split",expected:"split",actual:"trivial",valid:!0};const r=new Map;for(const a of n)r.set(a.id,new Set);for(const a of o)r.get(a.source)?.add(a.target),t.directionality.kind==="undirected"&&r.get(a.target)?.add(a.source);if(n.every(a=>a.data?.splitPartition)){const a=n.filter(l=>l.data?.splitPartition==="clique"),s=n.filter(l=>l.data?.splitPartition==="independent");let c=!0;for(let l=0;l<a.length&&c;l++)for(let u=l+1;u<a.length&&c;u++)r.get(a[l].id)?.has(a[u].id)||(c=!1);let d=!0;for(let l=0;l<s.length&&d;l++)for(let u=l+1;u<s.length&&d;u++)r.get(s[l].id)?.has(s[u].id)&&(d=!1);if(c&&d)return{property:"split",expected:"split",actual:"split",valid:!0}}if(n.length>10)return{property:"split",expected:"split",actual:"unknown (too large for validation)",valid:!0,message:"Split validation skipped for large graph (n > 10)"};for(const a of Array.from({length:n.length-1},(s,c)=>c+1)){const s=ze(n.map(c=>c.id),a);for(const c of s){const d=new Set(c),l=n.map(g=>g.id).filter(g=>!d.has(g));let u=!0;for(let g=0;g<c.length&&u;g++)for(let h=g+1;h<c.length&&u;h++)r.get(c[g])?.has(c[h])||(u=!1);if(!u)continue;let f=!0;for(let g=0;g<l.length&&f;g++)for(let h=g+1;h<l.length&&f;h++)r.get(l[g])?.has(l[h])&&(f=!1);if(f)return{property:"split",expected:"split",actual:"split",valid:!0}}}return{property:"split",expected:"split",actual:"non_split",valid:!1,message:"Graph cannot be partitioned into clique + independent set"}},mc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.cograph?.kind!=="cograph")return{property:"cograph",expected:t.cograph?.kind??"unconstrained",actual:t.cograph?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"cograph",expected:"cograph",actual:"trivial",valid:!0};const r=new Map;for(const a of n)r.set(a.id,new Set);for(const a of o)r.get(a.source)?.add(a.target),t.directionality.kind==="undirected"&&r.get(a.target)?.add(a.source);const i=ze(n.map(a=>a.id),4);for(const a of i)if(va(a,r,t.directionality.kind==="directed"))return{property:"cograph",expected:"cograph",actual:"non_cograph",valid:!1,message:`Graph contains induced P4 on vertices [${a.join(", ")}]`};return{property:"cograph",expected:"cograph",actual:"cograph",valid:!0}},vc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.clawFree?.kind!=="claw_free")return{property:"clawFree",expected:t.clawFree?.kind??"unconstrained",actual:t.clawFree?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"clawFree",expected:"claw_free",actual:"trivial",valid:!0};const r=new Map;for(const i of n)r.set(i.id,new Set);for(const i of o)r.get(i.source)?.add(i.target),t.directionality.kind==="undirected"&&r.get(i.target)?.add(i.source);for(const i of n){const a=[...r.get(i.id)||[]];if(a.length<3)continue;const s=ze(a,3);for(const c of s){let d=!0;for(let l=0;l<c.length&&d;l++)for(let u=l+1;u<c.length&&d;u++)r.get(c[l])?.has(c[u])&&(d=!1);if(d)return{property:"clawFree",expected:"claw_free",actual:"has_claw",valid:!1,message:`Graph contains induced K_{1,3} with center ${i.id} and leaves [${c.join(", ")}]`}}}return{property:"clawFree",expected:"claw_free",actual:"claw_free",valid:!0}},yc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.chordal?.kind!=="chordal")return{property:"chordal",expected:t.chordal?.kind??"unconstrained",actual:t.chordal?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"chordal",expected:"chordal",actual:"trivial",valid:!0};const r=new Map;for(const i of n)r.set(i.id,new Set);for(const i of o)r.get(i.source)?.add(i.target),t.directionality.kind==="undirected"&&r.get(i.target)?.add(i.source);if(n.length<=10)for(let i=4;i<=n.length;i++){const a=ya(n.map(s=>s.id),r,i,t.directionality.kind==="directed");for(const s of a)if(!ba(s,r,t.directionality.kind==="directed"))return{property:"chordal",expected:"chordal",actual:"non_chordal",valid:!1,message:`Graph contains chordless cycle of length ${i}: [${s.join(", ")}]`}}return{property:"chordal",expected:"chordal",actual:"chordal",valid:!0,message:n.length>10?"Chordal validation skipped for large graph (n > 10)":void 0}},bc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.interval?.kind!=="interval")return{property:"interval",expected:t.interval?.kind??"unconstrained",actual:t.interval?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"interval",expected:"interval",actual:"trivial",valid:!0};if(n.every(i=>i.data?.interval)){const i=n.map(s=>({node:s,start:s.data?.interval?.start??0,end:s.data?.interval?.end??0})),a=new Map;for(const s of n)a.set(s.id,new Set);for(const s of o)a.get(s.source)?.add(s.target),t.directionality.kind==="undirected"&&a.get(s.target)?.add(s.source);for(let s=0;s<i.length;s++)for(let c=s+1;c<i.length;c++){const d=i[s],l=i[c],u=d.start<l.end&&l.start<d.end,f=a.get(d.node.id)?.has(l.node.id);if(u!==f)return{property:"interval",expected:"interval",actual:"non_interval",valid:!1,message:`Edge mismatch: intervals ${d.node.id} and ${l.node.id} ${u?"intersect but no edge":"have edge but don't intersect"}`}}return{property:"interval",expected:"interval",actual:"interval",valid:!0}}return{property:"interval",expected:"interval",actual:"unknown",valid:!0,message:"Interval validation skipped (no interval metadata found)"}},kc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.permutation?.kind!=="permutation")return{property:"permutation",expected:t.permutation?.kind??"unconstrained",actual:t.permutation?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"permutation",expected:"permutation",actual:"trivial",valid:!0};if(n.every(i=>i.data?.permutationValue!==void 0)){const i=n.map(s=>s.data?.permutationValue??0),a=new Map;for(const s of n)a.set(s.id,new Set);for(const s of o)a.get(s.source)?.add(s.target),t.directionality.kind==="undirected"&&a.get(s.target)?.add(s.source);for(let s=0;s<n.length;s++)for(let c=s+1;c<n.length;c++){const d=s-c,l=i[s]-i[c],u=d*l<0,f=a.get(n[s].id)?.has(n[c].id);if(u!==f)return{property:"permutation",expected:"permutation",actual:"non_permutation",valid:!1,message:`Edge mismatch: nodes ${s} and ${c} ${u?"should have edge but don't":"have edge but shouldn't"}`}}return{property:"permutation",expected:"permutation",actual:"permutation",valid:!0}}return{property:"permutation",expected:"permutation",actual:"unknown",valid:!0,message:"Permutation validation skipped (no permutation metadata found)"}},wc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.comparability?.kind!=="comparability")return{property:"comparability",expected:t.comparability?.kind??"unconstrained",actual:t.comparability?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"comparability",expected:"comparability",actual:"trivial",valid:!0};if(n.every(i=>i.data?.topologicalOrder!==void 0)){const i=n.map(s=>s.data?.topologicalOrder??0);return new Set(i).size!==n.length?{property:"comparability",expected:"comparability",actual:"invalid_order",valid:!1,message:"Topological order contains duplicate values"}:{property:"comparability",expected:"comparability",actual:"comparability",valid:!0}}return n.length<=10&&!ka(n,o,t.directionality.kind==="directed")?{property:"comparability",expected:"comparability",actual:"non_comparability",valid:!1,message:"Graph is not transitively orientable"}:{property:"comparability",expected:"comparability",actual:"comparability",valid:!0,message:n.length>10?"Comparability validation skipped for large graph (n > 10)":void 0}},xc=e=>{const{spec:t,nodes:n}=e;if(t.perfect?.kind!=="perfect")return{property:"perfect",expected:t.perfect?.kind??"unconstrained",actual:t.perfect?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"perfect",expected:"perfect",actual:"trivial",valid:!0};if(n.every(r=>r.data?.perfectClass)){const r=n[0].data?.perfectClass;return n.every(a=>a.data?.perfectClass===r)?{property:"perfect",expected:"perfect",actual:`perfect (${r})`,valid:!0}:{property:"perfect",expected:"perfect",actual:"mixed_classes",valid:!1,message:"Nodes have inconsistent perfect class markers"}}return{property:"perfect",expected:"perfect",actual:"unknown",valid:!0,message:"Perfect validation skipped (no perfect class metadata found)"}},Mc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.line?.kind!=="line_graph")return{property:"line",expected:t.line?.kind??"unconstrained",actual:t.line?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"line",expected:"line_graph",actual:"trivial",valid:!0};if(n.every(i=>i.data?.baseEdge!==void 0)){const i=n.map(a=>a.data?.baseEdge??{source:"",target:""});for(const a of o){const s=Number.parseInt(a.source.replaceAll(/^\D+/g,"")),c=Number.parseInt(a.target.replaceAll(/^\D+/g,""));if(Number.isNaN(s)||Number.isNaN(c)||s>=i.length||c>=i.length)return{property:"line",expected:"line_graph",actual:"invalid_structure",valid:!1,message:"Invalid node IDs for line graph"};const d=i[s],l=i[c];if(!(d.source===l.source||d.source===l.target||d.target===l.source||d.target===l.target))return{property:"line",expected:"line_graph",actual:"invalid_adjacency",valid:!1,message:"Adjacent vertices in L(G) don't share vertex in base graph G"}}return{property:"line",expected:"line_graph",actual:"line_graph",valid:!0}}return{property:"line",expected:"line_graph",actual:"unknown",valid:!0,message:"Line graph validation skipped (no base edge metadata found)"}},Sc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.selfComplementary?.kind!=="self_complementary")return{property:"selfComplementary",expected:t.selfComplementary?.kind??"unconstrained",actual:t.selfComplementary?.kind??"unconstrained",valid:!0};const r=n.length;if(r%4!==0&&r%4!==1)return{property:"selfComplementary",expected:"self_complementary",actual:"invalid_size",valid:!1,message:`Self-complementary requires n ≡ 0 or 1 (mod 4), got n=${r}`};const i=n.some(s=>s.data?.permutation!==void 0),a=n.some(s=>s.data?.selfComplementaryType!==void 0);if(i||a){const c=r*(r-1)/2/2;return o.length!==c?{property:"selfComplementary",expected:"self_complementary",actual:"invalid_edge_count",valid:!1,message:`Self-complementary requires exactly ${c} edges, got ${o.length}`}:{property:"selfComplementary",expected:"self_complementary",actual:"self_complementary",valid:!0,message:"Isomorphism validation not yet implemented"}}return{property:"selfComplementary",expected:"self_complementary",actual:"unknown",valid:!0,message:"Self-complementary validation skipped (no construction metadata found)"}},Cc=e=>{const{spec:t,nodes:n}=e;return t.threshold?.kind!=="threshold"?{property:"threshold",expected:t.threshold?.kind??"unconstrained",actual:t.threshold?.kind??"unconstrained",valid:!0}:n.length<2?{property:"threshold",expected:"threshold",actual:"trivial",valid:!0}:n.some(r=>r.data?.thresholdType!==void 0)?n.every(i=>i.data?.thresholdType==="dominant"||i.data?.thresholdType==="isolated")?{property:"threshold",expected:"threshold",actual:"threshold",valid:!0}:{property:"threshold",expected:"threshold",actual:"invalid_metadata",valid:!1,message:"Not all vertices marked as dominant or isolated"}:{property:"threshold",expected:"threshold",actual:"unknown",valid:!0,message:"Threshold validation requires construction metadata"}},_c=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.stronglyRegular?.kind!=="strongly_regular")return{property:"stronglyRegular",expected:t.stronglyRegular?.kind??"unconstrained",actual:t.stronglyRegular?.kind??"unconstrained",valid:!0};const r=n.length,{k:i,lambda:a,mu:s}=t.stronglyRegular;if(i===void 0||a===void 0||s===void 0)return{property:"stronglyRegular",expected:"strongly_regular",actual:"missing_parameters",valid:!1,message:"Strongly regular requires k, lambda, mu parameters"};if(n.some(d=>d.data?.srgParams!==void 0)){const d=n[0].data?.srgParams;if(!d)return{property:"stronglyRegular",expected:"strongly_regular",actual:"invalid_metadata",valid:!1,message:"SRG parameter metadata not found"};if(d.n!==r||d.k!==i||d.lambda!==a||d.mu!==s)return{property:"stronglyRegular",expected:"strongly_regular",actual:"parameter_mismatch",valid:!1,message:`SRG parameters mismatch: expected (${r}, ${i}, ${a}, ${s}), got (${d.n}, ${d.k}, ${d.lambda}, ${d.mu})`};const l=new Map;for(const f of n)l.set(f.id,0);for(const f of o)l.set(f.source,(l.get(f.source)||0)+1),l.set(f.target,(l.get(f.target)||0)+1);return[...l.values()].every(f=>f===i)?{property:"stronglyRegular",expected:"strongly_regular",actual:"strongly_regular",valid:!0}:{property:"stronglyRegular",expected:"strongly_regular",actual:"not_regular",valid:!1,message:`SRG requires all vertices to have degree ${i}`}}return i*(i-a-1)!==(r-i-1)*s?{property:"stronglyRegular",expected:"strongly_regular",actual:"invalid_parameters",valid:!1,message:"SRG feasibility condition failed: k(k-λ-1) = (n-k-1)μ required"}:{property:"stronglyRegular",expected:"strongly_regular",actual:"strongly_regular",valid:!0,message:"Strongly regular validation skipped (no metadata, feasibility condition satisfied)"}},Nc=e=>{const{spec:t,nodes:n}=e;if(t.vertexTransitive?.kind!=="vertex_transitive")return{property:"vertexTransitive",expected:t.vertexTransitive?.kind??"unconstrained",actual:t.vertexTransitive?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"vertexTransitive",expected:"vertex_transitive",actual:"trivial",valid:!0};if(n.some(c=>c.data?.vertexTransitiveGroup!==void 0)){if(!n.every(u=>u.data?.vertexTransitiveGroup!==void 0))return{property:"vertexTransitive",expected:"vertex_transitive",actual:"incomplete_metadata",valid:!1,message:"Not all vertices have vertex-transitive group metadata"};const d=n[0].data?.vertexTransitiveGroup;return d?n.every(u=>u.data?.vertexTransitiveGroup===d)?{property:"vertexTransitive",expected:"vertex_transitive",actual:"vertex_transitive",valid:!0}:{property:"vertexTransitive",expected:"vertex_transitive",actual:"inconsistent_groups",valid:!1,message:"Not all vertices use same automorphism group"}:{property:"vertexTransitive",expected:"vertex_transitive",actual:"missing_group",valid:!1,message:"Vertex-transitive group metadata not found"}}const i=new Map;for(const c of n)i.set(c.id,0);for(const c of e.edges)i.set(c.source,(i.get(c.source)||0)+1),i.set(c.target,(i.get(c.target)||0)+1);const a=[...i.values()];return a.every(c=>c===a[0])?{property:"vertexTransitive",expected:"vertex_transitive",actual:"vertex_transitive",valid:!0,message:"Vertex-transitive validation skipped (no metadata, graph is regular)"}:{property:"vertexTransitive",expected:"vertex_transitive",actual:"irregular",valid:!1,message:"Vertex-transitive graphs are regular (all vertices same degree)"}},Ec=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.edgeTransitive?.kind!=="edge_transitive")return{property:"edgeTransitive",expected:t.edgeTransitive?.kind??"unconstrained",actual:t.edgeTransitive?.kind??"unconstrained",valid:!0};const r=n.length;if(r<2)return{property:"edgeTransitive",expected:"edge_transitive",actual:"trivial",valid:!0};if(n.some(s=>s.data?.edgeTransitive!==void 0))return{property:"edgeTransitive",expected:"edge_transitive",actual:"edge_transitive",valid:!0};const a=r*(r-1)/2;return o.length===a?{property:"edgeTransitive",expected:"edge_transitive",actual:"edge_transitive",valid:!0,message:"Edge-transitive validation skipped (complete graph is edge-transitive)"}:{property:"edgeTransitive",expected:"edge_transitive",actual:"unknown",valid:!1,message:"Cannot verify edge-transitivity without metadata (non-complete graph)"}},$c=e=>{const{spec:t,nodes:n}=e;if(t.arcTransitive?.kind!=="arc_transitive")return{property:"arcTransitive",expected:t.arcTransitive?.kind??"unconstrained",actual:t.arcTransitive?.kind??"unconstrained",valid:!0};if(n.length<3)return{property:"arcTransitive",expected:"arc_transitive",actual:"trivial",valid:!0};if(n.some(c=>c.data?.arcTransitive!==void 0))return n.every(d=>d.data?.arcTransitive!==void 0)?{property:"arcTransitive",expected:"arc_transitive",actual:"arc_transitive",valid:!0}:{property:"arcTransitive",expected:"arc_transitive",actual:"incomplete_metadata",valid:!1,message:"Not all vertices have arc-transitive metadata"};const i=new Map;for(const c of n)i.set(c.id,0);for(const c of e.edges)i.set(c.source,(i.get(c.source)||0)+1),i.set(c.target,(i.get(c.target)||0)+1);const a=[...i.values()];return a.every(c=>c===a[0])?{property:"arcTransitive",expected:"arc_transitive",actual:"unknown",valid:!1,message:"Cannot verify arc-transitivity without metadata (regularity is necessary but not sufficient)"}:{property:"arcTransitive",expected:"arc_transitive",actual:"irregular",valid:!1,message:"Arc-transitive graphs must be regular"}},Ic=e=>{const{spec:t,nodes:n,edges:o}=e;let r=null;if(t.cubic?.kind==="cubic")r=3;else if(t.specificRegular?.kind==="k_regular")r=t.specificRegular.k;else return{property:"regularity",expected:"unconstrained",actual:"unconstrained",valid:!0};if(r===null)return{property:"regularity",expected:"unconstrained",actual:"unconstrained",valid:!0};const i=new Map;for(const d of n)i.set(d.id,0);for(const d of o)i.set(d.source,(i.get(d.source)||0)+1),t.directionality.kind==="undirected"&&i.set(d.target,(i.get(d.target)||0)+1);const a=[...i.values()];if(!a.every(d=>d===r)){const d=new Map;for(const u of a)d.set(u,(d.get(u)||0)+1);const l=Object.fromEntries(d);return{property:"regularity",expected:`${r}-regular`,actual:`not_regular (degree distribution: ${JSON.stringify(l)})`,valid:!1,message:`Expected all vertices to have degree ${r}, but got ${JSON.stringify(l)}`}}const c=t.cubic?.kind==="cubic"?"cubic":`${r}-regular`;return{property:"regularity",expected:c,actual:c,valid:!0}},Pc=e=>{const{spec:t,nodes:n,edges:o}=e,r=t.eulerian?.kind;if(r!=="eulerian"&&r!=="semi_eulerian")return{property:"eulerian",expected:r??"unconstrained",actual:r??"unconstrained",valid:!0};const i=new Map;for(const c of n)i.set(c.id,0);for(const c of o)i.set(c.source,(i.get(c.source)||0)+1),t.directionality.kind==="undirected"?i.set(c.target,(i.get(c.target)||0)+1):i.set(c.target,i.get(c.target)||0);const a=[];for(const[c,d]of i.entries())d%2===1&&a.push(c);const s=a.length;return r==="eulerian"?s===0?{property:"eulerian",expected:"eulerian",actual:"eulerian",valid:!0}:{property:"eulerian",expected:"eulerian",actual:`semi_eulerian (${s} odd-degree vertices: ${a.join(", ")})`,valid:!1,message:`Eulerian graphs require all vertices to have even degree, but found ${s} vertices with odd degree`}:r==="semi_eulerian"?s===2?{property:"eulerian",expected:"semi_eulerian",actual:"semi_eulerian",valid:!0}:{property:"eulerian",expected:"semi_eulerian",actual:s===0?"eulerian":`non_eulerian (${s} odd-degree vertices)`,valid:!1,message:`Semi-Eulerian graphs require exactly 2 vertices with odd degree, but found ${s}`}:{property:"eulerian",expected:"unconstrained",actual:"unconstrained",valid:!0}},Dc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.kVertexConnected?.kind!=="k_vertex_connected")return{property:"kVertexConnected",expected:t.kVertexConnected?.kind??"unconstrained",actual:t.kVertexConnected?.kind??"unconstrained",valid:!0};const r=t.kVertexConnected.k,i=n.length;if(i<r+1)return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`not_${r}-vertex-connected (only ${i} vertices, need at least ${r+1})`,valid:!1,message:`k-vertex-connected graphs require at least ${r+1} vertices (got ${i})`};if(!Qe(n,o,t.directionality.kind==="directed"))return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`not_${r}-vertex-connected (graph is disconnected)`,valid:!1,message:"k-vertex-connected graphs must be connected"};const a=new Map;for(const c of n)a.set(c.id,0);for(const c of o)a.set(c.source,(a.get(c.source)||0)+1),t.directionality.kind==="undirected"&&a.set(c.target,(a.get(c.target)||0)+1);const s=Math.min(...a.values());if(s<r)return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`not_${r}-vertex-connected (min degree = ${s}, need ≥ ${r})`,valid:!1,message:`k-vertex-connected graphs require minimum degree ≥ ${r} (got ${s})`};if(r===2&&i<=50)for(const c of n){const d=n.filter(u=>u.id!==c.id),l=o.filter(u=>u.source!==c.id&&u.target!==c.id);if(!Qe(d,l,t.directionality.kind==="directed"))return{property:"kVertexConnected",expected:"2-vertex-connected",actual:"not_2-vertex-connected (removing one vertex disconnects the graph)",valid:!1,message:`2-vertex-connected graphs must remain connected after removing any single vertex (failed for ${c.id})`}}return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`${r}-vertex-connected`,valid:!0}},Tc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.kEdgeConnected?.kind!=="k_edge_connected")return{property:"kEdgeConnected",expected:t.kEdgeConnected?.kind??"unconstrained",actual:t.kEdgeConnected?.kind??"unconstrained",valid:!0};const r=t.kEdgeConnected.k,i=n.length;if(i<r+1)return{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`not_${r}-edge-connected (only ${i} vertices, need at least ${r+1})`,valid:!1,message:`k-edge-connected graphs require at least ${r+1} vertices (got ${i})`};if(!Qe(n,o,t.directionality.kind==="directed"))return{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`not_${r}-edge-connected (graph is disconnected)`,valid:!1,message:"k-edge-connected graphs must be connected"};const a=new Map;for(const c of n)a.set(c.id,0);for(const c of o)a.set(c.source,(a.get(c.source)||0)+1),t.directionality.kind==="undirected"&&a.set(c.target,(a.get(c.target)||0)+1);const s=Math.min(...a.values());return s<r?{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`not_${r}-edge-connected (min degree = ${s}, need ≥ ${r})`,valid:!1,message:`k-edge-connected graphs require minimum degree ≥ ${r} (got ${s})`}:{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`${r}-edge-connected`,valid:!0}},Ac=e=>{const{nodes:t,edges:n,spec:o}=e;return t.length===0?{property:"treewidth",expected:"unconstrained",actual:"0 (empty)",valid:!0}:{property:"treewidth",expected:"unconstrained",actual:`treewidth_${Rc(t,n,o)}`,valid:!0}},Rc=(e,t,n)=>{if(e.length===0)return 0;const o=Y(e,t,n.directionality.kind==="directed"),r=new Set(e.map(a=>a.id));let i=1;for(;r.size>0;){let a=1/0,s=null;for(const l of r){const f=(o.get(l)??[]).filter(g=>r.has(g)).length;f<a&&(a=f,s=l)}if(s===null)break;const c=(o.get(s)??[]).filter(l=>r.has(l)),d=Fc(new Set([...c,s]),o);i=Math.max(i,d),r.delete(s)}return i-1},Fc=(e,t)=>{if(e.size===0)return 0;let n=0;const o=100,r=(a,s,c,d=0)=>{if(d>o){n=Math.max(n,Math.min(e.size,a.size+s.size));return}if(s.size===0&&c.size===0){n=Math.max(n,a.size);return}if(s.size===0)return;const l=new Set([...s,...c]);let u=null,f=-1;for(const p of l){const m=(t.get(p)??[]).filter(y=>s.has(y)).length;m>f&&(f=m,u=p)}const g=u?new Set(t.get(u)):new Set,h=[...s].filter(p=>!g.has(p));for(const p of h){const v=new Set(t.get(p)),m=new Set([...a,p]),y=new Set([...s].filter(k=>v.has(k))),b=new Set([...c].filter(k=>v.has(k)));r(m,y,b,d+1),s.delete(p),c.add(p)}},i=new Set(e);return r(new Set,i,new Set),n},jc=(e,t,n)=>{if(e.length===0)return 0;if(e.length===1)return 1;const o=Y(e,t,!1);let r=0;const i=100,a=(c,d,l,u=0)=>{if(u>i){r=Math.max(r,Math.min(e.length,c.size+d.size));return}if(d.size===0&&l.size===0){r=Math.max(r,c.size);return}if(d.size===0)return;const f=new Set([...d,...l]);let g=null,h=-1;for(const m of f){const b=(o.get(m)??[]).filter(k=>d.has(k)).length;b>h&&(h=b,g=m)}const p=g?new Set(o.get(g)):new Set,v=[...d].filter(m=>!p.has(m));for(const m of v){const y=new Set(o.get(m)),b=new Set([...c,m]),k=new Set([...d].filter(C=>y.has(C))),w=new Set([...l].filter(C=>y.has(C)));a(b,k,w,u+1),d.delete(m),l.add(m)}},s=new Set(e.map(c=>c.id));return a(new Set,s,new Set),r},Lc=e=>{const{nodes:t,edges:n,spec:o}=e;if(o.kColorable?.kind!=="k_colorable"&&o.kColorable?.kind!=="bipartite_colorable")return{property:"kColorable",expected:o.kColorable?.kind??"unconstrained",actual:o.kColorable?.kind??"unconstrained",valid:!0};const r=o.kColorable.kind==="bipartite_colorable"?2:o.kColorable.kind==="k_colorable"?o.kColorable.k:0;if(t.length===0)return{property:"kColorable",expected:o.kColorable.kind,actual:o.kColorable.kind,valid:!0};if(r<1)return{property:"kColorable",expected:o.kColorable.kind,actual:"not_k_colorable",valid:!1,message:"k must be at least 1 for k-colorable property"};if(r===1){const s=n.length===0;return{property:"kColorable",expected:"k_colorable",actual:s?"1_colorable":"not_1_colorable",valid:s,message:s?void 0:"Graph with edges cannot be 1-colorable"}}if(r===2){const s=zc(t,n,o.directionality.kind==="directed");return{property:"kColorable",expected:"bipartite_colorable",actual:s?"bipartite_colorable":"not_2_colorable",valid:s,message:s?void 0:"Graph is not bipartite, therefore not 2-colorable"}}const i=qn(t,n,o.directionality.kind==="directed"),a=Math.max(...i.values());return a>r-1?{property:"kColorable",expected:o.kColorable.kind,actual:`not_${r}_colorable`,valid:!1,message:`Graph requires at least ${a+1} colors, which exceeds ${r}`}:{property:"kColorable",expected:o.kColorable.kind,actual:`${r}_colorable`,valid:!0}},qn=(e,t,n)=>{const o=new Map;if(e.length===0)return o;const r=Y(e,t,n),i=[...e].sort((a,s)=>{const c=(r.get(a.id)??[]).length;return(r.get(s.id)??[]).length-c});for(const a of i){const s=r.get(a.id)??[],c=new Set;for(const l of s){const u=o.get(l);u!==void 0&&c.add(u)}let d=0;for(;c.has(d);)d++;o.set(a.id,d)}return o},zc=(e,t,n)=>{if(e.length===0)return!0;const o=Y(e,t,n),r=new Map,i=new Set,a=s=>{const c=[s];for(r.set(s,0),i.add(s);c.length>0;){const d=c.shift();if(!d)break;const l=o.get(d)??[];for(const u of l)if(i.has(u)){if(r.get(u)===r.get(d))return!1}else r.set(u,1-(r.get(d)??0)),i.add(u),c.push(u)}return!0};for(const s of e)if(!i.has(s.id)&&!a(s.id))return!1;return!0},Bc=e=>{const t=[],n=[],{spec:o,nodes:r,edges:i}=e;if(o.flowNetwork?.kind!=="flow_network")return{property:"flowNetwork",expected:o.flowNetwork?.kind??"unconstrained",actual:o.flowNetwork?.kind??"unconstrained",valid:!0};const{source:a,sink:s}=o.flowNetwork;o.directionality.kind!=="directed"&&t.push("Flow network must be directed");const c=r.find(m=>m.id===a),d=r.find(m=>m.id===s);c||t.push(`Source node '${a}' does not exist in the graph`),d||t.push(`Sink node '${s}' does not exist in the graph`),a===s&&t.push("Source and sink must be different nodes"),o.weighting.kind!=="weighted_numeric"&&t.push("Flow network must have weighted edges (capacities)");const l=[],u=[];for(const m of i)m.weight===void 0?l.push(m):m.weight<0&&u.push(m);l.length>0&&t.push(`Flow network edges must have capacities (weights). Missing capacities on ${l.length} edge(s): `+l.map(m=>`${m.source}→${m.target}`).join(", ")),u.length>0&&t.push(`Flow network capacities must be non-negative. Negative capacities on ${u.length} edge(s): `+u.map(m=>`${m.source}→${m.target} (${m.weight})`).join(", "));const f=i.filter(m=>m.target===a);f.length>0&&n.push(`Flow network typically has no edges entering the source. Found ${f.length} edge(s) entering source: `+f.map(m=>`${m.source}→${m.target}`).join(", "));const g=i.filter(m=>m.source===s);if(g.length>0&&n.push(`Flow network typically has no edges leaving the sink. Found ${g.length} edge(s) leaving sink: `+g.map(m=>`${m.source}→${m.target}`).join(", ")),c&&d&&t.length===0){const m=new Map;for(const S of r)m.set(S.id,[]);for(const S of i){const M=m.get(S.source);M&&M.push(S.target)}const y=new Set,b=[a];for(;b.length>0;){const S=b.shift();if(!S)break;if(y.has(S))continue;y.add(S);const M=m.get(S)??[];b.push(...M.filter(I=>!y.has(I)))}const k=new Map;for(const S of r)k.set(S.id,[]);for(const S of i){const M=k.get(S.target);M&&M.push(S.source)}const w=new Set,C=[s];for(;C.length>0;){const S=C.shift();if(!S)break;if(w.has(S))continue;w.add(S);const M=k.get(S)??[];C.push(...M.filter(I=>!w.has(I)))}const x=[];for(const S of r)S.id!==a&&S.id!==s&&(!y.has(S.id)||!w.has(S.id))&&x.push(S.id);x.length>0&&n.push(`Flow network nodes should lie on paths from source to sink. Found ${x.length} disconnected node(s): `+x.join(", "))}const h=t.length===0,p=[...t,...n],v=p.length>0?p.join("; "):void 0;return{property:"flowNetwork",expected:"flow_network",actual:h?"flow_network":"not_flow_network",valid:h,message:v}},Oc=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph cannot be null or undefined"}};if(!e.getNode(t))return{ok:!1,error:{type:"invalid-input",message:`Start node '${t}' not found in graph`}};const o=new Set,r=[],i=new Map,a=[t];for(o.add(t),i.set(t,null);a.length>0;){const s=a.shift();if(s===void 0)break;const c=e.getNode(s);c&&r.push(c);const d=e.getNeighbors(s);for(const l of d)o.has(l)||(o.add(l),i.set(l,s),a.push(l))}return{ok:!0,value:{visitOrder:r,parents:i}}};class Xe{heap=[];itemSet=new Set;push(t,n){this.itemSet.has(t)||(this.heap.push({item:t,priority:n}),this.itemSet.add(t),this.bubbleUp(this.heap.length-1))}pop(){if(this.heap.length===0)return;if(this.heap.length===1){const o=this.heap.pop();return o?(this.itemSet.delete(o.item),o.item):void 0}const t=this.heap[0],n=this.heap.pop();if(n&&t)return this.heap[0]=n,this.bubbleDown(0),this.itemSet.delete(t.item),t.item}get length(){return this.heap.length}contains(t){return this.itemSet.has(t)}*[Symbol.iterator](){yield*this.itemSet}bubbleUp(t){for(;t>0;){const n=Math.floor((t-1)/2);if(this.heap[t].priority>=this.heap[n].priority)break;[this.heap[t],this.heap[n]]=[this.heap[n],this.heap[t]],t=n}}bubbleDown(t){for(;;){const n=2*t+1,o=2*t+2;let r=t;if(n<this.heap.length&&this.heap[n].priority<this.heap[r].priority&&(r=n),o<this.heap.length&&this.heap[o].priority<this.heap[r].priority&&(r=o),r===t)break;[this.heap[t],this.heap[r]]=[this.heap[r],this.heap[t]],t=r}}}class qc{constructor(t,n,o,r){this.expander=t,this.seedA=n,this.seedB=o,this.options=r;const i=new Xe;i.push(n,0),this.stateA={visited:new Set([n]),frontier:i,parents:new Map};const a=new Xe;a.push(o,0),this.stateB={visited:new Set([o]),frontier:a,parents:new Map}}foundPaths=[];stateA;stateB;async search(){if(this.seedA===this.seedB)return{paths:[[this.seedA]],visitedA:new Set([this.seedA]),visitedB:new Set([this.seedB]),iterations:0};let t=0,n=!1,o=0;const r=this.options.minIterations??2;for(;(this.foundPaths.length<this.options.targetPaths||n&&t-o<r)&&t<this.options.maxIterations&&(this.stateA.frontier.length>0||this.stateB.frontier.length>0);){t++,this.stateA.frontier.length>0&&await this.expandFrontier(this.stateA,"A");let i=this.foundPaths.length;this.checkForConnections(),this.foundPaths.length>=this.options.targetPaths&&!n&&(n=!0,o=t),n&&this.addPathNodesToFrontiers(i),this.stateB.frontier.length>0&&await this.expandFrontier(this.stateB,"B"),i=this.foundPaths.length,this.checkForConnections(),this.foundPaths.length>=this.options.targetPaths&&!n&&(n=!0,o=t),n&&this.addPathNodesToFrontiers(i)}return{paths:this.foundPaths,visitedA:this.stateA.visited,visitedB:this.stateB.visited,iterations:t}}async expandFrontier(t,n){const o=[];for(;t.frontier.length>0;){const r=t.frontier.pop();r&&o.push(r)}for(const r of o){const i=await this.expander.getNeighbors(r);for(const{targetId:a,relationshipType:s}of i){if(t.visited.has(a))continue;this.expander.addEdge(r,a,s),t.visited.add(a),t.parents.set(a,{parent:r,edge:s});const c=this.expander.getDegree(a);t.frontier.push(a,c)}}}checkForConnections(){for(const t of this.stateA.frontier)if(this.stateB.visited.has(t)){const n=this.reconstructPath(t,!0);n.length>0&&!this.pathExists(n)&&this.foundPaths.push(n)}for(const t of this.stateB.frontier)if(this.stateA.visited.has(t)){const n=this.reconstructPath(t,!1);n.length>0&&!this.pathExists(n)&&this.foundPaths.push(n)}}reconstructPath(t,n){const o=[],r=[];let i=t;for(;i!==void 0;)o.unshift(i),i=this.stateA.parents.get(i)?.parent;for(i=t;i!==void 0;){const a=this.stateB.parents.get(i);if(a)r.push(a.parent),i=a.parent;else break}return[...o,...r]}pathExists(t){return this.foundPaths.some(n=>n.length===t.length&&n.every((o,r)=>o===t[r]))}addPathNodesToFrontiers(t){if(!(this.foundPaths.length<=t))for(let n=t;n<this.foundPaths.length;n++){const o=this.foundPaths[n];for(const r of o){if(!this.stateA.visited.has(r)){const i=this.expander.getDegree(r);this.stateA.frontier.push(r,i),this.stateA.visited.add(r)}if(!this.stateB.visited.has(r)){const i=this.expander.getDegree(r);this.stateB.frontier.push(r,i),this.stateB.visited.add(r)}}}}}class Uc{constructor(t,n){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");for(const[o,r]of n.entries()){const i=new Xe,a=t.getDegree(r);i.push(r,a),this.frontiers.push({index:o,frontier:i,visited:new Set([r]),parents:new Map})}this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map}}frontiers=[];paths=[];sampledEdges=new Set;stats;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectLowestDegreeFrontier();if(o===-1)break;const r=this.frontiers[o],i=r.frontier.pop();if(!i)continue;this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(i));const a=await this.expander.getNeighbors(i);for(const{targetId:s,relationshipType:c}of a){if(r.visited.has(s))continue;this.stats.edgesTraversed++,this.expander.addEdge(i,s,c);const d=`${i}->${s}`;this.sampledEdges.add(d),r.visited.add(s),r.parents.set(s,{parent:i,edge:c});const l=this.expander.getDegree(s);r.frontier.push(s,l);for(let u=0;u<this.frontiers.length;u++)if(u!==o&&this.frontiers[u].visited.has(s)){const f=this.reconstructPath(r,this.frontiers[u],s);f&&!this.pathExists(o,u,f)&&this.paths.push({fromSeed:o,toSeed:u,nodes:f})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.frontier.length>0)}selectLowestDegreeFrontier(){let t=1/0,n=-1;for(let o=0;o<this.frontiers.length;o++){const r=this.frontiers[o];if(r.frontier.length>0){const i=this.peekPriority(r.frontier);i<t&&(t=i,n=o)}}return n}peekPriority(t){for(const n of t)return this.expander.getDegree(n);return 1/0}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}const Gc=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph cannot be null or undefined"}};if(!e.getNode(t))return{ok:!1,error:{type:"invalid-input",message:`Start node '${t}' not found in graph`}};const o=new Set,r=[],i=new Map,a=new Map,s=new Map;let c=0;const d=[[t,!1]];for(i.set(t,null);d.length>0;){const l=d.pop();if(l===void 0)break;const[u,f]=l;if(f){c++,s.set(u,c);continue}if(o.has(u))continue;o.add(u),c++,a.set(u,c);const g=e.getNode(u);g&&r.push(g),d.push([u,!0]);const h=e.getNeighbors(u);for(let p=h.length-1;p>=0;p--){const v=h[p];o.has(v)||(i.has(v)||i.set(v,u),d.push([v,!1]))}}return{ok:!0,value:{visitOrder:r,parents:i,discovered:a,finished:s}}},Wc=(e,t)=>{if(t.radius<0)return{ok:!1,error:{type:"invalid-options",message:"Radius must be non-negative"}};if(t.seedNodes.length===0)return{ok:!1,error:{type:"invalid-options",message:"At least one seed node is required"}};for(const n of t.seedNodes)if(!e.hasNode(n))return{ok:!1,error:{type:"invalid-input",message:`Seed node '${n}' not found in graph`}};return{ok:!0,value:{...t,includeSeed:t.includeSeed??!0}}},Un=(e,t)=>{const n=Wc(e,t);if(!n.ok)return n;const o=n.value,{radius:r,seedNodes:i,includeSeed:a}=o,s=new Set;if(r===0){if(a)for(const c of i)s.add(c);return cn(e,s)}for(const c of i){const d=Vc(e,c,r);for(const[l,u]of d.entries())u===0&&!a||s.add(l)}return cn(e,s)},Vc=(e,t,n)=>{const o=new Map,r=[{nodeId:t,distance:0}];for(o.set(t,0);r.length>0;){const i=r.shift();if(!i)break;const{nodeId:a,distance:s}=i;if(s>=n)continue;const c=e.getNeighbors(a);for(const d of c)o.has(d)||(o.set(d,s+1),r.push({nodeId:d,distance:s+1}))}return o},cn=(e,t)=>{const n=[],o=[];for(const r of t){const i=e.getNode(r);i&&n.push(i)}if(e.getOutgoingEdges)for(const r of t){const i=e.getOutgoingEdges(r);for(const a of i)t.has(a.source)&&t.has(a.target)&&o.push(a)}return{ok:!0,value:{nodes:n,edges:o}}},Kc=(e,t,n,o=!0)=>Un(e,{radius:n,seedNodes:t,includeSeed:o});class Hc{constructor(t,n){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");for(const[o,r]of n.entries())this.frontiers.push({index:o,queue:[r],visited:new Set([r]),parents:new Map});this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map,frontierSwitches:0}}frontiers=[];paths=[];sampledEdges=new Set;stats;lastActiveFrontier=0;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectSmallestFrontier();if(o===-1)break;o!==this.lastActiveFrontier&&(this.stats.frontierSwitches++,this.lastActiveFrontier=o);const r=this.frontiers[o],i=r.queue.shift();if(!i)continue;this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(i));const a=await this.expander.getNeighbors(i);for(const{targetId:s,relationshipType:c}of a){if(r.visited.has(s))continue;this.stats.edgesTraversed++,this.expander.addEdge(i,s,c);const d=`${i}->${s}`;this.sampledEdges.add(d),r.visited.add(s),r.parents.set(s,{parent:i,edge:c}),r.queue.push(s);for(let l=0;l<this.frontiers.length;l++)if(l!==o&&this.frontiers[l].visited.has(s)){const u=this.reconstructPath(r,this.frontiers[l],s);u&&!this.pathExists(o,l,u)&&this.paths.push({fromSeed:o,toSeed:l,nodes:u})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.queue.length>0)}selectSmallestFrontier(){let t=1/0,n=-1;for(let o=0;o<this.frontiers.length;o++){const r=this.frontiers[o].queue.length;r>0&&r<t&&(t=r,n=o)}return n}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}let Jc=class{state;constructor(t){this.state=t}next(){return this.state=this.state*1664525+1013904223>>>0,this.state/4294967295}nextInt(t){return Math.floor(this.next()*t)}};class Qc{constructor(t,n,o=42){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");this.rng=new Jc(o);for(const[r,i]of n.entries())this.frontiers.push({index:r,frontier:[i],visited:new Set([i]),parents:new Map});this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map}}frontiers=[];paths=[];sampledEdges=new Set;rng;stats;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectRandomFrontier();if(o===-1)break;const r=this.frontiers[o],i=this.rng.nextInt(r.frontier.length),a=r.frontier[i];r.frontier.splice(i,1),this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(a));const s=await this.expander.getNeighbors(a);for(const{targetId:c,relationshipType:d}of s){if(r.visited.has(c))continue;this.stats.edgesTraversed++,this.expander.addEdge(a,c,d);const l=`${a}->${c}`;this.sampledEdges.add(l),r.visited.add(c),r.parents.set(c,{parent:a,edge:d}),r.frontier.push(c);for(let u=0;u<this.frontiers.length;u++)if(u!==o&&this.frontiers[u].visited.has(c)){const f=this.reconstructPath(r,this.frontiers[u],c);f&&!this.pathExists(o,u,f)&&this.paths.push({fromSeed:o,toSeed:u,nodes:f})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.frontier.length>0)}selectRandomFrontier(){const t=this.frontiers.map((o,r)=>({index:r,size:o.frontier.length})).filter(o=>o.size>0);return t.length===0?-1:t[this.rng.nextInt(t.length)].index}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}class Xc{constructor(t,n){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");for(const[o,r]of n.entries())this.frontiers.push({index:o,queue:[r],visited:new Set([r]),parents:new Map});this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map}}frontiers=[];paths=[];sampledEdges=new Set;stats;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectNextFrontier();if(o===-1)break;const r=this.frontiers[o],i=r.queue.shift();if(!i)continue;this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(i));const a=await this.expander.getNeighbors(i);for(const{targetId:s,relationshipType:c}of a){if(r.visited.has(s))continue;this.stats.edgesTraversed++,this.expander.addEdge(i,s,c);const d=`${i}->${s}`;this.sampledEdges.add(d),r.visited.add(s),r.parents.set(s,{parent:i,edge:c}),r.queue.push(s);for(let l=0;l<this.frontiers.length;l++)if(l!==o&&this.frontiers[l].visited.has(s)){const u=this.reconstructPath(r,this.frontiers[l],s);u&&!this.pathExists(o,l,u)&&this.paths.push({fromSeed:o,toSeed:l,nodes:u})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.queue.length>0)}selectNextFrontier(){for(let t=0;t<this.frontiers.length;t++)if(this.frontiers[t].queue.length>0)return t;return-1}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}const F=e=>({ok:!0,value:e}),R=e=>({ok:!1,error:e}),Yc=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Set,o=[];let r=0;const i=(a,s)=>{n.add(a);const c=e.getNode(a);c.some&&s.push(c.value);const d=e.getNeighbors(a);if(d.ok)for(const l of d.value)n.has(l)||i(l,s);if(e.isDirected()){const l=e.getAllEdges();for(const u of l)u.target===a&&!n.has(u.source)&&i(u.source,s)}};for(const a of t)if(!n.has(a.id)){const s=[];i(a.id,s),o.push({id:r++,nodes:s,size:s.length})}return F(o)},me=e=>({some:!0,value:e}),ge=()=>({some:!1}),Zc=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Set,o=new Set,r=new Map,i=c=>{n.add(c),o.add(c);const d=e.getNeighbors(c);if(d.ok)for(const l of d.value){if(o.has(l))return s(c,l);if(!n.has(l)){r.set(l,c);const u=i(l);if(u.some)return u}}return o.delete(c),ge()},a=(c,d)=>{n.add(c);const l=e.getNeighbors(c);if(l.ok)for(const u of l.value)if(n.has(u)){if(u!==d)return s(c,u)}else{r.set(u,c);const f=a(u,c);if(f.some)return f}return ge()},s=(c,d)=>{const l=[],u=[];let f=c;const g=[f];for(;f!==d&&r.has(f);){const h=r.get(f);if(h)g.unshift(h),f=h;else break}g.push(d);for(let h=0;h<g.length;h++){const p=e.getNode(g[h]);if(p.some&&l.push(p.value),h<g.length-1){const v=e.getOutgoingEdges(g[h]);if(v.ok){const m=v.value.find(y=>y.target===g[h+1]);m&&u.push(m)}}}return me({nodes:l,edges:u})};for(const c of t)if(!n.has(c.id)){r.set(c.id,null);const d=e.isDirected()?i(c.id):a(c.id,null);if(d.some)return F(d)}return F(ge())},ed=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Map,o=new Map,r=new Set,i=[],a=[];let s=0,c=0;const d=l=>{n.set(l,s),o.set(l,s),s++,i.push(l),r.add(l);const u=e.getNeighbors(l);if(u.ok)for(const f of u.value)if(n.has(f)){if(r.has(f)){const g=o.get(l),h=n.get(f);g!==void 0&&h!==void 0&&o.set(l,Math.min(g,h))}}else{d(f);const g=o.get(l),h=o.get(f);g!==void 0&&h!==void 0&&o.set(l,Math.min(g,h))}if(o.get(l)===n.get(l)){const f=[];let g;do{const h=i.pop();if(h===void 0)break;g=h,r.delete(g);const p=e.getNode(g);p.some&&f.push(p.value)}while(g!==l);a.push({id:c++,nodes:f,size:f.length})}};for(const l of t)n.has(l.id)||d(l.id);return F(a)},td=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Set,o=new Set,r=new Map,i=[],a=(s,c)=>{if(o.has(s)){const u=[];let f=c;for(;f!=null&&f!==s;)u.push(f),f=r.get(f);return u.push(s),u.reverse(),R({type:"cycle-detected",message:`Cycle detected: ${u.join(" → ")} → ${u[0]}`,cyclePath:u})}if(n.has(s))return F(void 0);n.add(s),o.add(s),r.set(s,c);const d=e.getNeighbors(s);if(d.ok)for(const u of d.value){const f=a(u,s);if(!f.ok)return f}o.delete(s);const l=e.getNode(s);return l.some&&i.push(l.value),F(void 0)};for(const s of t)if(!n.has(s.id)){const c=a(s.id,null);if(!c.ok)return R(c.error)}return i.reverse(),F(i)},dt=(e,t)=>{if(t.size===0||t.size===e.getNodeCount())return 0;let n=0,o=0,r=0;const i=e.getAllNodes();for(const c of i){const d=c.id,l=e.getNeighbors(d);if(!l.ok)continue;const u=l.value,f=u.length;if([...t].some(h=>h.id===d)){o+=f;for(const h of u)[...t].some(v=>v.id===h)||n++}else r+=f}const a=Math.min(o,r);if(a===0)return 0;const s=n/a;return Math.max(0,Math.min(1,s))},Gn=(e,t)=>{if(t.length===0)return 0;let n=0;for(const o of t){const r=dt(e,o);n+=r}return n/t.length},nd=(e,t)=>{if(t.length===0)return 0;let n=0,o=0;for(const r of t){const i=dt(e,r),a=r.size;n+=i*a,o+=a}return o===0?0:n/o},At=(e,t)=>{const n=e.getEdgeCount();if(n===0)return 0;const o=new Map;for(const c of t)for(const d of c.nodes)o.set(d.id,c.id);const r=new Map,i=e.getAllNodes();for(const c of i){const d=e.getNeighbors(c.id);d.ok?r.set(c.id,d.value.length):r.set(c.id,0)}let a=0;const s=2*n;if(e.isDirected())for(const c of i)for(const d of i){const l=o.get(c.id),u=o.get(d.id);if(l===void 0||u===void 0||l!==u)continue;const f=e.getNeighbors(c.id),g=f.ok&&f.value.includes(d.id)?1:0,h=r.get(c.id)||0,p=r.get(d.id)||0,v=h*p/s;a+=g-v}else for(let c=0;c<i.length;c++)for(let d=c;d<i.length;d++){const l=i[c],u=i[d],f=o.get(l.id),g=o.get(u.id);if(f===void 0||g===void 0||f!==g)continue;const h=e.getNeighbors(l.id),p=h.ok&&h.value.includes(u.id)?1:0,v=r.get(l.id)||0,m=r.get(u.id)||0,y=v*m/s;a+=(c===d?1:2)*(p-y)}return a/=s,a},od=(e,t,n)=>{if(n===0)return 0;const o=2*n;let r=0;const i=new Map;for(const s of t.nodes){const c=typeof s=="string"?s:String(s),d=e.getNeighbors(c);d.ok?i.set(s,d.value.length):i.set(s,0)}const a=[...t.nodes];if(e.isDirected())for(const s of a)for(const c of a){const d=typeof s=="string"?s:String(s),l=typeof c=="string"?c:String(c),u=e.getNeighbors(d),f=u.ok&&u.value.includes(l)?1:0,g=i.get(s)||0,h=i.get(c)||0,p=g*h/o;r+=f-p}else for(let s=0;s<a.length;s++)for(let c=s;c<a.length;c++){const d=a[s],l=a[c],u=typeof d=="string"?d:String(d),f=typeof l=="string"?l:String(l),g=e.getNeighbors(u),h=g.ok&&g.value.includes(f)?1:0,p=i.get(d)||0,v=i.get(l)||0,m=p*v/o;r+=(s===c?1:2)*(h-m)}return r/=o,r},Ye=(e,t,n,o,r)=>{const i=2*r,a=(o+t)/i-Math.pow((n+e)/i,2),s=o/i-Math.pow(n/i,2)-Math.pow(e/i,2);return a-s},lt=(e,t)=>{const n=t.size;if(n===0||n===1)return 0;const o=e.isDirected()?n*(n-1):n*(n-1)/2;let r=0;const i=[...t];for(let s=0;s<i.length;s++)for(let c=s+1;c<i.length;c++){const d=i[s],l=i[c],u=e.getOutgoingEdges(d.id),f=e.getOutgoingEdges(l.id);let g=!1;u.ok&&(g=u.value.some(h=>h.target===l.id)),!g&&f.ok&&!e.isDirected()&&(g=f.value.some(h=>h.target===d.id)),g&&r++}const a=r/o;return Math.max(0,Math.min(1,a))},Wn=(e,t)=>{if(t.length===0)return 0;let n=0;for(const o of t){const r=lt(e,o);n+=r}return n/t.length},Vn=(e,t)=>{const n=e.getEdgeCount();if(n===0)return 0;let o=0;for(const i of t){const a=[...i];for(let s=0;s<a.length;s++)for(let c=s+1;c<a.length;c++){const d=a[s],l=a[c],u=e.getOutgoingEdges(d.id),f=e.getOutgoingEdges(l.id);let g=!1;u.ok&&(g=u.value.some(h=>h.target===l.id)),!g&&f.ok&&!e.isDirected()&&(g=f.value.some(h=>h.target===d.id)),g&&o++}}const r=o/n;return Math.max(0,Math.min(1,r))},kt=(e,t)=>{const n=t.map(c=>c.nodes),o=At(e,t),r=Gn(e,n),i=Wn(e,n),a=Vn(e,n),s=t.length;return{modularity:o,avgConductance:r,avgDensity:i,numClusters:s,coverageRatio:a}},rd=(e,t)=>{for(const n of t)n.density=lt(e,n.nodes)},id=(e,t={})=>{const n=performance.now(),{weightFn:o=()=>1,maxIterations:r=10,numTrials:i=10,seed:a}=t,s=e.getAllNodes();if(s.length===0)return R({type:"EmptyGraph",message:"Cannot run Infomap on empty graph"});const c=sd(e,o),d=ad(e,c),l=new Map,u=new Map;let f=0;const g=20;let h=new Set,p=0;for(const[N,T]of s.entries())h.add(T.id),l.set(T.id,f),p+=d.get(T.id)||0,(h.size>=g||N===s.length-1)&&(u.set(f,{id:f,nodes:h,exitProbability:0,visitProbability:p}),f++,h=new Set,p=0);dn(u,l,c);const v=ut(u,d);let m=new Map(u),y=v,b=0;for(;b<r;){b++;let N=!1;const T=gd(s.map(O=>O.id),a?a+b:void 0);for(const O of T){const ee=l.get(O);if(ee===void 0||u.get(ee)===void 0)continue;const Z=cd(e,O,l,c);if(Z.size===0)continue;let W=ee,q=0;for(const Q of Z){if(Q===ee)continue;const K=dd(O,ee,Q,u,l,c);K<q&&(q=K,W=Q)}W!==ee&&q<-1e-10&&(ld(O,ee,W,u,l,d),N=!0)}ud(u),dn(u,l,c);const L=ut(u,d);if(L<y&&(y=L,m=new Map(u)),!N)break}u.clear();for(const[N,T]of m.entries())u.set(N,T);const k=ut(u,d),w=v/k,C=fd(e,u,l,d,w),x=C.map(N=>({id:N.id,nodes:N.nodes,size:N.nodes.size,density:lt(e,N.nodes),internalEdges:0,externalEdges:0,modularity:0})),S=At(e,x),M=e.getEdgeCount();let I=0;for(const N of x)for(const T of N.nodes){const L=typeof T=="string"?T:T.id,O=e.getOutgoingEdges(L);if(O.ok)for(const ee of O.value){const z=e.getNode(ee.target);z.some&&N.nodes.has(z.value)&&I++}}const E=M>0?I/M:0,P=performance.now()-n;return F({modules:C,metrics:{modularity:S,avgConductance:0,avgDensity:x.reduce((N,T)=>N+T.density,0)/x.length,numClusters:C.length,coverageRatio:E},descriptionLength:k,compressionRatio:w,metadata:{algorithm:"infomap",runtime:P,iterations:b,parameters:{maxIterations:r,numTrials:i,seed:a}}})},sd=(e,t)=>{const n=[],o=e.getAllNodes();for(const r of o){const i=e.getOutgoingEdges(r.id);if(!i.ok||i.value.length===0)continue;let a=0;for(const s of i.value){const c=e.getNode(s.source),d=e.getNode(s.target);c.some&&d.some&&(a+=t(s,c.value,d.value))}if(a!==0)for(const s of i.value){const c=e.getNode(s.source),d=e.getNode(s.target);if(c.some&&d.some){const l=t(s,c.value,d.value);n.push({from:s.source,to:s.target,probability:l/a})}}}return n},ad=(e,t)=>{const n=e.getAllNodes(),o=n.length,r=new Map;for(const d of n)r.set(d.id,1/o);const i=new Map;for(const d of t){i.has(d.from)||i.set(d.from,[]);const l=i.get(d.from);l&&l.push({to:d.to,prob:d.probability})}const a=.85,s=100,c=1e-6;for(let d=0;d<s;d++){const l=new Map;for(const f of n)l.set(f.id,(1-a)/o);for(const f of n){const g=r.get(f.id)||0,h=i.get(f.id);if(h)for(const{to:p,prob:v}of h){const m=l.get(p)||0;l.set(p,m+a*g*v)}}let u=0;for(const f of n){const g=r.get(f.id)||0,h=l.get(f.id)||0;u=Math.max(u,Math.abs(h-g))}r.clear();for(const[f,g]of l.entries())r.set(f,g);if(u<c)break}return r},dn=(e,t,n)=>{for(const[,o]of e)o.exitProbability=0;for(const o of n){const r=t.get(o.from),i=t.get(o.to);if(r!==void 0&&i!==void 0&&r!==i){const a=e.get(r);a&&(a.exitProbability+=o.probability)}}},ut=(e,t)=>{let n=0;for(const[,r]of e)r.exitProbability>0&&(n-=r.exitProbability*Math.log2(r.exitProbability));let o=0;for(const[,r]of e){if(r.visitProbability===0)continue;let i=0;for(const a of r.nodes){const s=t.get(a)||0;if(s>0){const c=s/r.visitProbability;i-=c*Math.log2(c)}}o+=r.visitProbability*i}return n+o},cd=(e,t,n,o)=>{const r=new Set,i=e.getOutgoingEdges(t);if(i.ok)for(const a of i.value){const s=n.get(a.target);s!==void 0&&r.add(s)}for(const a of o)if(a.to===t){const s=n.get(a.from);s!==void 0&&r.add(s)}return r},dd=(e,t,n,o,r,i)=>{const a=o.get(t),s=o.get(n);if(!a||!s)return 100;let c=0,d=0;for(const u of i){if(u.from===e){const f=r.get(u.to);f===t&&f!==n?c+=u.probability:f===n&&f!==t&&(d+=u.probability)}if(u.to===e){const f=r.get(u.from);f===t&&f!==n?c+=u.probability:f===n&&f!==t&&(d+=u.probability)}}return c-d},ld=(e,t,n,o,r,i)=>{const a=o.get(t),s=o.get(n);if(!a||!s)return;const c=i.get(e)||0;a.nodes.delete(e),a.visitProbability-=c,s.nodes.add(e),s.visitProbability+=c,r.set(e,n)},ud=e=>{const t=[];for(const[n,o]of e.entries())o.nodes.size===0&&t.push(n);for(const n of t)e.delete(n)},fd=(e,t,n,o,r)=>{const i=[];let a=0;for(const[,s]of t){if(s.nodes.size===0)continue;let c=0;for(const l of s.nodes){const u=o.get(l)||0;if(u>0&&s.visitProbability>0){const f=u/s.visitProbability;c-=f*Math.log2(f)}}const d=new Set;for(const l of s.nodes){const u=e.getNode(l);u.some&&d.add(u.value)}i.push({id:a++,nodes:d,descriptionLength:c,visitProbability:s.visitProbability,compressionRatio:r})}return i},gd=(e,t)=>{const n=[...e];let o=t===void 0?Math.random()*2147483647:t;const r=()=>(o=o*1103515245+12345&2147483647,o/2147483647);for(let i=n.length-1;i>0;i--){const a=Math.floor(r()*(i+1));[n[i],n[a]]=[n[a],n[i]]}return n},hd=(e,t={})=>{const n=performance.now(),{maxIterations:o=10,seed:r=Date.now()}=t,i=e.getAllNodes();if(i.length===0)return R({type:"EmptyGraph",message:"Cannot perform label propagation on empty graph"});const a=new Map,s=[];for(const[x,S]of i.entries())s.push(S.id),a.set(S.id,x);const c=new Map,d=new Map;for(const x of i){const S=[],M=e.getOutgoingEdges(x.id);if(M.ok){const I=M.value;for(const E of I){S.push(E.target);let _=d.get(E.target);_||(_=[],d.set(E.target,_)),_.push(E.source)}}c.set(x.id,S)}let l=r;const u=()=>(l=l*1103515245+12345&2147483647,l/2147483647),f=x=>{const S=[...x];for(let M=S.length-1;M>0;M--){const I=Math.floor(u()*(M+1));[S[M],S[I]]=[S[I],S[M]]}return S};let g=0,h=!1;const p=new Map,v=[],m=Array.from({length:s.length});for(;!h&&g<o;){g++;let x=0;const S=f(s);for(const[M,I]of S.entries())m[M]=I;for(const M of m){const I=a.get(M);if(I===void 0)continue;p.clear();const E=c.get(M);if(E)for(const _ of E){const P=a.get(_);if(P!==void 0){const N=p.get(P);p.set(P,N?N+1:1)}}if(e.isDirected()){const _=d.get(M);if(_)for(const P of _){const N=a.get(P);if(N!==void 0){const T=p.get(N);p.set(N,T?T+1:1)}}}if(p.size>0){let _=0,P=I;v.length=0;for(const[N,T]of p.entries())T>_?(_=T,P=N,v.length=0,v.push(N)):T===_&&v.push(N);if(v.length>1){const N=Math.floor(u()*v.length);P=v[N]}P!==I&&(a.set(M,P),x++)}}x===0&&(h=!0)}const y=new Map;for(const x of i){const S=a.get(x.id);if(S===void 0)continue;let M=y.get(S);M||(M=new Set,y.set(S,M)),M.add(x)}const b=[],k=[...y.keys()];for(const x of k){const S=y.get(x);S&&b.push({label:x,nodes:S,size:S.size,iterations:g,stable:h})}const C=performance.now()-n;return F({clusters:b,metadata:{algorithm:"label-propagation",runtime:C,converged:h,iterations:g,parameters:{maxIterations:o,seed:r}}})},pd=(e,t={})=>{const n=performance.now(),{weightFn:o=()=>1,resolution:r=1,maxIterations:i=100}=t,a=e.getAllNodes();if(a.length===0)return R({type:"EmptyGraph",message:"Cannot detect communities in empty graph"});const s=new Map;if(e.isDirected())for(const M of a){const I=e.getOutgoingEdges(M.id);if(I.ok)for(const E of I.value){s.has(E.target)||s.set(E.target,[]);const _=s.get(E.target);_!==void 0&&_.push(E)}}const c=new Map;for(const M of a)c.set(M.id,vd(e,M.id,o,s));const d=new Map,l=new Map;let u=0;for(const M of a){const I=u++;d.set(M.id,I);const E=c.get(M.id)||0;l.set(I,{id:I,nodes:new Set([M.id]),sigmaTot:E,sigmaIn:0})}const f=yd(e,o);if(f===0){const M=performance.now(),I=un(e,d,s),E=I.map(fn),_=kt(e,E);return F({communities:I,metrics:_,metadata:{algorithm:"leiden",runtime:M-n,iterations:0,parameters:{resolution:r,maxIterations:i}}})}let g=new Map;for(const M of a)g.set(M.id,new Set([M.id]));const h=a.length,p=h>50,v=h>500?1e-5:1e-6;let m=0;const y=p?3:1;let b=0;for(;m<y;){m++,d.clear(),l.clear();let M=0;for(const[z,Z]of g.entries()){const W=M++;d.set(z,W);let q=0;for(const Q of Z)q+=c.get(Q)||0;l.set(W,{id:W,nodes:new Set([z]),sigmaTot:q,sigmaIn:0})}let I=!0,E=0,_;m===1?_=h<200?40:50:_=12;const P=new Map;for(const[z,Z]of g.entries())for(const W of Z)P.set(W,z);let N=0;const T=h>500?2:3;for(;I&&E<_;){I=!1,E++,b++;let z=0;const Z=Md([...g.keys()]);for(const W of Z){const q=d.get(W);if(q===void 0||l.get(q)===void 0)continue;const K=g.get(W);if(K===void 0)continue;const $=bd(e,K,P,d,o,s);let D=q,A=0,B=0;for(const j of K)B+=c.get(j)||0;for(const[j,U]of $.entries()){if(j===q)continue;const G=l.get(j);if(G===void 0)continue;const oe=Ye(B,U,G.sigmaTot,G.sigmaIn,f)*r;oe>A&&(A=oe,D=j)}D!==q&&A>v&&(kd(W,q,D,l,d,g,c),I=!0,z++)}if(wd(l),z===0){if(N++,N>=T)break}else N=0}md(e,l,d,g,P,s);const L=l.size;if(L<=1||L>=g.size)break;const O=new Map;let ee=0;for(const[,z]of l){const Z=`L${m}_${ee++}`,W=new Set;for(const q of z.nodes){const Q=g.get(q);if(Q)for(const K of Q)W.add(K)}O.set(Z,W)}g=O}const k=new Map;for(const[M,I]of g.entries()){const E=d.get(M);if(E!==void 0)for(const _ of I)k.set(_,E)}const w=un(e,k,s),C=w.map(fn),x=kt(e,C),S=performance.now();return F({communities:w,metrics:x,metadata:{algorithm:"leiden",runtime:S-n,iterations:b,parameters:{resolution:r,maxIterations:i}}})},ln=(e,t,n,o,r,i,a)=>{const s=t.getOutgoingEdges(e);if(s.ok)for(const c of s.value){const d=n.get(c.target);d&&o.nodes.has(d)&&!r.has(d)&&(r.add(d),i.push(d))}if(t.isDirected()){const c=a.get(e)||[];for(const d of c){const l=n.get(d.source);l&&o.nodes.has(l)&&!r.has(l)&&(r.add(l),i.push(l))}}},md=(e,t,n,o,r,i)=>{const a=[];for(const[c,d]of t.entries()){const l=[...d.nodes];if(l.length<=1)continue;const u=new Set,f=[l[0]];for(u.add(l[0]);f.length>0;){const g=f.shift();if(g===void 0)continue;const h=o.get(g);if(h!==void 0)for(const p of h)ln(p,e,r,d,u,f,i)}u.size<l.length&&a.push(c)}let s=Math.max(...t.keys());for(const c of a){const d=t.get(c);if(d===void 0)continue;const l=[...d.nodes],u=new Map,f=new Set;let g=0;for(const h of l){if(f.has(h))continue;const p=[h];f.add(h);const v=[];for(;p.length>0;){const m=p.shift();if(m===void 0)continue;v.push(m);const y=o.get(m);if(y!==void 0)for(const b of y)ln(b,e,r,d,f,p,i)}for(const m of v)u.set(m,g);g++}if(g>1){const h=new Map;for(let p=0;p<g;p++){const v=p===0?c:++s;h.set(v,{id:v,nodes:new Set,sigmaTot:0,sigmaIn:0})}for(const p of l){const v=u.get(p);if(v===void 0)continue;const m=v===0?c:s-(g-1-v),y=h.get(m);y!==void 0&&y.nodes.add(p),n.set(p,m)}t.delete(c);for(const[p,v]of h.entries())v.nodes.size>0&&t.set(p,v)}}},vd=(e,t,n,o)=>{let r=0;const i=e.getOutgoingEdges(t);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(r+=n(a,s.value,c.value))}if(e.isDirected()){const a=o.get(t)||[];for(const s of a){const c=e.getNode(s.source),d=e.getNode(s.target);c.some&&d.some&&(r+=n(s,c.value,d.value))}}return r},yd=(e,t)=>{let n=0;const o=e.getAllNodes();for(const r of o){const i=e.getOutgoingEdges(r.id);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(n+=t(a,s.value,c.value))}}return e.isDirected()||(n/=2),n},bd=(e,t,n,o,r,i)=>{const a=new Map;for(const s of t){const c=e.getOutgoingEdges(s);if(c.ok)for(const d of c.value){const l=d.target,u=n.get(l);if(u){const f=o.get(u);if(f!==void 0){const g=e.getNode(d.source),h=e.getNode(d.target);if(g.some&&h.some){const p=r(d,g.value,h.value);a.set(f,(a.get(f)||0)+p)}}}}if(e.isDirected()){const d=i.get(s)||[];for(const l of d){const u=l.source,f=n.get(u);if(f){const g=o.get(f);if(g!==void 0){const h=e.getNode(l.source),p=e.getNode(l.target);if(h.some&&p.some){const v=r(l,h.value,p.value);a.set(g,(a.get(g)||0)+v)}}}}}}return a},kd=(e,t,n,o,r,i,a)=>{const s=o.get(t);if(s===void 0)return;const c=o.get(n);if(c===void 0)return;const d=i.get(e);if(d===void 0)return;let l=0;for(const u of d)l+=a.get(u)||0;s.nodes.delete(e),s.sigmaTot-=l,c.nodes.add(e),c.sigmaTot+=l,r.set(e,n)},wd=e=>{const t=[];for(const[n,o]of e.entries())o.nodes.size===0&&t.push(n);for(const n of t)e.delete(n)},un=(e,t,n)=>{const o=new Map;for(const[a,s]of t.entries()){o.has(s)||o.set(s,new Set);const c=e.getNode(a);if(c.some){const d=o.get(s);d!==void 0&&d.add(c.value)}}const r=[];let i=0;for(const[,a]of o){const s=xd(e,a,n),c=dt(e,a);let d=0;for(const u of a){const f=e.getOutgoingEdges(u.id);if(f.ok)for(const g of f.value){const h=e.getNode(g.target);h.some&&a.has(h.value)&&d++}}const l={id:i++,nodes:a,modularity:0,isConnected:s,internalEdges:d,conductance:c};r.push(l)}return r},fn=e=>{const t=e.nodes.size,n=t*(t-1),o=n>0?e.internalEdges/n:0;return{id:e.id,nodes:e.nodes,internalEdges:e.internalEdges,externalEdges:0,modularity:e.modularity,density:o,size:t}},xd=(e,t,n)=>{if(t.size===0||t.size===1)return!0;const r=[...t][0],i=new Set,a=[r];for(i.add(r.id);a.length>0;){const s=a.shift();if(s===void 0)continue;const c=e.getOutgoingEdges(s.id);if(c.ok)for(const d of c.value){const l=e.getNode(d.target);l.some&&t.has(l.value)&&!i.has(d.target)&&(i.add(d.target),a.push(l.value))}if(e.isDirected()){const d=n.get(s.id)||[];for(const l of d){const u=e.getNode(l.source);u.some&&t.has(u.value)&&!i.has(l.source)&&(i.add(l.source),a.push(u.value))}}}return i.size===t.size},Md=e=>{const t=[...e];for(let n=t.length-1;n>0;n--){const o=Math.floor(Math.random()*(n+1));[t[n],t[o]]=[t[o],t[n]]}return t},Sd=e=>{const t=e.getAllNodes(),n=e.getAllEdges(),o=t.length,r=n.length;if(o>4294967295)throw new RangeError(`Graph has ${o} nodes, exceeding Uint32Array limit (4,294,967,295)`);if(r>4294967295)throw new RangeError(`Graph has ${r} edges, exceeding Uint32Array limit (4,294,967,295)`);const i=t.map(f=>f.id),a=new Map;for(const[f,g]of i.entries())a.set(g,f);const s=new Uint32Array(o);for(const f of n){const g=a.get(f.source);g!==void 0&&s[g]++}const c=new Uint32Array(o+1);c[0]=0;for(let f=0;f<o;f++)c[f+1]=c[f]+s[f];const d=new Uint32Array(r),l=new Float64Array(r),u=new Uint32Array(o);for(let f=0;f<o;f++)u[f]=c[f];for(const f of n){const g=a.get(f.source),h=a.get(f.target);if(g===void 0||h===void 0)continue;const p=u[g]++;d[p]=h,l[p]=f.weight??1}return{offsets:c,edges:d,weights:l,nodeIds:i,nodeIndex:a,graph:e}},Kn=e=>e>500?1e-5:1e-6,Hn=(e,t)=>t===0&&e>200?20:e<100?50:40,Jn=()=>"best",Qn=(e,t)=>{let n;if(t===void 0)n=Math.random;else{let o=t;n=()=>(o=1664525*o+1013904223>>>0,o/4294967296)}for(let o=e.length-1;o>0;o--){const r=Math.floor(n()*(o+1));[e[o],e[r]]=[e[r],e[o]]}return e},Cd=(e,t={})=>{const n=performance.now(),{weightFn:o=()=>1,resolution:r=1,minModularityIncrease:i,maxIterations:a=100}=t,s=e.getAllNodes();if(s.length===0)return[];let c=null;try{c=Sd(e)}catch(_){if(_ instanceof RangeError)console.warn(`CSR conversion failed (${_.message}). Falling back to Map-based adjacency list.`);else throw _}let d=0;const{mode:l="auto",seed:u}=t,f=l==="auto"?Jn():l,g=new Map;if(e.isDirected())for(const _ of s){const P=e.getOutgoingEdges(_.id);if(P.ok)for(const N of P.value){g.has(N.target)||g.set(N.target,[]);const T=g.get(N.target);T&&T.push(N)}}const h=new Map;for(const _ of s)h.set(_.id,_d(e,_.id,o,g));const p=new Map,v=new Map;let m=0;for(const _ of s){const P=m++;p.set(_.id,P);const N=h.get(_.id)||0;v.set(P,{id:P,nodes:new Set([_.id]),sigmaTot:N,sigmaIn:0})}const y=Nd(e,o);if(y===0)return gn(e,p);let b=new Map;for(const _ of s)b.set(_.id,new Set([_.id]));const k=s.length,w=k>50,C=i??Kn(k);let x=0;const S=w?3:1;for(;x<S;){x++,p.clear(),v.clear();let _=0;for(const[K,$]of b.entries()){const D=_++;p.set(K,D);let A=0;for(const B of $)A+=h.get(B)||0;v.set(D,{id:D,nodes:new Set([K]),sigmaTot:A,sigmaIn:0})}let P=!0,N=0;const T=a??Hn(k,x-1),L=new Map;for(const[K,$]of b.entries())for(const D of $)L.set(D,K);let O=0;const ee=k>500?2:3,z=[...b.keys()],Z=Array.from({length:z.length});for(;P&&N<T;){P=!1,N++;let K=0;const $=Pd(z);for(const[D,A]of $.entries())Z[D]=A;for(const D of Z){const A=p.get(D);if(A===void 0)continue;const B=b.get(D);if(B===void 0)continue;const j=Ed(e,B,L,p,o,g,c);let U=A,G=0,oe=0;for(const Me of B)oe+=h.get(Me)||0;const De=[...j.entries()];if(f==="random"){const Me=Qn(De,u);for(const[Te,Ae]of Me){if(Te===A)continue;const _e=v.get(Te);if(!_e)continue;const Yt=Ye(oe,Ae,_e.sigmaTot,_e.sigmaIn,y)*r;if(Yt>C){G=Yt,U=Te;break}}}else for(const[Me,Te]of De){if(Me===A)continue;const Ae=v.get(Me);if(!Ae)continue;const _e=Ye(oe,Te,Ae.sigmaTot,Ae.sigmaIn,y)*r;_e>G&&(G=_e,U=Me)}U!==A&&G>C&&($d(D,A,U,v,p,b,h),P=!0,K++)}if(Id(v),K===0){if(O++,O>=ee)break}else O=0}d+=N;const W=v.size;if(W<=1||W>=b.size)break;const q=new Map;let Q=0;for(const[,K]of v){const $=`L${x}_${Q++}`,D=new Set;for(const A of K.nodes){const B=b.get(A);if(B)for(const j of B)D.add(j)}q.set($,D)}b=q}const M=new Map;for(const[_,P]of b.entries()){const N=p.get(_);if(N!==void 0)for(const T of P)M.set(T,N)}const E=performance.now()-n;return console.log(`[spec-027] Louvain completed in ${E.toFixed(2)}ms (${(E/1e3).toFixed(2)}s)`),console.log(`[spec-027] Total iterations: ${d} across ${x} hierarchy levels`),console.log(`[spec-027] Adaptive threshold: ${C.toExponential(1)}`),console.log(`[spec-027] Neighbor selection mode: ${f} (requested: ${l})`),gn(e,M,y,h)},_d=(e,t,n,o)=>{let r=0;const i=e.getOutgoingEdges(t);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(r+=n(a,s.value,c.value))}if(e.isDirected()){const a=o.get(t)||[];for(const s of a){const c=e.getNode(s.source),d=e.getNode(s.target);c.some&&d.some&&(r+=n(s,c.value,d.value))}}return r},Nd=(e,t)=>{let n=0;const o=e.getAllNodes();for(const r of o){const i=e.getOutgoingEdges(r.id);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(n+=t(a,s.value,c.value))}}return e.isDirected()||(n/=2),n};let ft=null;const Ed=(e,t,n,o,r,i,a=null)=>{ft||(ft=new Map);const s=ft;s.clear();const c=[...t];for(const d of c){if(a){const l=a.nodeIndex.get(d);if(l!==void 0){const u=a.offsets[l],f=a.offsets[l+1];for(let g=u;g<f;g++){const h=a.edges[g],p=a.nodeIds[h],v=a.weights[g],m=n.get(p);if(m){const y=o.get(m);if(y!==void 0){const b=s.get(y)||0;s.set(y,b+v)}}}}}else{const l=e.getOutgoingEdges(d);if(l.ok){const u=l.value;for(const f of u){const g=f.target,h=n.get(g);if(h){const p=o.get(h);if(p!==void 0){const v=e.getNode(f.source),m=e.getNode(f.target);if(v.some&&m.some){const y=r(f,v.value,m.value),b=s.get(p)||0;s.set(p,b+y)}}}}}}if(e.isDirected()){const l=i.get(d);if(l)for(const u of l){const f=u.source,g=n.get(f);if(g){const h=o.get(g);if(h!==void 0){const p=e.getNode(u.source),v=e.getNode(u.target);if(p.some&&v.some){const m=r(u,p.value,v.value),y=s.get(h)||0;s.set(h,y+m)}}}}}}return s},$d=(e,t,n,o,r,i,a)=>{const s=o.get(t);if(!s)return;const c=o.get(n);if(!c)return;const d=i.get(e);if(!d)return;let l=0;for(const u of d)l+=a.get(u)||0;s.nodes.delete(e),s.sigmaTot-=l,c.nodes.add(e),c.sigmaTot+=l,r.set(e,n)},Id=e=>{const t=[];for(const[n,o]of e.entries())o.nodes.size===0&&t.push(n);for(const n of t)e.delete(n)},gn=(e,t,n=0,o)=>{const r=new Map;for(const[f,g]of t.entries()){r.has(g)||r.set(g,new Set);const h=e.getNode(f);if(h.some){const p=r.get(g);p&&p.add(h.value)}}const i=new Map,a=new Map,s=new Map,c=new Map;for(const[f,g]of r.entries())i.set(f,0),a.set(f,0),s.set(f,0),c.set(f,0);for(const[f,g]of t.entries()){const h=o?.get(f)??0,p=c.get(g)??0;c.set(g,p+h)}const d=e.getAllEdges();for(const f of d){const g=t.get(f.source),h=t.get(f.target);if(!(g===void 0||h===void 0))if(g===h){const p=f.weight??1,v=i.get(g)??0;i.set(g,v+p);const m=a.get(g)??0;a.set(g,m+1)}else{const p=s.get(g)??0;s.set(g,p+1)}}const l=[];let u=0;for(const[f,g]of r.entries()){const h=g.size,p=i.get(f)??0,v=a.get(f)??0,m=s.get(f)??0,y=c.get(f)??0;let b=0;if(h>1){const x=e.isDirected()?h*(h-1):h*(h-1)/2;b=(e.isDirected()?p:p/2)/x,b=Math.max(0,Math.min(1,b))}let k=0;if(n>0){const x=2*n,S=p/x,M=y/x;k=S-M*M}const w=e.isDirected()?v:Math.floor(v/2),C={id:u++,nodes:g,size:h,density:b,internalEdges:w,externalEdges:m,modularity:k};l.push(C)}return l},Pd=e=>{const t=[...e];for(let n=t.length-1;n>0;n--){const o=Math.floor(Math.random()*(n+1));[t[n],t[o]]=[t[o],t[n]]}return t},Dd=()=>({disc:new Map,low:new Map,parent:new Map,visited:new Set,edgeStack:[],time:0,articulationPoints:new Set,components:[],nextComponentId:0}),Xn=(e,t,n,o)=>{n.disc.set(t,n.time),n.low.set(t,n.time),n.time++,n.visited.add(t);let r=0;const i=e.getNeighbors(t);if(!i.ok)return;const a=i.value;for(const s of a)if(n.visited.has(s)){if(s!==n.parent.get(t)){const c=n.low.get(t),d=n.disc.get(s);if(c===void 0||d===void 0)continue;n.low.set(t,Math.min(c,d));const l=n.disc.get(t);if(l===void 0)continue;d<l&&n.edgeStack.push({source:t,target:s})}}else{r++,n.parent.set(s,t),n.edgeStack.push({source:t,target:s}),Xn(e,s,n,!1);const c=n.low.get(s),d=n.low.get(t),l=n.disc.get(t);if(c===void 0||d===void 0||l===void 0)continue;if(n.low.set(t,Math.min(d,c)),o&&r>1&&n.articulationPoints.add(t),!o&&c>=l&&n.articulationPoints.add(t),c>=l){const u=Td(n,t,s);n.components.push(u)}}},Td=(e,t,n)=>{const o=new Set,r=new Set;let i=0;for(;e.edgeStack.length>0;){const s=e.edgeStack.pop();if(s===void 0||(o.add(s.source),o.add(s.target),i++,s.source===t&&s.target===n||s.source===n&&s.target===t))break}e.articulationPoints.has(t)&&r.add(t);const a=o.size===2&&i===1;return{id:e.nextComponentId++,nodes:o,size:o.size,articulationPoints:r,isBridge:a}},Ad=e=>{const t=new Set,n=new Set;let o=0;for(;e.edgeStack.length>0;){const i=e.edgeStack.pop();if(i===void 0)break;t.add(i.source),t.add(i.target),o++}for(const i of t)e.articulationPoints.has(i)&&n.add(i);const r=t.size===2&&o===1;return{id:e.nextComponentId++,nodes:t,size:t.size,articulationPoints:n,isBridge:r}},Rd=e=>{const t=performance.now(),n=e.getNodeCount();if(n===0)return R({type:"EmptyGraph",message:"Cannot compute biconnected components for empty graph"});if(n<2)return R({type:"InsufficientNodes",message:"Biconnected components require at least 2 nodes",required:2,actual:n});if(e.isDirected())return R({type:"InvalidInput",message:"Biconnected components are only defined for undirected graphs"});const o=Dd(),r=e.getAllNodes();for(const s of r)if(!o.visited.has(s.id)&&(Xn(e,s.id,o,!0),o.edgeStack.length>0)){const c=Ad(o);c.nodes.size>0&&o.components.push(c)}e.getEdgeCount()===0&&(o.components=r.map((s,c)=>({id:c,nodes:new Set([s.id]),size:1,articulationPoints:new Set,isBridge:!1})));const a=performance.now()-t;return F({components:o.components,articulationPoints:o.articulationPoints,metadata:{algorithm:"biconnected",runtime:a}})},Fd=.7,jd=100,Ld=.001,zd=(e,t={})=>{const n=performance.now(),o=e.getNodeCount();if(o===0)return R({type:"EmptyGraph",message:"Cannot decompose empty graph"});if(o<3)return R({type:"InsufficientNodes",message:"Core-periphery decomposition requires at least 3 nodes",required:3,actual:o});const r=t.coreThreshold??Fd,i=t.maxIterations??jd,a=t.epsilon??Ld;if(r<0||r>1)return R({type:"InvalidInput",message:`Core threshold must be in range [0, 1], got ${r}`});if(i<1)return R({type:"InvalidInput",message:`Max iterations must be positive, got ${i}`});if(a<=0)return R({type:"InvalidInput",message:`Epsilon must be positive, got ${a}`});const c=e.getAllNodes().map(x=>x.id),d=new Map,l=new Map;for(const x of c)d.set(x,new Set),l.set(x,new Set);const u=e.getAllEdges();for(const x of u)d.get(x.source)?.add(x.target),l.get(x.target)?.add(x.source);if(e.isDirected())for(const x of c){const S=l.get(x)||new Set,M=d.get(x)||new Set,I=new Set([...S,...M]);d.set(x,I)}const g=Bd(c,d);let h=!1,p=-1/0,v;for(v=0;v<i;v++){Od(c,u,g);const x=qd(u,g,c.length),S=x-p;if(Math.abs(S)<a){h=!0;break}p=x}const{coreNodes:m,peripheryNodes:y}=Ud(c,g,r),b=Gd(e,m,y),k={coreNodes:m,peripheryNodes:y,corenessScores:g,coreThreshold:r,fitQuality:b},C=performance.now()-n;return F({structure:k,metadata:{algorithm:"core-periphery",runtime:C,iterations:v,converged:h,parameters:{coreThreshold:r,maxIterations:i,epsilon:a}}})},Bd=(e,t)=>{const n=new Map;let o=0;for(const r of e){const i=t.get(r)?.size??0;o=Math.max(o,i)}o===0&&(o=1);for(const r of e){const a=(t.get(r)?.size??0)/o;n.set(r,a)}return n},Od=(e,t,n)=>{const o=new Map,r=new Map;for(const[a,s]of e.entries())r.set(s,a);for(const a of e){let s=0;for(const c of t)c.source===a?s+=n.get(c.target)??0:c.target===a&&(s+=n.get(c.source)??0);o.set(a,s)}const i=Math.max(...o.values(),0);if(i>1)for(const[a,s]of o)n.set(a,s/i);else for(const[a,s]of o)n.set(a,s)},qd=(e,t,n)=>{const o=e.length,r=n*(n-1),i=o/r;let a=0,s=0;for(const g of e){const h=t.get(g.source)??0,p=t.get(g.target)??0;a+=h*p,s++}const c=s>0?a/s:0;let d=0,l=0,u=0;for(const g of e){const h=t.get(g.source)??0,p=t.get(g.target)??0,v=h*p,m=1;d+=(m-i)*(v-c),l+=(m-i)**2,u+=(v-c)**2}return l===0||u===0?0:d/Math.sqrt(l*u)},Ud=(e,t,n)=>{const o=new Set,r=new Set;for(const i of e)(t.get(i)??0)>n?o.add(i):r.add(i);return{coreNodes:o,peripheryNodes:r}},Gd=(e,t,n)=>{const o=e.getAllEdges();let r=0,i=0,a=0;for(const E of o){const _=t.has(E.source),P=t.has(E.target);_&&P?r++:_||P?i++:a++}const s=t.size,c=n.size,d=s*(s-1),l=s*c,u=c*(c-1),f=d>0?r/d:0,g=l>0?i/l:0,h=u>0?a/u:0,p=1,v=.5,m=0,y=[f,g,h],b=[p,v,m],k=y.reduce((E,_)=>E+_,0)/y.length,w=b.reduce((E,_)=>E+_,0)/b.length;let C=0,x=0,S=0;for(const[E,_]of y.entries()){const P=_-k,N=b[E]-w;C+=P*N,x+=P*P,S+=N*N}if(x===0||S===0)return 0;const M=Math.sqrt(x*S),I=C/M;return Math.max(-1,Math.min(1,I))},Wd=e=>{const t=performance.now();if(e.getNodeCount()===0)return R({type:"EmptyGraph",message:"Cannot perform k-core decomposition on empty graph"});const o=e.getAllNodes().map(m=>m.id),r=new Map,i=new Map,a=new Set,s=new Map,c=new Map;for(const m of o)s.set(m,new Set),c.set(m,new Set);const d=e.getAllEdges();for(const m of d){const{source:y,target:b}=m;c.get(y)?.add(b),s.get(b)?.add(y)}let l=0;for(const m of o){const y=s.get(m)||new Set,b=c.get(m)||new Set,w=new Set([...y,...b]).size;r.set(m,w),l=Math.max(l,w)}const u=Array.from({length:l+1},()=>[]),f=new Map,g=new Map;for(const[m,y]of o.entries()){f.set(y,m);const b=r.get(y)||0,k=u[b].length;u[b].push(m),g.set(m,k)}let h=0;for(let m=0;m<o.length;m++){let y=-1;for(const[I,E]of u.entries())if(E.length>0){y=I;break}if(y===-1)break;const b=u[y].pop();if(b===void 0)break;const k=o[b],w=r.get(k)||0;w!==y&&console.warn(`Mismatch: node ${k} in bin ${y} has degree ${w}`);const C=Math.max(w,h);i.set(k,C),h=C,a.add(k);const x=s.get(k)||new Set,S=c.get(k)||new Set,M=new Set([...x,...S]);for(const I of M){if(a.has(I))continue;const E=r.get(I)||0;if(E>0){const _=E-1;r.set(I,_);const P=f.get(I);if(P===void 0)continue;const N=g.get(P);if(N!==void 0){const T=u[E],L=T.at(-1);L===void 0?T.pop():(T[N]=L,T.pop(),L!==P&&g.set(L,N));const O=u[_].length;u[_].push(P),g.set(P,O)}}}}const p=new Map;for(let m=0;m<=h;m++){const y=new Set;for(const[k,w]of i.entries())w>=m&&y.add(k);const b={k:m,nodes:y,size:y.size,degeneracy:h,coreNumbers:i};p.set(m,b)}const v=performance.now();return F({cores:p,degeneracy:h,coreNumbers:i,metadata:{algorithm:"k-core",runtime:v-t}})};class Se{nodes;edges;adjacencyList;directed;constructor(t){this.nodes=new Map,this.edges=new Map,this.adjacencyList=new Map,this.directed=t}addNode(t){return this.nodes.has(t.id)?R({type:"duplicate-node",message:`Node '${t.id}' already exists in graph`,nodeId:t.id}):(this.nodes.set(t.id,t),this.adjacencyList.set(t.id,new Set),F(void 0))}removeNode(t){if(!this.nodes.has(t))return R({type:"invalid-input",message:`Node '${t}' not found in graph`,input:t});const n=[];for(const[o,r]of this.edges.entries())(r.source===t||r.target===t)&&n.push(o);for(const o of n)this.removeEdge(o);return this.nodes.delete(t),this.adjacencyList.delete(t),F(void 0)}hasNode(t){return this.nodes.has(t)}getNode(t){const n=this.nodes.get(t);return n===void 0?ge():me(n)}addEdge(t){if(!this.nodes.has(t.source))return R({type:"invalid-input",message:`Source node '${t.source}' not found in graph`,input:t.source});if(!this.nodes.has(t.target))return R({type:"invalid-input",message:`Target node '${t.target}' not found in graph`,input:t.target});this.edges.set(t.id,t);const n=this.adjacencyList.get(t.source);if(n&&n.add(t.target),!this.directed){const o=this.adjacencyList.get(t.target);o&&o.add(t.source)}return F(void 0)}removeEdge(t){const n=this.edges.get(t);return n?(this.adjacencyList.get(n.source)?.delete(n.target),this.directed||this.adjacencyList.get(n.target)?.delete(n.source),this.edges.delete(t),F(void 0)):R({type:"invalid-input",message:`Edge '${t}' not found in graph`,input:t})}getNeighbors(t){if(!this.nodes.has(t))return R({type:"invalid-input",message:`Node '${t}' not found in graph`,input:t});const n=this.adjacencyList.get(t);return F([...n||[]])}getNodeCount(){return this.nodes.size}getEdgeCount(){return this.edges.size}isDirected(){return this.directed}getAllNodes(){return[...this.nodes.values()]}getAllEdges(){return[...this.edges.values()]}getEdge(t){const n=this.edges.get(t);return n?me(n):ge()}getOutgoingEdges(t){if(!this.nodes.has(t))return R({type:"invalid-input",message:`Node '${t}' not found in graph`,input:t});const n=[];for(const o of this.edges.values())(o.source===t||!this.directed&&o.target===t)&&n.push(o);return F(n)}}const Vd=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph is null or undefined",input:e}};if(!t||t.size===0)return{ok:!0,value:new Se(e.isDirected())};const n=new Se(e.isDirected());for(const r of t){const i=e.getNode(r);i.some&&n.addNode(i.value)}const o=e.getAllEdges();for(const r of o)t.has(r.source)&&t.has(r.target)&&n.addEdge(r);return{ok:!0,value:n}},Rt=(e,t,n)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph is null or undefined",input:e}};const o=new Se(e.isDirected()),r=new Set,i=e.getAllNodes();for(const s of i)t(s)&&(o.addNode(s),r.add(s.id));const a=e.getAllEdges();for(const s of a)r.has(s.source)&&r.has(s.target)&&(!n||n(s))&&o.addEdge(s);return{ok:!0,value:o}},Kd=(e,t)=>Rt(e,()=>!0,n=>t.has(n.type)),Hd=e=>{if(!e)return{ok:!1,error:{type:"invalid-filter",message:"Filter is null or undefined",filter:e}};const t=typeof e.nodePredicate=="function",n=typeof e.edgePredicate=="function",o=e.nodeAttributes&&Object.keys(e.nodeAttributes).length>0,r=e.edgeTypes&&e.edgeTypes.size>0;return!t&&!n&&!o&&!r?{ok:!0,value:{...e,combineMode:e.combineMode??"and"}}:{ok:!0,value:{...e,combineMode:e.combineMode??"and"}}},Jd=e=>e?typeof e.k!="number"||e.k<2?{ok:!1,error:{type:"invalid-truss",message:`k must be an integer >= 2, got: ${e.k}`,k:e.k}}:Number.isInteger(e.k)?{ok:!0,value:{...e,returnHierarchy:e.returnHierarchy??!1}}:{ok:!1,error:{type:"invalid-truss",message:`k must be an integer, got: ${e.k}`,k:e.k}}:{ok:!1,error:{type:"invalid-input",message:"Options is null or undefined",input:e}},Qd=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph is null or undefined",input:e}};const n=Hd(t);if(!n.ok)return{ok:!1,error:n.error};const o=n.value,r=Xd(o),i=Yd(o);return o.combineMode==="or"?Zd(e,o,r,i):Rt(e,r,i)},Xd=e=>{const t=[];if(e.nodePredicate&&t.push(e.nodePredicate),e.nodeAttributes&&Object.keys(e.nodeAttributes).length>0){const n=e.nodeAttributes;t.push(o=>{for(const[r,i]of Object.entries(n))if(o[r]!==i)return!1;return!0})}return t.length===0?()=>!0:n=>t.every(o=>o(n))},Yd=e=>{const t=[];if(e.edgePredicate&&t.push(e.edgePredicate),e.edgeTypes&&e.edgeTypes.size>0){const n=e.edgeTypes;t.push(o=>n.has(o.type))}return t.length===0?()=>!0:n=>t.every(o=>o(n))},Zd=(e,t,n,o)=>{const r=new Se(e.isDirected()),i=new Set,a=e.getAllNodes();for(const c of a)n(c)&&(r.addNode(c),i.add(c.id));const s=e.getAllEdges();for(const c of s)if(o(c)){if(!i.has(c.source)){const d=e.getNode(c.source);d.some&&(r.addNode(d.value),i.add(c.source))}if(!i.has(c.target)){const d=e.getNode(c.target);d.some&&(r.addNode(d.value),i.add(c.target))}r.addEdge(c)}return{ok:!0,value:r}},el=e=>{const t=[],n=e.getAllEdges(),o=new Set;for(const r of n){const{source:i,target:a}=r;if(i===a)continue;const s=e.getNeighbors(i),c=e.getNeighbors(a);if(!s.ok||!c.ok)continue;const d=new Set(s.value),l=new Set(c.value);for(const u of d)if(!(u===i||u===a)&&l.has(u)){const f=[i,a,u].sort().join(",");if(!o.has(f)){o.add(f);const g=e.getNode(i),h=e.getNode(a),p=e.getNode(u);g.some&&h.some&&p.some&&t.push({nodes:[g.value,h.value,p.value]})}}}return F(t)},tl=(e,t)=>{const n=[],o=e.getAllNodes(),{minDegree:r,type:i}=t;for(const a of o){const s=a.id;let c=[];if(i==="out"){const d=e.getNeighbors(s);if(!d.ok)continue;const l=d.value.filter(u=>u!==s);l.length>=r&&(c=l.map(u=>e.getNode(u)).filter(u=>u.some).map(u=>u.value),n.push({hub:a,leaves:c,type:"out"}))}else{if(!e.isDirected())continue;const d=e.getAllEdges(),l=[];for(const u of d)if(u.target===s&&u.source!==s){const f=e.getNode(u.source);f.some&&l.push(f.value)}l.length>=r&&n.push({hub:a,leaves:l,type:"in"})}}return F(n)},nl=(e,t)=>{const{minCount:n}=t,o=new Map,r=e.getAllNodes();for(const a of r){const s=e.getOutgoingEdges(a.id);if(!s.ok)continue;const c=s.value.map(d=>d.target).filter(d=>d!==a.id);for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++){const u=c[d],f=c[l],g=u<f?`${u},${f}`:`${f},${u}`;o.set(g,(o.get(g)||0)+1)}}const i=[];for(const[a,s]of o.entries())if(s>=n){const[c,d]=a.split(","),l=e.getNode(c),u=e.getNode(d);l.some&&u.some&&i.push({paper1:l.value,paper2:u.value,count:s})}return F(i)},ol=(e,t)=>{const{minShared:n}=t,o=e.getAllNodes(),r=new Map;for(const s of o){const c=e.getOutgoingEdges(s.id);if(!c.ok)continue;const d=new Set(c.value.map(l=>l.target).filter(l=>l!==s.id));r.set(s.id,d)}const i=[],a=[...r.keys()];for(let s=0;s<a.length;s++)for(let c=s+1;c<a.length;c++){const d=a[s],l=a[c],u=r.get(d),f=r.get(l);if(!u||!f)continue;let g=0;for(const h of u)f.has(h)&&g++;if(g>=n){const h=e.getNode(d),p=e.getNode(l);h.some&&p.some&&i.push({paper1:h.value,paper2:p.value,sharedReferences:g})}}return F(i)},Yn=e=>{const t=new Map,n=new Map,o=e.getAllNodes();for(const i of o)n.set(i.id,new Set);const r=e.getAllEdges();for(const i of r)n.get(i.source)?.add(i.target),n.get(i.target)?.add(i.source);for(const i of r){const{source:a,target:s}=i,c=n.get(a)||new Set,d=n.get(s)||new Set;let l=0;for(const u of c)d.has(u)&&l++;t.set(i.id,l)}return F(t)},rl=(e,t,n,o,r,i,a,s)=>{if(!(e===n&&t===o||e===o&&t===n)){for(const c of i.getAllEdges())if(c.source===e&&c.target===t||c.source===t&&c.target===e){const l=a.get(c.id)||0;l>0&&a.set(c.id,l-1),s.get(c.id)?.delete(r)}}},il=(e,t)=>{const n=Jd(t);if(!n.ok)return n;const{k:o}=n.value,r=o-2;if(e.getNodeCount()===0)return F(new Se(e.isDirected()));const i=Yn(e);if(!i.ok)return i;const a=i.value,s=new Se(e.isDirected());for(const g of e.getAllNodes())s.addNode(g);const c=new Map;for(const g of e.getAllEdges())s.addEdge(g),c.set(g.id,g);const d=new Map,l=new Map;for(const g of e.getAllNodes())l.set(g.id,new Set);for(const g of e.getAllEdges())l.get(g.source)?.add(g.target),l.get(g.target)?.add(g.source),d.set(g.id,new Set);for(const g of e.getAllEdges()){const{source:h,target:p,id:v}=g,m=l.get(h)||new Set,y=l.get(p)||new Set;for(const b of m)if(y.has(b)){const k=[h,p,b].sort().join("-");d.get(v)?.add(k)}}let u=!0;for(;u;){u=!1;const g=[];for(const h of s.getAllEdges())(a.get(h.id)||0)<r&&g.push(h.id);if(g.length===0)break;for(const h of g){const p=c.get(h);if(!p)continue;const{source:v,target:m}=p;s.removeEdge(h),u=!0,l.get(v)?.delete(m),l.get(m)?.delete(v);const y=d.get(h)||new Set;for(const b of y){const k=b.split("-");if(k.length!==3)continue;const[w,C,x]=k,S=[[w,C],[C,x],[w,x]];for(const[M,I]of S)rl(M,I,v,m,b,s,a,d)}d.delete(h)}}const f=[];for(const g of s.getAllNodes())s.getAllEdges().some(p=>p.source===g.id||p.target===g.id)||f.push(g.id);for(const g of f)s.removeNode(g);return F(s)};class sl{constructor(t){this.graph=t}hasNode(t){return this.graph.getNode(t).some}getNode(t){const n=this.graph.getNode(t);return n.some?n.value:null}getNeighbors(t){const n=this.graph.getOutgoingEdges(t);return n.ok?n.value.map(o=>o.target):[]}getAllNodes(){return this.graph.getAllNodes()}isDirected(){return this.graph.isDirected()}getOutgoingEdges(t){const n=this.graph.getOutgoingEdges(t);return n.ok?n.value:[]}}class al{distances;n;constructor(t){this.distances=new Map,this.n=t}get(t,n){if(t===n)return 0;const o=t<n?`${t},${n}`:`${n},${t}`;return this.distances.get(o)??1/0}set(t,n,o){if(t===n)return;const r=t<n?`${t},${n}`:`${n},${t}`;this.distances.set(r,o)}findMinimum(t){let n=-1,o=-1,r=1/0;const i=[...t];for(let a=0;a<i.length;a++)for(let s=a+1;s<i.length;s++){const c=this.get(i[a],i[s]);c<r&&(r=c,n=i[a],o=i[s])}return n>=0&&o>=0?[n,o,r]:void 0}}const cl=(e,t)=>{const n=t.size,o=Array.from({length:n},()=>new Array(n).fill(0));for(let i=0;i<n;i++)o[i][i]=1;const r=e.getAllEdges();for(const i of r){const a=t.get(i.source),s=t.get(i.target);a!==void 0&&s!==void 0&&(o[a][s]=1,e.isDirected()||(o[s][a]=1))}return o},dl=e=>{const t=e.length,n=new al(t);for(let o=0;o<t;o++)for(let r=o+1;r<t;r++){const i=1-e[o][r];n.set(o,r,i)}return n},ll=(e,t,n,o,r,i,a)=>{const s=a.get(n)??1,c=a.get(o)??1;for(const d of r){if(d===t)continue;const l=e.get(n,d),u=e.get(o,d);let f;switch(i){case"single":{f=Math.min(l,u);break}case"complete":{f=Math.max(l,u);break}case"average":{f=(l*s+u*c)/(s+c);break}default:f=Math.min(l,u)}e.set(t,d,f)}},ul=(e,t,n)=>{const o=e.map(i=>i.id),r=t.map(i=>i.size);return{merges:t,heights:n,leafNodes:o,clusterSizes:r,cutAtHeight:i=>{const a=new Map;for(const[s,c]of o.entries())a.set(s,new Set([c]));for(const[s,c]of t.entries()){if(n[s]>i)break;const d=a.get(c.cluster1),l=a.get(c.cluster2);if(!d||!l)continue;const u=new Set([...d,...l]);a.delete(c.cluster1),a.delete(c.cluster2);const f=o.length;a.set(f+s,u)}return[...a.values()]},getClusters:i=>{if(i<=0)return[];if(i>=o.length)return o.map(d=>new Set([d]));const a=o.length,s=a-i;if(s<0||s>=t.length)return o.map(d=>new Set([d]));const c=new Map;for(const[d,l]of o.entries())c.set(d,new Set([l]));for(let d=0;d<s;d++){const l=t[d],u=c.get(l.cluster1),f=c.get(l.cluster2);if(!u||!f)continue;const g=new Set([...u,...f]);c.delete(l.cluster1),c.delete(l.cluster2),c.set(a+d,g)}return[...c.values()]}}},fl=(e,t={})=>{const n=performance.now(),o=t.linkage??"average",r=e.getAllNodes(),i=r.length;if(i===0)return R({type:"EmptyGraph",message:"Cannot perform hierarchical clustering on empty graph"});if(i===1){const m={merges:[],heights:[],leafNodes:[r[0].id],clusterSizes:[],cutAtHeight:()=>[new Set([r[0].id])],getClusters:()=>[new Set([r[0].id])]};return F({dendrogram:m,metadata:{algorithm:"hierarchical",runtime:performance.now()-n,parameters:{linkage:o}}})}const a=new Map;for(const[m,y]of r.entries())a.set(y.id,m);const s=cl(e,a),c=dl(s),d=new Set;for(let m=0;m<i;m++)d.add(m);const l=new Map,u=new Map;for(const[m,y]of r.entries())l.set(m,new Set([y.id])),u.set(m,1);const f=[],g=[];let h=i;for(let m=0;m<i-1;m++){const y=c.findMinimum(d);if(!y)break;const[b,k,w]=y,C=u.get(b)??1,x=u.get(k)??1,S=C+x;f.push({cluster1:b,cluster2:k,distance:w,size:S}),g.push(w);const M=h++,I=l.get(b)??new Set,E=l.get(k)??new Set,_=new Set([...I,...E]);l.set(M,_),u.set(M,S),ll(c,M,b,k,d,o,u),d.delete(b),d.delete(k),d.add(M)}const p=ul(r,f,g),v=performance.now();return F({dendrogram:p,metadata:{algorithm:"hierarchical",runtime:v-n,parameters:{linkage:o}}})},gl={levelSpacing:150,nodeSpacing:80,rootNodeId:null,direction:"horizontal"},hl=e=>e.type==="REFERENCE"||e.type==="AUTHORSHIP"||e.type==="AFFILIATION",pl=(e,t,n)=>{const o=new Map,r=new Map,i=t.filter(hl);for(const s of i){const{source:c,target:d}=s;let l,u;if(s.type==="AUTHORSHIP"||s.type==="AFFILIATION")l=c,u=d;else if(s.type==="REFERENCE")l=d,u=c;else continue;o.has(l)||o.set(l,[]);const f=o.get(l);f&&f.push(u),r.set(u,l)}let a=n;if(a===null){const s=new Set(e.map(l=>l.id)),c=new Set(r.keys()),d=[...s].filter(l=>!c.has(l));if(d.length>0)a=d[0];else if(e.length>0)a=e[0].id;else throw new Error("Cannot determine root node: no nodes available")}return{rootNodeId:a,children:o,parents:r}},Ft=(e,t,n)=>{const o=t.get(e);if(!o||o.length===0)return n;let r=0;for(const i of o)r+=Ft(i,t,n);return r},Zn=(e,t,n,o)=>{const r=new Map,i=t.get(e);if(!i||i.length===0)return r;let a=o;for(const s of i){r.set(s,a);const c=Zn(s,t,n,a);for(const[l,u]of c.entries())r.set(l,u);const d=Ft(s,t,n);a+=d}return r},ml=(e,t,n={})=>{const o={...gl,...n};if(e.length===0)return{nodes:[],maxDepth:0,rootNodeId:""};const{rootNodeId:r,children:i}=pl(e,t,o.rootNodeId),a=new Map,s=[{nodeId:r,level:0}],c=new Set([r]);let d=0;for(;s.length>0;){const g=s.shift();if(!g)break;const{nodeId:h,level:p}=g;a.set(h,p),d=Math.max(d,p);const v=i.get(h)||[];for(const m of v)c.has(m)||(c.add(m),s.push({nodeId:m,level:p+1}))}const l=Zn(r,i,o.nodeSpacing,0),u=Ft(r,i,o.nodeSpacing);return l.set(r,u/2-o.nodeSpacing/2),{nodes:e.map(g=>{const h=a.get(g.id)??0,p=l.get(g.id)??0;let v,m;return o.direction==="horizontal"?(v=h*o.levelSpacing,m=p):(v=p,m=h*o.levelSpacing),{node:g,x:v,y:m,level:h}}),maxDepth:d,rootNodeId:r}},vl=e=>{const t=new Map;return e.nodes.forEach(({node:n,x:o,y:r})=>{t.set(n.id,{x:o,y:r})}),t},yl=(e,t,n={})=>{const{weightFn:o=()=>1,balanceTolerance:r=1.2,maxKMeansIterations:i=100}=n,a=e.getAllNodes(),s=a.length;if(s===0)return R({type:"EmptyGraph",message:"Cannot partition an empty graph"});if(t<2)return R({type:"InvalidPartitionCount",message:"Number of partitions must be at least 2",k:t,nodeCount:s});if(t>s)return R({type:"InvalidPartitionCount",message:`Number of partitions (${t}) exceeds number of nodes (${s})`,k:t,nodeCount:s});const c=new Map;for(const[g,h]of a.entries())c.set(h.id,g);const d=bl(e,a,c,o),l=kl(d,t,s);let u=wl(l,t,i);u=xl(u,t,s,r);const f=Ml(e,a,u,t,o,c);return F(f)},bl=(e,t,n,o)=>{const r=t.length,i=new Array(r).fill(0).map(()=>new Array(r).fill(0)),a=new Array(r).fill(0);for(const[d,l]of t.entries()){const u=e.getOutgoingEdges(l.id);if(u.ok)for(const f of u.value){const g=n.get(f.target);if(g!==void 0){const h=e.getNode(f.source),p=e.getNode(f.target);if(h.some&&p.some){const v=o(f,h.value,p.value);i[d][g]=v,a[d]+=v,e.isDirected()||(i[g][d]=v,a[g]+=v)}}}}const s=a.map(d=>d>0?1/Math.sqrt(d):0),c=new Array(r).fill(0).map(()=>new Array(r).fill(0));for(let d=0;d<r;d++)for(let l=0;l<r;l++)c[d][l]=d===l?1:-s[d]*i[d][l]*s[l];return c},kl=(e,t,n)=>{const o=new Array(n).fill(0).map(()=>new Array(t).fill(0));for(let r=0;r<n;r++)for(let i=0;i<t;i++)o[r][i]=Math.random()-.5;for(let r=0;r<t;r++){for(let s=0;s<r;s++){let c=0;for(let d=0;d<n;d++)c+=o[d][r]*o[d][s];for(let d=0;d<n;d++)o[d][r]-=c*o[d][s]}let i=0;for(let s=0;s<n;s++)i+=o[s][r]*o[s][r];if(i=Math.sqrt(i),i>1e-10)for(let s=0;s<n;s++)o[s][r]/=i;const a=20;for(let s=0;s<a;s++){const c=new Array(n).fill(0);for(let l=0;l<n;l++)for(let u=0;u<n;u++)c[l]+=l===u?o[u][r]:-e[l][u]*o[u][r];for(let l=0;l<r;l++){let u=0;for(let f=0;f<n;f++)u+=c[f]*o[f][l];for(let f=0;f<n;f++)c[f]-=u*o[f][l]}let d=0;for(let l=0;l<n;l++)d+=c[l]*c[l];if(d=Math.sqrt(d),d>1e-10)for(let l=0;l<n;l++)o[l][r]=c[l]/d}}return o},wl=(e,t,n)=>{const o=e.length,r=e[0].length,i=[],a=new Array(o).fill(0),s=Math.floor(Math.random()*o);i.push([...e[s]]);for(let l=1;l<t;l++){const u=new Array(o).fill(1/0);for(let h=0;h<o;h++)for(const p of i){const v=hn(e[h],p);u[h]=Math.min(u[h],v)}let f=-1,g=0;for(let h=0;h<o;h++)u[h]>f&&(f=u[h],g=h);i.push([...e[g]])}let c=!1,d=0;for(;!c&&d<n;){c=!0,d++;for(let f=0;f<o;f++){let g=1/0,h=0;for(let p=0;p<t;p++){const v=hn(e[f],i[p]);v<g&&(g=v,h=p)}a[f]!==h&&(a[f]=h,c=!1)}const l=new Array(t).fill(0),u=new Array(t).fill(0).map(()=>new Array(r).fill(0));for(let f=0;f<o;f++){const g=a[f];l[g]++;for(let h=0;h<r;h++)u[g][h]+=e[f][h]}for(let f=0;f<t;f++)if(l[f]>0)for(let g=0;g<r;g++)i[f][g]=u[f][g]/l[f]}return a},hn=(e,t)=>{let n=0;for(const[o,r]of e.entries()){const i=r-t[o];n+=i*i}return Math.sqrt(n)},xl=(e,t,n,o)=>{const r=n/t,i=new Array(t).fill(0);for(const u of e)i[u]++;if(Math.max(...i)/r<=o)return e;const c=[...e],d=1e3;let l=0;for(;l<d;){l++,i.fill(0);for(const v of c)i[v]++;let u=0,f=0,g=i[0],h=i[0];for(let v=1;v<t;v++)i[v]>g&&(g=i[v],u=v),i[v]<h&&(h=i[v],f=v);if(g/r<=o||g-h<=1)break;for(let v=0;v<c.length;v++)if(c[v]===u){c[v]=f;break}}return c},Ml=(e,t,n,o,r,i)=>{const a=new Map;for(let l=0;l<o;l++)a.set(l,new Set);for(const[l,u]of t.entries()){const f=n[l],g=a.get(f);g&&g.add(u)}const s=[],d=t.length/o;for(let l=0;l<o;l++){const u=a.get(l);if(!u)continue;let f=0;for(const p of u){const v=e.getOutgoingEdges(p.id);if(v.ok)for(const m of v.value){const y=i.get(m.target);if(y!==void 0&&n[y]!==l){const k=e.getNode(m.source),w=e.getNode(m.target);k.some&&w.some&&(f+=r(m,k.value,w.value))}}}const g=u.size,h=g/d;s.push({id:l,nodes:u,size:g,edgeCuts:f,balance:h})}return s},eo=e=>e.weight??1,Sl=e=>{const t=e.weight??1;return t<0?R({type:"negative-weight",message:`Edge '${e.id}' has negative weight: ${t}. Dijkstra's algorithm requires non-negative weights.`,weight:t,edgeId:e.id}):F(void 0)};class to{heap=[];positions=new Map;insert(t,n){const o={element:t,priority:n},r=this.heap;r.push(o);const i=r.length-1;this.positions.set(t,i),this.bubbleUp(i)}extractMin(){const t=this.heap,n=t.length;if(n===0)return ge();const r=t[0].element;if(this.positions.delete(r),n===1)return t.length=0,me(r);const i=t.pop();return i===void 0?ge():(t[0]=i,this.positions.set(i.element,0),this.bubbleDown(0),me(r))}decreaseKey(t,n){const o=this.positions.get(t);if(o===void 0)return R({type:"invalid-input",message:"Element not found in heap"});const r=this.heap,i=r[o].priority;return n>i?R({type:"invalid-input",message:`New priority ${n} is greater than current priority ${i}`}):(r[o].priority=n,this.bubbleUp(o),F(void 0))}isEmpty(){return this.heap.length===0}size(){return this.heap.length}extractMinBatch(t){const n=[],o=this.heap;for(let r=0;r<t&&o.length>0;r++){const i=o[0];if(n.push(i.element),this.positions.delete(i.element),o.length===1){o.length=0;break}const a=o.pop();if(a===void 0)break;o[0]=a,this.positions.set(a.element,0),this.bubbleDown(0)}return n}bubbleUp(t){const n=this.heap,o=this.positions;for(;t>0;){const r=t-1>>1,i=n[r],a=n[t];if(i.priority<=a.priority)break;n[t]=i,n[r]=a,o.set(a.element,r),o.set(i.element,t),t=r}}bubbleDown(t){const n=this.heap,o=this.positions,r=n.length;for(;;){const i=(t<<1)+1,a=i+1;let s=t;if(i<r&&n[i].priority<n[s].priority&&(s=i),a<r&&n[a].priority<n[s].priority&&(s=a),s===t)break;const c=n[t],d=n[s];n[t]=d,n[s]=c,o.set(c.element,s),o.set(d.element,t),t=s}}swap(t,n){const o=this.heap,r=this.positions,i=o[t];o[t]=o[n],o[n]=i,r.set(o[t].element,t),r.set(o[n].element,n)}}const Cl=(e,t,n,o=eo)=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const r=e.getNode(t);if(!r.some)return R({type:"invalid-input",message:`Start node '${t}' not found in graph`});if(!e.getNode(n).some)return R({type:"invalid-input",message:`End node '${n}' not found in graph`});const a=e.getAllEdges();for(const g of a){const h=Sl(g);if(!h.ok)return R(h.error)}if(t===n)return F(me({nodes:[r.value],edges:[],totalWeight:0}));const s=new Map,c=new Map,d=new Set,l=new to,u=e.getAllNodes();for(const g of u)s.set(g.id,1/0),c.set(g.id,null);for(s.set(t,0),l.insert(t,0);!l.isEmpty();){const g=l.extractMin();if(!g.some)break;const h=g.value;if(d.has(h))continue;if(d.add(h),h===n)break;const p=s.get(h);if(p===void 0)continue;const v=e.getOutgoingEdges(h);if(v.ok)for(const m of v.value){const y=m.source===h?m.target:m.source,b=e.getNode(h),k=e.getNode(y);if(!b.some||!k.some)continue;const w=o(m,b.value,k.value),C=p+w,x=s.get(y);x!==void 0&&C<x&&(s.set(y,C),c.set(y,{nodeId:h,edgeId:m.id}),d.has(y)||l.insert(y,C))}}if(s.get(n)===1/0)return F(ge());const f=_l(e,t,n,c,o);return F(me(f))},_l=(e,t,n,o,r)=>{const i=[],a=[];let s=0,c=n;for(;c!==t;){const l=e.getNode(c);l.some&&i.unshift(l.value);const u=o.get(c);if(!u)break;const f=e.getEdge(u.edgeId);if(f.some){const g=f.value;a.unshift(g);const h=e.getNode(u.nodeId),p=e.getNode(c);h.some&&p.some&&(s+=r(g,h.value,p.value))}c=u.nodeId}const d=e.getNode(t);return d.some&&i.unshift(d.value),{nodes:i,edges:a,totalWeight:s}},no=(e,t,n)=>{if(e.length===0||t.length===0)return n;const o=Math.min(e.length,t.length);let r=0,i=0;for(let g=0;g<o;g++)r+=e[g],i+=t[g];const a=r/o,s=i/o;let c=0,d=0,l=0;for(let g=0;g<o;g++){const h=e[g]-a,p=t[g]-s;c+=h*p,d+=h*h,l+=p*p}const u=Math.sqrt(d*l);if(u<n)return n;const f=c/u;return Math.abs(f)+n},Nl=(e,t,n,o,r)=>{const i=e<=t?`${e}:${t}`:`${t}:${e}`,s=((n.get(i)??0)+r)/(o+r),c=-Math.log(s),d=-Math.log(r/(o+r));return c/d},Ze=(e,t,n)=>{if(e.size===0&&t.size===0)return n;let o=0;for(const i of e)t.has(i)&&o++;const r=e.size+t.size-o;return r===0?n:o/r+n},El=(e,t,n,o)=>{const i=((t.get(e)??0)+o)/(n+o),a=-Math.log(i),s=-Math.log(o/(n+o));return a/s},oo=(e,t,n)=>{const o=Math.max(0,t-e);return Math.exp(-n*o)},ro=(e,t)=>e>=0?1:1-t,io=(e,t,n)=>e===void 0||t===void 0?1:e===t?1+n:1,$l=(e,t,n)=>{if(e.length<2)return n;let o=0,r=0;for(let i=0;i<e.length;i++)for(let a=i+1;a<e.length;a++){const s=t.get(e[i])??new Set,c=t.get(e[a])??new Set,d=Ze(s,c,n);o+=Math.log(d+n),r++}return r>0?Math.exp(o/r):n},Re=(e,t)=>{const n=new Set,o=e.getOutgoingEdges(t);if(o.ok)for(const r of o.value){const i=r.source===t?r.target:r.source;n.add(i)}return n},jt=(e,t={})=>{const{attributeExtractor:n,communityExtractor:o,layerExtractor:r,timestampExtractor:i,signExtractor:a,probabilityExtractor:s,hyperedgeExtractor:c,useEdgeTypes:d,communityBoost:l=.5,negativePenalty:u=.5,temporalDecay:f=.001,referenceTime:g=Date.now(),epsilon:h=1e-10,useDegreeBasedPenalty:p=!1,degreeBasedPenaltyFactor:v=.5,useIDFWeighting:m=!1,useEdgeTypeRarity:y=!1}=t,b=new Map,k=e.getAllEdges(),w=n!==void 0,C=o!==void 0,x=r!==void 0,S=i!==void 0,M=a!==void 0,I=s!==void 0,E=c!==void 0;let _,P=!1,N,T=!1;if(!w){const $=new Set;for(const A of e.getAllNodes())$.add(A.type);if(P=$.size>1,P){_=new Map;for(const A of k){const B=e.getNode(A.source),j=e.getNode(A.target);if(B.some&&j.some){const U=B.value.type,G=j.value.type,oe=U<=G?`${U}:${G}`:`${G}:${U}`;_.set(oe,(_.get(oe)??0)+1)}}}const D=new Set;for(const A of k)D.add(A.type);if(T=d??D.size>1,T){N=new Map;for(const A of k)N.set(A.type,(N.get(A.type)??0)+1)}}const L=new Map,O=e.getNodeCount();if(p||m)for(const $ of k)L.set($.source,(L.get($.source)??0)+1),L.set($.target,(L.get($.target)??0)+1);const ee=k.length,z=new Map;if(y&&N)for(const[$,D]of N.entries()){const A=D/ee;z.set($,-Math.log(A+h))}const Z=new Map,W=new Map;if(x)for(const $ of k){const D=r($);if(D!==void 0){const A=W.get(D)??[];A.push($),W.set(D,A)}}const q=$=>{let D=Z.get($);return D||(D=Re(e,$),Z.set($,D)),D},Q=$=>{const D=e.getNode($.source),A=e.getNode($.target);if(!D.some||!A.some)return h;if(E){const U=c($);if(U&&U.length>0){const G=[$.source,$.target,...U];for(const oe of G)q(oe);return $l(G,Z,h)}}if(w&&n){const U=n(D.value),G=n(A.value);if(U&&G&&U.length>0&&G.length>0)return no(U,G,h)}if(P&&_)return Nl(D.value.type,A.value.type,_,k.length,h);if(T&&N)return El($.type,N,k.length,h);const B=q($.source),j=q($.target);return Ze(B,j,h)},K=$=>{const D=e.getNode($.source),A=e.getNode($.target);let B=1;if(S){const j=i($);j!==void 0&&(B*=oo(j,g,f))}if(M){const j=a($);j!==void 0&&(B*=ro(j,u))}if(I){const j=s($);j!==void 0&&(B*=Math.max(0,Math.min(1,j)))}if(C&&D.some&&A.some){const j=o(D.value),U=o(A.value);B*=io(j,U,l)}if(p){const j=L.get($.source)??0,U=L.get($.target)??0,G=Math.log(j+1)+Math.log(U+1);B*=Math.exp(-v*G)}if(m){const j=L.get($.source)??0,U=L.get($.target)??0,G=Math.log(O/(j+1)+h),oe=Math.log(O/(U+1)+h);B*=G*oe}if(y){const j=z.get($.type)??1;B*=j}return B};for(const $ of k){let D=Q($);D*=K($),x&&r($)!==void 0&&W.size>1,b.set($.id,D)}return{get:$=>b.get($),keys:()=>b.keys(),size:b.size}},Il=(e,t,n={})=>{const{attributeExtractor:o,communityExtractor:r,timestampExtractor:i,signExtractor:a,probabilityExtractor:s,communityBoost:c=.5,negativePenalty:d=.5,temporalDecay:l=.001,referenceTime:u=Date.now(),epsilon:f=1e-10}=n,g=e.getNode(t.source),h=e.getNode(t.target);if(!g.some||!h.some)return f;let p;if(o){const m=o(g.value),y=o(h.value);if(m&&y&&m.length>0&&y.length>0)p=no(m,y,f);else{const b=Re(e,t.source),k=Re(e,t.target);p=Ze(b,k,f)}}else{const m=Re(e,t.source),y=Re(e,t.target);p=Ze(m,y,f)}let v=1;if(i){const m=i(t);m!==void 0&&(v*=oo(m,u,l))}if(a){const m=a(t);m!==void 0&&(v*=ro(m,d))}if(s){const m=s(t);m!==void 0&&(v*=Math.max(0,Math.min(1,m)))}if(r){const m=r(g.value),y=r(h.value);v*=io(m,y,c)}return p*v},Pl=(e,t,n,o="undirected")=>{if(t===n){const f=e.getNode(t);return f.some?[{nodes:[f.value],edges:[],totalWeight:0}]:[]}const r=new Map,i=new Map;r.set(t,0),i.set(t,[]);const a=[t];let s=1/0;const c=new Map;if(o==="undirected")for(const f of e.getAllEdges()){const g=c.get(f.target)??[];g.push(f),c.set(f.target,g)}const d=f=>{const g=[],h=new Set,p=e.getOutgoingEdges(f);if(p.ok)for(const v of p.value){const m=v.source===f?v.target:v.source;g.push({neighbour:m,edge:v}),h.add(v.id)}if(o==="undirected"){const v=c.get(f)??[];for(const m of v)if(!h.has(m.id)){const y=m.source;g.push({neighbour:y,edge:m}),h.add(m.id)}}return g};for(;a.length>0;){const f=a.shift();if(f===void 0)break;const g=r.get(f);if(g===void 0||g>=s)continue;const h=d(f);for(const{neighbour:p,edge:v}of h){const m=g+1,y=r.get(p);if(y===void 0)r.set(p,m),i.set(p,[{nodeId:f,edge:v}]),a.push(p),p===n&&(s=m);else if(y===m){const b=i.get(p);b&&b.push({nodeId:f,edge:v})}}}if(!r.has(n))return[];const l=[],u=(f,g,h)=>{if(f===t){const v=e.getNode(t);v.some&&l.push({nodes:[v.value,...g],edges:[...h].reverse(),totalWeight:h.length});return}const p=i.get(f);if(p){for(const{nodeId:v,edge:m}of p)if(e.getNode(v).some){const b=e.getNode(f);b.some&&u(v,[b.value,...g],[m,...h])}}};return u(n,[],[]),l},Dl=(e,t,n,o,r="undirected",i=1e4)=>{if(t===n){const u=e.getNode(t);return u.some?[{nodes:[u.value],edges:[],totalWeight:0}]:[]}const a=[],s=new Map;if(r==="undirected")for(const u of e.getAllEdges()){const f=s.get(u.target)??[];f.push(u),s.set(u.target,f)}const c=u=>{const f=[],g=new Set,h=e.getOutgoingEdges(u);if(h.ok)for(const p of h.value){const v=p.source===u?p.target:p.source;f.push({neighbour:v,edge:p}),g.add(p.id)}if(r==="undirected"){const p=s.get(u)??[];for(const v of p)if(!g.has(v.id)){const m=v.source;f.push({neighbour:m,edge:v}),g.add(v.id)}}return f},d=(u,f,g,h,p)=>{if(a.length>=i)return;if(u===n&&p>0){const m=e.getNode(t);m.some&&a.push({nodes:[m.value,...g],edges:[...h],totalWeight:h.length});return}if(p>=o)return;const v=c(u);for(const{neighbour:m,edge:y}of v){if(f.has(m))continue;const b=e.getNode(m);if(!b.some)continue;const k=new Set(f);k.add(m),d(m,k,[...g,b.value],[...h,y],p+1)}};return d(t,new Set([t]),[],[],0),a.sort((u,f)=>u.edges.length-f.edges.length),a},Tl=(e,t,n,o,r="none",i)=>{const a=e.edges.length;if(a===0)return{score:1,geometricMeanMI:1,edgeMIValues:[]};const s=[];let c=0;const d=[];for(const h of e.edges){const p=t.get(h.id)??o;if(s.push(p),c+=Math.log(p+o),r!=="none"){const v=i?i(h):h.weight??1;d.push(Math.max(v,o))}}const l=Math.exp(c/a),u=n>0?Math.exp(-n*a):void 0;let f;if(r==="divide"&&d.length>0){const h=d.reduce((p,v)=>p+v,0)/d.length;f=1/Math.max(h,o)}else if(r==="multiplicative"&&d.length>0){const h=d.reduce((p,v)=>p+Math.log(v),0)/d.length;f=Math.exp(-h)}let g=l;return u!==void 0&&(g*=u),f!==void 0&&(g*=f),{score:g,geometricMeanMI:l,edgeMIValues:s,lengthPenalty:u,weightFactor:f}},Lt=(e,t,n,o={})=>{const{traversalMode:r="undirected",lambda:i=0,weightMode:a="none",weightExtractor:s,maxPaths:c=10,maxLength:d=1/0,shortestOnly:l=!0,miCache:u,miConfig:f={},epsilon:g=1e-10}=o;if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});if(!e.getNode(t).some)return R({type:"invalid-input",message:`Start node '${t}' not found in graph`});if(!e.getNode(n).some)return R({type:"invalid-input",message:`End node '${n}' not found in graph`});const v=u??jt(e,f),m=l||d===1/0?Pl(e,t,n,r):Dl(e,t,n,d,r);if(m.length===0)return F(ge());const y=m.map(k=>{const w=Tl(k,v,i,g,a,s);return{path:k,score:w.score,geometricMeanMI:w.geometricMeanMI,edgeMIValues:w.edgeMIValues,lengthPenalty:w.lengthPenalty,weightFactor:w.weightFactor}});y.sort((k,w)=>w.score-k.score);const b=y.slice(0,c);return F(me(b))},so=(e,t,n,o={})=>{const r=Lt(e,t,n,{...o,maxPaths:1});return r.ok?!r.value.some||r.value.value.length===0?F(ge()):F(me(r.value.value[0])):r},Al=(e,t={})=>{const n=jt(e,t.miConfig??{});return{rank:(o,r,i={})=>Lt(e,o,r,{...t,...i,miCache:n}),getBest:(o,r,i={})=>so(e,o,r,{...t,...i,miCache:n}),getMICache:()=>n}},ao=(e,t)=>{if(e.length===0||t.length===0)return 0;const n=new Map(e.map((c,d)=>[c,d])),o=new Map(t.map((c,d)=>[c,d])),r=e.filter(c=>o.has(c));if(r.length===0)return 0;const i=r.length;let a=0;for(const c of r){const d=n.get(c),l=o.get(c);if(d===void 0||l===void 0)continue;const u=d-l;a+=u*u}const s=i*(i*i-1);return s===0?1:1-6*a/s},co=(e,t)=>{if(e.length===0&&t.length===0)return 1;if(e.length===0||t.length===0)return 0;const n=new Map(e.map((c,d)=>[c,d])),o=new Map(t.map((c,d)=>[c,d])),r=e.filter(c=>o.has(c));if(r.length<2)return 1;let i=0,a=0;for(let c=0;c<r.length;c++)for(let d=c+1;d<r.length;d++){const l=r[c],u=r[d];if(l===void 0||u===void 0)continue;const f=n.get(l),g=n.get(u),h=o.get(l),p=o.get(u);if(f===void 0||g===void 0||h===void 0||p===void 0)continue;const v=f<g?-1:1,m=h<p?-1:1;v===m?i++:a++}const s=i+a;return s===0?1:(i-a)/s},pn=(e,t)=>{const n=e.slice(0,t);let o=0;for(const[r,i]of n.entries()){const a=r+1;o+=a===1?i.relevance:i.relevance/Math.log2(a)}return o},lo=(e,t,n)=>{if(e.length===0||t.length===0)return 0;const o=n??e.length,r=pn(e,o),i=pn(t,o);return i===0?1:r/i},uo=(e,t)=>{if(e.length===0||t.size===0)return 0;let n=0,o=0;for(const[r,i]of e.entries()){const a=i;if(t.has(a)){o++;const s=r+1,c=o/s;n+=c}}return o===0?0:n/o},fo=(e,t)=>{if(e.length===0||t.size===0)return 0;for(const[n,o]of e.entries()){const r=o;if(t.has(r))return 1/(n+1)}return 0},wt=(e,t,n)=>e.length===0||t.size===0||n<=0?0:e.slice(0,Math.min(n,e.length)).filter(i=>t.has(i)).length/n,xt=(e,t,n)=>e.length===0||t.size===0||n<=0?0:e.slice(0,Math.min(n,e.length)).filter(i=>t.has(i)).length/t.size,Rl=(e,t)=>{const n=t.map(o=>{let r=0;for(const a of o.nodes){const s=e.getNeighbors(a.id),c=s.ok?s.value.length:0;r+=c}const i=o.nodes.length>0?r/o.nodes.length:0;return{path:o,score:i,geometricMeanMI:0,edgeMIValues:[]}});return n.sort((o,r)=>r.score-o.score),n},Fl=(e,t=.85,n=100,o=1e-6)=>{const r=e.getAllNodes(),i=r.length;if(i===0)return new Map;const a=new Map,s=r.map(l=>l.id);for(const l of s)a.set(l,1/i);const c=new Map,d=new Map;for(const l of e.getAllEdges()){const u=c.get(l.source)??[];u.push(l.target),c.set(l.source,u);const f=d.get(l.target)??[];f.push(l.source),d.set(l.target,f)}for(let l=0;l<n;l++){const u=new Map;let f=0;for(const g of s){const h=d.get(g)??[];let p=0;for(const b of h){const k=(c.get(b)??[]).length,w=a.get(b)??0;k>0&&(p+=w/k)}const v=(1-t)/i+t*p;u.set(g,v);const m=a.get(g)??0,y=Math.abs(v-m);f=Math.max(f,y)}for(const[g,h]of u.entries())a.set(g,h);if(f<o)break}return a},jl=(e,t,n)=>{const o=Fl(e,n),r=t.map(i=>{let a=0;for(const c of i.nodes){const d=o.get(c.id)??0;a+=d}const s=i.nodes.length>0?a/i.nodes.length:0;return{path:i,score:s,geometricMeanMI:0,edgeMIValues:[]}});return r.sort((i,a)=>a.score-i.score),r};let Ll=class{seed;constructor(t){this.seed=t}next(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}shuffle(t){const n=[...t];for(let o=n.length-1;o>0;o--){const r=Math.floor(this.next()*(o+1));[n[o],n[r]]=[n[r],n[o]]}return n}};const zl=(e,t)=>{const o=new Ll(t??Date.now()).shuffle(e);return o.map((r,i)=>({path:r,score:1-i/o.length,geometricMeanMI:0,edgeMIValues:[]}))},Bl=e=>{const t=e.map(n=>{const r=1/(n.edges.length+1);return{path:n,score:r,geometricMeanMI:0,edgeMIValues:[]}});return t.sort((n,o)=>o.score-n.score),t},Ol=(e,t)=>{const n=e.map(o=>{let r=0;for(const a of o.edges){const s=t(a);r+=s}const i=o.edges.length>0?r/o.edges.length:0;return{path:o,score:i,geometricMeanMI:0,edgeMIValues:[]}});return n.sort((o,r)=>r.score-o.score),n};let ql=class{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}next(){return this.nextDouble()}nextInt(t,n){return Math.floor(this.next()*(n-t+1))+t}shuffle(t){const n=[...t];for(let o=n.length-1;o>0;o--){const r=Math.floor(this.nextDouble()*(o+1));[n[o],n[r]]=[n[r],n[o]]}return n}};const Ul=e=>{switch(e){case"weak":return{min:.1,max:.3};case"medium":return{min:.4,max:.7};case"strong":return{min:.8,max:1}}},We=(e,t)=>{const n=new ql(t.seed),o=Ul(t.signalStrength),i=e.getAllNodes().map(g=>g.id);if(i.length===0)throw new Error("Cannot plant paths in empty graph");const a=t.sourceNodes??n.shuffle(i).slice(0,Math.min(t.numPaths,i.length)),s=t.targetNodes??n.shuffle(i).slice(0,Math.min(t.numPaths,i.length)),c=[],d=new Map;let l=0,u=0,f=0;for(let g=0;g<t.numPaths;g++){const h=a[g%a.length],p=s[g%s.length],v=e.getNode(h),m=e.getNode(p);if(!v.some)throw new Error(`Source node '${h}' not found in graph`);if(!m.some)throw new Error(`Target node '${p}' not found in graph`);const y=n.nextInt(t.pathLength.min,t.pathLength.max),b=[],k=[];let w=h,C=n.nextDouble()*(o.max-o.min)+o.min;b.push(v.value);for(let E=0;E<y;E++){const _=`planted_node_${l++}`,P={id:_,type:"planted"};e.addNode(P),b.push(P);const T={id:`planted_edge_${u++}`,source:w,target:_,weight:C};e.addEdge(T),k.push(T),f+=C,w=_,C=Math.max(0,Math.min(1,C+(n.nextDouble()-.5)*.2))}const S={id:`planted_edge_${u++}`,source:w,target:p,weight:C};e.addEdge(S),k.push(S),f+=C,b.push(m.value);const M={nodes:b,edges:k,totalWeight:k.reduce((E,_)=>E+(_.weight??0),0)};c.push(M);const I=f/k.length;d.set(gt(M),I)}return c.sort((g,h)=>{const p=d.get(gt(g))??0;return(d.get(gt(h))??0)-p}),{graph:e,groundTruthPaths:c,relevanceScores:d,metadata:{nodesAdded:l,edgesAdded:u,avgPathMI:f/c.length}}},gt=e=>e.nodes.map(t=>t.id).join("→"),Gl=(e,t,n)=>{const o=new Xl(n.seed),r=e.getAllNodes(),i=Ql(r);if(i.length<3)throw new Error("Need at least 3 work nodes to plant citation paths");const a=o.shuffle([...i]).slice(0,Math.min(n.numPaths*3,i.length));switch(t){case"direct-citation-chain":return Wl(e,a,n,o);case"co-citation-bridge":return Vl(e,a,n,o);case"bibliographic-coupling":return Kl(e,a,n,o);case"author-mediated":return Hl(e,r,a,n,o);case"venue-mediated":return Jl(e,r,a,n,o)}},Wl=(e,t,n,o)=>{const i=[],a=new Map;let s=0,c=0;for(let d=0;d<n.numPaths;d++){const l=d*3;if(l+3>t.length)break;const u=t[l],f=t[l+1],g=t[l+2],h=$e(e,u.id,f.id,o);h&&(s++,c+=h.weight);const p=$e(e,f.id,g.id,o);if(p&&(s++,c+=p.weight),h&&p){const v={nodes:[u,f,g],edges:[h.edge,p.edge],totalWeight:h.weight+p.weight};i.push(v);const m=(h.weight+p.weight)/2,y=v.nodes.map(b=>b.id).join("→");a.set(y,m)}}return{graph:e,groundTruthPaths:i,relevanceScores:a,metadata:{nodesAdded:0,edgesAdded:s,avgPathMI:i.length>0?c/i.length:0}}},Vl=(e,t,n,o)=>{const r=[],i=new Map;let a=0,s=0;for(let c=0;c<n.numPaths;c++){const d=c*3;if(d+3>t.length)break;const l=t[d],u=t[d+1],f=t[d+2],g=$e(e,u.id,l.id,o),h=$e(e,u.id,f.id,o);if(g&&(a++,s+=g.weight),h&&(a++,s+=h.weight),g&&h){const p={nodes:[l,u,f],edges:[g.edge,h.edge],totalWeight:g.weight+h.weight};r.push(p);const v=(g.weight+h.weight)/2,m=p.nodes.map(y=>y.id).join("→");i.set(m,v)}}return{graph:e,groundTruthPaths:r,relevanceScores:i,metadata:{nodesAdded:0,edgesAdded:a,avgPathMI:r.length>0?s/r.length:0}}},Kl=(e,t,n,o)=>{const r=[],i=new Map;let a=0,s=0;for(let c=0;c<n.numPaths;c++){const d=c*3;if(d+3>t.length)break;const l=t[d],u=t[d+1],f=t[d+2],g=$e(e,l.id,u.id,o),h=$e(e,f.id,u.id,o);if(g&&(a++,s+=g.weight),h&&(a++,s+=h.weight),g&&h){const p={nodes:[l,u,f],edges:[g.edge,h.edge],totalWeight:g.weight+h.weight};r.push(p);const v=(g.weight+h.weight)/2,m=p.nodes.map(y=>y.id).join("→");i.set(m,v)}}return{graph:e,groundTruthPaths:r,relevanceScores:i,metadata:{nodesAdded:0,edgesAdded:a,avgPathMI:r.length>0?s/r.length:0}}},Hl=(e,t,n,o,r)=>{const i=zt(t,"Author");if(i.length===0)return We(e,o);const a=[],s=new Map;let c=0,d=0;for(let l=0;l<o.numPaths&&!(l+2>n.length);l++){const u=n[l],f=n[l+1],g=i[l%i.length],h=mn(e,u.id,g.id,r),p=mn(e,f.id,g.id,r);if(h&&(c++,d+=h.weight),p&&(c++,d+=p.weight),h&&p){const v={nodes:[u,g,f],edges:[h.edge,p.edge],totalWeight:h.weight+p.weight};a.push(v);const m=(h.weight+p.weight)/2,y=v.nodes.map(b=>b.id).join("→");s.set(y,m)}}return{graph:e,groundTruthPaths:a,relevanceScores:s,metadata:{nodesAdded:0,edgesAdded:c,avgPathMI:a.length>0?d/a.length:0}}},Jl=(e,t,n,o,r)=>{const i=zt(t,"Source");if(i.length===0)return We(e,o);const a=[],s=new Map;let c=0,d=0;for(let l=0;l<o.numPaths&&!(l+2>n.length);l++){const u=n[l],f=n[l+1],g=i[l%i.length],h=vn(e,u.id,g.id,r),p=vn(e,f.id,g.id,r);if(h&&(c++,d+=h.weight),p&&(c++,d+=p.weight),h&&p){const v={nodes:[u,g,f],edges:[h.edge,p.edge],totalWeight:h.weight+p.weight};a.push(v);const m=(h.weight+p.weight)/2,y=v.nodes.map(b=>b.id).join("→");s.set(y,m)}}return{graph:e,groundTruthPaths:a,relevanceScores:s,metadata:{nodesAdded:0,edgesAdded:c,avgPathMI:a.length>0?d/a.length:0}}},$e=(e,t,n,o)=>{const r=`citation_${t}_${n}`;if(e.getEdge(r).some)return null;const a=.5+o.nextDouble()*.5,s={id:r,source:t,target:n,weight:a};return e.addEdge(s),{edge:s,weight:a}},mn=(e,t,n,o)=>{const r=`authorship_${t}_${n}`;if(e.getEdge(r).some)return null;const a=.6+o.nextDouble()*.4,s={id:r,source:t,target:n,weight:a};return e.addEdge(s),{edge:s,weight:a}},vn=(e,t,n,o)=>{const r=`publication_${t}_${n}`;if(e.getEdge(r).some)return null;const a=.4+o.nextDouble()*.6,s={id:r,source:t,target:n,weight:a};return e.addEdge(s),{edge:s,weight:a}},Ql=e=>zt(e,"Work"),zt=(e,t)=>e.filter(n=>"type"in n&&typeof n.type=="string"?n.type===t:"entityType"in n&&typeof n.entityType=="string"?n.entityType===t:!1);let Xl=class{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}shuffle(t){const n=[...t];for(let o=n.length-1;o>0;o--){const r=Math.floor(this.nextDouble()*(o+1));[n[o],n[r]]=[n[r],n[o]]}return n}};const go=e=>"type"in e&&typeof e.type=="string"?e.type:"entityType"in e&&typeof e.entityType=="string"?e.entityType:"unknown",Yl=(e,t,n)=>{if(t.length<2)throw new Error("Path template must have at least 2 node types");const o=new Map;for(const l of e.getAllNodes()){const u=go(l);if(n.entityTypes.includes(u)){const f=o.get(u)??[];f.push(l),o.set(u,f)}}for(const l of t)if(!o.has(l))throw new Error(`No nodes found with type: ${l}`);const r=t[0],a=t.at(-1)??r,s=o.get(r)?.map(l=>l.id)??[],c=o.get(a)?.map(l=>l.id)??[],d={...n,sourceNodes:s,targetNodes:c};return We(e,d)},Zl=(e,t)=>{if(e.nodes.length!==t.length)return!1;for(let n=0;n<e.nodes.length;n++)if(go(e.nodes[n])!==t[n])return!1;return!0},eu=(e,t,n,o)=>{if(n<=0)return e;const r=new nu(o??Date.now()),a=e.getAllNodes().map(l=>l.id);if(a.length<2)return e;const s=new Set;for(const l of t)s.add(yn(l));let c=0,d=0;for(let l=0;l<n;l++){const u=a[r.nextInt(0,a.length-1)],f=a[r.nextInt(0,a.length-1)];if(u===f)continue;const g=r.nextInt(1,4),h=tu(e,u,f,g,r,c,d),p=yn(h);if(!s.has(p)){for(const v of h.nodes)e.hasNode(v.id)||(e.addNode(v),c++);for(const v of h.edges)e.getEdge(v.id).some||(e.addEdge(v),d++);s.add(p)}}return e},tu=(e,t,n,o,r,i,a)=>{const s=[],c=[],d=e.getNode(t);if(!d.some)return{nodes:[],edges:[],totalWeight:0};s.push(d.value);let l=t;for(let h=0;h<o-1;h++){const p=`noise_node_${i+h}`,v=`noise_edge_${a+h}`,m={id:p},y={id:v,source:l,target:p,weight:r.nextDouble()*.3};s.push(m),c.push(y),l=p}const f={id:`noise_edge_${a+o-1}`,source:l,target:n,weight:r.nextDouble()*.3};c.push(f);const g=e.getNode(n);return g.some&&s.push(g.value),{nodes:s,edges:c,totalWeight:c.reduce((h,p)=>h+(p.weight??0),0)}},yn=e=>e.edges.map(t=>`${t.source}-${t.target}`).join("|");let nu=class{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}nextInt(t,n){return Math.floor(this.nextDouble()*(n-t+1))+t}};const ho=(e,t,n=.05)=>{if(e.length!==t.length)throw new Error("Paired samples must have equal length");if(e.length<2)throw new Error("Paired t-test requires at least 2 observations");const o=e.length,r=[];for(let f=0;f<o;f++)r.push(e[f]-t[f]);const i=r.reduce((f,g)=>f+g,0)/o,a=r.reduce((f,g)=>f+(g-i)**2,0)/(o-1),c=Math.sqrt(a)/Math.sqrt(o),d=i/c,l=o-1,u=ou(d,l);return{pValue:u,tStatistic:d,significant:u<n}},po=(e,t,n=.05)=>{if(e.length!==t.length)throw new Error("Paired samples must have equal length");if(e.length<2)throw new Error("Wilcoxon test requires at least 2 observations");const o=e.length,r=[];for(let g=0;g<o;g++){const h=e[g]-t[g];h!==0&&r.push({value:h,absValue:Math.abs(h)})}const i=r.length;if(i===0)return{pValue:1,statistic:0,significant:!1};const a=[...r].sort((g,h)=>g.absValue-h.absValue),s=[];let c=0;for(;c<i;){let g=c;for(;g<i&&a[g].absValue===a[c].absValue;)g++;const h=(c+1+g)/2;for(let p=c;p<g;p++)s.push(h);c=g}let d=0;for(let g=0;g<i;g++)a[g].value>0&&(d+=s[g]);const l=i*(i+1)/2-d,u=Math.min(d,l);let f;if(i>20){const g=i*(i+1)/4,h=Math.sqrt(i*(i+1)*(2*i+1)/24),p=(u-g)/h;f=2*(1-et(Math.abs(p)))}else{const g=i*(i+1)/4,h=Math.sqrt(i*(i+1)*(2*i+1)/24),p=(u-g)/h;f=2*(1-et(Math.abs(p)))}return{pValue:f,statistic:u,significant:f<n}},ou=(e,t)=>{if(t>30){const o=ru(e);return 2*(1-et(Math.abs(o)))}return 2*(1-et(Math.abs(e)))},ru=(e,t)=>e,et=e=>{const t=.254829592,n=-.284496736,o=1.421413741,r=-1.453152027,i=1.061405429,a=.3275911,s=e<0?-1:1;e=Math.abs(e)/Math.sqrt(2);const c=1/(1+a*e),d=1-((((i*c+r)*c+o)*c+n)*c+t)*c*Math.exp(-e*e);return .5*(1+s*d)},iu=(e,t=.95,n=1e4,o)=>{if(e.length<2)throw new Error("Bootstrap requires at least 2 samples");if(t<=0||t>=1)throw new Error("Confidence level must be between 0 and 1");const r=new vo(o??Date.now()),i=e.reduce((f,g)=>f+g,0)/e.length,a=[];for(let f=0;f<n;f++){const g=[];for(let p=0;p<e.length;p++){const v=Math.floor(r.nextDouble()*e.length);g.push(e[v])}const h=g.reduce((p,v)=>p+v,0)/g.length;a.push(h)}a.sort((f,g)=>f-g);const s=1-t,c=Math.floor(s/2*n),d=Math.ceil((1-s/2)*n)-1,l=a[c],u=a[d];return{lower:l,upper:u,mean:i}},mo=(e,t,n=1e4,o=.05,r)=>{if(e.length<2||t.length<2)throw new Error("Both methods require at least 2 samples");const i=new vo(r??Date.now()),a=e.reduce((m,y)=>m+y,0)/e.length,s=t.reduce((m,y)=>m+y,0)/t.length,c=a-s,d=[];for(let m=0;m<n;m++){const y=[];for(let C=0;C<e.length;C++){const x=Math.floor(i.nextDouble()*e.length);y.push(e[x])}const b=[];for(let C=0;C<t.length;C++){const x=Math.floor(i.nextDouble()*t.length);b.push(t[x])}const k=y.reduce((C,x)=>C+x,0)/y.length,w=b.reduce((C,x)=>C+x,0)/b.length;d.push(k-w)}d.sort((m,y)=>m-y);const l=Math.floor(o/2*n),u=Math.ceil((1-o/2)*n)-1,f={lower:d[l],upper:d[u]},g=d.filter(m=>m<=0).length,h=d.filter(m=>m>=2*c).length,p=Math.min(2*g/n,2*h/n),v=f.lower>0||f.upper<0;return{pValue:p,meanDifference:c,ci:f,significant:v}};class vo{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}}const su=(e,t=.05)=>{if(e.length===0)return{correctedAlpha:t,significant:[]};const n=t/e.length,o=e.map(r=>r<n);return{correctedAlpha:n,significant:o}},au=(e,t=.05)=>{if(e.length===0)return{adjustedPValues:[],significant:[]};const n=e.length,o=e.map((s,c)=>({p:s,i:c}));o.sort((s,c)=>s.p-c.p);const r=[];for(const[s,c]of o.entries()){const{p:d,i:l}=c,u=d*n/(s+1);r.push({p:d,i:l,adjusted:Math.min(u,1)})}for(let s=r.length-2;s>=0;s--)r[s].adjusted=Math.min(r[s].adjusted,r[s+1].adjusted);const i=Array.from({length:e.length}),a=Array.from({length:e.length});for(const{i:s,adjusted:c}of r)i[s]=c,a[s]=c<t;return{adjustedPValues:i,significant:a}},cu=(e,t=.05)=>{if(e.length===0)return{adjustedPValues:[],significant:[]};const n=e.length,o=e.map((l,u)=>({p:l,i:u}));o.sort((l,u)=>l.p-u.p);const r=[];let i=0;for(const[l,u]of o.entries()){const{p:f,i:g}=u,h=Math.max(f*(n-l),i);r.push({i:g,adjusted:Math.min(h,1)}),i=h}const a=new Map;let s=n;for(let l=0;l<o.length;l++){const{p:u,i:f}=o[l];if(u<t/s)a.set(f,!0),s--;else{a.set(f,!1);for(let g=l+1;g<o.length;g++)a.set(o[g].i,!1);break}}const c=Array.from({length:e.length}),d=Array.from({length:e.length});for(const{i:l,adjusted:u}of r)c[l]=u,d[l]=a.get(l)??!1;return{adjustedPValues:c,significant:d}},du=(e,t=.05,n=.5)=>{if(e.length===0)return{qValues:[],significant:[],pi0:1};const o=e.length,r=e.filter(l=>l>n),i=Math.min(1,r.length/o/(1-n)),a=e.map((l,u)=>({p:l,i:u}));a.sort((l,u)=>l.p-u.p);const s=Array.from({length:e.length}),c=Array.from({length:e.length});let d=0;for(let l=a.length-1;l>=0;l--){const{p:u,i:f}=a[l],g=Math.min(1,u*o*i/(l+1)),h=Math.max(g,d);s[f]=h,d=h}for(let l=0;l<e.length;l++)c[l]=(s[l]??0)<t;return{qValues:s,significant:c,pi0:i}},lu=(e,t)=>{if(e.length<2||t.length<2)throw new Error("Cohen's d requires at least 2 samples per group");const n=e.reduce((u,f)=>u+f,0)/e.length,o=t.reduce((u,f)=>u+f,0)/t.length,r=e.reduce((u,f)=>u+(f-n)**2,0)/(e.length-1),i=t.reduce((u,f)=>u+(f-o)**2,0)/(t.length-1),a=((e.length-1)*r+(t.length-1)*i)/(e.length+t.length-2),s=Math.sqrt(a),c=s===0?0:(n-o)/s,d=Math.abs(c);let l;return d<.2?l="negligible":d<.5?l="small":d<.8?l="medium":l="very-large",{effectSize:c,interpretation:l,magnitude:d}},uu=(e,t)=>{if(e.length===0||t.length===0)throw new Error("Cliff's delta requires at least 1 sample per group");let n=0,o=0;for(const d of e)for(const l of t)d>l?n++:d<l&&o++;const r=e.length*t.length,i=r===0?0:(n-o)/r,a=r===0?.5:n/r,s=Math.abs(i);let c;return s<.147?c="negligible":s<.33?c="small":s<.474?c="medium":c="large",{effectSize:i,interpretation:c,probability:a,magnitude:s}},fu=(e,t)=>{if(e.length<2||t.length<2)throw new Error("Glass's delta requires at least 2 samples per group");const n=e.reduce((d,l)=>d+l,0)/e.length,o=t.reduce((d,l)=>d+l,0)/t.length,r=t.reduce((d,l)=>d+(l-o)**2,0)/(t.length-1),i=Math.sqrt(r),a=i===0?0:(n-o)/i,s=Math.abs(a);let c;return s<.2?c="negligible":s<.5?c="small":s<.8?c="medium":c="very-large",{effectSize:a,interpretation:c}},gu=(e,t)=>{if(e.length===0||t.length===0)throw new Error("Rank-biserial correlation requires at least 1 sample per group");const n=[...e.map(v=>({value:v,group:1})),...t.map(v=>({value:v,group:2}))];n.sort((v,m)=>v.value-m.value);const o=[];let r=0;for(;r<n.length;){let v=r;for(;v<n.length&&n[v].value===n[r].value;)v++;const m=(r+1+v)/2;for(let y=r;y<v;y++)o.push(m);r=v}let i=0,a=0;for(const v of n)v.group===1&&(i+=o[a]),a++;const s=e.length,c=t.length,d=s+c,l=s*(d+1)/2,u=2*(i-l),f=s*c,g=f===0?0:u/f,h=Math.abs(g);let p;return h<.147?p="negligible":h<.33?p="small":h<.474?p="medium":p="large",{effectSize:h,correlation:g,interpretation:p}},yo=async(e,t)=>{const n=Date.now(),o=We(t,e.pathPlanting),r=o.groundTruthPaths,i=o.relevanceScores,a=o.graph,s=[];for(const u of e.methods){const f=[];for(let g=0;g<e.repetitions;g++){const h=u.ranker(a,r),p=pu(h,r,i,e.metrics);f.push(p)}s.push({method:u.name,repetitions:f})}const c=s.map(({method:u,repetitions:f})=>{const g=mu(f,e.metrics);return{method:u,results:g,runtime:0}}),d=vu(s,e.statisticalTests,e.alpha??.05),l=yu(c,e.metrics[0]??"spearman");return{name:e.name,graphSpec:"custom",methods:c,statisticalTests:d,winner:l,timestamp:new Date().toISOString(),duration:Date.now()-n}},hu=async(e,t,n=5)=>{const o=[];for(let a=0;a<n;a++){const s={...e,seed:e.seed+a},c=await yo(s,t);o.push(c)}const r=bu(o),i=ku(o);return{foldResults:o,aggregated:r,stdDev:i}},pu=(e,t,n,o)=>{const r=new Map,i=e.map(s=>s.path.nodes[0]?.id??"unknown"),a=t.map((s,c)=>({path:s,index:c,relevance:n.get(s.nodes[0]?.id??"unknown")??0})).sort((s,c)=>c.relevance-s.relevance).map(s=>s.path.nodes[0]?.id??"unknown");for(const s of o)switch(s){case"spearman":{r.set("spearman",ao(i,a));break}case"kendall":{r.set("kendall",co(i,a));break}case"ndcg":{const c=e.map((l,u)=>({id:i[u],relevance:l.path.totalWeight??0})),d=t.map(l=>({id:l.nodes[0]?.id??"unknown",relevance:n.get(l.nodes[0]?.id??"unknown")??0}));d.sort((l,u)=>u.relevance-l.relevance),r.set("ndcg",lo(c,d));break}case"map":{const c=Math.min(10,t.length),d=new Set(t.slice(0,c).map(l=>l.nodes[0]?.id??"unknown"));r.set("map",uo(i,d));break}case"mrr":{const c=new Set(t.slice(0,5).map(d=>d.nodes[0]?.id??"unknown"));r.set("mrr",fo(i,c));break}case"precision":{const c=new Set(t.slice(0,10).map(d=>d.nodes[0]?.id??"unknown"));r.set("precision_at_5",wt(i,c,5)),r.set("precision_at_10",wt(i,c,10));break}case"recall":{const c=new Set(t.slice(0,10).map(d=>d.nodes[0]?.id??"unknown"));r.set("recall_at_5",xt(i,c,5)),r.set("recall_at_10",xt(i,c,10));break}}return r},mu=(e,t)=>{const n={},o=new Map;for(const r of e)for(const[i,a]of r){let s=o.get(i);s||(s=[],o.set(i,s)),s.push(a)}for(const[r,i]of o){const a=i.reduce((s,c)=>s+c,0)/i.length;n[r]=a}for(const r of t)r in n||(n[r]=0);return n},vu=(e,t,n)=>{const o=[],r=[...e].sort((a,s)=>{const c="spearman",d=ht(a.repetitions,c);return ht(s.repetitions,c)-d}),i=r[0];ht(i.repetitions,"spearman");for(let a=1;a<r.length;a++){const s=r[a];for(const c of t){let d;switch(c){case"paired-t":{const l=i.repetitions.map(g=>g.get("spearman")??0),u=s.repetitions.map(g=>g.get("spearman")??0),f=ho(l,u,n);d={type:"paired-t",comparison:`${i.method} vs ${s.method}`,pValue:f.pValue,significant:f.significant,statistic:f.tStatistic};break}case"wilcoxon":{const l=i.repetitions.map(g=>g.get("spearman")??0),u=s.repetitions.map(g=>g.get("spearman")??0),f=po(l,u,n);d={type:"wilcoxon",comparison:`${i.method} vs ${s.method}`,pValue:f.pValue,significant:f.significant,statistic:f.statistic};break}case"bootstrap":{const l=i.repetitions.map(g=>g.get("spearman")??0),u=s.repetitions.map(g=>g.get("spearman")??0),f=mo(l,u,1e4,n);d={type:"bootstrap",comparison:`${i.method} vs ${s.method}`,pValue:f.pValue,significant:f.significant,ci:f.ci};break}default:continue}o.push(d)}}return o},yu=(e,t)=>[...e].sort((o,r)=>{const i=o.results[t]??0;return(r.results[t]??0)-i})[0]?.method??"unknown",ht=(e,t)=>{let n=0,o=0;for(const r of e){const i=r.get(t);i!==void 0&&(n+=i,o++)}return o>0?n/o:0},bu=e=>{const t=e[0],n=t.methods.map(r=>{const i={};for(const a of Object.keys(r.results)){const s=e.map(d=>d.methods.find(l=>l.method===r.method)?.results[a]),c=s.reduce((d,l)=>d+(l??0),0)/s.length;i[a]=c}return{method:r.method,results:i,runtime:r.runtime}});return{...t,methods:n,statisticalTests:[]}},ku=e=>{const t=e[0],n=t.methods.map(o=>{const r={};for(const i of Object.keys(o.results)){const a=e.map(d=>d.methods.find(l=>l.method===o.method)?.results[i]),s=a.reduce((d,l)=>d+(l??0),0)/a.length,c=a.reduce((d,l)=>d+((l??0)-s)**2,0)/a.length;r[i]=Math.sqrt(c)}return{method:o.method,results:r,runtime:0}});return{...t,methods:n,statisticalTests:[]}},wu=e=>{const t=[`# ${e.name}
1
+ "use strict";var Wo=Object.create;var Zt=Object.defineProperty;var Vo=Object.getOwnPropertyDescriptor;var Ko=Object.getOwnPropertyNames;var Ho=Object.getPrototypeOf,Jo=Object.prototype.hasOwnProperty;var Qo=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ko(t))!Jo.call(e,r)&&r!==n&&Zt(e,r,{get:()=>t[r],enumerable:!(o=Vo(t,r))||o.enumerable});return e};var ve=(e,t,n)=>(n=e!=null?Wo(Ho(e)):{},Qo(t||!e||!e.__esModule?Zt(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const rt=require("./experiments/evaluation/loaders/index.ts"),ce=require("./experiments/evaluation/fixtures/index.ts");var J=typeof document<"u"?document.currentScript:null;const Pe={vertexOrderKey:"order",edgeOrderKey:"order",posKey:"pos",layerKey:"layer",timeKey:"time",rootKey:"root",portKey:"ports",weightVectorKey:"weightVector",probabilityKey:"probability"},it=e=>[...new Set(e)],He=(e,t)=>{if(e.length<=1)return!0;for(let n=1;n<e.length;n++)if(!t(e[0],e[n]))return!1;return!0},Je=(e,t,n)=>n?`${e}->${t}`:e<t?`${e}--${t}`:`${t}--${e}`,$t=e=>e.edges.some(t=>t.directed),It=e=>e.edges.some(t=>!t.directed),Pt=e=>{let t=0;for(const n of e.edges)n.endpoints.length===2&&n.endpoints[0]===n.endpoints[1]&&t++;return t},ee=e=>{const t={};for(const n of e.vertices)t[n.id]=[];for(const n of e.edges){if(n.directed||n.endpoints.length!==2)continue;const[o,r]=n.endpoints;t[o].push(r),t[r].push(o)}return t},Oe=e=>{if(e.vertices.length===0)return!0;const t=ee(e),n=e.vertices[0].id,o=new Set,r=[n];for(;r.length>0;){const i=r.pop();if(i&&!o.has(i)){o.add(i);for(const a of t[i]??[])o.has(a)||r.push(a)}}return o.size===e.vertices.length},wn=e=>{const t=e.vertices.map(a=>a.id),n={},o={};for(const a of t)n[a]=0,o[a]=[];for(const a of e.edges){if(!a.directed||a.endpoints.length!==2)continue;const[s,c]=a.endpoints;o[s].push(c),n[c]+=1}const r=[];for(const a of t)n[a]===0&&r.push(a);let i=0;for(;r.length>0;){const a=r.pop();if(a){i++;for(const s of o[a])n[s]-=1,n[s]===0&&r.push(s)}}return i===t.length},ae=e=>{const t={};for(const[o,r]of e.vertices.entries())t[r.id]=o;const n=Array.from({length:e.vertices.length},()=>0);for(const o of e.edges){if(o.endpoints.length!==2)continue;const[r,i]=o.endpoints;r!==i&&(n[t[r]]+=1,n[t[i]]+=1)}return n},st=e=>{const t=ee(e),n=new Map;for(const o of e.vertices){if(n.has(o.id))continue;const r=[o.id];for(n.set(o.id,0);r.length>0;){const i=r.shift();if(!i)break;const a=n.get(i);if(a===void 0)break;for(const s of t[i]??[])if(!n.has(s))n.set(s,a^1),r.push(s);else if(n.get(s)===a)return!1}}return!0},Le=e=>{if(e.vertices.length<=3)return!0;const t=e.vertices.map(s=>s.id),n=ee(e),o=new Set,r=[],i={};for(const s of t)i[s]=0;for(let s=0;s<t.length;s++){let c=-1,d=null;for(const l of t)!o.has(l)&&i[l]>c&&(c=i[l],d=l);if(d===null)break;o.add(d),r.push(d);for(const l of n[d]??[])o.has(l)||i[l]++}const a=new Map;for(let s=0;s<r.length;s++){const c=r[s],d=new Set;for(const l of n[c]??[])r.indexOf(l)<s&&d.add(l);a.set(c,d)}for(const[,s]of a){const c=[...s];for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++)if(!(n[c[d]]??[]).includes(c[l]))return!1}return!0},Xo=(e,t)=>{const n=e.vertices.map(a=>a.attrs?.[t.posKey]);if(!(n.length>0&&n.every(a=>typeof a=="object"&&a!=null)))return{kind:"abstract"};const r=n.map(a=>{const s=a,c=typeof s.x=="number",d=typeof s.y=="number",l=typeof s.z=="number";return c&&d&&l?3:c&&d?2:null});if(r.some(a=>a==null))return{kind:"abstract"};const i=it(r);return i.length===1?{kind:"spatial_coordinates",dims:i[0]}:{kind:"abstract"}},Yo=(e,t)=>{const n=e.vertices.filter(o=>o.attrs?.[t.rootKey]===!0);return n.length===1?{kind:"rooted"}:n.length>1?{kind:"multi_rooted"}:{kind:"unrooted"}},Zo=(e,t)=>{const n=e.vertices.map(c=>c.attrs?.[t.timeKey]),o=e.edges.map(c=>c.attrs?.[t.timeKey]),r=n.some(c=>c!=null),i=o.some(c=>c!=null),a=r&&n.every(c=>c==null||typeof c=="number"),s=i&&o.every(c=>c==null||typeof c=="number");return r&&i&&a&&s?{kind:"time_ordered"}:r?{kind:"temporal_vertices"}:i?{kind:"temporal_edges"}:{kind:"static"}},er=(e,t)=>{const n=[];for(const r of e.vertices){const i=r.attrs?.[t.layerKey];(typeof i=="string"||typeof i=="number")&&n.push(i)}for(const r of e.edges){const i=r.attrs?.[t.layerKey];(typeof i=="string"||typeof i=="number")&&n.push(i)}return it(n.map(String)).length>1?{kind:"multi_layer"}:{kind:"single_layer"}},tr=(e,t)=>e.edges.map(o=>o.attrs?.[t.edgeOrderKey]).every(o=>typeof o=="number")?{kind:"ordered"}:{kind:"unordered"},nr=(e,t)=>e.vertices.some(o=>o.attrs?.[t.portKey]!=null)?{kind:"port_labelled_vertices"}:{kind:"none"},or=e=>e.vertices.some(o=>o.attrs?.latent===!0)||e.edges.some(o=>o.attrs?.latent===!0)?{kind:"latent_or_inferred"}:e.vertices.some(o=>o.attrs?.observed===!1)||e.edges.some(o=>o.attrs?.observed===!1)?{kind:"partially_observed"}:{kind:"fully_specified"},rr=e=>e.vertices.some(o=>o.attrs?.exec===!0)||e.edges.some(o=>o.attrs?.exec===!0)?{kind:"executable"}:e.vertices.some(o=>typeof o.attrs?.fn=="string")||e.edges.some(o=>typeof o.attrs?.fn=="string")?{kind:"annotated_with_functions"}:{kind:"structural_only"},ir=e=>e.edges.some(r=>typeof r.attrs?.cost=="number")||e.vertices.some(r=>typeof r.attrs?.cost=="number")?{kind:"cost"}:e.edges.some(r=>typeof r.attrs?.utility=="number")||e.vertices.some(r=>typeof r.attrs?.utility=="number")?{kind:"utility"}:e.edges.some(r=>typeof r.weight=="number")||e.edges.some(r=>Array.isArray(r.attrs?.weightVector))?{kind:"metric"}:{kind:"none"},sr=e=>{if(!e.edges.every(r=>r.endpoints.length===2))return{kind:"incomplete"};const n=cr(e),o=e.vertices.length;if(o<=1)return{kind:"complete"};if(n.kind==="undirected"){const r=o*(o-1)/2,i=new Set;for(const a of e.edges.filter(s=>!s.directed&&s.endpoints.length===2))i.add(Je(a.endpoints[0],a.endpoints[1],!1));return i.size===r?{kind:"complete"}:{kind:"incomplete"}}if(n.kind==="directed"||n.kind==="bidirected"||n.kind==="antidirected"){const r=o*(o-1),i=new Set;for(const a of e.edges.filter(s=>s.directed&&s.endpoints.length===2))i.add(Je(a.endpoints[0],a.endpoints[1],!0));return i.size===r?{kind:"complete"}:{kind:"incomplete"}}return{kind:"incomplete"}},xn=e=>e.edges.every(n=>!n.directed&&n.endpoints.length===2)?st(e)?{kind:"bipartite"}:{kind:"unrestricted"}:{kind:"unrestricted"},ar=e=>{if(!e.edges.every(a=>!a.directed&&a.endpoints.length===2))return{kind:"unconstrained"};const n=e.vertices.length;if(n<=1)return{kind:"dense"};const o=e.edges.length,r=n*(n-1)/2,i=o/r;return i<=.1?{kind:"sparse"}:i>=.9?{kind:"dense"}:{kind:"unconstrained"}},cr=e=>{const t=$t(e),n=It(e);if(t&&n)return{kind:"mixed"};if(!t)return{kind:"undirected"};const o=e.edges.filter(s=>s.directed&&s.endpoints.length===2);if(o.length===0)return{kind:"directed"};const r=new Set(o.map(s=>`${s.endpoints[0]}->${s.endpoints[1]}`));return o.every(s=>r.has(`${s.endpoints[1]}->${s.endpoints[0]}`))?{kind:"bidirected"}:o.every(s=>{const c=`${s.endpoints[1]}->${s.endpoints[0]}`;return c!==`${s.endpoints[0]}->${s.endpoints[1]}`&&r.has(c)})&&o.length>0?{kind:"antidirected"}:{kind:"directed"}},dr=e=>{const t=e.edges.every(s=>!s.directed),n=e.edges.every(s=>s.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(Le(e))return{kind:"perfect"};const o=e.vertices.map(s=>s.id),r=ee(e),i={};for(const s of o)i[s]=[];for(const s of o)for(const c of o){if(s===c)continue;(r[s]??[]).includes(c)||i[s].push(c)}const a={vertices:e.vertices,edges:[]};for(const s of o)for(const c of i[s])s<c&&a.edges.push({id:`e_${s}_${c}`,endpoints:[s,c],directed:!1});return Le(a)?{kind:"perfect"}:{kind:"imperfect"}},Mn=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(Le(e)){const o=e.vertices.map(s=>s.id),r=ee(e),i={};for(const s of o)i[s]=[];for(const s of o)for(const c of o){if(s===c)continue;(r[s]??[]).includes(c)||i[s].push(c)}const a={vertices:e.vertices,edges:[]};for(const s of o)for(const c of i[s])s<c&&a.edges.push({id:`e_${s}_${c}`,endpoints:[s,c],directed:!1});if(Le(a))return{kind:"split"}}return{kind:"non_split"}},Sn=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=e.vertices.map(i=>i.id);if(o.length<4)return{kind:"cograph"};const r=ee(e);for(let i=0;i<o.length;i++)for(let a=i+1;a<o.length;a++)for(let s=a+1;s<o.length;s++)for(let c=s+1;c<o.length;c++){const d=[o[i],o[a],o[s],o[c]],l={};for(const w of d){l[w]=[];const C=r[w]??[];for(const x of C)d.includes(x)&&l[w].push(x)}const u=d[0],f=d[1],g=d[2],h=d[3],p=l[u].includes(f),m=l[f].includes(g),v=l[g].includes(h),y=l[u].includes(g),b=l[f].includes(h),k=l[u].includes(h);if(p&&m&&v&&!y&&!k&&!b)return{kind:"non_cograph"}}return{kind:"cograph"}},lr=e=>{const t=Mn(e),n=Sn(e);return t.kind==="unconstrained"||n.kind==="unconstrained"?{kind:"unconstrained"}:t.kind==="split"&&n.kind==="cograph"?{kind:"threshold"}:{kind:"non_threshold"}},ur=e=>{const t=e.edges.every(s=>!s.directed),n=e.edges.every(s=>s.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(Cn(e).kind==="unconstrained")return{kind:"unconstrained"};const r=ae(e),i=r.reduce((s,c)=>s+c,0)/r.length;return Math.max(...r)>i*3?{kind:"non_line_graph"}:{kind:"line_graph"}},Cn=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(e.vertices.length<4)return{kind:"claw_free"};const o=ee(e),r=e.vertices.map(i=>i.id);for(const i of r){const a=o[i]??[];if(!(a.length<3))for(let s=0;s<a.length;s++)for(let c=s+1;c<a.length;c++)for(let d=c+1;d<a.length;d++){const l=a[s],u=a[c],f=a[d],g=(o[l]??[]).length,h=(o[u]??[]).length,p=(o[f]??[]).length,m=(o[l]??[]).includes(u),v=(o[l]??[]).includes(f),y=(o[u]??[]).includes(f);if(g===1&&h===1&&p===1&&!m&&!v&&!y)return{kind:"has_claw"}}}return{kind:"claw_free"}},fr=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=ae(e);return o.length>0&&o.every(i=>i===3)?{kind:"cubic"}:{kind:"non_cubic"}},gr=(e,t)=>{if(!e.edges.every(i=>i.endpoints.length===2))return{kind:"unconstrained"};const o=ae(e);return o.length>0&&o.every(i=>i===t)?{kind:"k_regular",k:t}:{kind:"not_k_regular"}},hr=e=>{if(!e.edges.every(r=>r.endpoints.length===2))return{kind:"unconstrained"};const n=ae(e);return n.length>0&&n.every(r=>r===n[0])?{kind:"k_regular",k:n[0]}:{kind:"not_k_regular"}},pr=e=>{const t=e.edges.every(f=>!f.directed),n=e.edges.every(f=>f.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=ae(e);if(!(o.length>0&&o.every(f=>f===o[0])))return{kind:"not_strongly_regular"};const i=o[0],a=ee(e),s=e.vertices.map(f=>f.id);let c=-1,d=!0;for(let f=0;f<s.length&&d;f++)for(let g=f+1;g<s.length;g++){const h=s[f],p=s[g];if((a[h]??[]).includes(p)){const m=new Set(a[h]),v=(a[p]??[]).filter(y=>m.has(y)).length;c===-1?c=v:c!==v&&(d=!1)}}let l=-1,u=!0;for(let f=0;f<s.length&&u;f++)for(let g=f+1;g<s.length;g++){const h=s[f],p=s[g];if(!(a[h]??[]).includes(p)){const m=new Set(a[h]),v=(a[p]??[]).filter(y=>m.has(y)).length;l===-1?l=v:l!==v&&(u=!1)}}return d&&u?{kind:"strongly_regular",k:i,lambda:c,mu:l}:{kind:"not_strongly_regular"}},mr=e=>{const t=e.edges.every(d=>!d.directed),n=e.edges.every(d=>d.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=e.vertices.length;if(o===0)return{kind:"self_complementary"};if(o%4!==0&&o%4!==1)return{kind:"not_self_complementary"};const r=o*(o-1)/2;if(e.edges.length!==r/2)return{kind:"not_self_complementary"};const i=ae(e),a=i.map(d=>o-1-d);a.sort((d,l)=>d-l);const s=[...i].sort((d,l)=>d-l);if(!(s.length===a.length&&s.every((d,l)=>d===a[l])))return{kind:"not_self_complementary"};if(o<=8){const d=e.vertices.map(p=>p.id),l=ee(e),u=[];for(let p=0;p<d.length;p++)for(let m=p+1;m<d.length;m++)(l[d[p]]??[]).includes(d[m])||u.push({id:`e_${p}_${m}`,endpoints:[d[p],d[m]],directed:!1});const f={vertices:e.vertices,edges:u};return ae(f).sort((p,m)=>p-m).every((p,m)=>p===s[m])?{kind:"self_complementary"}:{kind:"not_self_complementary"}}return{kind:"unconstrained"}},vr=e=>{const t=e.edges.every(i=>!i.directed),n=e.edges.every(i=>i.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};const o=ae(e);return o.every(i=>i===o[0])?e.vertices.length<=6?{kind:"vertex_transitive"}:{kind:"unconstrained"}:{kind:"not_vertex_transitive"}},yr=e=>{if(xn(e).kind!=="bipartite")return{kind:"not_complete_bipartite"};if(!e.edges.every(l=>l.endpoints.length===2))return{kind:"unconstrained"};const o=ee(e),r=new Map;for(const l of e.vertices){if(r.has(l.id))continue;const u=[l.id];for(r.set(l.id,0);u.length>0;){const f=u.shift();if(!f)break;const g=r.get(f);if(g===void 0)break;for(const h of o[f]??[])r.has(h)||(r.set(h,g^1),u.push(h))}}let i=0,a=0;for(const l of r.values())l===0?i++:a++;const s=e.vertices.filter(l=>r.get(l.id)===0).map(l=>l.id),c=e.vertices.filter(l=>r.get(l.id)===1).map(l=>l.id),d=i*a;if(e.edges.length===d){const l=new Set;for(const f of e.edges){const[g,h]=f.endpoints;l.add(`${g}_${h}`),l.add(`${h}_${g}`)}let u=!0;for(const f of s)for(const g of c)if(!l.has(`${f}_${g}`)){u=!1;break}if(u)return{kind:"complete_bipartite",m:i,n:a}}return{kind:"not_complete_bipartite"}},br=e=>e.edges.every(n=>!n.directed&&n.endpoints.length===2)?Oe(e)?{kind:"connected"}:{kind:"unconstrained"}:{kind:"unconstrained"},kr=e=>{const t=e.edges.length>0&&e.edges.every(o=>o.directed&&o.endpoints.length===2),n=e.edges.length>0&&e.edges.every(o=>!o.directed&&o.endpoints.length===2);return t?wn(e)?{kind:"acyclic"}:{kind:"cycles_allowed"}:n?e.edges.length<e.vertices.length?{kind:"acyclic"}:{kind:"cycles_allowed"}:{kind:"cycles_allowed"}},wr=e=>{if(!e.edges.every(o=>o.endpoints.length===2))return{kind:"unconstrained"};const n=ae(e);return n.length>0&&new Set(n).size===1?{kind:"regular",degree:n[0]}:{kind:"degree_sequence",sequence:n}},xr=e=>({kind:"finite",n:e.vertices.length}),Mr=e=>{const t=e.vertices.map(n=>n.id);return new Set(t).size===t.length?{kind:"distinguishable"}:{kind:"indistinguishable"}},Sr=(e,t)=>{const n=e.vertices.map(r=>r.attrs?.[t.vertexOrderKey]);if(!n.every(r=>typeof r=="number"))return{kind:"unordered"};const o=n;return new Set(o).size===o.length?{kind:"total_order"}:{kind:"partial_order"}},Cr=e=>{if(e.edges.length===0)return{kind:"binary"};const t=e.edges.map(o=>o.endpoints.length);if(t.every(o=>o===2))return{kind:"binary"};if(He(t,(o,r)=>o===r))return{kind:"k_ary",k:t[0]};throw new Error(`Mixed edge arity cannot be represented as a single EdgeArity: ${it(t).join(", ")}`)},at=e=>{const t=new Set;for(const n of e.edges)if(n.endpoints.length===2){const[o,r]=n.endpoints,i=Je(o,r,n.directed);if(t.has(i))return{kind:"multi"};t.add(i)}else{const o=`H:${[...n.endpoints].sort().join("|")}`;if(t.has(o))return{kind:"multi"};t.add(o)}return{kind:"simple"}},_r=e=>Pt(e)>0?{kind:"allowed"}:{kind:"disallowed"},Nr=e=>{const t=$t(e),n=It(e);if(t&&n)return{kind:"mixed"};if(!t)return{kind:"undirected"};const o=e.edges.filter(s=>s.directed&&s.endpoints.length===2);if(o.length===0)return{kind:"directed"};const r=new Set(o.map(s=>`${s.endpoints[0]}->${s.endpoints[1]}`));return o.every(s=>r.has(`${s.endpoints[1]}->${s.endpoints[0]}`))?{kind:"bidirected"}:o.every(s=>{const c=`${s.endpoints[1]}->${s.endpoints[0]}`;return c!==`${s.endpoints[0]}->${s.endpoints[1]}`&&r.has(c)})&&o.length>0?{kind:"antidirected"}:{kind:"directed"}},Er=(e,t)=>e.edges.length===0?{kind:"unweighted"}:e.edges.every(o=>typeof o.weight=="number")?{kind:"weighted_numeric"}:{kind:"unweighted"},$r=e=>e.edges.some(n=>n.sign===-1||n.sign===1)?{kind:"signed"}:{kind:"unsigned"},Ir=(e,t)=>e.edges.some(o=>typeof o.probability=="number")||e.edges.some(o=>typeof o.attrs?.[t.probabilityKey]=="number")?{kind:"probabilistic"}:{kind:"deterministic"},Pr=e=>{const t=e.vertices.some(o=>o.attrs&&Object.keys(o.attrs).length>0),n=e.vertices.some(o=>typeof o.label=="string"&&o.label.length>0);return t?{kind:"attributed"}:n?{kind:"labelled"}:{kind:"unlabelled"}},Dr=e=>{const t=e.edges.some(o=>o.attrs&&Object.keys(o.attrs).length>0),n=e.edges.some(o=>typeof o.label=="string"&&o.label.length>0);return t?{kind:"attributed"}:n?{kind:"labelled"}:{kind:"unlabelled"}},Tr=e=>{const t=e.vertices.map(i=>Object.keys(i.attrs??{}).sort().join("|")),n=e.edges.map(i=>Object.keys(i.attrs??{}).sort().join("|")),o=He(t,(i,a)=>i===a),r=He(n,(i,a)=>i===a);return o&&r?{kind:"homogeneous"}:{kind:"heterogeneous"}},_n=e=>{if(!e.edges.every(c=>c.endpoints.length===2))return{kind:"unconstrained"};if(e.vertices.length>10)return{kind:"unconstrained"};const n=e.vertices.length;if(n<3)return{kind:"non_hamiltonian"};const o=ee(e),r=ae(e);if(Math.min(...r)<2)return{kind:"non_hamiltonian"};const i=new Set,a=[],s=(c,d)=>{if(i.add(c),a.push(c),a.length===n)return(o[c]??[]).includes(d)?!0:(a.pop(),i.delete(c),!1);const l=o[c]??[];for(const u of l)if(!i.has(u)&&s(u,d))return!0;return a.pop(),i.delete(c),!1};for(const c of e.vertices)if(a.length=0,i.clear(),s(c.id,c.id))return{kind:"hamiltonian"};return{kind:"non_hamiltonian"}},Ar=e=>{if(_n(e).kind==="hamiltonian")return{kind:"traceable"};if(e.vertices.length>10)return{kind:"unconstrained"};const n=ee(e),o=e.vertices.length;if(o<2)return{kind:"non_traceable"};const r=new Set,i=a=>{if(r.add(a),r.size===o)return!0;const s=n[a]??[];for(const c of s)if(!r.has(c)&&i(c))return!0;return r.delete(a),!1};for(const a of e.vertices)if(r.clear(),i(a.id))return{kind:"traceable"};return{kind:"non_traceable"}},Rr=e=>{const t=e.edges.every(u=>!u.directed),n=e.edges.every(u=>u.endpoints.length===2);if(!t||!n)return{kind:"not_scale_free"};if(e.vertices.length<10)return{kind:"not_scale_free"};const o=ae(e),r={};for(const u of o)r[u]=(r[u]||0)+1;delete r[0];const i=Object.keys(r).map(Number).sort((u,f)=>u-f);if(i.length<2)return{kind:"not_scale_free"};const a=Math.min(...i);let s=0;for(const u of i)s+=r[u];if(s<5)return{kind:"not_scale_free"};const c=[];for(const u of i)if(u>=a){const f=r[u]/s;c.push(Math.log(f)+Math.log(u))}const d=c.reduce((u,f)=>u+f,0)/c.length;if(c.reduce((u,f)=>u+(f-d)**2,0)/c.length<2){const u=1+d;return{kind:"scale_free",exponent:Math.round(u*100)/100}}return{kind:"not_scale_free"}},Fr=e=>{const t=e.edges.every(p=>!p.directed),n=e.edges.every(p=>p.endpoints.length===2);if(!t||!n)return{kind:"unconstrained"};if(!Oe(e))return{kind:"unconstrained"};if(e.vertices.length<3)return{kind:"unconstrained"};const o=ee(e);let r=0,i=0;for(const p of e.vertices){const m=o[p.id]??[],v=m.length;if(!(v<2)){i+=v*(v-1)/2;for(let y=0;y<v;y++)for(let b=y+1;b<v;b++){const k=m[y],w=m[b];(o[k]??[]).includes(w)&&r++}}}const a=i>0?3*r/i:0;let s=0,c=0;for(const p of e.vertices){const m={[p.id]:0},v=[p.id];for(;v.length>0;){const y=v.shift();if(!y)break;const b=m[y];for(const k of o[y]??[])k in m||(m[k]=b+1,v.push(k),s+=b+1,c++)}}const d=c>0?s/c:0,l=e.vertices.length,u=e.edges.length/(l*(l-1)/2),f=Math.log(l)/Math.log(1/(1-u)),g=a>u*2,h=d<=f*1.5;return g&&h?{kind:"small_world"}:{kind:"not_small_world"}},jr=(e,t)=>{const n=e.edges.every(d=>!d.directed),o=e.edges.every(d=>d.endpoints.length===2);if(!n||!o)return{kind:"unconstrained"};if(e.vertices.length<4)return{kind:"unconstrained"};const r=new Map;let i=!0;for(const d of e.vertices){const l=d.attrs?.[t.layerKey];if(!l){i=!1;break}r.set(l,(r.get(l)||0)+1)}if(i&&r.size>1)return{kind:"modular",numCommunities:r.size};const a=ee(e),s=new Set;let c=0;for(const d of e.vertices){if(s.has(d.id))continue;const l=[d.id];for(s.add(d.id);l.length>0;){const u=l.shift();if(!u)break;for(const f of a[u]??[])s.has(f)||(s.add(f),l.push(f))}c++}return c>1?{kind:"modular",numCommunities:c}:{kind:"non_modular"}},qe=(e,t={})=>{const n={...Pe,...t};return{vertexCardinality:xr(e),vertexIdentity:Mr(e),vertexOrdering:Sr(e,n),edgeArity:Cr(e),edgeMultiplicity:at(e),selfLoops:_r(e),directionality:Nr(e),weighting:Er(e),signedness:$r(e),uncertainty:Ir(e,n),vertexData:Pr(e),edgeData:Dr(e),schema:Tr(e),connectivity:br(e),cycles:kr(e),degreeConstraint:wr(e),completeness:sr(e),partiteness:xn(e),density:ar(e),embedding:Xo(e,n),rooting:Yo(e,n),temporal:Zo(e,n),layering:er(e,n),edgeOrdering:tr(e,n),ports:nr(e,n),observability:or(e),operationalSemantics:rr(e),measureSemantics:ir(e),scaleFree:Rr(e),smallWorld:Fr(e),communityStructure:jr(e,n),hamiltonian:_n(e),traceable:Ar(e),perfect:dr(e),split:Mn(e),cograph:Sn(e),threshold:lr(e),line:ur(e),clawFree:Cn(e),cubic:fr(e),specificRegular:hr(e),stronglyRegular:pr(e),selfComplementary:mr(e),vertexTransitive:vr(e),completeBipartite:yr(e)}},Lr=(e,t,n={})=>{const o={...Pe,...n};return r=>{const i=qe(r,o);return Nn(i[e],t)}},H=(e,t,n={})=>{const o={...Pe,...n};return r=>qe(r,o)[e].kind===t},ct=(e,t={})=>{const n={...Pe,...t};return o=>{const r=qe(o,n);for(const i of Object.keys(e)){const a=r[i],s=e[i];if(!Nn(a,s))return!1}return!0}},Nn=(e,t)=>{if(e.kind!==t.kind||"k"in e&&"k"in t&&e.k!==t.k||"n"in e&&"n"in t&&e.n!==t.n||"degree"in e&&"degree"in t&&e.degree!==t.degree||"dims"in e&&"dims"in t&&e.dims!==t.dims)return!1;if("sequence"in e&&"sequence"in t){const n=e,o=t;if(n.sequence.length!==o.sequence.length)return!1;for(let r=0;r<n.sequence.length;r++)if(n.sequence[r]!==o.sequence[r])return!1}return!0},zr=e=>{if(e.vertices.length<3)return!0;if(!(at(e).kind==="simple"))return!1;const n=e.vertices.length,o=e.edges.length;return!(o>3*n-6||st(e)&&o>2*n-4)},Dt=e=>{if(e.vertices.length<=3)return!0;const t=e.vertices.map(s=>s.id),n=ee(e),o=new Set,r=[],i={};for(const s of t)i[s]=0;for(let s=0;s<t.length;s++){let c=-1,d=null;for(const l of t)!o.has(l)&&i[l]>c&&(c=i[l],d=l);if(d===null)break;o.add(d),r.push(d);for(const l of n[d]??[])o.has(l)||i[l]++}const a=new Map;for(let s=0;s<r.length;s++){const c=r[s],d=new Set;for(const l of n[c]??[])r.indexOf(l)<s&&d.add(l);a.set(c,d)}for(const[,s]of a){const c=[...s];for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++)if(!(n[c[d]]??[]).includes(c[l]))return!1}return!0},Br=e=>{if(!Dt(e))return!1;const t=ee(e),n=new Set;for(const o of e.vertices){if(n.has(o.id))continue;const r=new Set([o.id]);let i=!0;for(;i;){i=!1;for(const a of e.vertices){if(r.has(a.id))continue;[...r].every(c=>(t[c]??[]).includes(a.id))&&(r.add(a.id),i=!0)}}for(const a of r)n.add(a)}return!0},Or=(e,t)=>{for(const i of e.vertices){const a=i.attrs?.[t.posKey];if(!a||typeof a.x!="number"||typeof a.y!="number")return!1}const n=new Map;for(const i of e.vertices){const a=i.attrs?.[t.posKey];if(!a)return!1;n.set(i.id,a)}let o=0;for(const i of e.edges){if(i.endpoints.length!==2)continue;const[a,s]=i.endpoints,c=n.get(a),d=n.get(s);if(!c||!d)continue;const l=Math.hypot(c.x-d.x,c.y-d.y);o=Math.max(o,l)}const r=o;for(let i=0;i<e.vertices.length;i++)for(let a=i+1;a<e.vertices.length;a++){const s=e.vertices[i].id,c=e.vertices[a].id,d=e.edges.some(g=>{if(g.endpoints.length!==2)return!1;const[h,p]=g.endpoints;return h===s&&p===c||h===c&&p===s}),l=n.get(s),u=n.get(c);if(!l||!u)continue;const f=Math.hypot(l.x-u.x,l.y-u.y);if(d&&f>r||!d&&f<=r)return!1}return!0},qr=e=>{const t=e.vertices.map(r=>r.id),n=ee(e),o={};for(const r of t)o[r]=[];for(const r of t)for(const i of t){if(r===i)continue;(n[r]??[]).includes(i)||o[r].push(i)}return!0},En=e=>{if(e.vertices.length<=2)return!0;const t=e.vertices.map(s=>s.id),n=ee(e),o=new Set;for(const s of e.edges){if(s.endpoints.length!==2)continue;const[c,d]=s.endpoints;o.add(`${c}-${d}`),o.add(`${d}-${c}`)}const r=(s,c)=>o.has(`${s}-${c}`),i={};for(const s of t){i[s]={};for(const c of t)i[s][c]=0}const a=(s,c)=>{if(i[s][c]===1)return!0;if(i[s][c]===-1)return!1;i[s][c]=1,i[c][s]=-1;for(const d of n[c]??[])if(d!==s&&i[c][d]===1&&r(s,d)&&!a(s,d))return!1;for(const d of n[s]??[])if(d!==c&&i[d][s]===1&&r(d,c)&&!a(d,c))return!1;return!0};for(const s of t)for(const c of n[s]??[])if(!(s>=c)&&i[s][c]===0&&!a(s,c))return!1;return!0},Ur=e=>ct({directionality:{kind:"undirected"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},cycles:{kind:"acyclic"},connectivity:{kind:"connected"}})(e),Gr=e=>ct({directionality:{kind:"undirected"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},cycles:{kind:"acyclic"}})(e),Wr=e=>ct({directionality:{kind:"directed"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},cycles:{kind:"acyclic"}})(e),Vr=e=>H("partiteness","bipartite")(e),Kr=e=>H("completeness","complete")(e),Hr=e=>H("density","sparse")(e),Jr=e=>H("density","dense")(e),Qr=e=>H("degreeConstraint","regular")(e),Xr=e=>H("connectivity","connected")(e),Yr=e=>{if(!e.edges.every(o=>o.endpoints.length===2))return!1;const n=qe(e);if(n.directionality.kind==="undirected"){const o=ae(e);return o.length>0&&o.every(r=>r%2===0)}if(n.directionality.kind==="directed"){const o=e.vertices.map(c=>c.id),r={},i={};for(const c of o)r[c]=0,i[c]=0;for(const c of e.edges)if(c.endpoints.length===2){const[d,l]=c.endpoints;i[d]=(i[d]||0)+1,r[l]=(r[l]||0)+1}if(!o.every(c=>r[c]===i[c]))return!1;if(!e.edges.every(c=>!c.directed&&c.endpoints.length===2)){const c=e.edges.map(l=>({...l,directed:!1})),d={vertices:e.vertices,edges:c};return Oe(d)}return!1}return!1},Zr=e=>{const t=e.edges.every(d=>!d.directed),n=e.edges.every(d=>d.endpoints.length===2),o=at(e).kind==="simple",r=Pt(e)===0;if(!t||!n||!o||!r||!Oe(e)||e.edges.length!==e.vertices.length-1)return!1;const i=ae(e),a=e.vertices.length,s=i.filter(d=>d===a-1).length,c=i.filter(d=>d===1).length;return s===1&&c===a-1},ei=e=>{const t=e.edges.every(r=>!r.directed),n=e.edges.every(r=>r.endpoints.length===2),o=at(e).kind==="simple";return!t||!n||!o?!1:zr(e)},ti=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:Dt(e)},ni=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:Br(e)},oi=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:qr(e)},ri=e=>{const t={...Pe},n=e.edges.every(r=>!r.directed),o=e.edges.every(r=>r.endpoints.length===2);return!n||!o?!1:Or(e,t)},ii=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:En(e)},si=e=>H("scaleFree","scale_free")(e),ai=e=>H("smallWorld","small_world")(e),ci=e=>H("communityStructure","modular")(e),di=e=>H("hamiltonian","hamiltonian")(e),li=e=>H("traceable","traceable")(e),ui=e=>{const t=e.edges.every(o=>!o.directed),n=e.edges.every(o=>o.endpoints.length===2);return!t||!n?!1:st(e)||Dt(e)||En(e)?!0:H("perfect","perfect")(e)},fi=e=>H("split","split")(e),gi=e=>H("cograph","cograph")(e),hi=e=>H("threshold","threshold")(e),pi=e=>H("line","line_graph")(e),mi=e=>H("clawFree","claw_free")(e),vi=e=>H("cubic","cubic")(e),yi=e=>t=>gr(t,e).kind==="k_regular",bi=e=>H("stronglyRegular","strongly_regular")(e),ki=e=>H("selfComplementary","self_complementary")(e),wi=e=>H("vertexTransitive","vertex_transitive")(e),xi=e=>H("completeBipartite","complete_bipartite")(e),Tt=e=>{const t=[];if(e.completeness.kind==="complete"&&e.connectivity.kind==="unconstrained"&&t.push({property:"connectivity/completeness",reason:"Complete graphs are inherently connected (every node reachable from every other)",severity:"error"}),e.completeness.kind==="complete"&&e.cycles.kind==="acyclic"&&t.push({property:"completeness/cycles",reason:"Complete graphs contain cycles (n*(n-1) edges creates many cycles)",severity:"error"}),e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&e.connectivity.kind==="unconstrained"&&t.push({property:"edgeMultiplicity/cycles/connectivity",reason:"Forests (acyclic disconnected graphs) are inherently simple; parallel edges either create cycles or are redundant",severity:"warning"}),e.cycles.kind==="acyclic"&&e.connectivity.kind==="unconstrained"&&e.density.kind==="sparse"&&t.push({property:"cycles/density/connectivity",reason:"Forest minimum density may exceed sparse threshold depending on component structure",severity:"warning"}),e.directionality.kind==="undirected"&&e.cycles.kind==="acyclic"&&e.connectivity.kind==="connected"&&e.density.kind!=="unconstrained"&&t.push({property:"cycles/density",reason:"Trees have exactly n-1 edges, which may not match specified density",severity:"warning"}),e.cycles.kind==="acyclic"&&e.selfLoops.kind==="allowed"&&e.directionality.kind==="directed"&&t.push({property:"cycles/selfLoops",reason:"Self-loops create cycles in directed graphs",severity:"error"}),e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&e.connectivity.kind==="connected"&&e.directionality.kind==="undirected"&&t.push({property:"edgeMultiplicity/cycles/connectivity/directionality",reason:"Undirected connected acyclic graphs are trees (n-1 edges, no parallel edges). Multigraphs require parallel edges which would create cycles.",severity:"error"}),e.directionality.kind==="undirected"&&e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&t.push({property:"edgeMultiplicity/cycles/directionality",reason:"Undirected acyclic graphs (forests and trees) cannot have parallel edges. Adding parallel edges would create cycles.",severity:"error"}),e.directionality.kind==="directed"&&e.edgeMultiplicity.kind==="multi"&&e.cycles.kind==="acyclic"&&t.push({property:"edgeMultiplicity/cycles/directionality",reason:"Directed acyclic graphs with parallel edges require careful design to avoid cycles",severity:"warning"}),e.partiteness?.kind==="bipartite"&&e.cycles.kind==="cycles_allowed"&&e.directionality.kind==="undirected"&&t.push({property:"partiteness/cycles",reason:"Bipartite graphs cannot contain odd-length cycles (all cycles in bipartite graphs have even length)",severity:"warning"}),e.embedding?.kind==="planar"&&e.completeness.kind==="complete"&&t.push({property:"embedding/completeness",reason:"Complete graphs with n ≥ 5 are non-planar (K5 is Kuratowski's first graph)",severity:"error"}),e.embedding?.kind==="planar"&&e.completeBipartite?.kind==="complete_bipartite"){const{m:n,n:o}=e.completeBipartite;n>=3&&o>=3&&t.push({property:"embedding/completeBipartite",reason:`K${n},${o} is non-planar when m,n ≥ 3 (K3,3 is Kuratowski's second graph)`,severity:"error"})}if(e.kVertexConnected?.kind==="k_vertex_connected"){const{k:n}=e.kVertexConnected;t.push({property:"kVertexConnected/nodeCount",reason:`k-vertex-connected graphs require at least ${n+1} vertices (will be validated during generation)`,severity:"warning"})}if(e.kEdgeConnected?.kind==="k_edge_connected"){const{k:n}=e.kEdgeConnected;t.push({property:"kEdgeConnected/nodeCount",reason:`k-edge-connected graphs require at least ${n+1} vertices (will be validated during generation)`,severity:"warning"})}if(e.perfectMatching?.kind==="perfect_matching"&&e.edgeMultiplicity.kind==="simple"&&t.push({property:"perfectMatching/vertexCount",reason:"Simple graphs with odd vertex count cannot have perfect matching (will be validated during generation)",severity:"warning"}),e.kColorable?.kind==="k_colorable"&&e.chromaticNumber?.kind==="chromatic_number"){const{k:n}=e.kColorable,{chi:o}=e.chromaticNumber;o>n&&t.push({property:"kColorable/chromaticNumber",reason:`Graph cannot be ${n}-colorable if chromatic number is ${o} (chi > k)`,severity:"error"})}if(e.embedding?.kind==="planar"&&e.treewidth?.kind==="treewidth"){const{width:n}=e.treewidth;n>4&&t.push({property:"embedding/treewidth",reason:`Planar graphs have treewidth ≤ 4, but spec requires treewidth ${n}`,severity:"error"})}if(e.tournament?.kind==="tournament"&&e.directionality.kind==="undirected"&&t.push({property:"tournament/directionality",reason:"Tournament graphs are complete oriented graphs (must be directed)",severity:"error"}),e.tournament?.kind==="tournament"&&e.completeness.kind==="complete"&&t.push({property:"tournament/completeness",reason:"Tournament graphs are inherently complete (one directed edge between each vertex pair)",severity:"warning"}),e.comparability?.kind==="comparability"&&e.perfect?.kind==="imperfect"&&t.push({property:"comparability/perfect",reason:"Comparability graphs are perfect (cannot be imperfect)",severity:"error"}),e.interval?.kind==="interval"&&(e.chordal?.kind==="non_chordal"&&t.push({property:"interval/chordal",reason:"Interval graphs are chordal (cannot be non-chordal)",severity:"error"}),e.perfect?.kind==="imperfect"&&t.push({property:"interval/perfect",reason:"Interval graphs are perfect (cannot be imperfect)",severity:"error"})),e.chordal?.kind==="chordal"&&e.perfect?.kind==="imperfect"&&t.push({property:"chordal/perfect",reason:"Chordal graphs are perfect (cannot be imperfect)",severity:"error"}),e.partiteness?.kind==="bipartite"&&e.kColorable?.kind==="k_colorable"){const{k:n}=e.kColorable;n<2&&t.push({property:"partiteness/kColorable",reason:`Bipartite graphs are 2-colorable, but spec requires ${n}-colorable (k < 2)`,severity:"error"})}return e.star?.kind==="star"&&e.cycles.kind==="cycles_allowed"&&t.push({property:"star/cycles",reason:"Star graphs are trees (cannot have cycles)",severity:"error"}),(e.binaryTree?.kind==="binary_tree"||e.binaryTree?.kind==="full_binary"||e.binaryTree?.kind==="complete_binary")&&e.cycles.kind==="cycles_allowed"&&t.push({property:"binaryTree/cycles",reason:"Binary trees are trees (cannot have cycles)",severity:"error"}),(e.eulerian?.kind==="eulerian"||e.eulerian?.kind==="semi_eulerian")&&t.push({property:"eulerian/degree",reason:"Eulerian graphs require specific degree constraints (validated during generation)",severity:"warning"}),e.flowNetwork?.kind==="flow_network"&&e.directionality.kind==="undirected"&&t.push({property:"flowNetwork/directionality",reason:"Flow networks require directed edges (to define source → sink flow)",severity:"error"}),t},Mi=e=>Tt(e).some(n=>n.severity==="error"),Si=e=>{const t={},n=Tt(e);for(const o of n)o.severity==="warning"&&(o.property.includes("edgeMultiplicity/cycles")&&(t.skipCycleValidation=!0),o.property.includes("cycles/density/connectivity")&&(t.relaxDensityValidation=!0),o.property.includes("cycles/density")&&(t.relaxDensityValidation=!0));return t},Ue=e=>{const t=e.filter(o=>o.partition==="left"),n=e.filter(o=>o.partition==="right");return{left:t,right:n}},ke=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Ci=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);for(const a of r)for(const s of i)ke(t,a.id,s.id,n,o)},kt=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;const a=r[0],s=i[0];ke(t,a.id,s.id,n,o);const c=new Set([a.id,s.id]),d=[...r.slice(1),...i.slice(1)];for(const l of d){const f=(l.partition==="left"?i:r).filter(g=>c.has(g.id));if(f.length>0){const g=o.choice(f);ke(t,l.id,g.id,n,o),c.add(l.id)}}},en=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;kt(e,t,n,o);const a=Math.min(r.length,i.length),s=Math.max(0,a-1);for(let c=0;c<s;c++){const d=o.choice(r),l=o.choice(i);n.edgeMultiplicity.kind==="simple"&&t.some(f=>f.source===d.id&&f.target===l.id||n.directionality.kind==="undirected"&&f.source===l.id&&f.target===d.id)||ke(t,d.id,l.id,n,o)}},tn=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;const a=Math.max(2,Math.floor(Math.sqrt(e.length))),s=Math.ceil(e.length/a);for(let c=0;c<a;c++){const d=c*s,l=Math.min(d+s,e.length),u=e.slice(d,l);if(u.length<2)continue;const f=u.filter(m=>m.partition==="left"),g=u.filter(m=>m.partition==="right");if(f.length===0||g.length===0)continue;ke(t,f[0].id,g[0].id,n,o);const h=new Set([f[0].id,g[0].id]),p=[...f.slice(1),...g.slice(1)];for(const m of p){const y=(m.partition==="left"?g:f).filter(b=>h.has(b.id));if(y.length>0){const b=o.choice(y);ke(t,m.id,b.id,n,o),h.add(m.id)}}}},nn=(e,t,n,o)=>{const{left:r,right:i}=Ue(e);if(r.length===0||i.length===0)return;const a=2+Math.floor(o.next()*3),s=Math.ceil(e.length/a);for(let c=0;c<a;c++){const d=c*s,l=Math.min(d+s,e.length),u=e.slice(d,l),f=u.filter(y=>y.partition==="left"),g=u.filter(y=>y.partition==="right");if(f.length===0||g.length===0)continue;const h=new Set,p=f[0],m=g[0];ke(t,p.id,m.id,n,o),h.add(p.id),h.add(m.id);for(const y of[...f.slice(1),...g.slice(1)]){const k=(y.partition==="left"?g:f).filter(w=>h.has(w.id));if(k.length>0){const w=o.choice(k);ke(t,y.id,w.id,n,o),h.add(y.id)}}const v=Math.floor(o.next()*f.length);for(let y=0;y<v;y++){const b=o.choice(f),k=o.choice(g);n.edgeMultiplicity.kind==="simple"&&t.some(C=>C.source===b.id&&C.target===k.id||n.directionality.kind==="undirected"&&C.source===k.id&&C.target===b.id)||ke(t,b.id,k.id,n,o)}}},X=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},_i=(e,t,n,o,r,i)=>{const a=e.length,s=e.find(g=>g.id===o),c=e.find(g=>g.id===r);if(!s)throw new Error(`Source node '${o}' not found in nodes`);if(!c)throw new Error(`Sink node '${r}' not found in nodes`);if(o===r)throw new Error("Source and sink must be different nodes");const d=new Set(e.filter(g=>g.id!==o&&g.id!==r).map(g=>g.id)),l=.5+i.next()*.25;for(const g of d)i.next()<l&&t.push({source:o,target:g,weight:Math.floor(i.next()*10)+1});const u=[...d];if(u.length>1)for(let g=0;g<u.length;g++){const h=u[g],p=Math.floor(i.next()*2)+1;for(let m=1;m<=p;m++){const v=(g+m)%u.length,y=u[v];i.next()<.7&&t.push({source:h,target:y,weight:Math.floor(i.next()*10)+1})}}const f=.5+i.next()*.25;for(const g of d)i.next()<f&&t.push({source:g,target:r,weight:Math.floor(i.next()*10)+1});if(i.next()<.3&&t.push({source:o,target:r,weight:Math.floor(i.next()*20)+10}),t.length<a-1){for(const g of d)if(!t.some(p=>p.source===o&&p.target===g)&&(t.push({source:o,target:g,weight:Math.floor(i.next()*10)+1}),t.length>=a-1))break}},Ni=(e,t,n,o)=>{const r=e.length;if(r<2)return;const i=n.eulerian?.kind==="semi_eulerian";for(let l=0;l<r;l++){const u=e[l].id,f=e[(l+1)%r].id;X(t,u,f,n,o)}if(i&&t.length>0){const l=o.choice(t),u=t.indexOf(l);u!==-1&&t.splice(u,1)}const a=new Set(t.map(l=>n.directionality.kind==="directed"?`${l.source}→${l.target}`:[l.source,l.target].sort().join("-"))),s=new Map;for(const l of e)s.set(l.id,0);for(const l of t)s.set(l.source,(s.get(l.source)||0)+1),n.directionality.kind==="undirected"&&s.set(l.target,(s.get(l.target)||0)+1);const c=r*2;let d=0;for(;d<c;){d++;const l=o.choice(e).id,u=o.choice(e).id;if(l===u)continue;const f=n.directionality.kind==="directed"?`${l}→${u}`:[l,u].sort().join("-");if(n.edgeMultiplicity.kind==="simple"&&a.has(f))continue;const g=s.get(l)||0,h=s.get(u)||0;if(n.directionality.kind==="undirected"){const m=[...s.values()].filter(y=>y%2===1).length+(g%2===0?1:-1)+(h%2===0?1:-1);(i?m===2:m===0)&&(X(t,l,u,n,o),s.set(l,g+1),s.set(u,h+1),a.add(f))}else break}},Ei=(e,t,n,o,r)=>{const i=e.length;if(i<o+1)throw new Error(`k-vertex-connected graph requires at least ${o+1} vertices (got n=${i}, k=${o})`);const a=Math.min(o+1,i);for(let s=0;s<a;s++)for(let c=s+1;c<a;c++)X(t,e[s].id,e[c].id,n,r);for(let s=a;s<i;s++){const c=e[s].id,d=e.slice(0,s),l=Math.min(o,d.length),u=[...d];for(let f=u.length-1;f>0;f--){const g=r.integer(0,f);[u[f],u[g]]=[u[g],u[f]]}for(let f=0;f<l;f++)X(t,c,u[f].id,n,r)}},$i=(e,t,n,o,r)=>{const i=e.length;if(i<o+1)throw new Error(`k-edge-connected graph requires at least ${o+1} vertices (got n=${i}, k=${o})`);if(n.directionality.kind==="directed"){for(let l=0;l<i;l++){const u=e[l].id,f=e[(l+1)%i].id;X(t,u,f,n,r)}for(let l=0;l<i;l++){const u=e[l].id;for(let f=0;f<o-1;f++){const g=(l+f+2)%i,h=e[g].id;X(t,u,h,n,r)}}return}for(let l=0;l<i;l++){const u=e[l].id,f=e[(l+1)%i].id;X(t,u,f,n,r)}const a=new Map;for(const l of e)a.set(l.id,2);const s=new Set(t.map(l=>[l.source,l.target].sort().join("-"))),c=i*o*2;let d=0;for(;d<c;){d++;const l=[...a.entries()].filter(([p,m])=>m<o).map(([p,m])=>p);if(l.length===0)break;const u=r.choice(l),f=e.filter(p=>p.id!==u);if(f.length===0)break;const g=r.choice(f).id,h=[u,g].sort().join("-");s.has(h)||(X(t,u,g,n,r),s.add(h),a.set(u,(a.get(u)||0)+1),a.set(g,(a.get(g)||0)+1))}},Ii=(e,t,n,o,r)=>{const i=e.length;if(i<o+1)throw new Error(`Treewidth ${o} requires at least ${o+1} vertices (got n=${i}, k=${o})`);if(o===0){if(n.connectivity.kind==="connected")for(let c=1;c<i;c++){const d=e[c].id,l=r.integer(0,c-1),u=e[l].id;X(t,u,d,n,r)}else{const c=Math.min(3,Math.max(2,Math.floor(i/3))),d=Math.floor(i/c);for(let l=0;l<c;l++){const u=l*d,f=l===c-1?i:u+d,g=e.slice(u,f);for(let h=1;h<g.length;h++){const p=g[h].id,m=r.integer(0,h-1),v=g[m].id;X(t,v,p,n,r)}}}return}const a=Math.min(o+1,i);for(let c=0;c<a;c++)for(let d=c+1;d<a;d++)X(t,e[c].id,e[d].id,n,r);const s=[];if(a===o+1){const c=e.slice(0,a).map(l=>l.id),d=(l,u)=>{if(u===0)return[[]];if(l.length===0)return[];const[f,...g]=l,h=d(g,u-1).map(m=>[f,...m]),p=d(g,u);return[...h,...p]};s.push(...d(c,o))}else s.push(e.slice(0,a).map(c=>c.id));for(let c=a;c<i;c++){const d=e[c].id,l=r.choice(s);for(const u of l)X(t,d,u,n,r);for(let u=0;u<l.length;u++){const f=[d,...l.slice(0,u),...l.slice(u+1)];s.push(f)}}},Pi=(e,t,n,o,r)=>{const i=e.length;if(o<1)throw new Error(`k-colorable graphs require k >= 1 (got k=${o})`);if(o===1)return;const a=Array.from({length:o},()=>[]);for(let s=0;s<i;s++){const c=e[s],d=r.integer(0,o-1);a[d].push(c.id)}for(let s=0;s<o;s++)for(let c=s+1;c<o;c++){const d=a[s],l=a[c],u=d.length*l.length;if(u===0)continue;let f;switch(n.density.kind){case"sparse":{f=.2;break}case"moderate":{f=.5;break}case"dense":{f=1;break}default:f=.5}const g=Math.floor(u*f);let h=0;const p=[];for(const m of d)for(const v of l)p.push([m,v]);for(let m=p.length-1;m>0;m--){const v=r.integer(0,m);[p[m],p[v]]=[p[v],p[m]]}for(const[m,v]of p){if(h>=g)break;X(t,m,v,n,r),h++}}if(n.cycles.kind==="acyclic"){t.length=0;const s=new Set,c=a;for(const d of c[0])s.add(d);for(let d=1;d<o&&c[d].length>0;d++)for(const l of c[d]){if(s.size===0)break;const u=r.choice([...s]);X(t,u,l,n,r),s.add(l)}for(let d=0;d<o;d++)for(const l of c[d])if(!s.has(l)&&s.size>0){const u=r.choice([...s]);X(t,u,l,n,r),s.add(l)}}},$n=(e,t,n,o)=>{if(e.length!==0)for(let r=0;r<e.length;r++){const i=e[r].id,a=e[(r+1)%e.length].id;X(t,i,a,n,o)}},In=(e,t,n,o)=>{if(e.length<2)return;const r=Math.min(3,Math.max(2,Math.floor(e.length/3))),i=Math.floor(e.length/r);for(let a=0;a<r;a++){const s=a*i,c=a===r-1?e.length:s+i,d=e.slice(s,c);for(let l=1;l<d.length;l++){const u=d[l].id,f=o.integer(0,l-1),g=d[f].id;X(t,g,u,n,o)}}},Pn=(e,t,n,o)=>{if(e.length<2)return;const r=n.density.kind==="sparse"||n.density.kind==="moderate",i=Math.min(3,Math.max(2,Math.floor(e.length/3))),a=Math.floor(e.length/i),s=[];for(let c=0;c<i;c++){const d=c*a,l=c===i-1?e.length:d+a,u=e.slice(d,l);if(s.push({start:d,end:l}),u.length>=2)if(r)for(let f=1;f<u.length;f++){const g=u[f].id,h=o.integer(0,f-1),p=u[h].id;X(t,p,g,n,o)}else for(let f=0;f<u.length;f++){const g=u[f].id,h=u[(f+1)%u.length].id;X(t,g,h,n,o)}}if(r&&n.cycles.kind==="cycles_allowed"){const c=new Set(t.map(d=>n.directionality.kind==="directed"?`${d.source}→${d.target}`:[d.source,d.target].sort().join("-")));for(const{start:d,end:l}of s)if(l-d>=4){for(let u=0;u<l-d-3;u++){const f=e[d+u].id,g=e[d+u+3].id,h=n.directionality.kind==="directed"?`${f}→${g}`:[f,g].sort().join("-");if(!c.has(h)){X(t,f,g,n,o);break}}break}}},ne=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Dn=(e,t,n,o)=>{if(e.length!==0)for(let r=1;r<e.length;r++){const i=e[r].id,a=o.integer(0,r-1),s=e[a].id;ne(t,s,i,n,o)}},Di=(e,t,n,o)=>{if(e.length===0)return;const r=e[0].id;for(let i=1;i<e.length;i++){const a=e[i].id;ne(t,r,a,n,o)}},Ti=(e,t,n,o)=>{if(e.length<4){if(e.length===1)return;if(e.length===2){ne(t,e[0].id,e[1].id,n,o);return}if(e.length===3){for(let a=0;a<e.length;a++)for(let s=a+1;s<e.length;s++)ne(t,e[a].id,e[s].id,n,o);return}}const r=e[0].id,i=e.slice(1);for(let a=0;a<i.length;a++){const s=i[a].id,c=i[(a+1)%i.length].id;ne(t,s,c,n,o)}for(const a of i)ne(t,r,a.id,n,o)},Ai=(e,t,n,o)=>{if(e.length===0||n.grid?.kind!=="grid")return;const{rows:r,cols:i}=n.grid,a=r*i,s=e.slice(0,Math.min(a,e.length));for(let c=0;c<r;c++)for(let d=0;d<i;d++){const l=c*i+d;if(l>=s.length)break;const u=s[l].id;if(d<i-1){const f=c*i+(d+1);f<s.length&&ne(t,u,s[f].id,n,o)}if(c<r-1){const f=(c+1)*i+d;f<s.length&&ne(t,u,s[f].id,n,o)}}},Ri=(e,t,n,o)=>{if(e.length===0||n.toroidal?.kind!=="toroidal")return;const{rows:r,cols:i}=n.toroidal,a=r*i,s=e.slice(0,Math.min(a,e.length));for(let c=0;c<r;c++)for(let d=0;d<i;d++){const l=c*i+d;if(l>=s.length)break;const u=s[l].id,f=(d+1)%i,g=c*i+f;g<s.length&&ne(t,u,s[g].id,n,o);const p=(c+1)%r*i+d;p<s.length&&ne(t,u,s[p].id,n,o)}},Fi=(e,t,n,o)=>{if(e.length===0)return;const r=n.binaryTree?.kind;if(r==="complete_binary")for(let i=0;i<e.length;i++){const a=2*i+1,s=2*i+2;a<e.length&&ne(t,e[i].id,e[a].id,n,o),s<e.length&&ne(t,e[i].id,e[s].id,n,o)}else if(r==="full_binary"){const i=[0];let a=1;for(;i.length>0&&a<e.length;){const s=i.shift();if(s===void 0)break;if(o.next()>.5&&a+1<e.length){const d=a++,l=a++;ne(t,e[s].id,e[d].id,n,o),ne(t,e[s].id,e[l].id,n,o),i.push(d,l)}}}else{const i=[0];let a=1;for(;i.length>0&&a<e.length;){const s=i.shift();if(s===void 0)break;const c=Math.min(2,e.length-a),d=i.length===0&&a<e.length?1:0;if(c>0){const l=o.integer(d,c);for(let u=0;u<l&&a<e.length;u++){const f=a++;ne(t,e[s].id,e[f].id,n,o),i.push(f)}}}}},ji=(e,t,n,o)=>{if(!(e.length<2))for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++){const a=e[r].id,s=e[i].id;o.next()>.5?ne(t,a,s,n,o):ne(t,s,a,n,o)}},on=(e,t,n,o,r)=>{const i=e.length;if(o>=i)throw new Error(`k-regular graph requires k < n (got k=${o}, n=${i})`);if(i*o%2!==0)throw new Error(`k-regular graph requires n*k to be even (got n=${i}, k=${o}, n*k=${i*o})`);const a=1e3;let s=0;for(;s<a&&t.length<i*o/2;){s++,s>1&&(t.length=0);const c=[];for(const u of e)for(let f=0;f<o;f++)c.push(u.id);for(let u=c.length-1;u>0;u--){const f=r.integer(0,u);[c[u],c[f]]=[c[f],c[u]]}const d=new Set;let l=!0;for(let u=0;u<c.length;u+=2){const f=c[u],g=c[u+1];if(f===g&&n.selfLoops.kind==="disallowed"){l=!1;break}const h=n.directionality.kind==="directed"?`${f}→${g}`:[f,g].sort().join("-");if(n.edgeMultiplicity.kind==="simple"&&d.has(h)){l=!1;break}ne(t,f,g,n,r),n.edgeMultiplicity.kind==="simple"&&d.add(h)}if(l&&t.length===i*o/2)break}if(t.length<i*o/2)throw new Error(`Failed to generate ${o}-regular graph after ${a} attempts (got ${t.length} edges, expected ${i*o/2})`)},Li=(e,t,n)=>{const{min:o=1,max:r=100}=t.weightRange??{};for(const i of e)i.weight=n.integer(o,r)},rn=(e,t,n)=>{if(e.length<2)return!1;const o=new Map;for(const s of e)o.set(s.id,[]);for(const s of t){const c=o.get(s.source);c&&c.push(s.target)}const r=new Set,i=new Set,a=s=>{r.add(s),i.add(s);const c=o.get(s)??[];for(const d of c)if(r.has(d)){if(i.has(d))return!0}else if(a(d))return!0;return i.delete(s),!1};for(const s of e)if(!r.has(s.id)&&a(s.id))return!0;return!1},Tn=(e,t,n)=>{const o=[],r=new Set,i=new Map;for(const a of e)i.set(a.id,[]);for(const a of t){const s=i.get(a.source);if(s&&s.push(a.target),!n){const c=i.get(a.target);c&&c.push(a.source)}}for(const a of e){if(r.has(a.id))continue;const s=[],c=[a.id];for(;c.length>0;){const d=c.shift();if(d===void 0)break;if(r.has(d))continue;r.add(d),s.push(d);const l=i.get(d)??[];c.push(...l.filter(u=>!r.has(u)))}o.push(s)}return o},he=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},zi=e=>e.completeBipartite?.kind==="complete_bipartite"||e.grid?.kind==="grid"||e.toroidal?.kind==="toroidal"||e.star?.kind==="star"||e.wheel?.kind==="wheel"||e.binaryTree?.kind==="binary_tree"||e.binaryTree?.kind==="full_binary"||e.binaryTree?.kind==="complete_binary"||e.tournament?.kind==="tournament"||e.cubic?.kind==="cubic"||e.specificRegular?.kind==="k_regular"||e.flowNetwork?.kind==="flow_network"||e.eulerian?.kind==="eulerian"||e.eulerian?.kind==="semi_eulerian"||e.kVertexConnected?.kind==="k_vertex_connected"||e.kEdgeConnected?.kind==="k_edge_connected"||e.treewidth?.kind==="treewidth"||e.kColorable?.kind==="k_colorable"||e.kColorable?.kind==="bipartite_colorable"||e.split?.kind==="split"||e.cograph?.kind==="cograph"||e.clawFree?.kind==="claw_free"||e.chordal?.kind==="chordal"||e.interval?.kind==="interval"||e.permutation?.kind==="permutation"||e.comparability?.kind==="comparability"||e.perfect?.kind==="perfect"||e.scaleFree?.kind==="scale_free"||e.smallWorld?.kind==="small_world"||e.communityStructure?.kind==="modular"||e.line?.kind==="line_graph"||e.selfComplementary?.kind==="self_complementary"||e.threshold?.kind==="threshold"||e.unitDisk?.kind==="unit_disk"||e.planarity?.kind==="planar"||e.hamiltonian?.kind==="hamiltonian"||e.traceable?.kind==="traceable"||e.stronglyRegular?.kind==="strongly_regular"||e.vertexTransitive?.kind==="vertex_transitive",Bi=(e,t,n)=>{const o=e.length,r=n.selfLoops.kind==="allowed"?o:0;if(n.partiteness?.kind==="bipartite"){const a=e.filter(c=>c.partition==="left"),s=e.filter(c=>c.partition==="right");return n.directionality.kind==="directed"?2*a.length*s.length+r:a.length*s.length}if(n.connectivity.kind==="unconstrained"){const a=Tn(e,t,n.directionality.kind==="directed");if(a.length>1)return a.reduce((s,c)=>{const d=c.length;return n.directionality.kind==="directed"?s+d*(d-1):s+d*(d-1)/2},0)+r}return n.directionality.kind==="directed"?o*(o-1)+r:o*(o-1)/2},Oi=(e,t,n,o)=>n.completeness.kind==="complete"?o:n.directionality.kind==="undirected"&&n.cycles.kind==="acyclic"&&n.connectivity.kind==="connected"?t.length:Math.floor(o*{sparse:.15,moderate:.4,dense:.7,unconstrained:.4}[n.density.kind]),qi=(e,t)=>t.selfLoops.kind==="allowed"&&t.completeness.kind!=="complete"&&e.length>0,Ui=(e,t)=>e*(t==="dense"?100:10),Gi=(e,t,n,o)=>{const r=n.unitDisk?.kind==="unit_disk"&&n.unitDisk.unitRadius!==void 0?n.unitDisk.unitRadius:1,i=n.unitDisk?.kind==="unit_disk"&&n.unitDisk.spaceSize!==void 0?n.unitDisk.spaceSize:Math.sqrt(e.length);for(const a of e)a.data||(a.data={}),a.data.x=o.next()*i,a.data.y=o.next()*i;for(let a=0;a<e.length;a++)for(let s=a+1;s<e.length;s++){const c=e[a].data,d=e[s].data;if(!c||!d)continue;const l=c.x-d.x,u=c.y-d.y;Math.hypot(l,u)<=r&&Ke(t,e[a].id,e[s].id,n,o)}},Wi=(e,t,n,o)=>{if(e.length<4){for(let s=0;s<e.length;s++)for(let c=s+1;c<e.length;c++)Ke(t,e[s].id,e[c].id,n,o);return}for(let s=0;s<e.length;s++)Ke(t,e[s].id,e[(s+1)%e.length].id,n,o);const r=3*e.length-6;let i=0;const a=e.length*2;for(;t.length<r&&i<a;){i++;const s=Math.floor(o.next()*e.length),c=Math.floor(o.next()*e.length);s>=c||Vi(t,e[s].id,e[c].id)||Ke(t,e[s].id,e[c].id,n,o)}},Ke=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Vi=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),dt=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Ki=(e,t,n,o)=>{if(n.hereditaryClass?.kind!=="hereditary_class")throw new Error("Hereditary class graph requires hereditary_class spec");const{forbidden:r}=n.hereditaryClass;for(const d of e)d.data=d.data||{},d.data.forbiddenSubgraphs=r,d.data.hereditaryClass=!0;const i=n.density.kind==="sparse"?.15:n.density.kind==="moderate"?.4:n.density.kind==="dense"?.7:.3,a=e.length*(e.length-1)/2,s=Math.floor(a*i);let c=0;for(let d=0;d<e.length&&c<s;d++)for(let l=d+1;l<e.length&&c<s;l++)o.next()<i&&(dt(t,e[d].id,e[l].id,n,o),c++)},Hi=(e,t,n,o)=>{if(n.independenceNumber?.kind!=="independence_number")throw new Error("Independence number graph requires independence_number spec");const{value:r}=n.independenceNumber;if(r>e.length)throw new Error(`Independence number ${r} cannot exceed node count ${e.length}`);for(const s of e)s.data=s.data||{},s.data.targetIndependenceNumber=r;const i=[],a=e.map((s,c)=>c);for(let s=0;s<r;s++){const c=Math.floor(o.next()*a.length);i.push(a[c]),a.splice(c,1)}for(const s of i)e[s].data=e[s].data||{},e[s].data.independentSet=!0;for(let s=0;s<e.length;s++)for(let c=s+1;c<e.length;c++)i.includes(s)&&i.includes(c)||dt(t,e[s].id,e[c].id,n,o)},Ji=(e,t,n,o)=>{if(n.vertexCover?.kind!=="vertex_cover")throw new Error("Vertex cover graph requires vertex_cover spec");const{value:r}=n.vertexCover;if(r>e.length)throw new Error(`Vertex cover number ${r} cannot exceed node count ${e.length}`);for(const c of e)c.data=c.data||{},c.data.targetVertexCover=r;const i=e.length-r,a=e.map((c,d)=>d);for(let c=0;c<i;c++){const d=Math.floor(o.next()*a.length);a.splice(d,1)}const s=a;for(const c of s)e[c].data=e[c].data||{},e[c].data.vertexCover=!0;for(let c=0;c<e.length;c++)for(let d=c+1;d<e.length;d++)!s.includes(c)&&!s.includes(d)||dt(t,e[c].id,e[d].id,n,o)},Qi=(e,t,n,o)=>{if(n.dominationNumber?.kind!=="domination_number")throw new Error("Domination number graph requires domination_number spec");const{value:r}=n.dominationNumber;if(r>e.length)throw new Error(`Domination number ${r} cannot exceed node count ${e.length}`);for(const s of e)s.data=s.data||{},s.data.targetDominationNumber=r;const i=[],a=e.map((s,c)=>c);for(let s=0;s<r;s++){const c=Math.floor(o.next()*a.length);i.push(a[c]),a.splice(c,1)}for(const s of i)e[s].data=e[s].data||{},e[s].data.dominatingSet=!0;for(let s=0;s<e.length;s++)for(let c=s+1;c<e.length;c++)(i.includes(s)||i.includes(c))&&dt(t,e[s].id,e[c].id,n,o)},Ee=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},An=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),Xi=(e,t,n,o)=>{if(e.length<3)return;const r=n.scaleFree?.kind==="scale_free"?n.scaleFree.exponent??2.1:2.1,i=Math.max(2,Math.floor(e.length/10));for(let s=0;s<i;s++)for(let c=s+1;c<i;c++)Ee(t,e[s].id,e[c].id,n,o);const a=new Map;for(const s of e)a.set(s.id,0);for(const s of t)a.set(s.source,(a.get(s.source)||0)+1),a.set(s.target,(a.get(s.target)||0)+1);for(let s=i;s<e.length;s++){const c=[...a.values()].reduce((l,u)=>l+Math.pow(u,r),0),d=Math.min(3,i);for(let l=0;l<d;l++){let u=o.next()*c,f=e[Math.floor(o.next()*s)].id;for(const[g,h]of a){const p=Math.pow(h,r);if(u-=p,u<=0){f=g;break}}An(t,e[s].id,f)||(Ee(t,e[s].id,f,n,o),a.set(f,(a.get(f)||0)+1))}a.set(e[s].id,d)}for(const s of e)s.data=s.data||{},s.data.scaleFreeExponent=r},Yi=(e,t,n,o)=>{if(e.length<4)return;const r=n.smallWorld?.kind==="small_world"?n.smallWorld.rewireProbability??.1:.1,i=n.smallWorld?.kind==="small_world"?n.smallWorld.meanDegree??4:4,a=Math.floor(i/2);for(let c=0;c<e.length;c++)for(let d=1;d<=a;d++){const l=(c+d)%e.length;Ee(t,e[c].id,e[l].id,n,o)}const s=[...t];for(const c of s)if(o.next()<r){const d=t.indexOf(c);d!==-1&&t.splice(d,1);const l=e.findIndex(h=>h.id===c.source);let u=Math.floor(o.next()*e.length),f=0;const g=e.length*2;for(;(u===l||An(t,c.source,e[u].id))&&(u=(u+1)%e.length,f++,!(f>g)););f<=g&&Ee(t,c.source,e[u].id,n,o)}for(const c of e)c.data=c.data||{},c.data.smallWorldRewireProb=r,c.data.smallWorldMeanDegree=i},Zi=(e,t,n,o)=>{if(e.length<3)return;const r=n.communityStructure?.kind==="modular"?n.communityStructure.numCommunities??3:3,i=n.communityStructure?.kind==="modular"?n.communityStructure.intraCommunityDensity??.7:.7,a=n.communityStructure?.kind==="modular"?n.communityStructure.interCommunityDensity??.05:.05,s=Array.from({length:r},()=>[]);for(const[c,d]of e.entries()){const l=c%r;s[l].push(d),d.data=d.data||{},d.data.community=l}for(const c of s)for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++)o.next()<i&&Ee(t,c[d].id,c[l].id,n,o);for(let c=0;c<s.length;c++)for(let d=c+1;d<s.length;d++)for(const l of s[c])for(const u of s[d])o.next()<a&&Ee(t,l.id,u.id,n,o);for(const c of e)c.data=c.data||{},c.data.numCommunities=r,c.data.intraDensity=i,c.data.interDensity=a},re=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Rn=(e,t)=>{for(let n=e.length-1;n>0;n--){const o=t.integer(0,n);[e[n],e[o]]=[e[o],e[n]]}},Ge=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),es=(e,t,n,o)=>{if(e.length<3)return;const r=Array.from({length:e.length},(s,c)=>c);Rn(r,o);for(let s=0;s<r.length;s++){const c=e[r[s]].id,d=e[r[(s+1)%r.length]].id;re(t,c,d,n,o)}for(const[s,c]of e.entries())c.data=c.data||{},c.data.hamiltonianPosition=s,c.data.hamiltonianCycle=r.map(d=>e[d].id);const i=Math.floor(e.length/2);let a=0;for(let s=0;s<i&&a<i;s++){const c=Math.floor(o.next()*e.length),d=Math.floor(o.next()*e.length);c!==d&&!Ge(t,e[c].id,e[d].id)&&(re(t,e[c].id,e[d].id,n,o),a++)}},ts=(e,t,n,o)=>{if(e.length<2)return;const r=Array.from({length:e.length},(s,c)=>c);Rn(r,o);for(let s=0;s<r.length-1;s++)re(t,e[r[s]].id,e[r[s+1]].id,n,o);for(const[s,c]of e.entries())c.data=c.data||{},c.data.traceablePosition=s,c.data.traceablePath=r.map(d=>e[d].id);const i=Math.floor(e.length/3);let a=0;for(let s=0;s<i&&a<i;s++){const c=Math.floor(o.next()*e.length),d=Math.floor(o.next()*e.length);if(c===d)continue;const l=r.at(-1),u=r[0];c===l&&d===u||c===u&&d===l||Ge(t,e[c].id,e[d].id)||(re(t,e[c].id,e[d].id,n,o),a++)}},ns=(e,t,n,o)=>{if(n.diameter?.kind!=="diameter")throw new Error("Diameter graph requires diameter spec");const{value:r}=n.diameter;for(const i of e)i.data=i.data||{},i.data.targetDiameter=r;if(r===1)for(let i=0;i<e.length;i++)for(let a=i+1;a<e.length;a++)re(t,e[i].id,e[a].id,n,o);else if(r>=e.length-1)for(let i=0;i<e.length-1;i++)re(t,e[i].id,e[i+1].id,n,o);else{for(let s=0;s<e.length-1;s++)re(t,e[s].id,e[s+1].id,n,o);const a=e.length-1-r;for(let s=0;s<a;s++){const c=Math.floor(e.length/(a+1))*(s+1),d=Math.floor(o.next()*(e.length-c-1)),l=d+c;l<e.length&&!Ge(t,e[d].id,e[l].id)&&re(t,e[d].id,e[l].id,n,o)}}},os=(e,t,n,o)=>{if(n.radius?.kind!=="radius")throw new Error("Radius graph requires radius spec");const{value:r}=n.radius;for(const i of e)i.data=i.data||{},i.data.targetRadius=r;if(r===1){const i=e[0].id;for(let a=1;a<e.length;a++)re(t,i,e[a].id,n,o)}else{for(let a=0;a<e.length-1;a++)re(t,e[a].id,e[a+1].id,n,o);const i=Math.ceil((e.length-1)/2);if(r<i){const a=e[Math.floor(e.length/2)].id,s=i-r;for(let c=0;c<s&&c<Math.floor(e.length/2);c++){const d=e[c].id;Ge(t,a,d)||re(t,a,d,n,o)}}}},rs=(e,t,n,o)=>{if(e.length<3)return;if(n.girth?.kind!=="girth")throw new Error("Girth graph requires girth spec");const{girth:r}=n.girth;for(const a of e)a.data=a.data||{},a.data.targetGirth=r;const i=Math.min(r,e.length);for(let a=0;a<i;a++){const s=(a+1)%i;re(t,e[a].id,e[s].id,n,o)}for(let a=i;a<e.length;a++){const s=Math.floor(o.next()*i);re(t,e[s].id,e[a].id,n,o)}},is=(e,t,n,o)=>{if(e.length<3)return;if(n.circumference?.kind!=="circumference")throw new Error("Circumference graph requires circumference spec");const{value:r}=n.circumference;for(const a of e)a.data=a.data||{},a.data.targetCircumference=r;const i=Math.min(r,e.length);for(let a=0;a<i;a++){const s=(a+1)%i;re(t,e[a].id,e[s].id,n,o)}for(let a=i;a<e.length;a++){const s=Math.floor(o.next()*i);re(t,e[s].id,e[a].id,n,o)}if(i>4){const a=Math.floor(i/4);for(let s=0;s<a;s++){const c=Math.floor(o.next()*i),d=(c+2)%i;Ge(t,e[c].id,e[d].id)||re(t,e[c].id,e[d].id,n,o)}}},le=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},Fn=(e,t)=>{for(let n=e.length-1;n>0;n--){const o=t.integer(0,n);[e[n],e[o]]=[e[o],e[n]]}},ss=e=>{const t=e.filter(o=>o.partition==="left"),n=e.filter(o=>o.partition==="right");return{left:t,right:n}},as=(e,t,n,o)=>{const{left:r,right:i}=ss(e);for(const a of r)for(const s of i)le(t,a.id,s.id,n,o)},cs=(e,t,n,o)=>{if(e.length<2)return;const r=Math.max(1,Math.floor(e.length/3)),i=e.slice(0,r),a=e.slice(r);for(let s=0;s<i.length;s++)for(let c=s+1;c<i.length;c++)le(t,i[s].id,i[c].id,n,o);for(const s of i)for(const c of a)o.next()<.5&&le(t,s.id,c.id,n,o);for(const s of i)s.data=s.data||{},s.data.splitPartition="clique";for(const s of a)s.data=s.data||{},s.data.splitPartition="independent"},jn=(e,t,n,o)=>{if(e.length<2)return;const r=(s,c)=>{if(!(s.length<=1))if(c){const d=Math.floor(s.length/2),l=s.slice(0,d),u=s.slice(d);i(l),i(u)}else{const d=Math.floor(s.length/2),l=s.slice(0,d),u=s.slice(d);for(const f of l)for(const g of u)le(t,f.id,g.id,n,o)}},i=s=>{for(let c=0;c<s.length;c++)for(let d=c+1;d<s.length;d++)le(t,s[c].id,s[d].id,n,o)},a=o.next()<.5;r(e,a)},ds=(e,t,n,o)=>{if(!(e.length<2))for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++)le(t,e[r].id,e[i].id,n,o)},Ln=(e,t,n,o)=>{if(e.length<3){for(let a=0;a<e.length;a++)for(let s=a+1;s<e.length;s++)le(t,e[a].id,e[s].id,n,o);return}const r=Math.min(Math.floor(o.next()*3)+1,e.length-1),i=e.slice(0,r+1);for(let a=0;a<i.length;a++)for(let s=a+1;s<i.length;s++)le(t,i[a].id,i[s].id,n,o);for(let a=r+1;a<e.length;a++){const s=e.slice(0,a),c=Math.min(r,s.length);for(let d=0;d<c;d++)le(t,e[a].id,s[d].id,n,o)}},ls=(e,t,n,o)=>{if(e.length<2)return;const r=e.map(i=>{const a=o.next()*100,s=1+o.next()*20,c=a+s;return i.data=i.data||{},i.data.interval={start:a,end:c,length:s},{node:i,start:a,end:c}});for(let i=0;i<r.length;i++)for(let a=i+1;a<r.length;a++){const s=r[i],c=r[a];s.start<c.end&&c.start<s.end&&le(t,s.node.id,c.node.id,n,o)}},us=(e,t,n,o)=>{const r=e.length;if(r<2)return;const i=Array.from({length:r},(a,s)=>s);Fn(i,o);for(const[a,s]of e.entries())s.data=s.data||{},s.data.permutationValue=i[a];for(let a=0;a<r;a++)for(let s=a+1;s<r;s++){const c=a-s,d=i[a]-i[s];c*d<0&&le(t,e[a].id,e[s].id,n,o)}},fs=(e,t,n,o)=>{if(e.length<2)return;const r=Array.from({length:e.length},(a,s)=>s);Fn(r,o);for(const[a,s]of e.entries())s.data=s.data||{},s.data.topologicalOrder=r[a];const i=.3;for(let a=0;a<r.length;a++)for(let s=a+1;s<r.length;s++)if(o.next()<i){const c=e[r[a]],d=e[r[s]];le(t,c.id,d.id,n,o)}},gs=(e,t,n,o)=>{if(e.length<2)return;const r=o.next();r<.4?Ln(e,t,n,o):r<.7?as(e,t,n,o):jn(e,t,n,o);for(const i of e)i.data=i.data||{},i.data.perfectClass=r<.4?"chordal":r<.7?"bipartite":"cograph"},hs=(e,t,n,o)=>{if(n.spectrum?.kind!=="spectrum")throw new Error("Spectrum computation requires spectrum spec");const{eigenvalues:r}=n.spectrum;for(const i of e)i.data=i.data||{},i.data.targetSpectrum=r},ps=(e,t,n,o)=>{if(n.algebraicConnectivity?.kind!=="algebraic_connectivity")throw new Error("Algebraic connectivity computation requires algebraic_connectivity spec");const{value:r}=n.algebraicConnectivity;for(const i of e)i.data=i.data||{},i.data.targetAlgebraicConnectivity=r},ms=(e,t,n,o)=>{if(n.spectralRadius?.kind!=="spectral_radius")throw new Error("Spectral radius computation requires spectral_radius spec");const{value:r}=n.spectralRadius;for(const i of e)i.data=i.data||{},i.data.targetSpectralRadius=r},vs=(e,t,n,o)=>{if(n.toughness?.kind!=="toughness")throw new Error("Toughness computation requires toughness spec");const{value:r}=n.toughness;for(const i of e)i.data=i.data||{},i.data.targetToughness=r},ys=(e,t,n,o)=>{if(n.integrity?.kind!=="integrity")throw new Error("Integrity computation requires integrity spec");const{value:r}=n.integrity;for(const i of e)i.data=i.data||{},i.data.targetIntegrity=r},bs=(e,t,n,o)=>{if(n.cage?.kind!=="cage")throw new Error("Cage computation requires cage spec");const{girth:r,degree:i}=n.cage;for(const a of e)a.data=a.data||{},a.data.targetCageGirth=r,a.data.targetCageDegree=i},ks=(e,t,n,o)=>{if(n.moore?.kind!=="moore")throw new Error("Moore graph computation requires moore spec");const{diameter:r,degree:i}=n.moore;for(const a of e)a.data=a.data||{},a.data.targetMooreDiameter=r,a.data.targetMooreDegree=i},ws=(e,t,n,o)=>{if(n.ramanujan?.kind!=="ramanujan")throw new Error("Ramanujan graph computation requires ramanujan spec");const{degree:r}=n.ramanujan;for(const i of e)i.data=i.data||{},i.data.targetRamanujanDegree=r},xs=(e,t,n,o)=>{if(n.cartesianProduct?.kind!=="cartesian_product")throw new Error("Cartesian product computation requires cartesian_product spec");const{leftFactors:r,rightFactors:i}=n.cartesianProduct;for(const a of e)a.data=a.data||{},a.data.targetCartesianProductLeft=r,a.data.targetCartesianProductRight=i},Ms=(e,t,n,o)=>{if(n.tensorProduct?.kind!=="tensor_product")throw new Error("Tensor product computation requires tensor_product spec");const{leftFactors:r,rightFactors:i}=n.tensorProduct;for(const a of e)a.data=a.data||{},a.data.targetTensorProductLeft=r,a.data.targetTensorProductRight=i},Ss=(e,t,n,o)=>{if(n.strongProduct?.kind!=="strong_product")throw new Error("Strong product computation requires strong_product spec");const{leftFactors:r,rightFactors:i}=n.strongProduct;for(const a of e)a.data=a.data||{},a.data.targetStrongProductLeft=r,a.data.targetStrongProductRight=i},Cs=(e,t,n,o)=>{if(n.lexicographicProduct?.kind!=="lexicographic_product")throw new Error("Lexicographic product computation requires lexicographic_product spec");const{leftFactors:r,rightFactors:i}=n.lexicographicProduct;for(const a of e)a.data=a.data||{},a.data.targetLexicographicProductLeft=r,a.data.targetLexicographicProductRight=i},_s=(e,t,n,o)=>{if(n.minorFree?.kind!=="minor_free")throw new Error("Minor-free computation requires minor_free spec");const{forbiddenMinors:r}=n.minorFree;for(const i of e)i.data=i.data||{},i.data.targetForbiddenMinors=r},Ns=(e,t,n,o)=>{if(n.topologicalMinorFree?.kind!=="topological_minor_free")throw new Error("Topological minor-free computation requires topological_minor_free spec");const{forbiddenMinors:r}=n.topologicalMinorFree;for(const i of e)i.data=i.data||{},i.data.targetTopologicalForbiddenMinors=r},Es=(e,t,n,o)=>{n.connectivity.kind==="connected"&&n.cycles.kind==="acyclic"?Dn(e,t,n,o):n.connectivity.kind==="connected"&&n.cycles.kind==="cycles_allowed"?$n(e,t,n,o):n.connectivity.kind==="unconstrained"&&n.cycles.kind==="acyclic"?In(e,t,n,o):Pn(e,t,n,o)},de=e=>(t,n,o,r)=>(Es(t,n,o,r),e(t,n,o,r),n),$s=de(hs),Is=de(ps),Ps=de(ms),Ds=de(vs),Ts=de(ys),As=de(bs),Rs=de(ks),Fs=de(ws),js=de(xs),Ls=de(Ms),zs=de(Ss),Bs=de(Cs),Os=de(_s),qs=de(Ns),be=(e,t,n,o,r)=>{const i={source:t,target:n};o.schema.kind==="heterogeneous"&&(i.type=r.choice(["type_a","type_b","type_c"])),e.push(i)},sn=(e,t,n)=>e.some(o=>o.source===t&&o.target===n||o.source===n&&o.target===t),Us=(e,t,n,o)=>{if(e.length<2)return;const r=[],i=Math.ceil(Math.sqrt(e.length*2))+1,a=Array.from({length:i},(c,d)=>({id:`B${d}`,data:{}}));for(let c=0;c<a.length;c++)for(let d=c+1;d<a.length;d++)r.push({source:a[c].id,target:a[d].id});const s=r.slice(0,e.length);for(const[c,d]of e.entries()){const l=d.data||{};l.baseEdge=s[c],d.data=l}for(let c=0;c<s.length;c++)for(let d=c+1;d<s.length;d++){const l=s[c],u=s[d];(l.source===u.source||l.source===u.target||l.target===u.source||l.target===u.target)&&be(t,e[c].id,e[d].id,n,o)}},Gs=(e,t,n,o)=>{const r=e.length;if(r%4!==0&&r%4!==1&&Math.floor(r/4)*4<4)return;const a=r*(r-1)/2/2;let s=0;for(let c=0;c<r&&s<a;c++)for(let d=c+1;d<r&&s<a;d++)(c+d)%2===0&&(t.push({source:e[c].id,target:e[d].id}),s++);if(s<a)for(let c=0;c<r&&s<a;c++)for(let d=c+1;d<r&&s<a;d++)(c+d)%2!==0&&(t.some(u=>u.source===e[c].id&&u.target===e[d].id||u.source===e[d].id&&u.target===e[c].id)||(t.push({source:e[c].id,target:e[d].id}),s++));for(const c of e)c.data=c.data||{},c.data.selfComplementaryType="deterministic"},Ws=(e,t,n,o)=>{if(e.length<2)return;const r=[];for(const[i,a]of e.entries()){const s=o.next()<.5,c=a.data||{};if(a.data=c,c.thresholdType=s?"dominant":"isolated",c.creationOrder=i,s)for(const d of r)be(t,a.id,d,n,o);r.push(a.id)}},Vs=(e,t,n,o)=>{const r=e.length;if(n.stronglyRegular?.kind!=="strongly_regular")throw new Error("Strongly regular graph requires strongly_regular spec");const{k:i,lambda:a,mu:s}=n.stronglyRegular;if(i===void 0||a===void 0||s===void 0)throw new Error("Strongly regular requires k, lambda, mu parameters");if(i*(i-a-1)!==(r-i-1)*s)throw new Error(`Invalid SRG parameters: k(k-λ-1) = (n-k-1)μ required. Got ${i}(${i}-${a}-1) = ${i*(i-a-1)}, (n-k-1)μ = ${(r-i-1)*s}`);for(const c of e)c.data=c.data||{},c.data.srgParams={n:r,k:i,lambda:a,mu:s};for(let c=0;c<r;c++){const d=(c+1)%r;be(t,e[c].id,e[d].id,n,o)}},Ks=(e,t,n,o)=>{if(e.length<2)return;const r=e.length;for(const[i,a]of e.entries())a.data=a.data||{},a.data.vertexTransitiveGroup="cyclic",a.data.vertexPosition=i;be(t,e[0].id,e[1%r].id,n,o);for(let i=1;i<r;i++)if(be(t,e[i].id,e[(i+1)%r].id,n,o),r%2===0){const a=(i+r/2)%r;sn(t,e[i].id,e[a].id)||be(t,e[i].id,e[a].id,n,o)}if(r>5&&r%3===0)for(let i=0;i<r;i++){const a=(i+Math.floor(r/3))%r;sn(t,e[i].id,e[a].id)||be(t,e[i].id,e[a].id,n,o)}},Hs=(e,t,n,o)=>{if(n.edgeTransitive?.kind!=="edge_transitive")throw new Error("Edge-transitive graph requires edge_transitive spec");for(const r of e)r.data=r.data||{},r.data.edgeTransitive=!0;for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++)be(t,e[r].id,e[i].id,n,o)},Js=(e,t,n,o)=>{if(e.length<3)return;if(n.arcTransitive?.kind!=="arc_transitive")throw new Error("Arc-transitive graph requires arc_transitive spec");for(const[i,a]of e.entries())a.data=a.data||{},a.data.arcTransitive=!0,a.data.symmetricGraph=!0,a.data.vertexPosition=i;const r=e.length;for(let i=0;i<r;i++){const a=(i+1)%r;be(t,e[i].id,e[a].id,n,o)}},Qs=(e,t,n,o)=>{const r=[];return t.completeBipartite?.kind==="complete_bipartite"?(Ci(e,r,t,o),r):t.partiteness?.kind==="bipartite"?(t.connectivity.kind==="connected"&&t.cycles.kind==="acyclic"?kt(e,r,t,o):t.connectivity.kind==="connected"&&t.cycles.kind==="cycles_allowed"?en(e,r,t,o):t.connectivity.kind==="unconstrained"&&t.cycles.kind==="acyclic"?tn(e,r,t,o):nn(e,r,t,o),r):t.star?.kind==="star"?(Di(e,r,t,o),r):t.wheel?.kind==="wheel"?(Ti(e,r,t,o),r):t.grid?.kind==="grid"?(Ai(e,r,t,o),r):t.toroidal?.kind==="toroidal"?(Ri(e,r,t,o),r):t.binaryTree?.kind==="binary_tree"||t.binaryTree?.kind==="full_binary"||t.binaryTree?.kind==="complete_binary"?(Fi(e,r,t,o),r):t.tournament?.kind==="tournament"?(ji(e,r,t,o),r):t.cubic?.kind==="cubic"?(on(e,r,t,3,o),r):t.specificRegular?.kind==="k_regular"?(on(e,r,t,t.specificRegular.k,o),r):t.flowNetwork?.kind==="flow_network"?(_i(e,r,t,t.flowNetwork.source,t.flowNetwork.sink,o),r):t.eulerian?.kind==="eulerian"||t.eulerian?.kind==="semi_eulerian"?(Ni(e,r,t,o),r):t.kVertexConnected?.kind==="k_vertex_connected"?(Ei(e,r,t,t.kVertexConnected.k,o),r):t.kEdgeConnected?.kind==="k_edge_connected"?($i(e,r,t,t.kEdgeConnected.k,o),r):t.treewidth?.kind==="treewidth"?(Ii(e,r,t,t.treewidth.width,o),r):t.kColorable?.kind==="k_colorable"?(Pi(e,r,t,t.kColorable.k,o),r):t.kColorable?.kind==="bipartite_colorable"?(t.connectivity.kind==="connected"&&t.cycles.kind==="acyclic"?kt(e,r,t,o):t.connectivity.kind==="connected"&&t.cycles.kind==="cycles_allowed"?en(e,r,t,o):t.connectivity.kind==="unconstrained"&&t.cycles.kind==="acyclic"?tn(e,r,t,o):nn(e,r,t,o),r):t.split?.kind==="split"?(cs(e,r,t,o),r):t.cograph?.kind==="cograph"?(jn(e,r,t,o),r):t.clawFree?.kind==="claw_free"?(ds(e,r,t,o),r):t.chordal?.kind==="chordal"?(Ln(e,r,t,o),r):t.interval?.kind==="interval"?(ls(e,r,t,o),r):t.permutation?.kind==="permutation"?(us(e,r,t,o),r):t.comparability?.kind==="comparability"?(fs(e,r,t,o),r):t.perfect?.kind==="perfect"?(gs(e,r,t,o),r):t.scaleFree?.kind==="scale_free"?(Xi(e,r,t,o),r):t.smallWorld?.kind==="small_world"?(Yi(e,r,t,o),r):t.communityStructure?.kind==="modular"?(Zi(e,r,t,o),r):t.line?.kind==="line_graph"?(Us(e,r,t,o),r):t.selfComplementary?.kind==="self_complementary"?(Gs(e,r),r):t.threshold?.kind==="threshold"?(Ws(e,r,t,o),r):t.unitDisk?.kind==="unit_disk"?(Gi(e,r,t,o),r):t.planarity?.kind==="planar"?(Wi(e,r,t,o),r):t.hamiltonian?.kind==="hamiltonian"?(es(e,r,t,o),r):t.traceable?.kind==="traceable"?(ts(e,r,t,o),r):t.stronglyRegular?.kind==="strongly_regular"?(Vs(e,r,t,o),r):t.vertexTransitive?.kind==="vertex_transitive"?(Ks(e,r,t,o),r):t.edgeTransitive?.kind==="edge_transitive"?(Hs(e,r,t,o),r):t.arcTransitive?.kind==="arc_transitive"?(Js(e,r,t,o),r):t.diameter?.kind==="diameter"?(ns(e,r,t,o),r):t.radius?.kind==="radius"?(os(e,r,t,o),r):t.girth?.kind==="girth"?(rs(e,r,t,o),r):t.circumference?.kind==="circumference"?(is(e,r,t,o),r):t.hereditaryClass?.kind==="hereditary_class"?(Ki(e,r,t,o),r):t.independenceNumber?.kind==="independence_number"?(Hi(e,r,t,o),r):t.vertexCover?.kind==="vertex_cover"?(Ji(e,r,t,o),r):t.dominationNumber?.kind==="domination_number"?(Qi(e,r,t,o),r):t.spectrum?.kind==="spectrum"?$s(e,r,t,o):t.algebraicConnectivity?.kind==="algebraic_connectivity"?Is(e,r,t,o):t.spectralRadius?.kind==="spectral_radius"?Ps(e,r,t,o):t.toughness?.kind==="toughness"?Ds(e,r,t,o):t.integrity?.kind==="integrity"?Ts(e,r,t,o):t.cage?.kind==="cage"?As(e,r,t,o):t.moore?.kind==="moore"?Rs(e,r,t,o):t.ramanujan?.kind==="ramanujan"?Fs(e,r,t,o):t.cartesianProduct?.kind==="cartesian_product"?js(e,r,t,o):t.tensorProduct?.kind==="tensor_product"?Ls(e,r,t,o):t.strongProduct?.kind==="strong_product"?zs(e,r,t,o):t.lexicographicProduct?.kind==="lexicographic_product"?Bs(e,r,t,o):t.minorFree?.kind==="minor_free"?Os(e,r,t,o):t.topologicalMinorFree?.kind==="topological_minor_free"?qs(e,r,t,o):(t.connectivity.kind==="connected"&&t.cycles.kind==="acyclic"?Dn(e,r,t,o):t.connectivity.kind==="connected"&&t.cycles.kind==="cycles_allowed"?$n(e,r,t,o):t.connectivity.kind==="unconstrained"&&t.cycles.kind==="acyclic"?In(e,r,t,o):Pn(e,r,t,o),r)},Xs=(e,t,n,o,r)=>{if(zi(n))return;e.length;const i=Bi(e,t,n),a=Oi(e,t,n,i);if(n.directionality.kind==="undirected"&&n.cycles.kind==="acyclic"&&n.connectivity.kind==="connected"){if(n.edgeMultiplicity.kind==="multi"&&t.length>0){const v=r.choice(t);he(t,v.source,v.target,n,r)}return}if(n.completeness.kind==="complete"&&n.edgeMultiplicity.kind==="simple"){t.length=0;const v=e.map(y=>y.id);for(let y=0;y<v.length;y++)for(let b=0;b<v.length;b++){const k=v[y],w=v[b];n.directionality.kind==="undirected"&&y>=b&&(y!==b||n.selfLoops.kind!=="allowed")||n.selfLoops.kind==="disallowed"&&k===w||he(t,k,w,n,r)}return}const c=qi(e,n),d=a-t.length,l=n.partiteness?.kind==="bipartite",u=l?e.filter(v=>v.partition==="left"):[],f=l?e.filter(v=>v.partition==="right"):[],g=n.connectivity.kind==="unconstrained"?Tn(e,t,n.directionality.kind==="directed"):[];if(d<=0){if(c&&t.length>0){const v=r.choice(e).id;he(t,v,v,n,r)}if(n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&n.connectivity.kind==="unconstrained"&&t.length>0&&!rn(e,t)){const y=r.choice(t),b=n.directionality.kind==="directed"?`${y.target}→${y.source}`:[y.target,y.source].sort().join("-");new Set(t.map(w=>n.directionality.kind==="directed"?`${w.source}→${w.target}`:[w.source,w.target].sort().join("-"))).has(b)||he(t,y.target,y.source,n,r)}if(n.edgeMultiplicity.kind==="multi"&&t.length>0){const v=r.choice(t);he(t,v.source,v.target,n,r)}return}const h=new Set(t.map(v=>n.directionality.kind==="directed"?`${v.source}→${v.target}`:[v.source,v.target].sort().join("-")));let p=0;const m=Ui(d,n.density.kind);for(;t.length<a&&p<m;){p++;let v,y;if(c&&p%10===0){const k=r.choice(e).id,w=n.directionality.kind==="directed"?`${k}→${k}`:[k,k].sort().join("-");if(n.edgeMultiplicity.kind==="multi"||!h.has(w)){he(t,k,k,n,r),n.edgeMultiplicity.kind==="simple"&&h.add(w);continue}}if(l){const w=(()=>{const x=[];return u.length>0&&x.push(...u),f.length>0&&x.push(...f),r.choice(x)})();let C;if(w.partition==="left"&&f.length>0)C=r.choice(f);else if(u.length>0)C=r.choice(u);else continue;v=w.id,y=C.id}else if(n.connectivity.kind==="unconstrained"&&g.length>0){const k=r.choice(g);if(k.length<2)continue;v=r.choice(k),y=r.choice(k)}else v=r.choice(e).id,y=r.choice(e).id;if(n.selfLoops.kind==="disallowed"&&v===y)continue;const b=n.directionality.kind==="directed"?`${v}→${y}`:[v,y].sort().join("-");if(!(n.edgeMultiplicity.kind==="simple"&&h.has(b))){if(n.cycles.kind==="acyclic"&&n.directionality.kind==="directed"){const k=Number.parseInt(v.slice(1),10);if(Number.parseInt(y.slice(1),10)<=k)continue}he(t,v,y,n,r),n.edgeMultiplicity.kind==="simple"&&h.add(b)}}if(c&&t.length>0&&!t.some(v=>v.source===v.target)){const v=r.choice(e).id;he(t,v,v,n,r)}if(n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&n.connectivity.kind==="unconstrained"&&t.length>0&&!rn(e,t)){const y=r.choice(t),b=`${y.target}→${y.source}`;h.has(b)||he(t,y.target,y.source,n,r)}if(n.edgeMultiplicity.kind==="multi"&&t.length>0){const v=r.choice(t);he(t,v.source,v.target,n,r)}},Ys=(e,t,n)=>{const o=[];let r=0,i=0;if(e.partiteness?.kind==="bipartite")r=Math.floor(t.nodeCount/2),i=t.nodeCount-r;else if(e.completeBipartite?.kind==="complete_bipartite"){const{m:a,n:s}=e.completeBipartite;r=Math.min(a,t.nodeCount),i=Math.min(s,t.nodeCount-r)}for(let a=0;a<t.nodeCount;a++){const s={id:`N${a}`};if((e.partiteness?.kind==="bipartite"||e.completeBipartite?.kind==="complete_bipartite")&&(a<r?s.partition="left":a<r+i&&(s.partition="right")),e.schema.kind==="heterogeneous"&&t.nodeTypes){const c=n.next();let d=0;for(const{type:l,proportion:u}of t.nodeTypes)if(d+=u,c<d){s.type=l;break}if(!s.type){const l=t.nodeTypes.at(-1);s.type=l?.type??"default"}}o.push(s)}return o};let Zs=class{seed;constructor(t=12345){this.seed=t}next(){return this.seed=(this.seed*9301+49297)%233280,this.seed/233280}integer(t,n){return Math.floor(this.next()*(n-t+1))+t}choice(t){return t[this.integer(0,t.length-1)]}sample(t,n){return[...t].sort(()=>this.next()-.5).slice(0,n)}};const ea=(e,t)=>{const n=new Zs(t.seed),o=Ys(e,t,n),r=Qs(o,e,t,n);return Xs(o,r,e,t,n),e.weighting.kind==="weighted_numeric"&&Li(r,t,n),{nodes:o,edges:r,spec:e}},zn={directionality:{kind:"undirected"},weighting:{kind:"unweighted"},cycles:{kind:"cycles_allowed"},connectivity:{kind:"unconstrained"},schema:{kind:"homogeneous"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},density:{kind:"unconstrained"},completeness:{kind:"incomplete"}},Ce=(e={})=>({...zn,...e}),ta=Ce({edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},directionality:{kind:"undirected"}}),na=Ce({edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"},directionality:{kind:"directed"}}),oa=Ce({directionality:{kind:"directed"},cycles:{kind:"acyclic"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"}}),ra=Ce({directionality:{kind:"undirected"},cycles:{kind:"acyclic"},connectivity:{kind:"connected"},edgeMultiplicity:{kind:"simple"},selfLoops:{kind:"disallowed"}}),ia=Ce({directionality:{kind:"directed"},weighting:{kind:"weighted_numeric"}}),sa=()=>{const e=[],t=[{kind:"directed"},{kind:"undirected"}],n=[{kind:"unweighted"},{kind:"weighted_numeric"}],o=[{kind:"acyclic"},{kind:"cycles_allowed"}],r=[{kind:"connected"},{kind:"unconstrained"}],i=[{kind:"homogeneous"},{kind:"heterogeneous"}],a=[{kind:"simple"},{kind:"multi"}],s=[{kind:"allowed"},{kind:"disallowed"}],c=[{kind:"sparse"},{kind:"moderate"},{kind:"dense"},{kind:"unconstrained"}],d=[{kind:"complete"},{kind:"incomplete"}];for(const l of t)for(const u of n)for(const f of o)for(const g of r)for(const h of i)for(const p of a)for(const m of s)for(const v of c)for(const y of d){const b={directionality:l,weighting:u,cycles:f,connectivity:g,schema:h,edgeMultiplicity:p,selfLoops:m,density:v,completeness:y};Bn(b)&&e.push(b)}return e},Bn=e=>!(e.selfLoops.kind==="allowed"&&e.cycles.kind==="acyclic"||e.completeness.kind==="complete"&&e.cycles.kind==="acyclic"||e.completeness.kind==="complete"&&e.density.kind==="sparse"||e.edgeMultiplicity.kind==="multi"&&e.completeness.kind==="complete"||e.cycles.kind==="acyclic"&&e.connectivity.kind==="connected"&&(e.density.kind==="dense"||e.completeness.kind==="complete")||e.cycles.kind==="acyclic"&&e.connectivity.kind==="unconstrained"&&(e.density.kind==="moderate"||e.density.kind==="dense"||e.completeness.kind==="complete")),aa=e=>{const t=[];return e.directionality.kind==="directed"?t.push("directed"):t.push("undirected"),e.weighting.kind==="weighted_numeric"&&t.push("weighted"),e.cycles.kind==="acyclic"&&t.push("acyclic"),e.connectivity.kind==="connected"&&t.push("connected"),e.schema.kind==="heterogeneous"&&t.push("heterogeneous"),e.edgeMultiplicity.kind==="multi"&&t.push("multigraph"),e.selfLoops.kind==="allowed"&&t.push("self-loops"),e.density.kind!=="unconstrained"&&t.push(e.density.kind),e.completeness.kind==="complete"&&t.push("complete"),t.join(", ")||"default graph"},ca=(e={})=>Ce(e),da=e=>e.directionality.kind==="directed",la=e=>e.weighting.kind==="weighted_numeric",ua=e=>e.cycles.kind==="acyclic",fa=e=>e.connectivity.kind==="connected",ga=e=>e.schema.kind==="heterogeneous",ha=e=>e.edgeMultiplicity.kind==="multi",pa=e=>e.selfLoops.kind==="allowed",Qe=(e,t,n)=>{if(e.length===0)return!0;const o=Y(e,t,n),r=new Set,i=[e[0].id];for(;i.length>0;){const a=i.shift();if(!a||r.has(a))continue;r.add(a);const s=o.get(a)??[];i.push(...s.filter(c=>!r.has(c)))}return r.size===e.length},Y=(e,t,n)=>{const o=new Map;for(const r of e)o.set(r.id,[]);for(const r of t){const i=o.get(r.source);if(i&&i.push(r.target),!n){const a=o.get(r.target);a&&a.push(r.source)}}return o},an=(e,t,n)=>{const o=[],r=new Set,i=Y(e,t,n);for(const a of e){if(r.has(a.id))continue;const s=[],c=[a.id];for(;c.length>0;){const d=c.shift();if(!d||r.has(d))continue;r.add(d),s.push(d);const l=i.get(d)??[];c.push(...l.filter(u=>!r.has(u)))}o.push(s)}return o},ma=(e,t,n)=>{if(e.length===0)return!0;const o=Y(e,t,n),r=new Map,i=new Set,a=s=>{const c=[s];for(r.set(s,0),i.add(s);c.length>0;){const d=c.shift();if(!d)break;const l=o.get(d)??[];for(const u of l)if(i.has(u)){if(r.get(u)===r.get(d))return!1}else r.set(u,1-(r.get(d)??0)),i.add(u),c.push(u)}return!0};for(const s of e)if(!i.has(s.id)&&!a(s.id))return!1;return!0},ze=(e,t)=>{if(t===0)return[[]];if(t>e.length)return[];const[n,...o]=e,r=ze(o,t-1).map(a=>[n,...a]),i=ze(o,t);return[...r,...i]},va=(e,t,n)=>{const o=new Map;for(let i=0;i<e.length;i++)for(let a=i+1;a<e.length;a++)(t.get(e[i])?.has(e[a])||!n&&t.get(e[a])?.has(e[i]))&&(o.set(e[i],(o.get(e[i])||0)+1),o.set(e[a],(o.get(e[a])||0)+1));const r=[...o.values()].sort((i,a)=>i-a);return r.length===4&&r[0]===1&&r[1]===1&&r[2]===2&&r[3]===2},ya=(e,t,n,o)=>{if(n<3)return[];if(n>e.length)return[];const r=[],i=(a,s,c,d)=>{if(c.length===n-1){(t.get(a)?.has(s)||!o&&t.get(s)?.has(a))&&r.push([s,...c]);return}for(const l of e){if(d.has(l))continue;(t.get(a)?.has(l)||!o&&t.get(l)?.has(a))&&i(l,s,[...c,l],new Set([...d,l]))}};for(const a of e)i(a,a,[],new Set([a]));return r},ba=(e,t,n)=>{const o=e.length;for(let r=0;r<o;r++)for(let i=r+2;i<o;i++){if(r===0&&i===o-1)continue;if(t.get(e[r])?.has(e[i])||!n&&t.get(e[i])?.has(e[r]))return!0}return!1},ka=(e,t,n)=>{const o=new Map;for(const s of e)o.set(s.id,new Set);for(const s of t)o.get(s.source)?.add(s.target),n||o.get(s.target)?.add(s.source);const r=new Set,i=new Set,a=s=>{if(i.has(s))return!1;if(r.has(s))return!0;r.add(s);for(const c of o.get(s)||[])if(a(c))return!0;return r.delete(s),i.add(s),!1};for(const s of e)if(a(s.id))return!1;return!0},On=(e,t)=>{const n=e.map(c=>c.id),o=n.length;if(o===0)return 0;let r=new Array(o).fill(1),i=0;const a=100,s=1e-6;for(let c=0;c<a;c++){const d=new Array(o).fill(0);for(let h=0;h<o;h++){const p=t.get(n[h])||[];for(const m of p){const v=n.indexOf(m);v!==-1&&(d[h]+=r[v])}}const l=d.reduce((h,p,m)=>h+p*r[m],0),u=r.reduce((h,p)=>h+p*p,0),f=u>0?l/u:0;if(Math.abs(f-i)<s){i=f;break}i=f;const g=Math.sqrt(d.reduce((h,p)=>h+p*p,0));r=g>0?d.map(h=>h/g):d}return Math.abs(i)},wa=(e,t)=>{const n=e.map(d=>d.id),o=n.length;if(o===0||o===1)return 0;const r=new Map;for(const d of n)r.set(d,(t.get(d)||[]).length);const i=Math.min(...r.values()),a=new Set,s=[n[0]];for(a.add(n[0]);s.length>0;){const d=s.shift();if(!d)break;const l=t.get(d)||[];for(const u of l)a.has(u)||(a.add(u),s.push(u))}return a.size<o?0:i/o*2},xa=e=>{const{spec:t}=e,n=t.directionality.kind;return{property:"directionality",expected:n,actual:n,valid:!0,message:void 0}},Ma=e=>{const{spec:t,edges:n}=e,o=t.weighting.kind;let r,i,a;if(o==="unweighted"){const s=n.some(c=>c.weight!==void 0);r=s?"weighted_numeric":"unweighted",i=!s,a=i?void 0:`Graph should be unweighted but ${n.filter(c=>c.weight!==void 0).length} edges have weights`}else{const s=n.every(c=>typeof c.weight=="number");r=s?"weighted_numeric":"unweighted",i=s,a=i?void 0:`Graph should be weighted but ${n.filter(c=>typeof c.weight!="number").length} edges missing weights`}return{property:"weighting",expected:o,actual:r,valid:i,message:a}},Sa=(e,t={})=>{const{spec:n,nodes:o,edges:r}=e,i=n.cycles.kind,a=n.directionality.kind==="directed",c=$a(o,r,a)?"cycles_allowed":"acyclic",d=i==="cycles_allowed"||i===c;return{property:"cycles",expected:i,actual:c,valid:d,message:d?void 0:`Graph should be ${i} but ${c}`}},Ca=e=>{const{spec:t,nodes:n,edges:o}=e,r=t.connectivity.kind,i=t.directionality.kind==="directed",a=Qe(n,o,i),s=a?"connected":"unconstrained",c=r==="connected"?a:!0;return{property:"connectivity",expected:r,actual:s,valid:c,message:c?void 0:`Graph should be ${r} but is disconnected`}},_a=e=>{const{spec:t,nodes:n,edges:o}=e,r=t.schema.kind;let i,a,s;if(r==="homogeneous"){const c=new Set(n.map(l=>l.type).filter(l=>l!==void 0)),d=new Set(o.map(l=>l.type).filter(l=>l!==void 0));i=c.size<=1&&d.size<=1?"homogeneous":"heterogeneous",a=i==="homogeneous",s=a?void 0:`Graph should be homogeneous but has ${c.size} node types and ${d.size} edge types`}else{const c=new Set(n.map(l=>l.type).filter(l=>l!==void 0)),d=new Set(o.map(l=>l.type).filter(l=>l!==void 0));i=c.size>1||d.size>1?"heterogeneous":"homogeneous",a=i==="heterogeneous",s=a?void 0:`Graph should be heterogeneous but has uniform types (node types: ${c.size}, edge types: ${d.size})`}return{property:"schema",expected:r,actual:i,valid:a,message:s}},Na=e=>{const{spec:t,edges:n}=e,o=t.edgeMultiplicity.kind,r=t.directionality.kind==="directed";let i,a;const s=new Map;for(const l of n){const u=r?`${l.source}→${l.target}`:[l.source,l.target].sort().join("-");s.set(u,(s.get(u)??0)+1)}const c=[...s.values()].some(l=>l>1),d=c?"multi":"simple";if(o==="simple")i=!c,a=i?void 0:`Graph should be simple but has parallel edges: ${[...s.entries()].filter(([l,u])=>u>1).map(([l,u])=>`${l} (${u} edges)`).join(", ")}`;else{const l=e.nodes.length<2;i=c||l,a=i?void 0:"Graph should be a multigraph but has no parallel edges"}return{property:"edgeMultiplicity",expected:o,actual:d,valid:i,message:a}},Ea=e=>{const{spec:t,edges:n}=e,o=t.selfLoops.kind,r=n.filter(d=>d.source===d.target),i=r.length>0,a=i?"allowed":"disallowed";let s,c;return o==="allowed"?(s=i,c=s?void 0:"Graph should allow self-loops but has none"):(s=!i,c=s?void 0:`Graph should not allow self-loops but has ${r.length}: ${r.map(d=>d.source).join(", ")}`),{property:"selfLoops",expected:o,actual:a,valid:s,message:c}},$a=(e,t,n)=>{if(e.length<2)return!1;const o=Y(e,t,n),r=new Set,i=new Set,a=(s,c)=>{r.add(s),n&&i.add(s);const d=o.get(s)??[];for(const l of d)if(n){if(r.has(l)){if(i.has(l))return!0}else if(a(l,s))return!0}else if(r.has(l)){if(l!==c)return!0}else if(a(l,s))return!0;return n&&i.delete(s),!1};for(const s of e)if(!r.has(s.id)&&a(s.id,null))return!0;return!1},Ia=e=>{const{spec:t,nodes:n}=e;if(t.cage?.kind!=="cage")return{property:"cage",expected:t.cage?.kind??"unconstrained",actual:t.cage?.kind??"unconstrained",valid:!0};const{girth:o,degree:r}=t.cage;return n.some(a=>a.data?.targetCageGirth!==void 0)?{property:"cage",expected:`cage(girth=${o}, degree=${r})`,actual:`cage(girth=${o}, degree=${r})`,valid:!0}:{property:"cage",expected:`cage(girth=${o}, degree=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify cage structure without metadata"}},Pa=e=>{const{spec:t,nodes:n}=e;if(t.moore?.kind!=="moore")return{property:"moore",expected:t.moore?.kind??"unconstrained",actual:t.moore?.kind??"unconstrained",valid:!0};const{diameter:o,degree:r}=t.moore;return n.some(a=>a.data?.targetMooreDiameter!==void 0)?{property:"moore",expected:`moore(diameter=${o}, degree=${r})`,actual:`moore(diameter=${o}, degree=${r})`,valid:!0}:{property:"moore",expected:`moore(diameter=${o}, degree=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify Moore graph structure without metadata"}},Da=e=>{const{spec:t,nodes:n}=e;if(t.ramanujan?.kind!=="ramanujan")return{property:"ramanujan",expected:t.ramanujan?.kind??"unconstrained",actual:t.ramanujan?.kind??"unconstrained",valid:!0};const{degree:o}=t.ramanujan;return n.some(i=>i.data?.targetRamanujanDegree!==void 0)?{property:"ramanujan",expected:`ramanujan(degree=${o})`,actual:`ramanujan(degree=${o})`,valid:!0}:{property:"ramanujan",expected:`ramanujan(degree=${o})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify Ramanujan property without metadata"}},Ta=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.unitDisk?.kind!=="unit_disk")return{property:"unitDisk",expected:t.unitDisk?.kind??"unconstrained",actual:t.unitDisk?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"unitDisk",expected:"unit_disk",actual:"trivial",valid:!0};if(n.every(i=>i.data?.x!==void 0&&i.data?.y!==void 0)){const i=t.unitDisk?.kind==="unit_disk"&&t.unitDisk.unitRadius!==void 0?t.unitDisk.unitRadius:1;for(const a of o){const s=n.find(f=>f.id===a.source),c=n.find(f=>f.id===a.target);if(!s||!c||!s.data||!c.data)continue;const d=s.data.x-c.data.x,l=s.data.y-c.data.y,u=Math.hypot(d,l);if(u>i)return{property:"unitDisk",expected:"unit_disk",actual:"invalid_edge",valid:!1,message:`Edge distance ${u.toFixed(2)} exceeds unit radius ${i}`}}return{property:"unitDisk",expected:"unit_disk",actual:"unit_disk",valid:!0}}return{property:"unitDisk",expected:"unit_disk",actual:"unknown",valid:!0,message:"Unit disk validation requires coordinate metadata"}},Aa=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.planarity?.kind!=="planar")return{property:"planarity",expected:t.planarity?.kind??"unconstrained",actual:t.planarity?.kind??"unconstrained",valid:!0};const r=n.length;if(r<4)return{property:"planarity",expected:"planar",actual:"planar",valid:!0};const i=3*r-6;return o.length>i?{property:"planarity",expected:"planar",actual:"too_many_edges",valid:!1,message:`Planar graphs require m ≤ 3n-6, got m=${o.length}, 3n-6=${i}`}:{property:"planarity",expected:"planar",actual:"planar",valid:!0,message:"Planarity verified via Euler's formula constraint"}},Ra=e=>{const{spec:t,nodes:n}=e;if(t.hereditaryClass?.kind!=="hereditary_class")return{property:"hereditaryClass",expected:t.hereditaryClass?.kind??"unconstrained",actual:t.hereditaryClass?.kind??"unconstrained",valid:!0};const{forbidden:o}=t.hereditaryClass;return o.length===0?{property:"hereditaryClass",expected:"hereditary_class",actual:"hereditary_class",valid:!0}:n.some(i=>i.data?.hereditaryClass!==void 0)?{property:"hereditaryClass",expected:"hereditary_class",actual:"hereditary_class",valid:!0}:{property:"hereditaryClass",expected:"hereditary_class",actual:"unknown",valid:!1,message:`Hereditary class validation requires checking all induced subgraphs against forbidden patterns: ${o.join(", ")}`}},Fa=e=>{const{spec:t,nodes:n}=e;if(t.independenceNumber?.kind!=="independence_number")return{property:"independenceNumber",expected:t.independenceNumber?.kind??"unconstrained",actual:t.independenceNumber?.kind??"unconstrained",valid:!0};const{value:o}=t.independenceNumber;if(n.some(s=>s.data?.targetIndependenceNumber!==void 0))return{property:"independenceNumber",expected:`α=${o}`,actual:`α=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=qn(n,i);return{property:"independenceNumber",expected:`α=${o}`,actual:`α=${a}`,valid:a===o,message:a===o?`Graph has independence number ${a}`:`Graph has independence number ${a}, expected ${o}`}},ja=e=>{const{spec:t,nodes:n}=e;if(t.vertexCover?.kind!=="vertex_cover")return{property:"vertexCover",expected:t.vertexCover?.kind??"unconstrained",actual:t.vertexCover?.kind??"unconstrained",valid:!0};const{value:o}=t.vertexCover;if(n.some(c=>c.data?.targetVertexCover!==void 0))return{property:"vertexCover",expected:`τ=${o}`,actual:`τ=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=qn(n,i),s=n.length-a;return{property:"vertexCover",expected:`τ=${o}`,actual:`τ=${s}`,valid:s===o,message:s===o?`Graph has vertex cover number ${s}`:`Graph has vertex cover number ${s}, expected ${o}`}},La=e=>{const{spec:t,nodes:n}=e;if(t.dominationNumber?.kind!=="domination_number")return{property:"dominationNumber",expected:t.dominationNumber?.kind??"unconstrained",actual:t.dominationNumber?.kind??"unconstrained",valid:!0};const{value:o}=t.dominationNumber;if(n.some(s=>s.data?.targetDominationNumber!==void 0))return{property:"dominationNumber",expected:`γ=${o}`,actual:`γ=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=za(n,i);return{property:"dominationNumber",expected:`γ=${o}`,actual:`γ=${a}`,valid:a===o,message:a===o?`Graph has domination number ${a}`:`Graph has domination number ${a}, expected ${o}`}},qn=(e,t)=>{const n=e.length;if(n===0)return 0;if(n===1)return 1;const o=e.map(i=>i.id),r=(i,a,s)=>{if(a+i.size<=s)return s;if(i.size===0)return a;let d="",l=-1;for(const m of i){const y=(t.get(m)??[]).filter(b=>i.has(b)).length;y>l&&(l=y,d=m)}if(!d)return a;const u=new Set(i);u.delete(d);const f=t.get(d)??[];for(const m of f)u.delete(m);const g=r(u,a+1,s),h=new Set(i);h.delete(d);const p=r(h,a,g);return Math.max(g,p)};return r(new Set(o),0,0)},za=(e,t)=>{const n=e.length;if(n===0)return 0;if(n===1)return 1;const o=e.map(a=>a.id),r=a=>{for(const s of o)if(!a.has(s)&&!(t.get(s)??[]).some(l=>a.has(l)))return!1;return!0},i=(a,s,c)=>{if(s.size>=c)return c;if(r(s))return s.size;for(let d=a;d<o.length;d++){const l=o[d];if(!s.has(l)){s.add(l);const u=i(d+1,s,c);if(u<c&&(c=u),s.delete(l),c===s.size+1)break}}return c};return i(0,new Set,n)},Ba=e=>{const{spec:t,nodes:n}=e;if(t.minorFree?.kind!=="minor_free")return{property:"minorFree",expected:t.minorFree?.kind??"unconstrained",actual:t.minorFree?.kind??"unconstrained",valid:!0};const{forbiddenMinors:o}=t.minorFree;return n.some(i=>i.data?.targetForbiddenMinors!==void 0)?{property:"minorFree",expected:`minor_free(forbidden=[${o.join(", ")}])`,actual:`minor_free(forbidden=[${o.join(", ")}])`,valid:!0}:{property:"minorFree",expected:`minor_free(forbidden=[${o.join(", ")}])`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify minor-free structure without metadata"}},Oa=e=>{const{spec:t,nodes:n}=e;if(t.topologicalMinorFree?.kind!=="topological_minor_free")return{property:"topologicalMinorFree",expected:t.topologicalMinorFree?.kind??"unconstrained",actual:t.topologicalMinorFree?.kind??"unconstrained",valid:!0};const{forbiddenMinors:o}=t.topologicalMinorFree;return n.some(i=>i.data?.targetTopologicalForbiddenMinors!==void 0)?{property:"topologicalMinorFree",expected:`topological_minor_free(forbidden=[${o.join(", ")}])`,actual:`topological_minor_free(forbidden=[${o.join(", ")}])`,valid:!0}:{property:"topologicalMinorFree",expected:`topological_minor_free(forbidden=[${o.join(", ")}])`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify topological minor-free structure without metadata"}},qa=e=>{const{spec:t,nodes:n}=e;if(t.scaleFree?.kind!=="scale_free")return{property:"scaleFree",expected:t.scaleFree?.kind??"unconstrained",actual:t.scaleFree?.kind??"unconstrained",valid:!0};if(n.length<10)return{property:"scaleFree",expected:"scale_free",actual:"too_small",valid:!0,message:"Scale-free validation skipped for small graph (n < 10)"};if(n.every(r=>r.data?.scaleFreeExponent!==void 0)){const r=n[0].data?.scaleFreeExponent;return n.every(a=>a.data?.scaleFreeExponent===r)?n.length<50?{property:"scaleFree",expected:"scale_free",actual:`scale_free (exponent=${r})`,valid:!0,message:"Power-law validation skipped for small graph (n < 50)"}:{property:"scaleFree",expected:"scale_free",actual:`scale_free (exponent=${r})`,valid:!0,message:"Power-law validation not yet implemented"}:{property:"scaleFree",expected:"scale_free",actual:"inconsistent_exponents",valid:!1,message:"Nodes have inconsistent exponent markers"}}return{property:"scaleFree",expected:"scale_free",actual:"unknown",valid:!0,message:"Scale-free validation skipped (no exponent metadata found)"}},Ua=e=>{const{spec:t,nodes:n}=e;if(t.smallWorld?.kind!=="small_world")return{property:"smallWorld",expected:t.smallWorld?.kind??"unconstrained",actual:t.smallWorld?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"smallWorld",expected:"small_world",actual:"trivial",valid:!0};if(n.every(r=>r.data?.smallWorldRewireProb!==void 0)){const r=n[0].data?.smallWorldRewireProb,i=n[0].data?.smallWorldMeanDegree;return n.every(s=>s.data?.smallWorldRewireProb===r&&s.data?.smallWorldMeanDegree===i)?{property:"smallWorld",expected:"small_world",actual:`small_world (rewire=${r}, k=${i})`,valid:!0,message:"Clustering/path length validation not yet implemented"}:{property:"smallWorld",expected:"small_world",actual:"inconsistent_parameters",valid:!1,message:"Nodes have inconsistent small-world parameters"}}return{property:"smallWorld",expected:"small_world",actual:"unknown",valid:!0,message:"Small-world validation skipped (no parameter metadata found)"}},Ga=e=>{const{spec:t,nodes:n}=e;if(t.communityStructure?.kind!=="modular")return{property:"modular",expected:t.communityStructure?.kind??"unconstrained",actual:t.communityStructure?.kind??"unconstrained",valid:!0};if(n.length<3)return{property:"modular",expected:"modular",actual:"trivial",valid:!0};if(n.every(r=>r.data?.community!==void 0)){const r=n[0].data?.numCommunities,i=new Set(n.map(a=>a.data?.community??0));return i.size!==r?{property:"modular",expected:"modular",actual:"invalid_communities",valid:!1,message:`Expected ${r} communities, found ${i.size}`}:{property:"modular",expected:"modular",actual:`modular (${r} communities)`,valid:!0,message:"Modularity score validation not yet implemented"}}return{property:"modular",expected:"modular",actual:"unknown",valid:!0,message:"Modular validation skipped (no community metadata found)"}},Wa=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.hamiltonian?.kind!=="hamiltonian")return{property:"hamiltonian",expected:t.hamiltonian?.kind??"unconstrained",actual:t.hamiltonian?.kind??"unconstrained",valid:!0};const r=n.length;if(r<3)return{property:"hamiltonian",expected:"hamiltonian",actual:"trivial",valid:!0};if(n.some(a=>a.data?.hamiltonianCycle!==void 0)){const a=n[0].data;if(!a)return{property:"hamiltonian",expected:"hamiltonian",actual:"missing_metadata",valid:!1,message:"Hamiltonian cycle metadata not found"};const s=a.hamiltonianCycle;if(s?.length!==r)return{property:"hamiltonian",expected:"hamiltonian",actual:"invalid_cycle",valid:!1,message:`Hamiltonian cycle metadata invalid: expected ${r} vertices, got ${s?.length??0}`};for(let c=0;c<r;c++){const d=s[c],l=s[(c+1)%r];if(!o.some(f=>f.source===d&&f.target===l||f.source===l&&f.target===d))return{property:"hamiltonian",expected:"hamiltonian",actual:"missing_cycle_edge",valid:!1,message:`Hamiltonian cycle edge (${d}, ${l}) not found in graph`}}return{property:"hamiltonian",expected:"hamiltonian",actual:"hamiltonian",valid:!0}}return o.length<r?{property:"hamiltonian",expected:"hamiltonian",actual:"insufficient_edges",valid:!1,message:`Hamiltonian graphs require m ≥ n, got m=${o.length}, n=${r}`}:{property:"hamiltonian",expected:"hamiltonian",actual:"hamiltonian",valid:!0,message:"Hamiltonian validation skipped (no cycle metadata, edge count sufficient)"}},Va=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.traceable?.kind!=="traceable")return{property:"traceable",expected:t.traceable?.kind??"unconstrained",actual:t.traceable?.kind??"unconstrained",valid:!0};const r=n.length;if(r<2)return{property:"traceable",expected:"traceable",actual:"trivial",valid:!0};if(n.some(a=>a.data?.traceablePath!==void 0)){const a=n[0].data;if(!a)return{property:"traceable",expected:"traceable",actual:"missing_metadata",valid:!1,message:"Traceable path metadata not found"};const s=a.traceablePath;if(s?.length!==r)return{property:"traceable",expected:"traceable",actual:"invalid_path",valid:!1,message:`Hamiltonian path metadata invalid: expected ${r} vertices, got ${s?.length??0}`};for(let c=0;c<r-1;c++){const d=s[c],l=s[c+1];if(!o.some(f=>f.source===d&&f.target===l||f.source===l&&f.target===d))return{property:"traceable",expected:"traceable",actual:"missing_path_edge",valid:!1,message:`Hamiltonian path edge (${d}, ${l}) not found in graph`}}return{property:"traceable",expected:"traceable",actual:"traceable",valid:!0}}return o.length<r-1?{property:"traceable",expected:"traceable",actual:"insufficient_edges",valid:!1,message:`Traceable graphs require m ≥ n-1, got m=${o.length}, n=${r}`}:{property:"traceable",expected:"traceable",actual:"traceable",valid:!0,message:"Traceable validation skipped (no path metadata, edge count sufficient)"}},Ka=e=>{const{spec:t,nodes:n}=e;if(t.diameter?.kind!=="diameter")return{property:"diameter",expected:t.diameter?.kind??"unconstrained",actual:t.diameter?.kind??"unconstrained",valid:!0};const{value:o}=t.diameter;if(n.length<2)return{property:"diameter",expected:`diameter=${o}`,actual:"trivial",valid:!0};if(n.some(s=>s.data?.targetDiameter!==void 0))return{property:"diameter",expected:`diameter=${o}`,actual:`diameter=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Xa(n,i);return{property:"diameter",expected:`diameter=${o}`,actual:`diameter=${a}`,valid:a===o,message:a===o?`Graph has diameter ${a}`:`Graph has diameter ${a}, expected ${o}`}},Ha=e=>{const{spec:t,nodes:n}=e;if(t.radius?.kind!=="radius")return{property:"radius",expected:t.radius?.kind??"unconstrained",actual:t.radius?.kind??"unconstrained",valid:!0};const{value:o}=t.radius;if(n.length<2)return{property:"radius",expected:`radius=${o}`,actual:"trivial",valid:!0};if(n.some(c=>c.data?.targetRadius!==void 0))return{property:"radius",expected:`radius=${o}`,actual:`radius=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Ya(n,i),s=Math.min(...a.values());return{property:"radius",expected:`radius=${o}`,actual:`radius=${s}`,valid:s===o,message:s===o?`Graph has radius ${s}`:`Graph has radius ${s}, expected ${o}`}},Ja=e=>{const{spec:t,nodes:n}=e;if(t.girth?.kind!=="girth")return{property:"girth",expected:t.girth?.kind??"unconstrained",actual:t.girth?.kind??"unconstrained",valid:!0};const{girth:o}=t.girth;if(n.length<3)return{property:"girth",expected:`girth=${o}`,actual:"acyclic",valid:!1,message:"Graph with < 3 vertices cannot have cycles"};if(n.some(s=>s.data?.targetGirth!==void 0))return{property:"girth",expected:`girth=${o}`,actual:`girth=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=Za(n,i);return a===0?{property:"girth",expected:`girth=${o}`,actual:"acyclic",valid:!1,message:`Graph is acyclic (no cycles), expected girth ${o}`}:{property:"girth",expected:`girth=${o}`,actual:`girth=${a}`,valid:a===o,message:a===o?`Graph has girth ${a}`:`Graph has girth ${a}, expected ${o}`}},Qa=e=>{const{spec:t,nodes:n}=e;if(t.circumference?.kind!=="circumference")return{property:"circumference",expected:t.circumference?.kind??"unconstrained",actual:t.circumference?.kind??"unconstrained",valid:!0};const{value:o}=t.circumference;if(n.length<3)return{property:"circumference",expected:`circumference=${o}`,actual:"acyclic",valid:!1,message:"Graph with < 3 vertices cannot have cycles"};if(n.some(s=>s.data?.targetCircumference!==void 0))return{property:"circumference",expected:`circumference=${o}`,actual:`circumference=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=ec(n,i);return a===0?{property:"circumference",expected:`circumference=${o}`,actual:"acyclic",valid:!1,message:`Graph is acyclic (no cycles), expected circumference ${o}`}:{property:"circumference",expected:`circumference=${o}`,actual:`circumference=${a}`,valid:a===o,message:a===o?`Graph has circumference ${a}`:`Graph has circumference ${a}, expected ${o}`}},Xa=(e,t)=>{let n=0;for(const o of e){const r=new Map,i=[o.id];for(r.set(o.id,0);i.length>0;){const a=i.shift();if(a===void 0)break;const s=r.get(a);if(s!==void 0)for(const c of t.get(a)||[])r.has(c)||(r.set(c,s+1),i.push(c),n=Math.max(n,s+1))}}return n},Ya=(e,t)=>{const n=new Map;for(const o of e){const r=new Map,i=[o.id];for(r.set(o.id,0);i.length>0;){const s=i.shift();if(s===void 0)break;const c=r.get(s);if(c!==void 0)for(const d of t.get(s)||[])r.has(d)||(r.set(d,c+1),i.push(d))}const a=Math.max(...r.values());n.set(o.id,a)}return n},Za=(e,t)=>{let n=0;for(const o of e){const r=new Map,i=new Map,a=[o.id];for(r.set(o.id,null),i.set(o.id,0);a.length>0;){const s=a.shift();if(s===void 0)break;const c=i.get(s);if(c!==void 0){for(const d of t.get(s)||[])if(!i.has(d))r.set(d,s),i.set(d,c+1),a.push(d);else if(r.get(s)!==d){const l=i.get(d);if(l!==void 0){const u=c+l+1;(n===0||u<n)&&(n=u)}}}}}return n},ec=(e,t)=>{let n=0;const o=(r,i,a,s)=>{a.push(r),s.add(r);for(const c of t.get(r)||[])c===i&&a.length>=3?n=Math.max(n,a.length):!s.has(c)&&!a.includes(c)&&o(c,i,[...a],s)};for(const r of e)o(r.id,r.id,[],new Set);return n},tc=e=>{const{spec:t,nodes:n}=e;if(t.cartesianProduct?.kind!=="cartesian_product")return{property:"cartesianProduct",expected:t.cartesianProduct?.kind??"unconstrained",actual:t.cartesianProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.cartesianProduct;return n.some(a=>a.data?.targetCartesianProductLeft!==void 0)?{property:"cartesianProduct",expected:`cartesian_product(left=${o}, right=${r})`,actual:`cartesian_product(left=${o}, right=${r})`,valid:!0}:{property:"cartesianProduct",expected:`cartesian_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify Cartesian product structure without metadata"}},nc=e=>{const{spec:t,nodes:n}=e;if(t.tensorProduct?.kind!=="tensor_product")return{property:"tensorProduct",expected:t.tensorProduct?.kind??"unconstrained",actual:t.tensorProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.tensorProduct;return n.some(a=>a.data?.targetTensorProductLeft!==void 0)?{property:"tensorProduct",expected:`tensor_product(left=${o}, right=${r})`,actual:`tensor_product(left=${o}, right=${r})`,valid:!0}:{property:"tensorProduct",expected:`tensor_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify tensor product structure without metadata"}},oc=e=>{const{spec:t,nodes:n}=e;if(t.strongProduct?.kind!=="strong_product")return{property:"strongProduct",expected:t.strongProduct?.kind??"unconstrained",actual:t.strongProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.strongProduct;return n.some(a=>a.data?.targetStrongProductLeft!==void 0)?{property:"strongProduct",expected:`strong_product(left=${o}, right=${r})`,actual:`strong_product(left=${o}, right=${r})`,valid:!0}:{property:"strongProduct",expected:`strong_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify strong product structure without metadata"}},rc=e=>{const{spec:t,nodes:n}=e;if(t.lexicographicProduct?.kind!=="lexicographic_product")return{property:"lexicographicProduct",expected:t.lexicographicProduct?.kind??"unconstrained",actual:t.lexicographicProduct?.kind??"unconstrained",valid:!0};const{leftFactors:o,rightFactors:r}=t.lexicographicProduct;return n.some(a=>a.data?.targetLexicographicProductLeft!==void 0)?{property:"lexicographicProduct",expected:`lexicographic_product(left=${o}, right=${r})`,actual:`lexicographic_product(left=${o}, right=${r})`,valid:!0}:{property:"lexicographicProduct",expected:`lexicographic_product(left=${o}, right=${r})`,actual:"unknown (no metadata)",valid:!1,message:"Cannot verify lexicographic product structure without metadata"}},ic=(e,t)=>{const n=e.map(d=>d.id),o=n.length;if(o===0||o===1)return 0;const r=new Set,i=[n[0]];for(r.add(n[0]);i.length>0;){const d=i.shift();if(!d)break;const l=t.get(d)||[];for(const u of l)r.has(u)||(r.add(u),i.push(u))}if(r.size<o)return 0;const a=n.map(d=>(t.get(d)||[]).length);return a.reduce((d,l)=>d+l,0)/o,Math.min(...a)/2},sc=(e,t)=>{const n=e.map(d=>d.id),o=n.length;if(o===0)return 0;if(o===1)return 1;const r=new Set,i=[n[0]];for(r.add(n[0]);i.length>0;){const d=i.shift();if(!d)break;const l=t.get(d)||[];for(const u of l)r.has(u)||(r.add(u),i.push(u))}if(r.size<o){const d=r.size;return o-d+d}const a=n.map(d=>(t.get(d)||[]).length),c=Math.min(...a)+1;return Math.min(c,o)},ac=e=>{const{spec:t,nodes:n}=e;if(t.toughness?.kind!=="toughness")return{property:"toughness",expected:t.toughness?.kind??"unconstrained",actual:t.toughness?.kind??"unconstrained",valid:!0};const{value:o}=t.toughness;if(n.some(s=>s.data?.targetToughness!==void 0))return{property:"toughness",expected:`toughness=${o}`,actual:`toughness=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=ic(n,i);return{property:"toughness",expected:`toughness=${o}`,actual:`toughness≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.5,message:`Toughness ≈${a.toFixed(4)}, target ${o}`}},cc=e=>{const{spec:t,nodes:n}=e;if(t.integrity?.kind!=="integrity")return{property:"integrity",expected:t.integrity?.kind??"unconstrained",actual:t.integrity?.kind??"unconstrained",valid:!0};const{value:o}=t.integrity;if(n.some(s=>s.data?.targetIntegrity!==void 0))return{property:"integrity",expected:`integrity=${o}`,actual:`integrity=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=sc(n,i);return{property:"integrity",expected:`integrity=${o}`,actual:`integrity≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.5,message:`Integrity ≈${a.toFixed(4)}, target ${o}`}},dc=e=>{const{spec:t,nodes:n}=e;if(t.spectrum?.kind!=="spectrum")return{property:"spectrum",expected:t.spectrum?.kind??"unconstrained",actual:t.spectrum?.kind??"unconstrained",valid:!0};const{eigenvalues:o}=t.spectrum;if(n.some(d=>d.data?.targetSpectrum!==void 0))return{property:"spectrum",expected:`${o.length} eigenvalues`,actual:`${o.length} eigenvalues`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=On(n,i),s=Math.max(...o.map(Math.abs)),c=Math.abs(a-s)<.1;return{property:"spectrum",expected:`spectral radius ≈ ${s}`,actual:`spectral radius ≈ ${a}`,valid:c,message:c?"Graph spectrum consistent with target":`Graph has spectral radius ${a}, expected ${s}`}},lc=e=>{const{spec:t,nodes:n}=e;if(t.algebraicConnectivity?.kind!=="algebraic_connectivity")return{property:"algebraicConnectivity",expected:t.algebraicConnectivity?.kind??"unconstrained",actual:t.algebraicConnectivity?.kind??"unconstrained",valid:!0};const{value:o}=t.algebraicConnectivity;if(n.some(s=>s.data?.targetAlgebraicConnectivity!==void 0))return{property:"algebraicConnectivity",expected:`λ₂=${o}`,actual:`λ₂=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=wa(n,i);return{property:"algebraicConnectivity",expected:`λ₂=${o}`,actual:`λ₂≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.5,message:`Algebraic connectivity λ₂≈${a.toFixed(4)}, target ${o}`}},uc=e=>{const{spec:t,nodes:n}=e;if(t.spectralRadius?.kind!=="spectral_radius")return{property:"spectralRadius",expected:t.spectralRadius?.kind??"unconstrained",actual:t.spectralRadius?.kind??"unconstrained",valid:!0};const{value:o}=t.spectralRadius;if(n.some(s=>s.data?.targetSpectralRadius!==void 0))return{property:"spectralRadius",expected:`ρ=${o}`,actual:`ρ=${o}`,valid:!0};const i=Y(n,e.edges,t.directionality.kind==="directed"),a=On(n,i);return{property:"spectralRadius",expected:`ρ=${o}`,actual:`ρ≈${a.toFixed(4)}`,valid:Math.abs(a-o)<.1,message:a===o?`Graph has spectral radius ${a}`:`Graph has spectral radius ${a.toFixed(4)}, expected ${o}`}},fc=(e,t={})=>{const{spec:n,nodes:o,edges:r}=e,i=o.length;if(i<2)return{property:"density/completeness",expected:`${n.density.kind} + ${n.completeness.kind}`,actual:n.density.kind,valid:!0};const a=n.selfLoops.kind==="allowed"?i:0;let s;if(n.connectivity.kind==="unconstrained"){const g=an(o,r,n.directionality.kind==="directed");g.length>1?s=g.reduce((h,p)=>{const m=p.length;return n.directionality.kind==="directed"?h+m*(m-1):h+m*(m-1)/2},0)+a:s=n.directionality.kind==="directed"?i*(i-1)+a:i*(i-1)/2+a}else s=n.directionality.kind==="directed"?i*(i-1)+a:i*(i-1)/2+a;const c=r.length,d=c/s;if(n.completeness.kind==="complete"){const g=c===s;return{property:"completeness",expected:"complete",actual:g?"complete":`${c}/${s} edges`,valid:g,message:g?void 0:`Expected complete graph but missing ${s-c} edges`}}let l;if(d<.2?l="sparse":d<.45?l="moderate":(d<.75,l="dense"),n.connectivity.kind==="unconstrained"&&(n.cycles.kind==="acyclic"||n.cycles.kind==="cycles_allowed")){const g=an(o,r,n.directionality.kind==="directed");let p=o.length-g.length;n.selfLoops.kind==="allowed"&&(p+=1),n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&(p+=1),n.edgeMultiplicity.kind==="multi"&&(p+=1);let m=1;if(n.density.kind==="moderate"?(m=Math.floor(s*.5)-p,m<2&&(m=2)):n.density.kind==="dense"&&(m=Math.floor(s*.7)-p,m<3&&(m=3)),c<=p+m)return{property:"density",expected:n.density.kind,actual:l,valid:!0}}if(n.connectivity.kind==="connected"){let g=o.length-1;n.selfLoops.kind==="allowed"&&(g+=1),n.cycles.kind==="cycles_allowed"&&n.directionality.kind==="directed"&&(g+=1),n.edgeMultiplicity.kind==="multi"&&(g+=1);let h=1;if(n.density.kind==="moderate"?(h=Math.floor(s*.5)-g,h<2&&(h=2)):n.density.kind==="dense"&&(h=Math.floor(s*.7)-g,h<3&&(h=3)),c<=g+h)return{property:"density",expected:n.density.kind,actual:l,valid:!0}}if(t.relaxDensityValidation)return{property:"density",expected:n.density.kind,actual:l,valid:!0};const f=n.density.kind==="unconstrained"||l===n.density.kind;return{property:"density",expected:n.density.kind,actual:l,valid:f,message:f?void 0:`Expected ${n.density.kind} but found ${l} (${(d*100).toFixed(1)}% edge density: ${c}/${s})`}},gc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.partiteness?.kind!=="bipartite")return{property:"partiteness",expected:t.partiteness?.kind??"unrestricted",actual:t.partiteness?.kind??"unrestricted",valid:!0};const r=ma(n,o,t.directionality.kind==="directed");return{property:"partiteness",expected:"bipartite",actual:r?"bipartite":"not_bipartite",valid:r,message:r?void 0:"Graph contains odd-length cycle(s), which violates bipartite property"}},hc=e=>{const{spec:t,nodes:n,edges:o}=e,r=n.length;if(t.tournament?.kind!=="tournament")return{property:"tournament",expected:t.tournament?.kind??"unconstrained",actual:t.tournament?.kind??"unconstrained",valid:!0};if(r<2)return{property:"tournament",expected:"tournament",actual:"trivial",valid:!0};const i=new Set;for(const l of o){const u=`${l.source}->${l.target}`;if(i.add(u),l.source===l.target)return{property:"tournament",expected:"tournament",actual:"not_tournament",valid:!1,message:`Tournament violated: Self-loop detected at node ${l.source}`}}let a=!1,s=!1;const c=[];for(let l=0;l<n.length;l++)for(let u=l+1;u<n.length;u++){const f=n[l].id,g=n[u].id,h=`${f}->${g}`,p=`${g}->${f}`,m=i.has(h),v=i.has(p);m&&v?(a=!0,c.push(`(${f}, ${g})`)):!m&&!v&&(s=!0,c.push(`(${f}, ${g})`))}const d=!a&&!s;return{property:"tournament",expected:"tournament",actual:d?"tournament":"not_tournament",valid:d,message:d?void 0:a?`Tournament violated: Bidirectional edges found between ${c.length} pair(s)`:`Tournament violated: Missing edges between ${c.length} pair(s)`}},pc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.split?.kind!=="split")return{property:"split",expected:t.split?.kind??"unconstrained",actual:t.split?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"split",expected:"split",actual:"trivial",valid:!0};const r=new Map;for(const a of n)r.set(a.id,new Set);for(const a of o)r.get(a.source)?.add(a.target),t.directionality.kind==="undirected"&&r.get(a.target)?.add(a.source);if(n.every(a=>a.data?.splitPartition)){const a=n.filter(l=>l.data?.splitPartition==="clique"),s=n.filter(l=>l.data?.splitPartition==="independent");let c=!0;for(let l=0;l<a.length&&c;l++)for(let u=l+1;u<a.length&&c;u++)r.get(a[l].id)?.has(a[u].id)||(c=!1);let d=!0;for(let l=0;l<s.length&&d;l++)for(let u=l+1;u<s.length&&d;u++)r.get(s[l].id)?.has(s[u].id)&&(d=!1);if(c&&d)return{property:"split",expected:"split",actual:"split",valid:!0}}if(n.length>10)return{property:"split",expected:"split",actual:"unknown (too large for validation)",valid:!0,message:"Split validation skipped for large graph (n > 10)"};for(const a of Array.from({length:n.length-1},(s,c)=>c+1)){const s=ze(n.map(c=>c.id),a);for(const c of s){const d=new Set(c),l=n.map(g=>g.id).filter(g=>!d.has(g));let u=!0;for(let g=0;g<c.length&&u;g++)for(let h=g+1;h<c.length&&u;h++)r.get(c[g])?.has(c[h])||(u=!1);if(!u)continue;let f=!0;for(let g=0;g<l.length&&f;g++)for(let h=g+1;h<l.length&&f;h++)r.get(l[g])?.has(l[h])&&(f=!1);if(f)return{property:"split",expected:"split",actual:"split",valid:!0}}}return{property:"split",expected:"split",actual:"non_split",valid:!1,message:"Graph cannot be partitioned into clique + independent set"}},mc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.cograph?.kind!=="cograph")return{property:"cograph",expected:t.cograph?.kind??"unconstrained",actual:t.cograph?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"cograph",expected:"cograph",actual:"trivial",valid:!0};const r=new Map;for(const a of n)r.set(a.id,new Set);for(const a of o)r.get(a.source)?.add(a.target),t.directionality.kind==="undirected"&&r.get(a.target)?.add(a.source);const i=ze(n.map(a=>a.id),4);for(const a of i)if(va(a,r,t.directionality.kind==="directed"))return{property:"cograph",expected:"cograph",actual:"non_cograph",valid:!1,message:`Graph contains induced P4 on vertices [${a.join(", ")}]`};return{property:"cograph",expected:"cograph",actual:"cograph",valid:!0}},vc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.clawFree?.kind!=="claw_free")return{property:"clawFree",expected:t.clawFree?.kind??"unconstrained",actual:t.clawFree?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"clawFree",expected:"claw_free",actual:"trivial",valid:!0};const r=new Map;for(const i of n)r.set(i.id,new Set);for(const i of o)r.get(i.source)?.add(i.target),t.directionality.kind==="undirected"&&r.get(i.target)?.add(i.source);for(const i of n){const a=[...r.get(i.id)||[]];if(a.length<3)continue;const s=ze(a,3);for(const c of s){let d=!0;for(let l=0;l<c.length&&d;l++)for(let u=l+1;u<c.length&&d;u++)r.get(c[l])?.has(c[u])&&(d=!1);if(d)return{property:"clawFree",expected:"claw_free",actual:"has_claw",valid:!1,message:`Graph contains induced K_{1,3} with center ${i.id} and leaves [${c.join(", ")}]`}}}return{property:"clawFree",expected:"claw_free",actual:"claw_free",valid:!0}},yc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.chordal?.kind!=="chordal")return{property:"chordal",expected:t.chordal?.kind??"unconstrained",actual:t.chordal?.kind??"unconstrained",valid:!0};if(n.length<4)return{property:"chordal",expected:"chordal",actual:"trivial",valid:!0};const r=new Map;for(const i of n)r.set(i.id,new Set);for(const i of o)r.get(i.source)?.add(i.target),t.directionality.kind==="undirected"&&r.get(i.target)?.add(i.source);if(n.length<=10)for(let i=4;i<=n.length;i++){const a=ya(n.map(s=>s.id),r,i,t.directionality.kind==="directed");for(const s of a)if(!ba(s,r,t.directionality.kind==="directed"))return{property:"chordal",expected:"chordal",actual:"non_chordal",valid:!1,message:`Graph contains chordless cycle of length ${i}: [${s.join(", ")}]`}}return{property:"chordal",expected:"chordal",actual:"chordal",valid:!0,message:n.length>10?"Chordal validation skipped for large graph (n > 10)":void 0}},bc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.interval?.kind!=="interval")return{property:"interval",expected:t.interval?.kind??"unconstrained",actual:t.interval?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"interval",expected:"interval",actual:"trivial",valid:!0};if(n.every(i=>i.data?.interval)){const i=n.map(s=>({node:s,start:s.data?.interval?.start??0,end:s.data?.interval?.end??0})),a=new Map;for(const s of n)a.set(s.id,new Set);for(const s of o)a.get(s.source)?.add(s.target),t.directionality.kind==="undirected"&&a.get(s.target)?.add(s.source);for(let s=0;s<i.length;s++)for(let c=s+1;c<i.length;c++){const d=i[s],l=i[c],u=d.start<l.end&&l.start<d.end,f=a.get(d.node.id)?.has(l.node.id);if(u!==f)return{property:"interval",expected:"interval",actual:"non_interval",valid:!1,message:`Edge mismatch: intervals ${d.node.id} and ${l.node.id} ${u?"intersect but no edge":"have edge but don't intersect"}`}}return{property:"interval",expected:"interval",actual:"interval",valid:!0}}return{property:"interval",expected:"interval",actual:"unknown",valid:!0,message:"Interval validation skipped (no interval metadata found)"}},kc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.permutation?.kind!=="permutation")return{property:"permutation",expected:t.permutation?.kind??"unconstrained",actual:t.permutation?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"permutation",expected:"permutation",actual:"trivial",valid:!0};if(n.every(i=>i.data?.permutationValue!==void 0)){const i=n.map(s=>s.data?.permutationValue??0),a=new Map;for(const s of n)a.set(s.id,new Set);for(const s of o)a.get(s.source)?.add(s.target),t.directionality.kind==="undirected"&&a.get(s.target)?.add(s.source);for(let s=0;s<n.length;s++)for(let c=s+1;c<n.length;c++){const d=s-c,l=i[s]-i[c],u=d*l<0,f=a.get(n[s].id)?.has(n[c].id);if(u!==f)return{property:"permutation",expected:"permutation",actual:"non_permutation",valid:!1,message:`Edge mismatch: nodes ${s} and ${c} ${u?"should have edge but don't":"have edge but shouldn't"}`}}return{property:"permutation",expected:"permutation",actual:"permutation",valid:!0}}return{property:"permutation",expected:"permutation",actual:"unknown",valid:!0,message:"Permutation validation skipped (no permutation metadata found)"}},wc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.comparability?.kind!=="comparability")return{property:"comparability",expected:t.comparability?.kind??"unconstrained",actual:t.comparability?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"comparability",expected:"comparability",actual:"trivial",valid:!0};if(n.every(i=>i.data?.topologicalOrder!==void 0)){const i=n.map(s=>s.data?.topologicalOrder??0);return new Set(i).size!==n.length?{property:"comparability",expected:"comparability",actual:"invalid_order",valid:!1,message:"Topological order contains duplicate values"}:{property:"comparability",expected:"comparability",actual:"comparability",valid:!0}}return n.length<=10&&!ka(n,o,t.directionality.kind==="directed")?{property:"comparability",expected:"comparability",actual:"non_comparability",valid:!1,message:"Graph is not transitively orientable"}:{property:"comparability",expected:"comparability",actual:"comparability",valid:!0,message:n.length>10?"Comparability validation skipped for large graph (n > 10)":void 0}},xc=e=>{const{spec:t,nodes:n}=e;if(t.perfect?.kind!=="perfect")return{property:"perfect",expected:t.perfect?.kind??"unconstrained",actual:t.perfect?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"perfect",expected:"perfect",actual:"trivial",valid:!0};if(n.every(r=>r.data?.perfectClass)){const r=n[0].data?.perfectClass;return n.every(a=>a.data?.perfectClass===r)?{property:"perfect",expected:"perfect",actual:`perfect (${r})`,valid:!0}:{property:"perfect",expected:"perfect",actual:"mixed_classes",valid:!1,message:"Nodes have inconsistent perfect class markers"}}return{property:"perfect",expected:"perfect",actual:"unknown",valid:!0,message:"Perfect validation skipped (no perfect class metadata found)"}},Mc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.line?.kind!=="line_graph")return{property:"line",expected:t.line?.kind??"unconstrained",actual:t.line?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"line",expected:"line_graph",actual:"trivial",valid:!0};if(n.every(i=>i.data?.baseEdge!==void 0)){const i=n.map(a=>a.data?.baseEdge??{source:"",target:""});for(const a of o){const s=Number.parseInt(a.source.replaceAll(/^\D+/g,"")),c=Number.parseInt(a.target.replaceAll(/^\D+/g,""));if(Number.isNaN(s)||Number.isNaN(c)||s>=i.length||c>=i.length)return{property:"line",expected:"line_graph",actual:"invalid_structure",valid:!1,message:"Invalid node IDs for line graph"};const d=i[s],l=i[c];if(!(d.source===l.source||d.source===l.target||d.target===l.source||d.target===l.target))return{property:"line",expected:"line_graph",actual:"invalid_adjacency",valid:!1,message:"Adjacent vertices in L(G) don't share vertex in base graph G"}}return{property:"line",expected:"line_graph",actual:"line_graph",valid:!0}}return{property:"line",expected:"line_graph",actual:"unknown",valid:!0,message:"Line graph validation skipped (no base edge metadata found)"}},Sc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.selfComplementary?.kind!=="self_complementary")return{property:"selfComplementary",expected:t.selfComplementary?.kind??"unconstrained",actual:t.selfComplementary?.kind??"unconstrained",valid:!0};const r=n.length;if(r%4!==0&&r%4!==1)return{property:"selfComplementary",expected:"self_complementary",actual:"invalid_size",valid:!1,message:`Self-complementary requires n ≡ 0 or 1 (mod 4), got n=${r}`};const i=n.some(s=>s.data?.permutation!==void 0),a=n.some(s=>s.data?.selfComplementaryType!==void 0);if(i||a){const c=r*(r-1)/2/2;return o.length!==c?{property:"selfComplementary",expected:"self_complementary",actual:"invalid_edge_count",valid:!1,message:`Self-complementary requires exactly ${c} edges, got ${o.length}`}:{property:"selfComplementary",expected:"self_complementary",actual:"self_complementary",valid:!0,message:"Isomorphism validation not yet implemented"}}return{property:"selfComplementary",expected:"self_complementary",actual:"unknown",valid:!0,message:"Self-complementary validation skipped (no construction metadata found)"}},Cc=e=>{const{spec:t,nodes:n}=e;return t.threshold?.kind!=="threshold"?{property:"threshold",expected:t.threshold?.kind??"unconstrained",actual:t.threshold?.kind??"unconstrained",valid:!0}:n.length<2?{property:"threshold",expected:"threshold",actual:"trivial",valid:!0}:n.some(r=>r.data?.thresholdType!==void 0)?n.every(i=>i.data?.thresholdType==="dominant"||i.data?.thresholdType==="isolated")?{property:"threshold",expected:"threshold",actual:"threshold",valid:!0}:{property:"threshold",expected:"threshold",actual:"invalid_metadata",valid:!1,message:"Not all vertices marked as dominant or isolated"}:{property:"threshold",expected:"threshold",actual:"unknown",valid:!0,message:"Threshold validation requires construction metadata"}},_c=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.stronglyRegular?.kind!=="strongly_regular")return{property:"stronglyRegular",expected:t.stronglyRegular?.kind??"unconstrained",actual:t.stronglyRegular?.kind??"unconstrained",valid:!0};const r=n.length,{k:i,lambda:a,mu:s}=t.stronglyRegular;if(i===void 0||a===void 0||s===void 0)return{property:"stronglyRegular",expected:"strongly_regular",actual:"missing_parameters",valid:!1,message:"Strongly regular requires k, lambda, mu parameters"};if(n.some(d=>d.data?.srgParams!==void 0)){const d=n[0].data?.srgParams;if(!d)return{property:"stronglyRegular",expected:"strongly_regular",actual:"invalid_metadata",valid:!1,message:"SRG parameter metadata not found"};if(d.n!==r||d.k!==i||d.lambda!==a||d.mu!==s)return{property:"stronglyRegular",expected:"strongly_regular",actual:"parameter_mismatch",valid:!1,message:`SRG parameters mismatch: expected (${r}, ${i}, ${a}, ${s}), got (${d.n}, ${d.k}, ${d.lambda}, ${d.mu})`};const l=new Map;for(const f of n)l.set(f.id,0);for(const f of o)l.set(f.source,(l.get(f.source)||0)+1),l.set(f.target,(l.get(f.target)||0)+1);return[...l.values()].every(f=>f===i)?{property:"stronglyRegular",expected:"strongly_regular",actual:"strongly_regular",valid:!0}:{property:"stronglyRegular",expected:"strongly_regular",actual:"not_regular",valid:!1,message:`SRG requires all vertices to have degree ${i}`}}return i*(i-a-1)!==(r-i-1)*s?{property:"stronglyRegular",expected:"strongly_regular",actual:"invalid_parameters",valid:!1,message:"SRG feasibility condition failed: k(k-λ-1) = (n-k-1)μ required"}:{property:"stronglyRegular",expected:"strongly_regular",actual:"strongly_regular",valid:!0,message:"Strongly regular validation skipped (no metadata, feasibility condition satisfied)"}},Nc=e=>{const{spec:t,nodes:n}=e;if(t.vertexTransitive?.kind!=="vertex_transitive")return{property:"vertexTransitive",expected:t.vertexTransitive?.kind??"unconstrained",actual:t.vertexTransitive?.kind??"unconstrained",valid:!0};if(n.length<2)return{property:"vertexTransitive",expected:"vertex_transitive",actual:"trivial",valid:!0};if(n.some(c=>c.data?.vertexTransitiveGroup!==void 0)){if(!n.every(u=>u.data?.vertexTransitiveGroup!==void 0))return{property:"vertexTransitive",expected:"vertex_transitive",actual:"incomplete_metadata",valid:!1,message:"Not all vertices have vertex-transitive group metadata"};const d=n[0].data?.vertexTransitiveGroup;return d?n.every(u=>u.data?.vertexTransitiveGroup===d)?{property:"vertexTransitive",expected:"vertex_transitive",actual:"vertex_transitive",valid:!0}:{property:"vertexTransitive",expected:"vertex_transitive",actual:"inconsistent_groups",valid:!1,message:"Not all vertices use same automorphism group"}:{property:"vertexTransitive",expected:"vertex_transitive",actual:"missing_group",valid:!1,message:"Vertex-transitive group metadata not found"}}const i=new Map;for(const c of n)i.set(c.id,0);for(const c of e.edges)i.set(c.source,(i.get(c.source)||0)+1),i.set(c.target,(i.get(c.target)||0)+1);const a=[...i.values()];return a.every(c=>c===a[0])?{property:"vertexTransitive",expected:"vertex_transitive",actual:"vertex_transitive",valid:!0,message:"Vertex-transitive validation skipped (no metadata, graph is regular)"}:{property:"vertexTransitive",expected:"vertex_transitive",actual:"irregular",valid:!1,message:"Vertex-transitive graphs are regular (all vertices same degree)"}},Ec=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.edgeTransitive?.kind!=="edge_transitive")return{property:"edgeTransitive",expected:t.edgeTransitive?.kind??"unconstrained",actual:t.edgeTransitive?.kind??"unconstrained",valid:!0};const r=n.length;if(r<2)return{property:"edgeTransitive",expected:"edge_transitive",actual:"trivial",valid:!0};if(n.some(s=>s.data?.edgeTransitive!==void 0))return{property:"edgeTransitive",expected:"edge_transitive",actual:"edge_transitive",valid:!0};const a=r*(r-1)/2;return o.length===a?{property:"edgeTransitive",expected:"edge_transitive",actual:"edge_transitive",valid:!0,message:"Edge-transitive validation skipped (complete graph is edge-transitive)"}:{property:"edgeTransitive",expected:"edge_transitive",actual:"unknown",valid:!1,message:"Cannot verify edge-transitivity without metadata (non-complete graph)"}},$c=e=>{const{spec:t,nodes:n}=e;if(t.arcTransitive?.kind!=="arc_transitive")return{property:"arcTransitive",expected:t.arcTransitive?.kind??"unconstrained",actual:t.arcTransitive?.kind??"unconstrained",valid:!0};if(n.length<3)return{property:"arcTransitive",expected:"arc_transitive",actual:"trivial",valid:!0};if(n.some(c=>c.data?.arcTransitive!==void 0))return n.every(d=>d.data?.arcTransitive!==void 0)?{property:"arcTransitive",expected:"arc_transitive",actual:"arc_transitive",valid:!0}:{property:"arcTransitive",expected:"arc_transitive",actual:"incomplete_metadata",valid:!1,message:"Not all vertices have arc-transitive metadata"};const i=new Map;for(const c of n)i.set(c.id,0);for(const c of e.edges)i.set(c.source,(i.get(c.source)||0)+1),i.set(c.target,(i.get(c.target)||0)+1);const a=[...i.values()];return a.every(c=>c===a[0])?{property:"arcTransitive",expected:"arc_transitive",actual:"unknown",valid:!1,message:"Cannot verify arc-transitivity without metadata (regularity is necessary but not sufficient)"}:{property:"arcTransitive",expected:"arc_transitive",actual:"irregular",valid:!1,message:"Arc-transitive graphs must be regular"}},Ic=e=>{const{spec:t,nodes:n,edges:o}=e;let r=null;if(t.cubic?.kind==="cubic")r=3;else if(t.specificRegular?.kind==="k_regular")r=t.specificRegular.k;else return{property:"regularity",expected:"unconstrained",actual:"unconstrained",valid:!0};if(r===null)return{property:"regularity",expected:"unconstrained",actual:"unconstrained",valid:!0};const i=new Map;for(const d of n)i.set(d.id,0);for(const d of o)i.set(d.source,(i.get(d.source)||0)+1),t.directionality.kind==="undirected"&&i.set(d.target,(i.get(d.target)||0)+1);const a=[...i.values()];if(!a.every(d=>d===r)){const d=new Map;for(const u of a)d.set(u,(d.get(u)||0)+1);const l=Object.fromEntries(d);return{property:"regularity",expected:`${r}-regular`,actual:`not_regular (degree distribution: ${JSON.stringify(l)})`,valid:!1,message:`Expected all vertices to have degree ${r}, but got ${JSON.stringify(l)}`}}const c=t.cubic?.kind==="cubic"?"cubic":`${r}-regular`;return{property:"regularity",expected:c,actual:c,valid:!0}},Pc=e=>{const{spec:t,nodes:n,edges:o}=e,r=t.eulerian?.kind;if(r!=="eulerian"&&r!=="semi_eulerian")return{property:"eulerian",expected:r??"unconstrained",actual:r??"unconstrained",valid:!0};const i=new Map;for(const c of n)i.set(c.id,0);for(const c of o)i.set(c.source,(i.get(c.source)||0)+1),t.directionality.kind==="undirected"?i.set(c.target,(i.get(c.target)||0)+1):i.set(c.target,i.get(c.target)||0);const a=[];for(const[c,d]of i.entries())d%2===1&&a.push(c);const s=a.length;return r==="eulerian"?s===0?{property:"eulerian",expected:"eulerian",actual:"eulerian",valid:!0}:{property:"eulerian",expected:"eulerian",actual:`semi_eulerian (${s} odd-degree vertices: ${a.join(", ")})`,valid:!1,message:`Eulerian graphs require all vertices to have even degree, but found ${s} vertices with odd degree`}:r==="semi_eulerian"?s===2?{property:"eulerian",expected:"semi_eulerian",actual:"semi_eulerian",valid:!0}:{property:"eulerian",expected:"semi_eulerian",actual:s===0?"eulerian":`non_eulerian (${s} odd-degree vertices)`,valid:!1,message:`Semi-Eulerian graphs require exactly 2 vertices with odd degree, but found ${s}`}:{property:"eulerian",expected:"unconstrained",actual:"unconstrained",valid:!0}},Dc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.kVertexConnected?.kind!=="k_vertex_connected")return{property:"kVertexConnected",expected:t.kVertexConnected?.kind??"unconstrained",actual:t.kVertexConnected?.kind??"unconstrained",valid:!0};const r=t.kVertexConnected.k,i=n.length;if(i<r+1)return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`not_${r}-vertex-connected (only ${i} vertices, need at least ${r+1})`,valid:!1,message:`k-vertex-connected graphs require at least ${r+1} vertices (got ${i})`};if(!Qe(n,o,t.directionality.kind==="directed"))return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`not_${r}-vertex-connected (graph is disconnected)`,valid:!1,message:"k-vertex-connected graphs must be connected"};const a=new Map;for(const c of n)a.set(c.id,0);for(const c of o)a.set(c.source,(a.get(c.source)||0)+1),t.directionality.kind==="undirected"&&a.set(c.target,(a.get(c.target)||0)+1);const s=Math.min(...a.values());if(s<r)return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`not_${r}-vertex-connected (min degree = ${s}, need ≥ ${r})`,valid:!1,message:`k-vertex-connected graphs require minimum degree ≥ ${r} (got ${s})`};if(r===2&&i<=50)for(const c of n){const d=n.filter(u=>u.id!==c.id),l=o.filter(u=>u.source!==c.id&&u.target!==c.id);if(!Qe(d,l,t.directionality.kind==="directed"))return{property:"kVertexConnected",expected:"2-vertex-connected",actual:"not_2-vertex-connected (removing one vertex disconnects the graph)",valid:!1,message:`2-vertex-connected graphs must remain connected after removing any single vertex (failed for ${c.id})`}}return{property:"kVertexConnected",expected:`${r}-vertex-connected`,actual:`${r}-vertex-connected`,valid:!0}},Tc=e=>{const{spec:t,nodes:n,edges:o}=e;if(t.kEdgeConnected?.kind!=="k_edge_connected")return{property:"kEdgeConnected",expected:t.kEdgeConnected?.kind??"unconstrained",actual:t.kEdgeConnected?.kind??"unconstrained",valid:!0};const r=t.kEdgeConnected.k,i=n.length;if(i<r+1)return{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`not_${r}-edge-connected (only ${i} vertices, need at least ${r+1})`,valid:!1,message:`k-edge-connected graphs require at least ${r+1} vertices (got ${i})`};if(!Qe(n,o,t.directionality.kind==="directed"))return{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`not_${r}-edge-connected (graph is disconnected)`,valid:!1,message:"k-edge-connected graphs must be connected"};const a=new Map;for(const c of n)a.set(c.id,0);for(const c of o)a.set(c.source,(a.get(c.source)||0)+1),t.directionality.kind==="undirected"&&a.set(c.target,(a.get(c.target)||0)+1);const s=Math.min(...a.values());return s<r?{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`not_${r}-edge-connected (min degree = ${s}, need ≥ ${r})`,valid:!1,message:`k-edge-connected graphs require minimum degree ≥ ${r} (got ${s})`}:{property:"kEdgeConnected",expected:`${r}-edge-connected`,actual:`${r}-edge-connected`,valid:!0}},Ac=e=>{const{nodes:t,edges:n,spec:o}=e;return t.length===0?{property:"treewidth",expected:"unconstrained",actual:"0 (empty)",valid:!0}:{property:"treewidth",expected:"unconstrained",actual:`treewidth_${Rc(t,n,o)}`,valid:!0}},Rc=(e,t,n)=>{if(e.length===0)return 0;const o=Y(e,t,n.directionality.kind==="directed"),r=new Set(e.map(a=>a.id));let i=1;for(;r.size>0;){let a=1/0,s=null;for(const l of r){const f=(o.get(l)??[]).filter(g=>r.has(g)).length;f<a&&(a=f,s=l)}if(s===null)break;const c=(o.get(s)??[]).filter(l=>r.has(l)),d=Fc(new Set([...c,s]),o);i=Math.max(i,d),r.delete(s)}return i-1},Fc=(e,t)=>{if(e.size===0)return 0;let n=0;const o=100,r=(a,s,c,d=0)=>{if(d>o){n=Math.max(n,Math.min(e.size,a.size+s.size));return}if(s.size===0&&c.size===0){n=Math.max(n,a.size);return}if(s.size===0)return;const l=new Set([...s,...c]);let u=null,f=-1;for(const p of l){const v=(t.get(p)??[]).filter(y=>s.has(y)).length;v>f&&(f=v,u=p)}const g=u?new Set(t.get(u)):new Set,h=[...s].filter(p=>!g.has(p));for(const p of h){const m=new Set(t.get(p)),v=new Set([...a,p]),y=new Set([...s].filter(k=>m.has(k))),b=new Set([...c].filter(k=>m.has(k)));r(v,y,b,d+1),s.delete(p),c.add(p)}},i=new Set(e);return r(new Set,i,new Set),n},jc=(e,t,n)=>{if(e.length===0)return 0;if(e.length===1)return 1;const o=Y(e,t,!1);let r=0;const i=100,a=(c,d,l,u=0)=>{if(u>i){r=Math.max(r,Math.min(e.length,c.size+d.size));return}if(d.size===0&&l.size===0){r=Math.max(r,c.size);return}if(d.size===0)return;const f=new Set([...d,...l]);let g=null,h=-1;for(const v of f){const b=(o.get(v)??[]).filter(k=>d.has(k)).length;b>h&&(h=b,g=v)}const p=g?new Set(o.get(g)):new Set,m=[...d].filter(v=>!p.has(v));for(const v of m){const y=new Set(o.get(v)),b=new Set([...c,v]),k=new Set([...d].filter(C=>y.has(C))),w=new Set([...l].filter(C=>y.has(C)));a(b,k,w,u+1),d.delete(v),l.add(v)}},s=new Set(e.map(c=>c.id));return a(new Set,s,new Set),r},Lc=e=>{const{nodes:t,edges:n,spec:o}=e;if(o.kColorable?.kind!=="k_colorable"&&o.kColorable?.kind!=="bipartite_colorable")return{property:"kColorable",expected:o.kColorable?.kind??"unconstrained",actual:o.kColorable?.kind??"unconstrained",valid:!0};const r=o.kColorable.kind==="bipartite_colorable"?2:o.kColorable.kind==="k_colorable"?o.kColorable.k:0;if(t.length===0)return{property:"kColorable",expected:o.kColorable.kind,actual:o.kColorable.kind,valid:!0};if(r<1)return{property:"kColorable",expected:o.kColorable.kind,actual:"not_k_colorable",valid:!1,message:"k must be at least 1 for k-colorable property"};if(r===1){const s=n.length===0;return{property:"kColorable",expected:"k_colorable",actual:s?"1_colorable":"not_1_colorable",valid:s,message:s?void 0:"Graph with edges cannot be 1-colorable"}}if(r===2){const s=zc(t,n,o.directionality.kind==="directed");return{property:"kColorable",expected:"bipartite_colorable",actual:s?"bipartite_colorable":"not_2_colorable",valid:s,message:s?void 0:"Graph is not bipartite, therefore not 2-colorable"}}const i=Un(t,n,o.directionality.kind==="directed"),a=Math.max(...i.values());return a>r-1?{property:"kColorable",expected:o.kColorable.kind,actual:`not_${r}_colorable`,valid:!1,message:`Graph requires at least ${a+1} colors, which exceeds ${r}`}:{property:"kColorable",expected:o.kColorable.kind,actual:`${r}_colorable`,valid:!0}},Un=(e,t,n)=>{const o=new Map;if(e.length===0)return o;const r=Y(e,t,n),i=[...e].sort((a,s)=>{const c=(r.get(a.id)??[]).length;return(r.get(s.id)??[]).length-c});for(const a of i){const s=r.get(a.id)??[],c=new Set;for(const l of s){const u=o.get(l);u!==void 0&&c.add(u)}let d=0;for(;c.has(d);)d++;o.set(a.id,d)}return o},zc=(e,t,n)=>{if(e.length===0)return!0;const o=Y(e,t,n),r=new Map,i=new Set,a=s=>{const c=[s];for(r.set(s,0),i.add(s);c.length>0;){const d=c.shift();if(!d)break;const l=o.get(d)??[];for(const u of l)if(i.has(u)){if(r.get(u)===r.get(d))return!1}else r.set(u,1-(r.get(d)??0)),i.add(u),c.push(u)}return!0};for(const s of e)if(!i.has(s.id)&&!a(s.id))return!1;return!0},Bc=e=>{const t=[],n=[],{spec:o,nodes:r,edges:i}=e;if(o.flowNetwork?.kind!=="flow_network")return{property:"flowNetwork",expected:o.flowNetwork?.kind??"unconstrained",actual:o.flowNetwork?.kind??"unconstrained",valid:!0};const{source:a,sink:s}=o.flowNetwork;o.directionality.kind!=="directed"&&t.push("Flow network must be directed");const c=r.find(v=>v.id===a),d=r.find(v=>v.id===s);c||t.push(`Source node '${a}' does not exist in the graph`),d||t.push(`Sink node '${s}' does not exist in the graph`),a===s&&t.push("Source and sink must be different nodes"),o.weighting.kind!=="weighted_numeric"&&t.push("Flow network must have weighted edges (capacities)");const l=[],u=[];for(const v of i)v.weight===void 0?l.push(v):v.weight<0&&u.push(v);l.length>0&&t.push(`Flow network edges must have capacities (weights). Missing capacities on ${l.length} edge(s): `+l.map(v=>`${v.source}→${v.target}`).join(", ")),u.length>0&&t.push(`Flow network capacities must be non-negative. Negative capacities on ${u.length} edge(s): `+u.map(v=>`${v.source}→${v.target} (${v.weight})`).join(", "));const f=i.filter(v=>v.target===a);f.length>0&&n.push(`Flow network typically has no edges entering the source. Found ${f.length} edge(s) entering source: `+f.map(v=>`${v.source}→${v.target}`).join(", "));const g=i.filter(v=>v.source===s);if(g.length>0&&n.push(`Flow network typically has no edges leaving the sink. Found ${g.length} edge(s) leaving sink: `+g.map(v=>`${v.source}→${v.target}`).join(", ")),c&&d&&t.length===0){const v=new Map;for(const S of r)v.set(S.id,[]);for(const S of i){const M=v.get(S.source);M&&M.push(S.target)}const y=new Set,b=[a];for(;b.length>0;){const S=b.shift();if(!S)break;if(y.has(S))continue;y.add(S);const M=v.get(S)??[];b.push(...M.filter(I=>!y.has(I)))}const k=new Map;for(const S of r)k.set(S.id,[]);for(const S of i){const M=k.get(S.target);M&&M.push(S.source)}const w=new Set,C=[s];for(;C.length>0;){const S=C.shift();if(!S)break;if(w.has(S))continue;w.add(S);const M=k.get(S)??[];C.push(...M.filter(I=>!w.has(I)))}const x=[];for(const S of r)S.id!==a&&S.id!==s&&(!y.has(S.id)||!w.has(S.id))&&x.push(S.id);x.length>0&&n.push(`Flow network nodes should lie on paths from source to sink. Found ${x.length} disconnected node(s): `+x.join(", "))}const h=t.length===0,p=[...t,...n],m=p.length>0?p.join("; "):void 0;return{property:"flowNetwork",expected:"flow_network",actual:h?"flow_network":"not_flow_network",valid:h,message:m}},Oc=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph cannot be null or undefined"}};if(!e.getNode(t))return{ok:!1,error:{type:"invalid-input",message:`Start node '${t}' not found in graph`}};const o=new Set,r=[],i=new Map,a=[t];for(o.add(t),i.set(t,null);a.length>0;){const s=a.shift();if(s===void 0)break;const c=e.getNode(s);c&&r.push(c);const d=e.getNeighbors(s);for(const l of d)o.has(l)||(o.add(l),i.set(l,s),a.push(l))}return{ok:!0,value:{visitOrder:r,parents:i}}};class Xe{heap=[];itemSet=new Set;push(t,n){this.itemSet.has(t)||(this.heap.push({item:t,priority:n}),this.itemSet.add(t),this.bubbleUp(this.heap.length-1))}pop(){if(this.heap.length===0)return;if(this.heap.length===1){const o=this.heap.pop();return o?(this.itemSet.delete(o.item),o.item):void 0}const t=this.heap[0],n=this.heap.pop();if(n&&t)return this.heap[0]=n,this.bubbleDown(0),this.itemSet.delete(t.item),t.item}get length(){return this.heap.length}contains(t){return this.itemSet.has(t)}*[Symbol.iterator](){yield*this.itemSet}bubbleUp(t){for(;t>0;){const n=Math.floor((t-1)/2);if(this.heap[t].priority>=this.heap[n].priority)break;[this.heap[t],this.heap[n]]=[this.heap[n],this.heap[t]],t=n}}bubbleDown(t){for(;;){const n=2*t+1,o=2*t+2;let r=t;if(n<this.heap.length&&this.heap[n].priority<this.heap[r].priority&&(r=n),o<this.heap.length&&this.heap[o].priority<this.heap[r].priority&&(r=o),r===t)break;[this.heap[t],this.heap[r]]=[this.heap[r],this.heap[t]],t=r}}}class qc{constructor(t,n,o,r){this.expander=t,this.seedA=n,this.seedB=o,this.options=r;const i=new Xe;i.push(n,0),this.stateA={visited:new Set([n]),frontier:i,parents:new Map};const a=new Xe;a.push(o,0),this.stateB={visited:new Set([o]),frontier:a,parents:new Map}}foundPaths=[];stateA;stateB;async search(){if(this.seedA===this.seedB)return{paths:[[this.seedA]],visitedA:new Set([this.seedA]),visitedB:new Set([this.seedB]),iterations:0};let t=0,n=!1,o=0;const r=this.options.minIterations??2;for(;(this.foundPaths.length<this.options.targetPaths||n&&t-o<r)&&t<this.options.maxIterations&&(this.stateA.frontier.length>0||this.stateB.frontier.length>0);){t++,this.stateA.frontier.length>0&&await this.expandFrontier(this.stateA,"A");let i=this.foundPaths.length;this.checkForConnections(),this.foundPaths.length>=this.options.targetPaths&&!n&&(n=!0,o=t),n&&this.addPathNodesToFrontiers(i),this.stateB.frontier.length>0&&await this.expandFrontier(this.stateB,"B"),i=this.foundPaths.length,this.checkForConnections(),this.foundPaths.length>=this.options.targetPaths&&!n&&(n=!0,o=t),n&&this.addPathNodesToFrontiers(i)}return{paths:this.foundPaths,visitedA:this.stateA.visited,visitedB:this.stateB.visited,iterations:t}}async expandFrontier(t,n){const o=[];for(;t.frontier.length>0;){const r=t.frontier.pop();r&&o.push(r)}for(const r of o){const i=await this.expander.getNeighbors(r);for(const{targetId:a,relationshipType:s}of i){if(t.visited.has(a))continue;this.expander.addEdge(r,a,s),t.visited.add(a),t.parents.set(a,{parent:r,edge:s});const c=this.expander.getDegree(a);t.frontier.push(a,c)}}}checkForConnections(){for(const t of this.stateA.frontier)if(this.stateB.visited.has(t)){const n=this.reconstructPath(t,!0);n.length>0&&!this.pathExists(n)&&this.foundPaths.push(n)}for(const t of this.stateB.frontier)if(this.stateA.visited.has(t)){const n=this.reconstructPath(t,!1);n.length>0&&!this.pathExists(n)&&this.foundPaths.push(n)}}reconstructPath(t,n){const o=[],r=[];let i=t;for(;i!==void 0;)o.unshift(i),i=this.stateA.parents.get(i)?.parent;for(i=t;i!==void 0;){const a=this.stateB.parents.get(i);if(a)r.push(a.parent),i=a.parent;else break}return[...o,...r]}pathExists(t){return this.foundPaths.some(n=>n.length===t.length&&n.every((o,r)=>o===t[r]))}addPathNodesToFrontiers(t){if(!(this.foundPaths.length<=t))for(let n=t;n<this.foundPaths.length;n++){const o=this.foundPaths[n];for(const r of o){if(!this.stateA.visited.has(r)){const i=this.expander.getDegree(r);this.stateA.frontier.push(r,i),this.stateA.visited.add(r)}if(!this.stateB.visited.has(r)){const i=this.expander.getDegree(r);this.stateB.frontier.push(r,i),this.stateB.visited.add(r)}}}}}class Uc{constructor(t,n){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");for(const[o,r]of n.entries()){const i=new Xe,a=t.getDegree(r);i.push(r,a),this.frontiers.push({index:o,frontier:i,visited:new Set([r]),parents:new Map})}this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map}}frontiers=[];paths=[];sampledEdges=new Set;stats;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectLowestDegreeFrontier();if(o===-1)break;const r=this.frontiers[o],i=r.frontier.pop();if(!i)continue;this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(i));const a=await this.expander.getNeighbors(i);for(const{targetId:s,relationshipType:c}of a){if(r.visited.has(s))continue;this.stats.edgesTraversed++,this.expander.addEdge(i,s,c);const d=`${i}->${s}`;this.sampledEdges.add(d),r.visited.add(s),r.parents.set(s,{parent:i,edge:c});const l=this.expander.getDegree(s);r.frontier.push(s,l);for(let u=0;u<this.frontiers.length;u++)if(u!==o&&this.frontiers[u].visited.has(s)){const f=this.reconstructPath(r,this.frontiers[u],s);f&&!this.pathExists(o,u,f)&&this.paths.push({fromSeed:o,toSeed:u,nodes:f})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.frontier.length>0)}selectLowestDegreeFrontier(){let t=1/0,n=-1;for(let o=0;o<this.frontiers.length;o++){const r=this.frontiers[o];if(r.frontier.length>0){const i=this.peekPriority(r.frontier);i<t&&(t=i,n=o)}}return n}peekPriority(t){for(const n of t)return this.expander.getDegree(n);return 1/0}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}const Gc=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph cannot be null or undefined"}};if(!e.getNode(t))return{ok:!1,error:{type:"invalid-input",message:`Start node '${t}' not found in graph`}};const o=new Set,r=[],i=new Map,a=new Map,s=new Map;let c=0;const d=[[t,!1]];for(i.set(t,null);d.length>0;){const l=d.pop();if(l===void 0)break;const[u,f]=l;if(f){c++,s.set(u,c);continue}if(o.has(u))continue;o.add(u),c++,a.set(u,c);const g=e.getNode(u);g&&r.push(g),d.push([u,!0]);const h=e.getNeighbors(u);for(let p=h.length-1;p>=0;p--){const m=h[p];o.has(m)||(i.has(m)||i.set(m,u),d.push([m,!1]))}}return{ok:!0,value:{visitOrder:r,parents:i,discovered:a,finished:s}}},Wc=(e,t)=>{if(t.radius<0)return{ok:!1,error:{type:"invalid-options",message:"Radius must be non-negative"}};if(t.seedNodes.length===0)return{ok:!1,error:{type:"invalid-options",message:"At least one seed node is required"}};for(const n of t.seedNodes)if(!e.hasNode(n))return{ok:!1,error:{type:"invalid-input",message:`Seed node '${n}' not found in graph`}};return{ok:!0,value:{...t,includeSeed:t.includeSeed??!0}}},Gn=(e,t)=>{const n=Wc(e,t);if(!n.ok)return n;const o=n.value,{radius:r,seedNodes:i,includeSeed:a}=o,s=new Set;if(r===0){if(a)for(const c of i)s.add(c);return cn(e,s)}for(const c of i){const d=Vc(e,c,r);for(const[l,u]of d.entries())u===0&&!a||s.add(l)}return cn(e,s)},Vc=(e,t,n)=>{const o=new Map,r=[{nodeId:t,distance:0}];for(o.set(t,0);r.length>0;){const i=r.shift();if(!i)break;const{nodeId:a,distance:s}=i;if(s>=n)continue;const c=e.getNeighbors(a);for(const d of c)o.has(d)||(o.set(d,s+1),r.push({nodeId:d,distance:s+1}))}return o},cn=(e,t)=>{const n=[],o=[];for(const r of t){const i=e.getNode(r);i&&n.push(i)}if(e.getOutgoingEdges)for(const r of t){const i=e.getOutgoingEdges(r);for(const a of i)t.has(a.source)&&t.has(a.target)&&o.push(a)}return{ok:!0,value:{nodes:n,edges:o}}},Kc=(e,t,n,o=!0)=>Gn(e,{radius:n,seedNodes:t,includeSeed:o});class Hc{constructor(t,n){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");for(const[o,r]of n.entries())this.frontiers.push({index:o,queue:[r],visited:new Set([r]),parents:new Map});this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map,frontierSwitches:0}}frontiers=[];paths=[];sampledEdges=new Set;stats;lastActiveFrontier=0;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectSmallestFrontier();if(o===-1)break;o!==this.lastActiveFrontier&&(this.stats.frontierSwitches++,this.lastActiveFrontier=o);const r=this.frontiers[o],i=r.queue.shift();if(!i)continue;this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(i));const a=await this.expander.getNeighbors(i);for(const{targetId:s,relationshipType:c}of a){if(r.visited.has(s))continue;this.stats.edgesTraversed++,this.expander.addEdge(i,s,c);const d=`${i}->${s}`;this.sampledEdges.add(d),r.visited.add(s),r.parents.set(s,{parent:i,edge:c}),r.queue.push(s);for(let l=0;l<this.frontiers.length;l++)if(l!==o&&this.frontiers[l].visited.has(s)){const u=this.reconstructPath(r,this.frontiers[l],s);u&&!this.pathExists(o,l,u)&&this.paths.push({fromSeed:o,toSeed:l,nodes:u})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.queue.length>0)}selectSmallestFrontier(){let t=1/0,n=-1;for(let o=0;o<this.frontiers.length;o++){const r=this.frontiers[o].queue.length;r>0&&r<t&&(t=r,n=o)}return n}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}let Jc=class{state;constructor(t){this.state=t}next(){return this.state=this.state*1664525+1013904223>>>0,this.state/4294967295}nextInt(t){return Math.floor(this.next()*t)}};class Qc{constructor(t,n,o=42){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");this.rng=new Jc(o);for(const[r,i]of n.entries())this.frontiers.push({index:r,frontier:[i],visited:new Set([i]),parents:new Map});this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map}}frontiers=[];paths=[];sampledEdges=new Set;rng;stats;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectRandomFrontier();if(o===-1)break;const r=this.frontiers[o],i=this.rng.nextInt(r.frontier.length),a=r.frontier[i];r.frontier.splice(i,1),this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(a));const s=await this.expander.getNeighbors(a);for(const{targetId:c,relationshipType:d}of s){if(r.visited.has(c))continue;this.stats.edgesTraversed++,this.expander.addEdge(a,c,d);const l=`${a}->${c}`;this.sampledEdges.add(l),r.visited.add(c),r.parents.set(c,{parent:a,edge:d}),r.frontier.push(c);for(let u=0;u<this.frontiers.length;u++)if(u!==o&&this.frontiers[u].visited.has(c)){const f=this.reconstructPath(r,this.frontiers[u],c);f&&!this.pathExists(o,u,f)&&this.paths.push({fromSeed:o,toSeed:u,nodes:f})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.frontier.length>0)}selectRandomFrontier(){const t=this.frontiers.map((o,r)=>({index:r,size:o.frontier.length})).filter(o=>o.size>0);return t.length===0?-1:t[this.rng.nextInt(t.length)].index}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}class Xc{constructor(t,n){if(this.expander=t,this.seeds=n,n.length===0)throw new Error("At least one seed node is required");for(const[o,r]of n.entries())this.frontiers.push({index:o,queue:[r],visited:new Set([r]),parents:new Map});this.stats={nodesExpanded:0,edgesTraversed:0,iterations:0,degreeDistribution:new Map}}frontiers=[];paths=[];sampledEdges=new Set;stats;async run(){for(;this.hasNonEmptyFrontier();){this.stats.iterations++;const o=this.selectNextFrontier();if(o===-1)break;const r=this.frontiers[o],i=r.queue.shift();if(!i)continue;this.stats.nodesExpanded++,this.recordDegree(this.expander.getDegree(i));const a=await this.expander.getNeighbors(i);for(const{targetId:s,relationshipType:c}of a){if(r.visited.has(s))continue;this.stats.edgesTraversed++,this.expander.addEdge(i,s,c);const d=`${i}->${s}`;this.sampledEdges.add(d),r.visited.add(s),r.parents.set(s,{parent:i,edge:c}),r.queue.push(s);for(let l=0;l<this.frontiers.length;l++)if(l!==o&&this.frontiers[l].visited.has(s)){const u=this.reconstructPath(r,this.frontiers[l],s);u&&!this.pathExists(o,l,u)&&this.paths.push({fromSeed:o,toSeed:l,nodes:u})}}}const t=new Set,n=[];for(const o of this.frontiers){for(const r of o.visited)t.add(r);n.push(new Set(o.visited))}return{paths:this.paths,sampledNodes:t,sampledEdges:this.sampledEdges,visitedPerFrontier:n,stats:this.stats}}hasNonEmptyFrontier(){return this.frontiers.some(t=>t.queue.length>0)}selectNextFrontier(){for(let t=0;t<this.frontiers.length;t++)if(this.frontiers[t].queue.length>0)return t;return-1}reconstructPath(t,n,o){const r=[],i=[];let a=o;for(;a!==void 0;)r.unshift(a),a=t.parents.get(a)?.parent;a=o;let s=n.parents.get(a);for(;s;)i.push(s.parent),s=n.parents.get(s.parent);const c=this.seeds[t.index],d=this.seeds[n.index];return r[0]!==c||i.length>0&&i.at(-1)!==d&&o!==d?null:[...r,...i]}pathExists(t,n,o){return this.paths.some(r=>(r.fromSeed===t&&r.toSeed===n||r.fromSeed===n&&r.toSeed===t)&&r.nodes.length===o.length&&(r.nodes.every((i,a)=>i===o[a])||r.nodes.every((i,a)=>i===o[o.length-1-a])))}recordDegree(t){const n=this.getDegreeBucket(t),o=this.stats.degreeDistribution.get(n)??0;this.stats.degreeDistribution.set(n,o+1)}getDegreeBucket(t){return t<=5?"1-5":t<=10?"6-10":t<=50?"11-50":t<=100?"51-100":t<=500?"101-500":t<=1e3?"501-1000":"1000+"}}const F=e=>({ok:!0,value:e}),R=e=>({ok:!1,error:e}),Yc=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Set,o=[];let r=0;const i=(a,s)=>{n.add(a);const c=e.getNode(a);c.some&&s.push(c.value);const d=e.getNeighbors(a);if(d.ok)for(const l of d.value)n.has(l)||i(l,s);if(e.isDirected()){const l=e.getAllEdges();for(const u of l)u.target===a&&!n.has(u.source)&&i(u.source,s)}};for(const a of t)if(!n.has(a.id)){const s=[];i(a.id,s),o.push({id:r++,nodes:s,size:s.length})}return F(o)},me=e=>({some:!0,value:e}),ge=()=>({some:!1}),Zc=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Set,o=new Set,r=new Map,i=c=>{n.add(c),o.add(c);const d=e.getNeighbors(c);if(d.ok)for(const l of d.value){if(o.has(l))return s(c,l);if(!n.has(l)){r.set(l,c);const u=i(l);if(u.some)return u}}return o.delete(c),ge()},a=(c,d)=>{n.add(c);const l=e.getNeighbors(c);if(l.ok)for(const u of l.value)if(n.has(u)){if(u!==d)return s(c,u)}else{r.set(u,c);const f=a(u,c);if(f.some)return f}return ge()},s=(c,d)=>{const l=[],u=[];let f=c;const g=[f];for(;f!==d&&r.has(f);){const h=r.get(f);if(h)g.unshift(h),f=h;else break}g.push(d);for(let h=0;h<g.length;h++){const p=e.getNode(g[h]);if(p.some&&l.push(p.value),h<g.length-1){const m=e.getOutgoingEdges(g[h]);if(m.ok){const v=m.value.find(y=>y.target===g[h+1]);v&&u.push(v)}}}return me({nodes:l,edges:u})};for(const c of t)if(!n.has(c.id)){r.set(c.id,null);const d=e.isDirected()?i(c.id):a(c.id,null);if(d.some)return F(d)}return F(ge())},ed=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Map,o=new Map,r=new Set,i=[],a=[];let s=0,c=0;const d=l=>{n.set(l,s),o.set(l,s),s++,i.push(l),r.add(l);const u=e.getNeighbors(l);if(u.ok)for(const f of u.value)if(n.has(f)){if(r.has(f)){const g=o.get(l),h=n.get(f);g!==void 0&&h!==void 0&&o.set(l,Math.min(g,h))}}else{d(f);const g=o.get(l),h=o.get(f);g!==void 0&&h!==void 0&&o.set(l,Math.min(g,h))}if(o.get(l)===n.get(l)){const f=[];let g;do{const h=i.pop();if(h===void 0)break;g=h,r.delete(g);const p=e.getNode(g);p.some&&f.push(p.value)}while(g!==l);a.push({id:c++,nodes:f,size:f.length})}};for(const l of t)n.has(l.id)||d(l.id);return F(a)},td=e=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const t=e.getAllNodes(),n=new Set,o=new Set,r=new Map,i=[],a=(s,c)=>{if(o.has(s)){const u=[];let f=c;for(;f!=null&&f!==s;)u.push(f),f=r.get(f);return u.push(s),u.reverse(),R({type:"cycle-detected",message:`Cycle detected: ${u.join(" → ")} → ${u[0]}`,cyclePath:u})}if(n.has(s))return F(void 0);n.add(s),o.add(s),r.set(s,c);const d=e.getNeighbors(s);if(d.ok)for(const u of d.value){const f=a(u,s);if(!f.ok)return f}o.delete(s);const l=e.getNode(s);return l.some&&i.push(l.value),F(void 0)};for(const s of t)if(!n.has(s.id)){const c=a(s.id,null);if(!c.ok)return R(c.error)}return i.reverse(),F(i)},lt=(e,t)=>{if(t.size===0||t.size===e.getNodeCount())return 0;let n=0,o=0,r=0;const i=e.getAllNodes();for(const c of i){const d=c.id,l=e.getNeighbors(d);if(!l.ok)continue;const u=l.value,f=u.length;if([...t].some(h=>h.id===d)){o+=f;for(const h of u)[...t].some(m=>m.id===h)||n++}else r+=f}const a=Math.min(o,r);if(a===0)return 0;const s=n/a;return Math.max(0,Math.min(1,s))},Wn=(e,t)=>{if(t.length===0)return 0;let n=0;for(const o of t){const r=lt(e,o);n+=r}return n/t.length},nd=(e,t)=>{if(t.length===0)return 0;let n=0,o=0;for(const r of t){const i=lt(e,r),a=r.size;n+=i*a,o+=a}return o===0?0:n/o},At=(e,t)=>{const n=e.getEdgeCount();if(n===0)return 0;const o=new Map;for(const c of t)for(const d of c.nodes)o.set(d.id,c.id);const r=new Map,i=e.getAllNodes();for(const c of i){const d=e.getNeighbors(c.id);d.ok?r.set(c.id,d.value.length):r.set(c.id,0)}let a=0;const s=2*n;if(e.isDirected())for(const c of i)for(const d of i){const l=o.get(c.id),u=o.get(d.id);if(l===void 0||u===void 0||l!==u)continue;const f=e.getNeighbors(c.id),g=f.ok&&f.value.includes(d.id)?1:0,h=r.get(c.id)||0,p=r.get(d.id)||0,m=h*p/s;a+=g-m}else for(let c=0;c<i.length;c++)for(let d=c;d<i.length;d++){const l=i[c],u=i[d],f=o.get(l.id),g=o.get(u.id);if(f===void 0||g===void 0||f!==g)continue;const h=e.getNeighbors(l.id),p=h.ok&&h.value.includes(u.id)?1:0,m=r.get(l.id)||0,v=r.get(u.id)||0,y=m*v/s;a+=(c===d?1:2)*(p-y)}return a/=s,a},od=(e,t,n)=>{if(n===0)return 0;const o=2*n;let r=0;const i=new Map;for(const s of t.nodes){const c=e.getNeighbors(s.id);c.ok?i.set(s,c.value.length):i.set(s,0)}const a=[...t.nodes];if(e.isDirected())for(const s of a)for(const c of a){const d=e.getNeighbors(s.id),l=d.ok&&d.value.includes(c.id)?1:0,u=i.get(s)||0,f=i.get(c)||0,g=u*f/o;r+=l-g}else for(let s=0;s<a.length;s++)for(let c=s;c<a.length;c++){const d=a[s],l=a[c],u=e.getNeighbors(d.id),f=u.ok&&u.value.includes(l.id)?1:0,g=i.get(d)||0,h=i.get(l)||0,p=g*h/o;r+=(s===c?1:2)*(f-p)}return r/=o,r},Ye=(e,t,n,o,r)=>{const i=2*r,a=(o+t)/i-Math.pow((n+e)/i,2),s=o/i-Math.pow(n/i,2)-Math.pow(e/i,2);return a-s},ut=(e,t)=>{const n=t.size;if(n===0||n===1)return 0;const o=e.isDirected()?n*(n-1):n*(n-1)/2;let r=0;const i=[...t];for(let s=0;s<i.length;s++)for(let c=s+1;c<i.length;c++){const d=i[s],l=i[c],u=e.getOutgoingEdges(d.id),f=e.getOutgoingEdges(l.id);let g=!1;u.ok&&(g=u.value.some(h=>h.target===l.id)),!g&&f.ok&&!e.isDirected()&&(g=f.value.some(h=>h.target===d.id)),g&&r++}const a=r/o;return Math.max(0,Math.min(1,a))},Vn=(e,t)=>{if(t.length===0)return 0;let n=0;for(const o of t){const r=ut(e,o);n+=r}return n/t.length},Kn=(e,t)=>{const n=e.getEdgeCount();if(n===0)return 0;let o=0;for(const i of t){const a=[...i];for(let s=0;s<a.length;s++)for(let c=s+1;c<a.length;c++){const d=a[s],l=a[c],u=e.getOutgoingEdges(d.id),f=e.getOutgoingEdges(l.id);let g=!1;u.ok&&(g=u.value.some(h=>h.target===l.id)),!g&&f.ok&&!e.isDirected()&&(g=f.value.some(h=>h.target===d.id)),g&&o++}}const r=o/n;return Math.max(0,Math.min(1,r))},wt=(e,t)=>{const n=t.map(c=>c.nodes),o=At(e,t),r=Wn(e,n),i=Vn(e,n),a=Kn(e,n),s=t.length;return{modularity:o,avgConductance:r,avgDensity:i,numClusters:s,coverageRatio:a}},rd=(e,t)=>{for(const n of t)n.density=ut(e,n.nodes)},id=(e,t={})=>{const n=performance.now(),{weightFn:o=()=>1,maxIterations:r=10,numTrials:i=10,seed:a}=t,s=e.getAllNodes();if(s.length===0)return R({type:"EmptyGraph",message:"Cannot run Infomap on empty graph"});const c=sd(e,o),d=ad(e,c),l=new Map,u=new Map;let f=0;const g=20;let h=new Set,p=0;for(const[N,T]of s.entries())h.add(T.id),l.set(T.id,f),p+=d.get(T.id)||0,(h.size>=g||N===s.length-1)&&(u.set(f,{id:f,nodes:h,exitProbability:0,visitProbability:p}),f++,h=new Set,p=0);dn(u,l,c);const m=ft(u,d);let v=new Map(u),y=m,b=0;for(;b<r;){b++;let N=!1;const T=gd(s.map(O=>O.id),a?a+b:void 0);for(const O of T){const te=l.get(O);if(te===void 0||u.get(te)===void 0)continue;const Z=cd(e,O,l,c);if(Z.size===0)continue;let W=te,q=0;for(const Q of Z){if(Q===te)continue;const K=dd(O,te,Q,u,l,c);K<q&&(q=K,W=Q)}W!==te&&q<-1e-10&&(ld(O,te,W,u,l,d),N=!0)}ud(u),dn(u,l,c);const L=ft(u,d);if(L<y&&(y=L,v=new Map(u)),!N)break}u.clear();for(const[N,T]of v.entries())u.set(N,T);const k=ft(u,d),w=m/k,C=fd(e,u,l,d,w),x=C.map(N=>({id:N.id,nodes:N.nodes,size:N.nodes.size,density:ut(e,N.nodes),internalEdges:0,externalEdges:0,modularity:0})),S=At(e,x),M=e.getEdgeCount();let I=0;for(const N of x)for(const T of N.nodes){const L=typeof T=="string"?T:T.id,O=e.getOutgoingEdges(L);if(O.ok)for(const te of O.value){const z=e.getNode(te.target);z.some&&N.nodes.has(z.value)&&I++}}const E=M>0?I/M:0,P=performance.now()-n;return F({modules:C,metrics:{modularity:S,avgConductance:0,avgDensity:x.reduce((N,T)=>N+T.density,0)/x.length,numClusters:C.length,coverageRatio:E},descriptionLength:k,compressionRatio:w,metadata:{algorithm:"infomap",runtime:P,iterations:b,parameters:{maxIterations:r,numTrials:i,seed:a}}})},sd=(e,t)=>{const n=[],o=e.getAllNodes();for(const r of o){const i=e.getOutgoingEdges(r.id);if(!i.ok||i.value.length===0)continue;let a=0;for(const s of i.value){const c=e.getNode(s.source),d=e.getNode(s.target);c.some&&d.some&&(a+=t(s,c.value,d.value))}if(a!==0)for(const s of i.value){const c=e.getNode(s.source),d=e.getNode(s.target);if(c.some&&d.some){const l=t(s,c.value,d.value);n.push({from:s.source,to:s.target,probability:l/a})}}}return n},ad=(e,t)=>{const n=e.getAllNodes(),o=n.length,r=new Map;for(const d of n)r.set(d.id,1/o);const i=new Map;for(const d of t){i.has(d.from)||i.set(d.from,[]);const l=i.get(d.from);l&&l.push({to:d.to,prob:d.probability})}const a=.85,s=100,c=1e-6;for(let d=0;d<s;d++){const l=new Map;for(const f of n)l.set(f.id,(1-a)/o);for(const f of n){const g=r.get(f.id)||0,h=i.get(f.id);if(h)for(const{to:p,prob:m}of h){const v=l.get(p)||0;l.set(p,v+a*g*m)}}let u=0;for(const f of n){const g=r.get(f.id)||0,h=l.get(f.id)||0;u=Math.max(u,Math.abs(h-g))}r.clear();for(const[f,g]of l.entries())r.set(f,g);if(u<c)break}return r},dn=(e,t,n)=>{for(const[,o]of e)o.exitProbability=0;for(const o of n){const r=t.get(o.from),i=t.get(o.to);if(r!==void 0&&i!==void 0&&r!==i){const a=e.get(r);a&&(a.exitProbability+=o.probability)}}},ft=(e,t)=>{let n=0;for(const[,r]of e)r.exitProbability>0&&(n-=r.exitProbability*Math.log2(r.exitProbability));let o=0;for(const[,r]of e){if(r.visitProbability===0)continue;let i=0;for(const a of r.nodes){const s=t.get(a)||0;if(s>0){const c=s/r.visitProbability;i-=c*Math.log2(c)}}o+=r.visitProbability*i}return n+o},cd=(e,t,n,o)=>{const r=new Set,i=e.getOutgoingEdges(t);if(i.ok)for(const a of i.value){const s=n.get(a.target);s!==void 0&&r.add(s)}for(const a of o)if(a.to===t){const s=n.get(a.from);s!==void 0&&r.add(s)}return r},dd=(e,t,n,o,r,i)=>{const a=o.get(t),s=o.get(n);if(!a||!s)return 100;let c=0,d=0;for(const u of i){if(u.from===e){const f=r.get(u.to);f===t&&f!==n?c+=u.probability:f===n&&f!==t&&(d+=u.probability)}if(u.to===e){const f=r.get(u.from);f===t&&f!==n?c+=u.probability:f===n&&f!==t&&(d+=u.probability)}}return c-d},ld=(e,t,n,o,r,i)=>{const a=o.get(t),s=o.get(n);if(!a||!s)return;const c=i.get(e)||0;a.nodes.delete(e),a.visitProbability-=c,s.nodes.add(e),s.visitProbability+=c,r.set(e,n)},ud=e=>{const t=[];for(const[n,o]of e.entries())o.nodes.size===0&&t.push(n);for(const n of t)e.delete(n)},fd=(e,t,n,o,r)=>{const i=[];let a=0;for(const[,s]of t){if(s.nodes.size===0)continue;let c=0;for(const l of s.nodes){const u=o.get(l)||0;if(u>0&&s.visitProbability>0){const f=u/s.visitProbability;c-=f*Math.log2(f)}}const d=new Set;for(const l of s.nodes){const u=e.getNode(l);u.some&&d.add(u.value)}i.push({id:a++,nodes:d,descriptionLength:c,visitProbability:s.visitProbability,compressionRatio:r})}return i},gd=(e,t)=>{const n=[...e];let o=t===void 0?Math.random()*2147483647:t;const r=()=>(o=o*1103515245+12345&2147483647,o/2147483647);for(let i=n.length-1;i>0;i--){const a=Math.floor(r()*(i+1));[n[i],n[a]]=[n[a],n[i]]}return n},hd=(e,t={})=>{const n=performance.now(),{maxIterations:o=10,seed:r=Date.now()}=t,i=e.getAllNodes();if(i.length===0)return R({type:"EmptyGraph",message:"Cannot perform label propagation on empty graph"});const a=new Map,s=[];for(const[x,S]of i.entries())s.push(S.id),a.set(S.id,x);const c=new Map,d=new Map;for(const x of i){const S=[],M=e.getOutgoingEdges(x.id);if(M.ok){const I=M.value;for(const E of I){S.push(E.target);let _=d.get(E.target);_||(_=[],d.set(E.target,_)),_.push(E.source)}}c.set(x.id,S)}let l=r;const u=()=>(l=l*1103515245+12345&2147483647,l/2147483647),f=x=>{const S=[...x];for(let M=S.length-1;M>0;M--){const I=Math.floor(u()*(M+1));[S[M],S[I]]=[S[I],S[M]]}return S};let g=0,h=!1;const p=new Map,m=[],v=Array.from({length:s.length});for(;!h&&g<o;){g++;let x=0;const S=f(s);for(const[M,I]of S.entries())v[M]=I;for(const M of v){const I=a.get(M);if(I===void 0)continue;p.clear();const E=c.get(M);if(E)for(const _ of E){const P=a.get(_);if(P!==void 0){const N=p.get(P);p.set(P,N?N+1:1)}}if(e.isDirected()){const _=d.get(M);if(_)for(const P of _){const N=a.get(P);if(N!==void 0){const T=p.get(N);p.set(N,T?T+1:1)}}}if(p.size>0){let _=0,P=I;m.length=0;for(const[N,T]of p.entries())T>_?(_=T,P=N,m.length=0,m.push(N)):T===_&&m.push(N);if(m.length>1){const N=Math.floor(u()*m.length);P=m[N]}P!==I&&(a.set(M,P),x++)}}x===0&&(h=!0)}const y=new Map;for(const x of i){const S=a.get(x.id);if(S===void 0)continue;let M=y.get(S);M||(M=new Set,y.set(S,M)),M.add(x)}const b=[],k=[...y.keys()];for(const x of k){const S=y.get(x);S&&b.push({label:x,nodes:S,size:S.size,iterations:g,stable:h})}const C=performance.now()-n;return F({clusters:b,metadata:{algorithm:"label-propagation",runtime:C,converged:h,iterations:g,parameters:{maxIterations:o,seed:r}}})},pd=(e,t={})=>{const n=performance.now(),{weightFn:o=()=>1,resolution:r=1,maxIterations:i=100}=t,a=e.getAllNodes();if(a.length===0)return R({type:"EmptyGraph",message:"Cannot detect communities in empty graph"});const s=new Map;if(e.isDirected())for(const M of a){const I=e.getOutgoingEdges(M.id);if(I.ok)for(const E of I.value){s.has(E.target)||s.set(E.target,[]);const _=s.get(E.target);_!==void 0&&_.push(E)}}const c=new Map;for(const M of a)c.set(M.id,vd(e,M.id,o,s));const d=new Map,l=new Map;let u=0;for(const M of a){const I=u++;d.set(M.id,I);const E=c.get(M.id)||0;l.set(I,{id:I,nodes:new Set([M.id]),sigmaTot:E,sigmaIn:0})}const f=yd(e,o);if(f===0){const M=performance.now(),I=un(e,d,s),E=I.map(fn),_=wt(e,E);return F({communities:I,metrics:_,metadata:{algorithm:"leiden",runtime:M-n,iterations:0,parameters:{resolution:r,maxIterations:i}}})}let g=new Map;for(const M of a)g.set(M.id,new Set([M.id]));const h=a.length,p=h>50,m=h>500?1e-5:1e-6;let v=0;const y=p?3:1;let b=0;for(;v<y;){v++,d.clear(),l.clear();let M=0;for(const[z,Z]of g.entries()){const W=M++;d.set(z,W);let q=0;for(const Q of Z)q+=c.get(Q)||0;l.set(W,{id:W,nodes:new Set([z]),sigmaTot:q,sigmaIn:0})}let I=!0,E=0,_;v===1?_=h<200?40:50:_=12;const P=new Map;for(const[z,Z]of g.entries())for(const W of Z)P.set(W,z);let N=0;const T=h>500?2:3;for(;I&&E<_;){I=!1,E++,b++;let z=0;const Z=Md([...g.keys()]);for(const W of Z){const q=d.get(W);if(q===void 0||l.get(q)===void 0)continue;const K=g.get(W);if(K===void 0)continue;const $=bd(e,K,P,d,o,s);let D=q,A=0,B=0;for(const j of K)B+=c.get(j)||0;for(const[j,U]of $.entries()){if(j===q)continue;const G=l.get(j);if(G===void 0)continue;const oe=Ye(B,U,G.sigmaTot,G.sigmaIn,f)*r;oe>A&&(A=oe,D=j)}D!==q&&A>m&&(kd(W,q,D,l,d,g,c),I=!0,z++)}if(wd(l),z===0){if(N++,N>=T)break}else N=0}md(e,l,d,g,P,s);const L=l.size;if(L<=1||L>=g.size)break;const O=new Map;let te=0;for(const[,z]of l){const Z=`L${v}_${te++}`,W=new Set;for(const q of z.nodes){const Q=g.get(q);if(Q)for(const K of Q)W.add(K)}O.set(Z,W)}g=O}const k=new Map;for(const[M,I]of g.entries()){const E=d.get(M);if(E!==void 0)for(const _ of I)k.set(_,E)}const w=un(e,k,s),C=w.map(fn),x=wt(e,C),S=performance.now();return F({communities:w,metrics:x,metadata:{algorithm:"leiden",runtime:S-n,iterations:b,parameters:{resolution:r,maxIterations:i}}})},ln=(e,t,n,o,r,i,a)=>{const s=t.getOutgoingEdges(e);if(s.ok)for(const c of s.value){const d=n.get(c.target);d&&o.nodes.has(d)&&!r.has(d)&&(r.add(d),i.push(d))}if(t.isDirected()){const c=a.get(e)||[];for(const d of c){const l=n.get(d.source);l&&o.nodes.has(l)&&!r.has(l)&&(r.add(l),i.push(l))}}},md=(e,t,n,o,r,i)=>{const a=[];for(const[c,d]of t.entries()){const l=[...d.nodes];if(l.length<=1)continue;const u=new Set,f=[l[0]];for(u.add(l[0]);f.length>0;){const g=f.shift();if(g===void 0)continue;const h=o.get(g);if(h!==void 0)for(const p of h)ln(p,e,r,d,u,f,i)}u.size<l.length&&a.push(c)}let s=Math.max(...t.keys());for(const c of a){const d=t.get(c);if(d===void 0)continue;const l=[...d.nodes],u=new Map,f=new Set;let g=0;for(const h of l){if(f.has(h))continue;const p=[h];f.add(h);const m=[];for(;p.length>0;){const v=p.shift();if(v===void 0)continue;m.push(v);const y=o.get(v);if(y!==void 0)for(const b of y)ln(b,e,r,d,f,p,i)}for(const v of m)u.set(v,g);g++}if(g>1){const h=new Map;for(let p=0;p<g;p++){const m=p===0?c:++s;h.set(m,{id:m,nodes:new Set,sigmaTot:0,sigmaIn:0})}for(const p of l){const m=u.get(p);if(m===void 0)continue;const v=m===0?c:s-(g-1-m),y=h.get(v);y!==void 0&&y.nodes.add(p),n.set(p,v)}t.delete(c);for(const[p,m]of h.entries())m.nodes.size>0&&t.set(p,m)}}},vd=(e,t,n,o)=>{let r=0;const i=e.getOutgoingEdges(t);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(r+=n(a,s.value,c.value))}if(e.isDirected()){const a=o.get(t)||[];for(const s of a){const c=e.getNode(s.source),d=e.getNode(s.target);c.some&&d.some&&(r+=n(s,c.value,d.value))}}return r},yd=(e,t)=>{let n=0;const o=e.getAllNodes();for(const r of o){const i=e.getOutgoingEdges(r.id);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(n+=t(a,s.value,c.value))}}return e.isDirected()||(n/=2),n},bd=(e,t,n,o,r,i)=>{const a=new Map;for(const s of t){const c=e.getOutgoingEdges(s);if(c.ok)for(const d of c.value){const l=d.target,u=n.get(l);if(u){const f=o.get(u);if(f!==void 0){const g=e.getNode(d.source),h=e.getNode(d.target);if(g.some&&h.some){const p=r(d,g.value,h.value);a.set(f,(a.get(f)||0)+p)}}}}if(e.isDirected()){const d=i.get(s)||[];for(const l of d){const u=l.source,f=n.get(u);if(f){const g=o.get(f);if(g!==void 0){const h=e.getNode(l.source),p=e.getNode(l.target);if(h.some&&p.some){const m=r(l,h.value,p.value);a.set(g,(a.get(g)||0)+m)}}}}}}return a},kd=(e,t,n,o,r,i,a)=>{const s=o.get(t);if(s===void 0)return;const c=o.get(n);if(c===void 0)return;const d=i.get(e);if(d===void 0)return;let l=0;for(const u of d)l+=a.get(u)||0;s.nodes.delete(e),s.sigmaTot-=l,c.nodes.add(e),c.sigmaTot+=l,r.set(e,n)},wd=e=>{const t=[];for(const[n,o]of e.entries())o.nodes.size===0&&t.push(n);for(const n of t)e.delete(n)},un=(e,t,n)=>{const o=new Map;for(const[a,s]of t.entries()){o.has(s)||o.set(s,new Set);const c=e.getNode(a);if(c.some){const d=o.get(s);d!==void 0&&d.add(c.value)}}const r=[];let i=0;for(const[,a]of o){const s=xd(e,a,n),c=lt(e,a);let d=0;for(const u of a){const f=e.getOutgoingEdges(u.id);if(f.ok)for(const g of f.value){const h=e.getNode(g.target);h.some&&a.has(h.value)&&d++}}const l={id:i++,nodes:a,modularity:0,isConnected:s,internalEdges:d,conductance:c};r.push(l)}return r},fn=e=>{const t=e.nodes.size,n=t*(t-1),o=n>0?e.internalEdges/n:0;return{id:e.id,nodes:e.nodes,internalEdges:e.internalEdges,externalEdges:0,modularity:e.modularity,density:o,size:t}},xd=(e,t,n)=>{if(t.size===0||t.size===1)return!0;const r=[...t][0],i=new Set,a=[r];for(i.add(r.id);a.length>0;){const s=a.shift();if(s===void 0)continue;const c=e.getOutgoingEdges(s.id);if(c.ok)for(const d of c.value){const l=e.getNode(d.target);l.some&&t.has(l.value)&&!i.has(d.target)&&(i.add(d.target),a.push(l.value))}if(e.isDirected()){const d=n.get(s.id)||[];for(const l of d){const u=e.getNode(l.source);u.some&&t.has(u.value)&&!i.has(l.source)&&(i.add(l.source),a.push(u.value))}}}return i.size===t.size},Md=e=>{const t=[...e];for(let n=t.length-1;n>0;n--){const o=Math.floor(Math.random()*(n+1));[t[n],t[o]]=[t[o],t[n]]}return t},Sd=e=>{const t=e.getAllNodes(),n=e.getAllEdges(),o=t.length,r=n.length;if(o>4294967295)throw new RangeError(`Graph has ${o} nodes, exceeding Uint32Array limit (4,294,967,295)`);if(r>4294967295)throw new RangeError(`Graph has ${r} edges, exceeding Uint32Array limit (4,294,967,295)`);const i=t.map(f=>f.id),a=new Map;for(const[f,g]of i.entries())a.set(g,f);const s=new Uint32Array(o);for(const f of n){const g=a.get(f.source);g!==void 0&&s[g]++}const c=new Uint32Array(o+1);c[0]=0;for(let f=0;f<o;f++)c[f+1]=c[f]+s[f];const d=new Uint32Array(r),l=new Float64Array(r),u=new Uint32Array(o);for(let f=0;f<o;f++)u[f]=c[f];for(const f of n){const g=a.get(f.source),h=a.get(f.target);if(g===void 0||h===void 0)continue;const p=u[g]++;d[p]=h,l[p]=f.weight??1}return{offsets:c,edges:d,weights:l,nodeIds:i,nodeIndex:a,graph:e}},Hn=e=>e>500?1e-5:1e-6,Jn=(e,t)=>t===0&&e>200?20:e<100?50:40,Qn=()=>"best",Xn=(e,t)=>{let n;if(t===void 0)n=Math.random;else{let o=t;n=()=>(o=1664525*o+1013904223>>>0,o/4294967296)}for(let o=e.length-1;o>0;o--){const r=Math.floor(n()*(o+1));[e[o],e[r]]=[e[r],e[o]]}return e},Cd=(e,t={})=>{const n=performance.now(),{weightFn:o=()=>1,resolution:r=1,minModularityIncrease:i,maxIterations:a=100}=t,s=e.getAllNodes();if(s.length===0)return[];let c=null;try{c=Sd(e)}catch(_){if(_ instanceof RangeError)console.warn(`CSR conversion failed (${_.message}). Falling back to Map-based adjacency list.`);else throw _}let d=0;const{mode:l="auto",seed:u}=t,f=l==="auto"?Qn():l,g=new Map;if(e.isDirected())for(const _ of s){const P=e.getOutgoingEdges(_.id);if(P.ok)for(const N of P.value){g.has(N.target)||g.set(N.target,[]);const T=g.get(N.target);T&&T.push(N)}}const h=new Map;for(const _ of s)h.set(_.id,_d(e,_.id,o,g));const p=new Map,m=new Map;let v=0;for(const _ of s){const P=v++;p.set(_.id,P);const N=h.get(_.id)||0;m.set(P,{id:P,nodes:new Set([_.id]),sigmaTot:N,sigmaIn:0})}const y=Nd(e,o);if(y===0)return gn(e,p);let b=new Map;for(const _ of s)b.set(_.id,new Set([_.id]));const k=s.length,w=k>50,C=i??Hn(k);let x=0;const S=w?3:1;for(;x<S;){x++,p.clear(),m.clear();let _=0;for(const[K,$]of b.entries()){const D=_++;p.set(K,D);let A=0;for(const B of $)A+=h.get(B)||0;m.set(D,{id:D,nodes:new Set([K]),sigmaTot:A,sigmaIn:0})}let P=!0,N=0;const T=a??Jn(k,x-1),L=new Map;for(const[K,$]of b.entries())for(const D of $)L.set(D,K);let O=0;const te=k>500?2:3,z=[...b.keys()],Z=Array.from({length:z.length});for(;P&&N<T;){P=!1,N++;let K=0;const $=Pd(z);for(const[D,A]of $.entries())Z[D]=A;for(const D of Z){const A=p.get(D);if(A===void 0)continue;const B=b.get(D);if(B===void 0)continue;const j=Ed(e,B,L,p,o,g,c);let U=A,G=0,oe=0;for(const Me of B)oe+=h.get(Me)||0;const De=[...j.entries()];if(f==="random"){const Me=Xn(De,u);for(const[Te,Ae]of Me){if(Te===A)continue;const _e=m.get(Te);if(!_e)continue;const Yt=Ye(oe,Ae,_e.sigmaTot,_e.sigmaIn,y)*r;if(Yt>C){G=Yt,U=Te;break}}}else for(const[Me,Te]of De){if(Me===A)continue;const Ae=m.get(Me);if(!Ae)continue;const _e=Ye(oe,Te,Ae.sigmaTot,Ae.sigmaIn,y)*r;_e>G&&(G=_e,U=Me)}U!==A&&G>C&&($d(D,A,U,m,p,b,h),P=!0,K++)}if(Id(m),K===0){if(O++,O>=te)break}else O=0}d+=N;const W=m.size;if(W<=1||W>=b.size)break;const q=new Map;let Q=0;for(const[,K]of m){const $=`L${x}_${Q++}`,D=new Set;for(const A of K.nodes){const B=b.get(A);if(B)for(const j of B)D.add(j)}q.set($,D)}b=q}const M=new Map;for(const[_,P]of b.entries()){const N=p.get(_);if(N!==void 0)for(const T of P)M.set(T,N)}const E=performance.now()-n;return console.log(`[spec-027] Louvain completed in ${E.toFixed(2)}ms (${(E/1e3).toFixed(2)}s)`),console.log(`[spec-027] Total iterations: ${d} across ${x} hierarchy levels`),console.log(`[spec-027] Adaptive threshold: ${C.toExponential(1)}`),console.log(`[spec-027] Neighbor selection mode: ${f} (requested: ${l})`),gn(e,M,y,h)},_d=(e,t,n,o)=>{let r=0;const i=e.getOutgoingEdges(t);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(r+=n(a,s.value,c.value))}if(e.isDirected()){const a=o.get(t)||[];for(const s of a){const c=e.getNode(s.source),d=e.getNode(s.target);c.some&&d.some&&(r+=n(s,c.value,d.value))}}return r},Nd=(e,t)=>{let n=0;const o=e.getAllNodes();for(const r of o){const i=e.getOutgoingEdges(r.id);if(i.ok)for(const a of i.value){const s=e.getNode(a.source),c=e.getNode(a.target);s.some&&c.some&&(n+=t(a,s.value,c.value))}}return e.isDirected()||(n/=2),n};let gt=null;const Ed=(e,t,n,o,r,i,a=null)=>{gt||(gt=new Map);const s=gt;s.clear();const c=[...t];for(const d of c){if(a){const l=a.nodeIndex.get(d);if(l!==void 0){const u=a.offsets[l],f=a.offsets[l+1];for(let g=u;g<f;g++){const h=a.edges[g],p=a.nodeIds[h],m=a.weights[g],v=n.get(p);if(v){const y=o.get(v);if(y!==void 0){const b=s.get(y)||0;s.set(y,b+m)}}}}}else{const l=e.getOutgoingEdges(d);if(l.ok){const u=l.value;for(const f of u){const g=f.target,h=n.get(g);if(h){const p=o.get(h);if(p!==void 0){const m=e.getNode(f.source),v=e.getNode(f.target);if(m.some&&v.some){const y=r(f,m.value,v.value),b=s.get(p)||0;s.set(p,b+y)}}}}}}if(e.isDirected()){const l=i.get(d);if(l)for(const u of l){const f=u.source,g=n.get(f);if(g){const h=o.get(g);if(h!==void 0){const p=e.getNode(u.source),m=e.getNode(u.target);if(p.some&&m.some){const v=r(u,p.value,m.value),y=s.get(h)||0;s.set(h,y+v)}}}}}}return s},$d=(e,t,n,o,r,i,a)=>{const s=o.get(t);if(!s)return;const c=o.get(n);if(!c)return;const d=i.get(e);if(!d)return;let l=0;for(const u of d)l+=a.get(u)||0;s.nodes.delete(e),s.sigmaTot-=l,c.nodes.add(e),c.sigmaTot+=l,r.set(e,n)},Id=e=>{const t=[];for(const[n,o]of e.entries())o.nodes.size===0&&t.push(n);for(const n of t)e.delete(n)},gn=(e,t,n=0,o)=>{const r=new Map;for(const[f,g]of t.entries()){r.has(g)||r.set(g,new Set);const h=e.getNode(f);if(h.some){const p=r.get(g);p&&p.add(h.value)}}const i=new Map,a=new Map,s=new Map,c=new Map;for(const[f,g]of r.entries())i.set(f,0),a.set(f,0),s.set(f,0),c.set(f,0);for(const[f,g]of t.entries()){const h=o?.get(f)??0,p=c.get(g)??0;c.set(g,p+h)}const d=e.getAllEdges();for(const f of d){const g=t.get(f.source),h=t.get(f.target);if(!(g===void 0||h===void 0))if(g===h){const p=f.weight??1,m=i.get(g)??0;i.set(g,m+p);const v=a.get(g)??0;a.set(g,v+1)}else{const p=s.get(g)??0;s.set(g,p+1)}}const l=[];let u=0;for(const[f,g]of r.entries()){const h=g.size,p=i.get(f)??0,m=a.get(f)??0,v=s.get(f)??0,y=c.get(f)??0;let b=0;if(h>1){const x=e.isDirected()?h*(h-1):h*(h-1)/2;b=(e.isDirected()?p:p/2)/x,b=Math.max(0,Math.min(1,b))}let k=0;if(n>0){const x=2*n,S=p/x,M=y/x;k=S-M*M}const w=e.isDirected()?m:Math.floor(m/2),C={id:u++,nodes:g,size:h,density:b,internalEdges:w,externalEdges:v,modularity:k};l.push(C)}return l},Pd=e=>{const t=[...e];for(let n=t.length-1;n>0;n--){const o=Math.floor(Math.random()*(n+1));[t[n],t[o]]=[t[o],t[n]]}return t},Dd=()=>({disc:new Map,low:new Map,parent:new Map,visited:new Set,edgeStack:[],time:0,articulationPoints:new Set,components:[],nextComponentId:0}),Yn=(e,t,n,o)=>{n.disc.set(t,n.time),n.low.set(t,n.time),n.time++,n.visited.add(t);let r=0;const i=e.getNeighbors(t);if(!i.ok)return;const a=i.value;for(const s of a)if(n.visited.has(s)){if(s!==n.parent.get(t)){const c=n.low.get(t),d=n.disc.get(s);if(c===void 0||d===void 0)continue;n.low.set(t,Math.min(c,d));const l=n.disc.get(t);if(l===void 0)continue;d<l&&n.edgeStack.push({source:t,target:s})}}else{r++,n.parent.set(s,t),n.edgeStack.push({source:t,target:s}),Yn(e,s,n,!1);const c=n.low.get(s),d=n.low.get(t),l=n.disc.get(t);if(c===void 0||d===void 0||l===void 0)continue;if(n.low.set(t,Math.min(d,c)),o&&r>1&&n.articulationPoints.add(t),!o&&c>=l&&n.articulationPoints.add(t),c>=l){const u=Td(n,t,s);n.components.push(u)}}},Td=(e,t,n)=>{const o=new Set,r=new Set;let i=0;for(;e.edgeStack.length>0;){const s=e.edgeStack.pop();if(s===void 0||(o.add(s.source),o.add(s.target),i++,s.source===t&&s.target===n||s.source===n&&s.target===t))break}e.articulationPoints.has(t)&&r.add(t);const a=o.size===2&&i===1;return{id:e.nextComponentId++,nodes:o,size:o.size,articulationPoints:r,isBridge:a}},Ad=e=>{const t=new Set,n=new Set;let o=0;for(;e.edgeStack.length>0;){const i=e.edgeStack.pop();if(i===void 0)break;t.add(i.source),t.add(i.target),o++}for(const i of t)e.articulationPoints.has(i)&&n.add(i);const r=t.size===2&&o===1;return{id:e.nextComponentId++,nodes:t,size:t.size,articulationPoints:n,isBridge:r}},Rd=e=>{const t=performance.now(),n=e.getNodeCount();if(n===0)return R({type:"EmptyGraph",message:"Cannot compute biconnected components for empty graph"});if(n<2)return R({type:"InsufficientNodes",message:"Biconnected components require at least 2 nodes",required:2,actual:n});if(e.isDirected())return R({type:"InvalidInput",message:"Biconnected components are only defined for undirected graphs"});const o=Dd(),r=e.getAllNodes();for(const s of r)if(!o.visited.has(s.id)&&(Yn(e,s.id,o,!0),o.edgeStack.length>0)){const c=Ad(o);c.nodes.size>0&&o.components.push(c)}e.getEdgeCount()===0&&(o.components=r.map((s,c)=>({id:c,nodes:new Set([s.id]),size:1,articulationPoints:new Set,isBridge:!1})));const a=performance.now()-t;return F({components:o.components,articulationPoints:o.articulationPoints,metadata:{algorithm:"biconnected",runtime:a}})},Fd=.7,jd=100,Ld=.001,zd=(e,t={})=>{const n=performance.now(),o=e.getNodeCount();if(o===0)return R({type:"EmptyGraph",message:"Cannot decompose empty graph"});if(o<3)return R({type:"InsufficientNodes",message:"Core-periphery decomposition requires at least 3 nodes",required:3,actual:o});const r=t.coreThreshold??Fd,i=t.maxIterations??jd,a=t.epsilon??Ld;if(r<0||r>1)return R({type:"InvalidInput",message:`Core threshold must be in range [0, 1], got ${r}`});if(i<1)return R({type:"InvalidInput",message:`Max iterations must be positive, got ${i}`});if(a<=0)return R({type:"InvalidInput",message:`Epsilon must be positive, got ${a}`});const c=e.getAllNodes().map(x=>x.id),d=new Map,l=new Map;for(const x of c)d.set(x,new Set),l.set(x,new Set);const u=e.getAllEdges();for(const x of u)d.get(x.source)?.add(x.target),l.get(x.target)?.add(x.source);if(e.isDirected())for(const x of c){const S=l.get(x)||new Set,M=d.get(x)||new Set,I=new Set([...S,...M]);d.set(x,I)}const g=Bd(c,d);let h=!1,p=-1/0,m;for(m=0;m<i;m++){Od(c,u,g);const x=qd(u,g,c.length),S=x-p;if(Math.abs(S)<a){h=!0;break}p=x}const{coreNodes:v,peripheryNodes:y}=Ud(c,g,r),b=Gd(e,v,y),k={coreNodes:v,peripheryNodes:y,corenessScores:g,coreThreshold:r,fitQuality:b},C=performance.now()-n;return F({structure:k,metadata:{algorithm:"core-periphery",runtime:C,iterations:m,converged:h,parameters:{coreThreshold:r,maxIterations:i,epsilon:a}}})},Bd=(e,t)=>{const n=new Map;let o=0;for(const r of e){const i=t.get(r)?.size??0;o=Math.max(o,i)}o===0&&(o=1);for(const r of e){const a=(t.get(r)?.size??0)/o;n.set(r,a)}return n},Od=(e,t,n)=>{const o=new Map,r=new Map;for(const[a,s]of e.entries())r.set(s,a);for(const a of e){let s=0;for(const c of t)c.source===a?s+=n.get(c.target)??0:c.target===a&&(s+=n.get(c.source)??0);o.set(a,s)}const i=Math.max(...o.values(),0);if(i>1)for(const[a,s]of o)n.set(a,s/i);else for(const[a,s]of o)n.set(a,s)},qd=(e,t,n)=>{const o=e.length,r=n*(n-1),i=o/r;let a=0,s=0;for(const g of e){const h=t.get(g.source)??0,p=t.get(g.target)??0;a+=h*p,s++}const c=s>0?a/s:0;let d=0,l=0,u=0;for(const g of e){const h=t.get(g.source)??0,p=t.get(g.target)??0,m=h*p,v=1;d+=(v-i)*(m-c),l+=(v-i)**2,u+=(m-c)**2}return l===0||u===0?0:d/Math.sqrt(l*u)},Ud=(e,t,n)=>{const o=new Set,r=new Set;for(const i of e)(t.get(i)??0)>n?o.add(i):r.add(i);return{coreNodes:o,peripheryNodes:r}},Gd=(e,t,n)=>{const o=e.getAllEdges();let r=0,i=0,a=0;for(const E of o){const _=t.has(E.source),P=t.has(E.target);_&&P?r++:_||P?i++:a++}const s=t.size,c=n.size,d=s*(s-1),l=s*c,u=c*(c-1),f=d>0?r/d:0,g=l>0?i/l:0,h=u>0?a/u:0,p=1,m=.5,v=0,y=[f,g,h],b=[p,m,v],k=y.reduce((E,_)=>E+_,0)/y.length,w=b.reduce((E,_)=>E+_,0)/b.length;let C=0,x=0,S=0;for(const[E,_]of y.entries()){const P=_-k,N=b[E]-w;C+=P*N,x+=P*P,S+=N*N}if(x===0||S===0)return 0;const M=Math.sqrt(x*S),I=C/M;return Math.max(-1,Math.min(1,I))},Wd=e=>{const t=performance.now();if(e.getNodeCount()===0)return R({type:"EmptyGraph",message:"Cannot perform k-core decomposition on empty graph"});const o=e.getAllNodes().map(v=>v.id),r=new Map,i=new Map,a=new Set,s=new Map,c=new Map;for(const v of o)s.set(v,new Set),c.set(v,new Set);const d=e.getAllEdges();for(const v of d){const{source:y,target:b}=v;c.get(y)?.add(b),s.get(b)?.add(y)}let l=0;for(const v of o){const y=s.get(v)||new Set,b=c.get(v)||new Set,w=new Set([...y,...b]).size;r.set(v,w),l=Math.max(l,w)}const u=Array.from({length:l+1},()=>[]),f=new Map,g=new Map;for(const[v,y]of o.entries()){f.set(y,v);const b=r.get(y)||0,k=u[b].length;u[b].push(v),g.set(v,k)}let h=0;for(let v=0;v<o.length;v++){let y=-1;for(const[I,E]of u.entries())if(E.length>0){y=I;break}if(y===-1)break;const b=u[y].pop();if(b===void 0)break;const k=o[b],w=r.get(k)||0;w!==y&&console.warn(`Mismatch: node ${k} in bin ${y} has degree ${w}`);const C=Math.max(w,h);i.set(k,C),h=C,a.add(k);const x=s.get(k)||new Set,S=c.get(k)||new Set,M=new Set([...x,...S]);for(const I of M){if(a.has(I))continue;const E=r.get(I)||0;if(E>0){const _=E-1;r.set(I,_);const P=f.get(I);if(P===void 0)continue;const N=g.get(P);if(N!==void 0){const T=u[E],L=T.at(-1);L===void 0?T.pop():(T[N]=L,T.pop(),L!==P&&g.set(L,N));const O=u[_].length;u[_].push(P),g.set(P,O)}}}}const p=new Map;for(let v=0;v<=h;v++){const y=new Set;for(const[k,w]of i.entries())w>=v&&y.add(k);const b={k:v,nodes:y,size:y.size,degeneracy:h,coreNumbers:i};p.set(v,b)}const m=performance.now();return F({cores:p,degeneracy:h,coreNumbers:i,metadata:{algorithm:"k-core",runtime:m-t}})};class Se{nodes;edges;adjacencyList;directed;constructor(t){this.nodes=new Map,this.edges=new Map,this.adjacencyList=new Map,this.directed=t}addNode(t){return this.nodes.has(t.id)?R({type:"duplicate-node",message:`Node '${t.id}' already exists in graph`,nodeId:t.id}):(this.nodes.set(t.id,t),this.adjacencyList.set(t.id,new Set),F(void 0))}removeNode(t){if(!this.nodes.has(t))return R({type:"invalid-input",message:`Node '${t}' not found in graph`,input:t});const n=[];for(const[o,r]of this.edges.entries())(r.source===t||r.target===t)&&n.push(o);for(const o of n)this.removeEdge(o);return this.nodes.delete(t),this.adjacencyList.delete(t),F(void 0)}hasNode(t){return this.nodes.has(t)}getNode(t){const n=this.nodes.get(t);return n===void 0?ge():me(n)}addEdge(t){if(!this.nodes.has(t.source))return R({type:"invalid-input",message:`Source node '${t.source}' not found in graph`,input:t.source});if(!this.nodes.has(t.target))return R({type:"invalid-input",message:`Target node '${t.target}' not found in graph`,input:t.target});this.edges.set(t.id,t);const n=this.adjacencyList.get(t.source);if(n&&n.add(t.target),!this.directed){const o=this.adjacencyList.get(t.target);o&&o.add(t.source)}return F(void 0)}removeEdge(t){const n=this.edges.get(t);return n?(this.adjacencyList.get(n.source)?.delete(n.target),this.directed||this.adjacencyList.get(n.target)?.delete(n.source),this.edges.delete(t),F(void 0)):R({type:"invalid-input",message:`Edge '${t}' not found in graph`,input:t})}getNeighbors(t){if(!this.nodes.has(t))return R({type:"invalid-input",message:`Node '${t}' not found in graph`,input:t});const n=this.adjacencyList.get(t);return F([...n||[]])}getNodeCount(){return this.nodes.size}getEdgeCount(){return this.edges.size}isDirected(){return this.directed}getAllNodes(){return[...this.nodes.values()]}getAllEdges(){return[...this.edges.values()]}getEdge(t){const n=this.edges.get(t);return n?me(n):ge()}getOutgoingEdges(t){if(!this.nodes.has(t))return R({type:"invalid-input",message:`Node '${t}' not found in graph`,input:t});const n=[];for(const o of this.edges.values())(o.source===t||!this.directed&&o.target===t)&&n.push(o);return F(n)}}const Vd=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph is null or undefined",input:e}};if(!t||t.size===0)return{ok:!0,value:new Se(e.isDirected())};const n=new Se(e.isDirected());for(const r of t){const i=e.getNode(r);i.some&&n.addNode(i.value)}const o=e.getAllEdges();for(const r of o)t.has(r.source)&&t.has(r.target)&&n.addEdge(r);return{ok:!0,value:n}},Rt=(e,t,n)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph is null or undefined",input:e}};const o=new Se(e.isDirected()),r=new Set,i=e.getAllNodes();for(const s of i)t(s)&&(o.addNode(s),r.add(s.id));const a=e.getAllEdges();for(const s of a)r.has(s.source)&&r.has(s.target)&&(!n||n(s))&&o.addEdge(s);return{ok:!0,value:o}},Kd=(e,t)=>Rt(e,()=>!0,n=>t.has(n.type)),Hd=e=>{if(!e)return{ok:!1,error:{type:"invalid-filter",message:"Filter is null or undefined",filter:e}};const t=typeof e.nodePredicate=="function",n=typeof e.edgePredicate=="function",o=e.nodeAttributes&&Object.keys(e.nodeAttributes).length>0,r=e.edgeTypes&&e.edgeTypes.size>0;return!t&&!n&&!o&&!r?{ok:!0,value:{...e,combineMode:e.combineMode??"and"}}:{ok:!0,value:{...e,combineMode:e.combineMode??"and"}}},Jd=e=>e?typeof e.k!="number"||e.k<2?{ok:!1,error:{type:"invalid-truss",message:`k must be an integer >= 2, got: ${e.k}`,k:e.k}}:Number.isInteger(e.k)?{ok:!0,value:{...e,returnHierarchy:e.returnHierarchy??!1}}:{ok:!1,error:{type:"invalid-truss",message:`k must be an integer, got: ${e.k}`,k:e.k}}:{ok:!1,error:{type:"invalid-input",message:"Options is null or undefined",input:e}},Qd=(e,t)=>{if(!e)return{ok:!1,error:{type:"invalid-input",message:"Graph is null or undefined",input:e}};const n=Hd(t);if(!n.ok)return{ok:!1,error:n.error};const o=n.value,r=Xd(o),i=Yd(o);return o.combineMode==="or"?Zd(e,o,r,i):Rt(e,r,i)},Xd=e=>{const t=[];if(e.nodePredicate&&t.push(e.nodePredicate),e.nodeAttributes&&Object.keys(e.nodeAttributes).length>0){const n=e.nodeAttributes;t.push(o=>{for(const[r,i]of Object.entries(n))if(o[r]!==i)return!1;return!0})}return t.length===0?()=>!0:n=>t.every(o=>o(n))},Yd=e=>{const t=[];if(e.edgePredicate&&t.push(e.edgePredicate),e.edgeTypes&&e.edgeTypes.size>0){const n=e.edgeTypes;t.push(o=>n.has(o.type))}return t.length===0?()=>!0:n=>t.every(o=>o(n))},Zd=(e,t,n,o)=>{const r=new Se(e.isDirected()),i=new Set,a=e.getAllNodes();for(const c of a)n(c)&&(r.addNode(c),i.add(c.id));const s=e.getAllEdges();for(const c of s)if(o(c)){if(!i.has(c.source)){const d=e.getNode(c.source);d.some&&(r.addNode(d.value),i.add(c.source))}if(!i.has(c.target)){const d=e.getNode(c.target);d.some&&(r.addNode(d.value),i.add(c.target))}r.addEdge(c)}return{ok:!0,value:r}},el=e=>{const t=[],n=e.getAllEdges(),o=new Set;for(const r of n){const{source:i,target:a}=r;if(i===a)continue;const s=e.getNeighbors(i),c=e.getNeighbors(a);if(!s.ok||!c.ok)continue;const d=new Set(s.value),l=new Set(c.value);for(const u of d)if(!(u===i||u===a)&&l.has(u)){const f=[i,a,u].sort().join(",");if(!o.has(f)){o.add(f);const g=e.getNode(i),h=e.getNode(a),p=e.getNode(u);g.some&&h.some&&p.some&&t.push({nodes:[g.value,h.value,p.value]})}}}return F(t)},tl=(e,t)=>{const n=[],o=e.getAllNodes(),{minDegree:r,type:i}=t;for(const a of o){const s=a.id;let c=[];if(i==="out"){const d=e.getNeighbors(s);if(!d.ok)continue;const l=d.value.filter(u=>u!==s);l.length>=r&&(c=l.map(u=>e.getNode(u)).filter(u=>u.some).map(u=>u.value),n.push({hub:a,leaves:c,type:"out"}))}else{if(!e.isDirected())continue;const d=e.getAllEdges(),l=[];for(const u of d)if(u.target===s&&u.source!==s){const f=e.getNode(u.source);f.some&&l.push(f.value)}l.length>=r&&n.push({hub:a,leaves:l,type:"in"})}}return F(n)},nl=(e,t)=>{const{minCount:n}=t,o=new Map,r=e.getAllNodes();for(const a of r){const s=e.getOutgoingEdges(a.id);if(!s.ok)continue;const c=s.value.map(d=>d.target).filter(d=>d!==a.id);for(let d=0;d<c.length;d++)for(let l=d+1;l<c.length;l++){const u=c[d],f=c[l],g=u<f?`${u},${f}`:`${f},${u}`;o.set(g,(o.get(g)||0)+1)}}const i=[];for(const[a,s]of o.entries())if(s>=n){const[c,d]=a.split(","),l=e.getNode(c),u=e.getNode(d);l.some&&u.some&&i.push({paper1:l.value,paper2:u.value,count:s})}return F(i)},ol=(e,t)=>{const{minShared:n}=t,o=e.getAllNodes(),r=new Map;for(const s of o){const c=e.getOutgoingEdges(s.id);if(!c.ok)continue;const d=new Set(c.value.map(l=>l.target).filter(l=>l!==s.id));r.set(s.id,d)}const i=[],a=[...r.keys()];for(let s=0;s<a.length;s++)for(let c=s+1;c<a.length;c++){const d=a[s],l=a[c],u=r.get(d),f=r.get(l);if(!u||!f)continue;let g=0;for(const h of u)f.has(h)&&g++;if(g>=n){const h=e.getNode(d),p=e.getNode(l);h.some&&p.some&&i.push({paper1:h.value,paper2:p.value,sharedReferences:g})}}return F(i)},Zn=e=>{const t=new Map,n=new Map,o=e.getAllNodes();for(const i of o)n.set(i.id,new Set);const r=e.getAllEdges();for(const i of r)n.get(i.source)?.add(i.target),n.get(i.target)?.add(i.source);for(const i of r){const{source:a,target:s}=i,c=n.get(a)||new Set,d=n.get(s)||new Set;let l=0;for(const u of c)d.has(u)&&l++;t.set(i.id,l)}return F(t)},rl=(e,t,n,o,r,i,a,s)=>{if(!(e===n&&t===o||e===o&&t===n)){for(const c of i.getAllEdges())if(c.source===e&&c.target===t||c.source===t&&c.target===e){const l=a.get(c.id)||0;l>0&&a.set(c.id,l-1),s.get(c.id)?.delete(r)}}},il=(e,t)=>{const n=Jd(t);if(!n.ok)return n;const{k:o}=n.value,r=o-2;if(e.getNodeCount()===0)return F(new Se(e.isDirected()));const i=Zn(e);if(!i.ok)return i;const a=i.value,s=new Se(e.isDirected());for(const g of e.getAllNodes())s.addNode(g);const c=new Map;for(const g of e.getAllEdges())s.addEdge(g),c.set(g.id,g);const d=new Map,l=new Map;for(const g of e.getAllNodes())l.set(g.id,new Set);for(const g of e.getAllEdges())l.get(g.source)?.add(g.target),l.get(g.target)?.add(g.source),d.set(g.id,new Set);for(const g of e.getAllEdges()){const{source:h,target:p,id:m}=g,v=l.get(h)||new Set,y=l.get(p)||new Set;for(const b of v)if(y.has(b)){const k=[h,p,b].sort().join("-");d.get(m)?.add(k)}}let u=!0;for(;u;){u=!1;const g=[];for(const h of s.getAllEdges())(a.get(h.id)||0)<r&&g.push(h.id);if(g.length===0)break;for(const h of g){const p=c.get(h);if(!p)continue;const{source:m,target:v}=p;s.removeEdge(h),u=!0,l.get(m)?.delete(v),l.get(v)?.delete(m);const y=d.get(h)||new Set;for(const b of y){const k=b.split("-");if(k.length!==3)continue;const[w,C,x]=k,S=[[w,C],[C,x],[w,x]];for(const[M,I]of S)rl(M,I,m,v,b,s,a,d)}d.delete(h)}}const f=[];for(const g of s.getAllNodes())s.getAllEdges().some(p=>p.source===g.id||p.target===g.id)||f.push(g.id);for(const g of f)s.removeNode(g);return F(s)};class sl{constructor(t){this.graph=t}hasNode(t){return this.graph.getNode(t).some}getNode(t){const n=this.graph.getNode(t);return n.some?n.value:null}getNeighbors(t){const n=this.graph.getOutgoingEdges(t);return n.ok?n.value.map(o=>o.source===t?o.target:o.source):[]}getAllNodes(){return this.graph.getAllNodes()}isDirected(){return this.graph.isDirected()}getOutgoingEdges(t){const n=this.graph.getOutgoingEdges(t);return n.ok?n.value:[]}}class al{distances;n;constructor(t){this.distances=new Map,this.n=t}get(t,n){if(t===n)return 0;const o=t<n?`${t},${n}`:`${n},${t}`;return this.distances.get(o)??1/0}set(t,n,o){if(t===n)return;const r=t<n?`${t},${n}`:`${n},${t}`;this.distances.set(r,o)}findMinimum(t){let n=-1,o=-1,r=1/0;const i=[...t];for(let a=0;a<i.length;a++)for(let s=a+1;s<i.length;s++){const c=this.get(i[a],i[s]);c<r&&(r=c,n=i[a],o=i[s])}return n>=0&&o>=0?[n,o,r]:void 0}}const cl=(e,t)=>{const n=t.size,o=Array.from({length:n},()=>new Array(n).fill(0));for(let i=0;i<n;i++)o[i][i]=1;const r=e.getAllEdges();for(const i of r){const a=t.get(i.source),s=t.get(i.target);a!==void 0&&s!==void 0&&(o[a][s]=1,e.isDirected()||(o[s][a]=1))}return o},dl=e=>{const t=e.length,n=new al(t);for(let o=0;o<t;o++)for(let r=o+1;r<t;r++){const i=1-e[o][r];n.set(o,r,i)}return n},ll=(e,t,n,o,r,i,a)=>{const s=a.get(n)??1,c=a.get(o)??1;for(const d of r){if(d===t)continue;const l=e.get(n,d),u=e.get(o,d);let f;switch(i){case"single":{f=Math.min(l,u);break}case"complete":{f=Math.max(l,u);break}case"average":{f=(l*s+u*c)/(s+c);break}default:f=Math.min(l,u)}e.set(t,d,f)}},ul=(e,t,n)=>{const o=e.map(i=>i.id),r=t.map(i=>i.size);return{merges:t,heights:n,leafNodes:o,clusterSizes:r,cutAtHeight:i=>{const a=new Map;for(const[s,c]of o.entries())a.set(s,new Set([c]));for(const[s,c]of t.entries()){if(n[s]>i)break;const d=a.get(c.cluster1),l=a.get(c.cluster2);if(!d||!l)continue;const u=new Set([...d,...l]);a.delete(c.cluster1),a.delete(c.cluster2);const f=o.length;a.set(f+s,u)}return[...a.values()]},getClusters:i=>{if(i<=0)return[];if(i>=o.length)return o.map(d=>new Set([d]));const a=o.length,s=a-i;if(s<0||s>=t.length)return o.map(d=>new Set([d]));const c=new Map;for(const[d,l]of o.entries())c.set(d,new Set([l]));for(let d=0;d<s;d++){const l=t[d],u=c.get(l.cluster1),f=c.get(l.cluster2);if(!u||!f)continue;const g=new Set([...u,...f]);c.delete(l.cluster1),c.delete(l.cluster2),c.set(a+d,g)}return[...c.values()]}}},fl=(e,t={})=>{const n=performance.now(),o=t.linkage??"average",r=e.getAllNodes(),i=r.length;if(i===0)return R({type:"EmptyGraph",message:"Cannot perform hierarchical clustering on empty graph"});if(i===1){const v={merges:[],heights:[],leafNodes:[r[0].id],clusterSizes:[],cutAtHeight:()=>[new Set([r[0].id])],getClusters:()=>[new Set([r[0].id])]};return F({dendrogram:v,metadata:{algorithm:"hierarchical",runtime:performance.now()-n,parameters:{linkage:o}}})}const a=new Map;for(const[v,y]of r.entries())a.set(y.id,v);const s=cl(e,a),c=dl(s),d=new Set;for(let v=0;v<i;v++)d.add(v);const l=new Map,u=new Map;for(const[v,y]of r.entries())l.set(v,new Set([y.id])),u.set(v,1);const f=[],g=[];let h=i;for(let v=0;v<i-1;v++){const y=c.findMinimum(d);if(!y)break;const[b,k,w]=y,C=u.get(b)??1,x=u.get(k)??1,S=C+x;f.push({cluster1:b,cluster2:k,distance:w,size:S}),g.push(w);const M=h++,I=l.get(b)??new Set,E=l.get(k)??new Set,_=new Set([...I,...E]);l.set(M,_),u.set(M,S),ll(c,M,b,k,d,o,u),d.delete(b),d.delete(k),d.add(M)}const p=ul(r,f,g),m=performance.now();return F({dendrogram:p,metadata:{algorithm:"hierarchical",runtime:m-n,parameters:{linkage:o}}})},gl={levelSpacing:150,nodeSpacing:80,rootNodeId:null,direction:"horizontal"},hl=e=>e.type==="REFERENCE"||e.type==="AUTHORSHIP"||e.type==="AFFILIATION",pl=(e,t,n)=>{const o=new Map,r=new Map,i=t.filter(hl);for(const s of i){const{source:c,target:d}=s;let l,u;if(s.type==="AUTHORSHIP"||s.type==="AFFILIATION")l=c,u=d;else if(s.type==="REFERENCE")l=d,u=c;else continue;o.has(l)||o.set(l,[]);const f=o.get(l);f&&f.push(u),r.set(u,l)}let a=n;if(a===null){const s=new Set(e.map(l=>l.id)),c=new Set(r.keys()),d=[...s].filter(l=>!c.has(l));if(d.length>0)a=d[0];else if(e.length>0)a=e[0].id;else throw new Error("Cannot determine root node: no nodes available")}return{rootNodeId:a,children:o,parents:r}},Ft=(e,t,n)=>{const o=t.get(e);if(!o||o.length===0)return n;let r=0;for(const i of o)r+=Ft(i,t,n);return r},eo=(e,t,n,o)=>{const r=new Map,i=t.get(e);if(!i||i.length===0)return r;let a=o;for(const s of i){r.set(s,a);const c=eo(s,t,n,a);for(const[l,u]of c.entries())r.set(l,u);const d=Ft(s,t,n);a+=d}return r},ml=(e,t,n={})=>{const o={...gl,...n};if(e.length===0)return{nodes:[],maxDepth:0,rootNodeId:""};const{rootNodeId:r,children:i}=pl(e,t,o.rootNodeId),a=new Map,s=[{nodeId:r,level:0}],c=new Set([r]);let d=0;for(;s.length>0;){const g=s.shift();if(!g)break;const{nodeId:h,level:p}=g;a.set(h,p),d=Math.max(d,p);const m=i.get(h)||[];for(const v of m)c.has(v)||(c.add(v),s.push({nodeId:v,level:p+1}))}const l=eo(r,i,o.nodeSpacing,0),u=Ft(r,i,o.nodeSpacing);return l.set(r,u/2-o.nodeSpacing/2),{nodes:e.map(g=>{const h=a.get(g.id)??0,p=l.get(g.id)??0;let m,v;return o.direction==="horizontal"?(m=h*o.levelSpacing,v=p):(m=p,v=h*o.levelSpacing),{node:g,x:m,y:v,level:h}}),maxDepth:d,rootNodeId:r}},vl=e=>{const t=new Map;return e.nodes.forEach(({node:n,x:o,y:r})=>{t.set(n.id,{x:o,y:r})}),t},yl=(e,t,n={})=>{const{weightFn:o=()=>1,balanceTolerance:r=1.2,maxKMeansIterations:i=100}=n,a=e.getAllNodes(),s=a.length;if(s===0)return R({type:"EmptyGraph",message:"Cannot partition an empty graph"});if(t<2)return R({type:"InvalidPartitionCount",message:"Number of partitions must be at least 2",k:t,nodeCount:s});if(t>s)return R({type:"InvalidPartitionCount",message:`Number of partitions (${t}) exceeds number of nodes (${s})`,k:t,nodeCount:s});const c=new Map;for(const[g,h]of a.entries())c.set(h.id,g);const d=bl(e,a,c,o),l=kl(d,t,s);let u=wl(l,t,i);u=xl(u,t,s,r);const f=Ml(e,a,u,t,o,c);return F(f)},bl=(e,t,n,o)=>{const r=t.length,i=new Array(r).fill(0).map(()=>new Array(r).fill(0)),a=new Array(r).fill(0);for(const[d,l]of t.entries()){const u=e.getOutgoingEdges(l.id);if(u.ok)for(const f of u.value){const g=n.get(f.target);if(g!==void 0){const h=e.getNode(f.source),p=e.getNode(f.target);if(h.some&&p.some){const m=o(f,h.value,p.value);i[d][g]=m,a[d]+=m,e.isDirected()||(i[g][d]=m,a[g]+=m)}}}}const s=a.map(d=>d>0?1/Math.sqrt(d):0),c=new Array(r).fill(0).map(()=>new Array(r).fill(0));for(let d=0;d<r;d++)for(let l=0;l<r;l++)c[d][l]=d===l?1:-s[d]*i[d][l]*s[l];return c},kl=(e,t,n)=>{const o=new Array(n).fill(0).map(()=>new Array(t).fill(0));for(let r=0;r<n;r++)for(let i=0;i<t;i++)o[r][i]=Math.random()-.5;for(let r=0;r<t;r++){for(let s=0;s<r;s++){let c=0;for(let d=0;d<n;d++)c+=o[d][r]*o[d][s];for(let d=0;d<n;d++)o[d][r]-=c*o[d][s]}let i=0;for(let s=0;s<n;s++)i+=o[s][r]*o[s][r];if(i=Math.sqrt(i),i>1e-10)for(let s=0;s<n;s++)o[s][r]/=i;const a=20;for(let s=0;s<a;s++){const c=new Array(n).fill(0);for(let l=0;l<n;l++)for(let u=0;u<n;u++)c[l]+=l===u?o[u][r]:-e[l][u]*o[u][r];for(let l=0;l<r;l++){let u=0;for(let f=0;f<n;f++)u+=c[f]*o[f][l];for(let f=0;f<n;f++)c[f]-=u*o[f][l]}let d=0;for(let l=0;l<n;l++)d+=c[l]*c[l];if(d=Math.sqrt(d),d>1e-10)for(let l=0;l<n;l++)o[l][r]=c[l]/d}}return o},wl=(e,t,n)=>{const o=e.length,r=e[0].length,i=[],a=new Array(o).fill(0),s=Math.floor(Math.random()*o);i.push([...e[s]]);for(let l=1;l<t;l++){const u=new Array(o).fill(1/0);for(let h=0;h<o;h++)for(const p of i){const m=hn(e[h],p);u[h]=Math.min(u[h],m)}let f=-1,g=0;for(let h=0;h<o;h++)u[h]>f&&(f=u[h],g=h);i.push([...e[g]])}let c=!1,d=0;for(;!c&&d<n;){c=!0,d++;for(let f=0;f<o;f++){let g=1/0,h=0;for(let p=0;p<t;p++){const m=hn(e[f],i[p]);m<g&&(g=m,h=p)}a[f]!==h&&(a[f]=h,c=!1)}const l=new Array(t).fill(0),u=new Array(t).fill(0).map(()=>new Array(r).fill(0));for(let f=0;f<o;f++){const g=a[f];l[g]++;for(let h=0;h<r;h++)u[g][h]+=e[f][h]}for(let f=0;f<t;f++)if(l[f]>0)for(let g=0;g<r;g++)i[f][g]=u[f][g]/l[f]}return a},hn=(e,t)=>{let n=0;for(const[o,r]of e.entries()){const i=r-t[o];n+=i*i}return Math.sqrt(n)},xl=(e,t,n,o)=>{const r=n/t,i=new Array(t).fill(0);for(const u of e)i[u]++;if(Math.max(...i)/r<=o)return e;const c=[...e],d=1e3;let l=0;for(;l<d;){l++,i.fill(0);for(const m of c)i[m]++;let u=0,f=0,g=i[0],h=i[0];for(let m=1;m<t;m++)i[m]>g&&(g=i[m],u=m),i[m]<h&&(h=i[m],f=m);if(g/r<=o||g-h<=1)break;for(let m=0;m<c.length;m++)if(c[m]===u){c[m]=f;break}}return c},Ml=(e,t,n,o,r,i)=>{const a=new Map;for(let l=0;l<o;l++)a.set(l,new Set);for(const[l,u]of t.entries()){const f=n[l],g=a.get(f);g&&g.add(u)}const s=[],d=t.length/o;for(let l=0;l<o;l++){const u=a.get(l);if(!u)continue;let f=0;for(const p of u){const m=e.getOutgoingEdges(p.id);if(m.ok)for(const v of m.value){const y=i.get(v.target);if(y!==void 0&&n[y]!==l){const k=e.getNode(v.source),w=e.getNode(v.target);k.some&&w.some&&(f+=r(v,k.value,w.value))}}}const g=u.size,h=g/d;s.push({id:l,nodes:u,size:g,edgeCuts:f,balance:h})}return s},to=e=>e.weight??1,Sl=e=>{const t=e.weight??1;return t<0?R({type:"negative-weight",message:`Edge '${e.id}' has negative weight: ${t}. Dijkstra's algorithm requires non-negative weights.`,weight:t,edgeId:e.id}):F(void 0)};class no{heap=[];positions=new Map;insert(t,n){const o={element:t,priority:n},r=this.heap;r.push(o);const i=r.length-1;this.positions.set(t,i),this.bubbleUp(i)}extractMin(){const t=this.heap,n=t.length;if(n===0)return ge();const r=t[0].element;if(this.positions.delete(r),n===1)return t.length=0,me(r);const i=t.pop();return i===void 0?ge():(t[0]=i,this.positions.set(i.element,0),this.bubbleDown(0),me(r))}decreaseKey(t,n){const o=this.positions.get(t);if(o===void 0)return R({type:"invalid-input",message:"Element not found in heap"});const r=this.heap,i=r[o].priority;return n>i?R({type:"invalid-input",message:`New priority ${n} is greater than current priority ${i}`}):(r[o].priority=n,this.bubbleUp(o),F(void 0))}isEmpty(){return this.heap.length===0}size(){return this.heap.length}extractMinBatch(t){const n=[],o=this.heap;for(let r=0;r<t&&o.length>0;r++){const i=o[0];if(n.push(i.element),this.positions.delete(i.element),o.length===1){o.length=0;break}const a=o.pop();if(a===void 0)break;o[0]=a,this.positions.set(a.element,0),this.bubbleDown(0)}return n}bubbleUp(t){const n=this.heap,o=this.positions;for(;t>0;){const r=t-1>>1,i=n[r],a=n[t];if(i.priority<=a.priority)break;n[t]=i,n[r]=a,o.set(a.element,r),o.set(i.element,t),t=r}}bubbleDown(t){const n=this.heap,o=this.positions,r=n.length;for(;;){const i=(t<<1)+1,a=i+1;let s=t;if(i<r&&n[i].priority<n[s].priority&&(s=i),a<r&&n[a].priority<n[s].priority&&(s=a),s===t)break;const c=n[t],d=n[s];n[t]=d,n[s]=c,o.set(c.element,s),o.set(d.element,t),t=s}}swap(t,n){const o=this.heap,r=this.positions,i=o[t];o[t]=o[n],o[n]=i,r.set(o[t].element,t),r.set(o[n].element,n)}}const Cl=(e,t,n,o=to)=>{if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});const r=e.getNode(t);if(!r.some)return R({type:"invalid-input",message:`Start node '${t}' not found in graph`});if(!e.getNode(n).some)return R({type:"invalid-input",message:`End node '${n}' not found in graph`});const a=e.getAllEdges();for(const g of a){const h=Sl(g);if(!h.ok)return R(h.error)}if(t===n)return F(me({nodes:[r.value],edges:[],totalWeight:0}));const s=new Map,c=new Map,d=new Set,l=new no,u=e.getAllNodes();for(const g of u)s.set(g.id,1/0),c.set(g.id,null);for(s.set(t,0),l.insert(t,0);!l.isEmpty();){const g=l.extractMin();if(!g.some)break;const h=g.value;if(d.has(h))continue;if(d.add(h),h===n)break;const p=s.get(h);if(p===void 0)continue;const m=e.getOutgoingEdges(h);if(m.ok)for(const v of m.value){const y=v.source===h?v.target:v.source,b=e.getNode(h),k=e.getNode(y);if(!b.some||!k.some)continue;const w=o(v,b.value,k.value),C=p+w,x=s.get(y);x!==void 0&&C<x&&(s.set(y,C),c.set(y,{nodeId:h,edgeId:v.id}),d.has(y)||l.insert(y,C))}}if(s.get(n)===1/0)return F(ge());const f=_l(e,t,n,c,o);return F(me(f))},_l=(e,t,n,o,r)=>{const i=[],a=[];let s=0,c=n;for(;c!==t;){const l=e.getNode(c);l.some&&i.unshift(l.value);const u=o.get(c);if(!u)break;const f=e.getEdge(u.edgeId);if(f.some){const g=f.value;a.unshift(g);const h=e.getNode(u.nodeId),p=e.getNode(c);h.some&&p.some&&(s+=r(g,h.value,p.value))}c=u.nodeId}const d=e.getNode(t);return d.some&&i.unshift(d.value),{nodes:i,edges:a,totalWeight:s}},oo=(e,t,n)=>{if(e.length===0||t.length===0)return n;const o=Math.min(e.length,t.length);let r=0,i=0;for(let g=0;g<o;g++)r+=e[g],i+=t[g];const a=r/o,s=i/o;let c=0,d=0,l=0;for(let g=0;g<o;g++){const h=e[g]-a,p=t[g]-s;c+=h*p,d+=h*h,l+=p*p}const u=Math.sqrt(d*l);if(u<n)return n;const f=c/u;return Math.abs(f)+n},Nl=(e,t,n,o,r)=>{const i=e<=t?`${e}:${t}`:`${t}:${e}`,s=((n.get(i)??0)+r)/(o+r),c=-Math.log(s),d=-Math.log(r/(o+r));return c/d},Ze=(e,t,n)=>{if(e.size===0&&t.size===0)return n;let o=0;for(const i of e)t.has(i)&&o++;const r=e.size+t.size-o;return r===0?n:o/r+n},El=(e,t,n,o)=>{const i=((t.get(e)??0)+o)/(n+o),a=-Math.log(i),s=-Math.log(o/(n+o));return a/s},ro=(e,t,n)=>{const o=Math.max(0,t-e);return Math.exp(-n*o)},io=(e,t)=>e>=0?1:1-t,so=(e,t,n)=>e===void 0||t===void 0?1:e===t?1+n:1,$l=(e,t,n)=>{if(e.length<2)return n;let o=0,r=0;for(let i=0;i<e.length;i++)for(let a=i+1;a<e.length;a++){const s=t.get(e[i])??new Set,c=t.get(e[a])??new Set,d=Ze(s,c,n);o+=Math.log(d+n),r++}return r>0?Math.exp(o/r):n},Re=(e,t)=>{const n=new Set,o=e.getOutgoingEdges(t);if(o.ok)for(const r of o.value){const i=r.source===t?r.target:r.source;n.add(i)}return n},jt=(e,t={})=>{const{attributeExtractor:n,communityExtractor:o,layerExtractor:r,timestampExtractor:i,signExtractor:a,probabilityExtractor:s,hyperedgeExtractor:c,useEdgeTypes:d,communityBoost:l=.5,negativePenalty:u=.5,temporalDecay:f=.001,referenceTime:g=Date.now(),epsilon:h=1e-10,useDegreeBasedPenalty:p=!1,degreeBasedPenaltyFactor:m=.5,useIDFWeighting:v=!1,useEdgeTypeRarity:y=!1}=t,b=new Map,k=e.getAllEdges(),w=n!==void 0,C=o!==void 0,x=r!==void 0,S=i!==void 0,M=a!==void 0,I=s!==void 0,E=c!==void 0;let _,P=!1,N,T=!1;if(!w){const $=new Set;for(const A of e.getAllNodes())$.add(A.type);if(P=$.size>1,P){_=new Map;for(const A of k){const B=e.getNode(A.source),j=e.getNode(A.target);if(B.some&&j.some){const U=B.value.type,G=j.value.type,oe=U<=G?`${U}:${G}`:`${G}:${U}`;_.set(oe,(_.get(oe)??0)+1)}}}const D=new Set;for(const A of k)D.add(A.type);if(T=d??D.size>1,T){N=new Map;for(const A of k)N.set(A.type,(N.get(A.type)??0)+1)}}const L=new Map,O=e.getNodeCount();if(p||v)for(const $ of k)L.set($.source,(L.get($.source)??0)+1),L.set($.target,(L.get($.target)??0)+1);const te=k.length,z=new Map;if(y&&N)for(const[$,D]of N.entries()){const A=D/te;z.set($,-Math.log(A+h))}const Z=new Map,W=new Map;if(x)for(const $ of k){const D=r($);if(D!==void 0){const A=W.get(D)??[];A.push($),W.set(D,A)}}const q=$=>{let D=Z.get($);return D||(D=Re(e,$),Z.set($,D)),D},Q=$=>{const D=e.getNode($.source),A=e.getNode($.target);if(!D.some||!A.some)return h;if(E){const U=c($);if(U&&U.length>0){const G=[$.source,$.target,...U];for(const oe of G)q(oe);return $l(G,Z,h)}}if(w&&n){const U=n(D.value),G=n(A.value);if(U&&G&&U.length>0&&G.length>0)return oo(U,G,h)}if(P&&_)return Nl(D.value.type,A.value.type,_,k.length,h);if(T&&N)return El($.type,N,k.length,h);const B=q($.source),j=q($.target);return Ze(B,j,h)},K=$=>{const D=e.getNode($.source),A=e.getNode($.target);let B=1;if(S){const j=i($);j!==void 0&&(B*=ro(j,g,f))}if(M){const j=a($);j!==void 0&&(B*=io(j,u))}if(I){const j=s($);j!==void 0&&(B*=Math.max(0,Math.min(1,j)))}if(C&&D.some&&A.some){const j=o(D.value),U=o(A.value);B*=so(j,U,l)}if(p){const j=L.get($.source)??0,U=L.get($.target)??0,G=Math.log(j+1)+Math.log(U+1);B*=Math.exp(-m*G)}if(v){const j=L.get($.source)??0,U=L.get($.target)??0,G=Math.log(O/(j+1)+h),oe=Math.log(O/(U+1)+h);B*=G*oe}if(y){const j=z.get($.type)??1;B*=j}return B};for(const $ of k){let D=Q($);D*=K($),x&&r($)!==void 0&&W.size>1,b.set($.id,D)}return{get:$=>b.get($),keys:()=>b.keys(),size:b.size}},Il=(e,t,n={})=>{const{attributeExtractor:o,communityExtractor:r,timestampExtractor:i,signExtractor:a,probabilityExtractor:s,communityBoost:c=.5,negativePenalty:d=.5,temporalDecay:l=.001,referenceTime:u=Date.now(),epsilon:f=1e-10}=n,g=e.getNode(t.source),h=e.getNode(t.target);if(!g.some||!h.some)return f;let p;if(o){const v=o(g.value),y=o(h.value);if(v&&y&&v.length>0&&y.length>0)p=oo(v,y,f);else{const b=Re(e,t.source),k=Re(e,t.target);p=Ze(b,k,f)}}else{const v=Re(e,t.source),y=Re(e,t.target);p=Ze(v,y,f)}let m=1;if(i){const v=i(t);v!==void 0&&(m*=ro(v,u,l))}if(a){const v=a(t);v!==void 0&&(m*=io(v,d))}if(s){const v=s(t);v!==void 0&&(m*=Math.max(0,Math.min(1,v)))}if(r){const v=r(g.value),y=r(h.value);m*=so(v,y,c)}return p*m},Pl=(e,t,n,o="undirected")=>{if(t===n){const f=e.getNode(t);return f.some?[{nodes:[f.value],edges:[],totalWeight:0}]:[]}const r=new Map,i=new Map;r.set(t,0),i.set(t,[]);const a=[t];let s=1/0;const c=new Map;if(o==="undirected")for(const f of e.getAllEdges()){const g=c.get(f.target)??[];g.push(f),c.set(f.target,g)}const d=f=>{const g=[],h=new Set,p=e.getOutgoingEdges(f);if(p.ok)for(const m of p.value){const v=m.source===f?m.target:m.source;g.push({neighbour:v,edge:m}),h.add(m.id)}if(o==="undirected"){const m=c.get(f)??[];for(const v of m)if(!h.has(v.id)){const y=v.source;g.push({neighbour:y,edge:v}),h.add(v.id)}}return g};for(;a.length>0;){const f=a.shift();if(f===void 0)break;const g=r.get(f);if(g===void 0||g>=s)continue;const h=d(f);for(const{neighbour:p,edge:m}of h){const v=g+1,y=r.get(p);if(y===void 0)r.set(p,v),i.set(p,[{nodeId:f,edge:m}]),a.push(p),p===n&&(s=v);else if(y===v){const b=i.get(p);b&&b.push({nodeId:f,edge:m})}}}if(!r.has(n))return[];const l=[],u=(f,g,h)=>{if(f===t){const m=e.getNode(t);m.some&&l.push({nodes:[m.value,...g],edges:[...h].reverse(),totalWeight:h.length});return}const p=i.get(f);if(p){for(const{nodeId:m,edge:v}of p)if(e.getNode(m).some){const b=e.getNode(f);b.some&&u(m,[b.value,...g],[v,...h])}}};return u(n,[],[]),l},Dl=(e,t,n,o,r="undirected",i=1e4)=>{if(t===n){const u=e.getNode(t);return u.some?[{nodes:[u.value],edges:[],totalWeight:0}]:[]}const a=[],s=new Map;if(r==="undirected")for(const u of e.getAllEdges()){const f=s.get(u.target)??[];f.push(u),s.set(u.target,f)}const c=u=>{const f=[],g=new Set,h=e.getOutgoingEdges(u);if(h.ok)for(const p of h.value){const m=p.source===u?p.target:p.source;f.push({neighbour:m,edge:p}),g.add(p.id)}if(r==="undirected"){const p=s.get(u)??[];for(const m of p)if(!g.has(m.id)){const v=m.source;f.push({neighbour:v,edge:m}),g.add(m.id)}}return f},d=(u,f,g,h,p)=>{if(a.length>=i)return;if(u===n&&p>0){const v=e.getNode(t);v.some&&a.push({nodes:[v.value,...g],edges:[...h],totalWeight:h.length});return}if(p>=o)return;const m=c(u);for(const{neighbour:v,edge:y}of m){if(f.has(v))continue;const b=e.getNode(v);if(!b.some)continue;const k=new Set(f);k.add(v),d(v,k,[...g,b.value],[...h,y],p+1)}};return d(t,new Set([t]),[],[],0),a.sort((u,f)=>u.edges.length-f.edges.length),a},Tl=(e,t,n,o,r="none",i)=>{const a=e.edges.length;if(a===0)return{score:1,geometricMeanMI:1,edgeMIValues:[]};const s=[];let c=0;const d=[];for(const h of e.edges){const p=t.get(h.id)??o;if(s.push(p),c+=Math.log(p+o),r!=="none"){const m=i?i(h):h.weight??1;d.push(Math.max(m,o))}}const l=Math.exp(c/a),u=n>0?Math.exp(-n*a):void 0;let f;if(r==="divide"&&d.length>0){const h=d.reduce((p,m)=>p+m,0)/d.length;f=1/Math.max(h,o)}else if(r==="multiplicative"&&d.length>0){const h=d.reduce((p,m)=>p+Math.log(m),0)/d.length;f=Math.exp(-h)}let g=l;return u!==void 0&&(g*=u),f!==void 0&&(g*=f),{score:g,geometricMeanMI:l,edgeMIValues:s,lengthPenalty:u,weightFactor:f}},Lt=(e,t,n,o={})=>{const{traversalMode:r="undirected",lambda:i=0,weightMode:a="none",weightExtractor:s,maxPaths:c=10,maxLength:d=1/0,shortestOnly:l=!0,miCache:u,miConfig:f={},epsilon:g=1e-10}=o;if(!e)return R({type:"invalid-input",message:"Graph cannot be null or undefined"});if(!e.getNode(t).some)return R({type:"invalid-input",message:`Start node '${t}' not found in graph`});if(!e.getNode(n).some)return R({type:"invalid-input",message:`End node '${n}' not found in graph`});const m=u??jt(e,f),v=l||d===1/0?Pl(e,t,n,r):Dl(e,t,n,d,r);if(v.length===0)return F(ge());const y=v.map(k=>{const w=Tl(k,m,i,g,a,s);return{path:k,score:w.score,geometricMeanMI:w.geometricMeanMI,edgeMIValues:w.edgeMIValues,lengthPenalty:w.lengthPenalty,weightFactor:w.weightFactor}});y.sort((k,w)=>w.score-k.score);const b=y.slice(0,c);return F(me(b))},ao=(e,t,n,o={})=>{const r=Lt(e,t,n,{...o,maxPaths:1});return r.ok?!r.value.some||r.value.value.length===0?F(ge()):F(me(r.value.value[0])):r},Al=(e,t={})=>{const n=jt(e,t.miConfig??{});return{rank:(o,r,i={})=>Lt(e,o,r,{...t,...i,miCache:n}),getBest:(o,r,i={})=>ao(e,o,r,{...t,...i,miCache:n}),getMICache:()=>n}},co=(e,t)=>{if(e.length===0||t.length===0)return 0;const n=new Map(e.map((c,d)=>[c,d])),o=new Map(t.map((c,d)=>[c,d])),r=e.filter(c=>o.has(c));if(r.length===0)return 0;const i=r.length;let a=0;for(const c of r){const d=n.get(c),l=o.get(c);if(d===void 0||l===void 0)continue;const u=d-l;a+=u*u}const s=i*(i*i-1);return s===0?1:1-6*a/s},lo=(e,t)=>{if(e.length===0&&t.length===0)return 1;if(e.length===0||t.length===0)return 0;const n=new Map(e.map((c,d)=>[c,d])),o=new Map(t.map((c,d)=>[c,d])),r=e.filter(c=>o.has(c));if(r.length<2)return 1;let i=0,a=0;for(let c=0;c<r.length;c++)for(let d=c+1;d<r.length;d++){const l=r[c],u=r[d];if(l===void 0||u===void 0)continue;const f=n.get(l),g=n.get(u),h=o.get(l),p=o.get(u);if(f===void 0||g===void 0||h===void 0||p===void 0)continue;const m=f<g?-1:1,v=h<p?-1:1;m===v?i++:a++}const s=i+a;return s===0?1:(i-a)/s},pn=(e,t)=>{const n=e.slice(0,t);let o=0;for(const[r,i]of n.entries()){const a=r+1;o+=a===1?i.relevance:i.relevance/Math.log2(a)}return o},uo=(e,t,n)=>{if(e.length===0||t.length===0)return 0;const o=n??e.length,r=pn(e,o),i=pn(t,o);return i===0?1:r/i},fo=(e,t)=>{if(e.length===0||t.size===0)return 0;let n=0,o=0;for(const[r,i]of e.entries()){const a=i;if(t.has(a)){o++;const s=r+1,c=o/s;n+=c}}return o===0?0:n/o},go=(e,t)=>{if(e.length===0||t.size===0)return 0;for(const[n,o]of e.entries()){const r=o;if(t.has(r))return 1/(n+1)}return 0},xt=(e,t,n)=>e.length===0||t.size===0||n<=0?0:e.slice(0,Math.min(n,e.length)).filter(i=>t.has(i)).length/n,Mt=(e,t,n)=>e.length===0||t.size===0||n<=0?0:e.slice(0,Math.min(n,e.length)).filter(i=>t.has(i)).length/t.size,Rl=(e,t)=>{const n=t.map(o=>{let r=0;for(const a of o.nodes){const s=e.getNeighbors(a.id),c=s.ok?s.value.length:0;r+=c}const i=o.nodes.length>0?r/o.nodes.length:0;return{path:o,score:i,geometricMeanMI:0,edgeMIValues:[]}});return n.sort((o,r)=>r.score-o.score),n},Fl=(e,t=.85,n=100,o=1e-6)=>{const r=e.getAllNodes(),i=r.length;if(i===0)return new Map;const a=new Map,s=r.map(l=>l.id);for(const l of s)a.set(l,1/i);const c=new Map,d=new Map;for(const l of e.getAllEdges()){const u=c.get(l.source)??[];u.push(l.target),c.set(l.source,u);const f=d.get(l.target)??[];f.push(l.source),d.set(l.target,f)}for(let l=0;l<n;l++){const u=new Map;let f=0;for(const g of s){const h=d.get(g)??[];let p=0;for(const b of h){const k=(c.get(b)??[]).length,w=a.get(b)??0;k>0&&(p+=w/k)}const m=(1-t)/i+t*p;u.set(g,m);const v=a.get(g)??0,y=Math.abs(m-v);f=Math.max(f,y)}for(const[g,h]of u.entries())a.set(g,h);if(f<o)break}return a},jl=(e,t,n)=>{const o=Fl(e,n),r=t.map(i=>{let a=0;for(const c of i.nodes){const d=o.get(c.id)??0;a+=d}const s=i.nodes.length>0?a/i.nodes.length:0;return{path:i,score:s,geometricMeanMI:0,edgeMIValues:[]}});return r.sort((i,a)=>a.score-i.score),r};let Ll=class{seed;constructor(t){this.seed=t}next(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}shuffle(t){const n=[...t];for(let o=n.length-1;o>0;o--){const r=Math.floor(this.next()*(o+1));[n[o],n[r]]=[n[r],n[o]]}return n}};const zl=(e,t)=>{const o=new Ll(t??Date.now()).shuffle(e);return o.map((r,i)=>({path:r,score:1-i/o.length,geometricMeanMI:0,edgeMIValues:[]}))},Bl=e=>{const t=e.map(n=>{const r=1/(n.edges.length+1);return{path:n,score:r,geometricMeanMI:0,edgeMIValues:[]}});return t.sort((n,o)=>o.score-n.score),t},Ol=(e,t)=>{const n=e.map(o=>{let r=0;for(const a of o.edges){const s=t(a);r+=s}const i=o.edges.length>0?r/o.edges.length:0;return{path:o,score:i,geometricMeanMI:0,edgeMIValues:[]}});return n.sort((o,r)=>r.score-o.score),n};let ql=class{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}next(){return this.nextDouble()}nextInt(t,n){return Math.floor(this.next()*(n-t+1))+t}shuffle(t){const n=[...t];for(let o=n.length-1;o>0;o--){const r=Math.floor(this.nextDouble()*(o+1));[n[o],n[r]]=[n[r],n[o]]}return n}};const Ul=e=>{switch(e){case"weak":return{min:.1,max:.3};case"medium":return{min:.4,max:.7};case"strong":return{min:.8,max:1}}},We=(e,t)=>{const n=new ql(t.seed),o=Ul(t.signalStrength),i=e.getAllNodes().map(g=>g.id);if(i.length===0)throw new Error("Cannot plant paths in empty graph");const a=t.sourceNodes??n.shuffle(i).slice(0,Math.min(t.numPaths,i.length)),s=t.targetNodes??n.shuffle(i).slice(0,Math.min(t.numPaths,i.length)),c=[],d=new Map;let l=0,u=0,f=0;for(let g=0;g<t.numPaths;g++){const h=a[g%a.length],p=s[g%s.length],m=e.getNode(h),v=e.getNode(p);if(!m.some)throw new Error(`Source node '${h}' not found in graph`);if(!v.some)throw new Error(`Target node '${p}' not found in graph`);const y=n.nextInt(t.pathLength.min,t.pathLength.max),b=[],k=[];let w=h,C=n.nextDouble()*(o.max-o.min)+o.min;b.push(m.value);for(let E=0;E<y;E++){const _=`planted_node_${l++}`,P={id:_,type:"planted"};e.addNode(P),b.push(P);const T={id:`planted_edge_${u++}`,source:w,target:_,weight:C};e.addEdge(T),k.push(T),f+=C,w=_,C=Math.max(0,Math.min(1,C+(n.nextDouble()-.5)*.2))}const S={id:`planted_edge_${u++}`,source:w,target:p,weight:C};e.addEdge(S),k.push(S),f+=C,b.push(v.value);const M={nodes:b,edges:k,totalWeight:k.reduce((E,_)=>E+(_.weight??0),0)};c.push(M);const I=f/k.length;d.set(ht(M),I)}return c.sort((g,h)=>{const p=d.get(ht(g))??0;return(d.get(ht(h))??0)-p}),{graph:e,groundTruthPaths:c,relevanceScores:d,metadata:{nodesAdded:l,edgesAdded:u,avgPathMI:f/c.length}}},ht=e=>e.nodes.map(t=>t.id).join("→"),Gl=(e,t,n)=>{const o=new Xl(n.seed),r=e.getAllNodes(),i=Ql(r);if(i.length<3)throw new Error("Need at least 3 work nodes to plant citation paths");const a=o.shuffle([...i]).slice(0,Math.min(n.numPaths*3,i.length));switch(t){case"direct-citation-chain":return Wl(e,a,n,o);case"co-citation-bridge":return Vl(e,a,n,o);case"bibliographic-coupling":return Kl(e,a,n,o);case"author-mediated":return Hl(e,r,a,n,o);case"venue-mediated":return Jl(e,r,a,n,o)}},Wl=(e,t,n,o)=>{const i=[],a=new Map;let s=0,c=0;for(let d=0;d<n.numPaths;d++){const l=d*3;if(l+3>t.length)break;const u=t[l],f=t[l+1],g=t[l+2],h=$e(e,u.id,f.id,o);h&&(s++,c+=h.weight);const p=$e(e,f.id,g.id,o);if(p&&(s++,c+=p.weight),h&&p){const m={nodes:[u,f,g],edges:[h.edge,p.edge],totalWeight:h.weight+p.weight};i.push(m);const v=(h.weight+p.weight)/2,y=m.nodes.map(b=>b.id).join("→");a.set(y,v)}}return{graph:e,groundTruthPaths:i,relevanceScores:a,metadata:{nodesAdded:0,edgesAdded:s,avgPathMI:i.length>0?c/i.length:0}}},Vl=(e,t,n,o)=>{const r=[],i=new Map;let a=0,s=0;for(let c=0;c<n.numPaths;c++){const d=c*3;if(d+3>t.length)break;const l=t[d],u=t[d+1],f=t[d+2],g=$e(e,u.id,l.id,o),h=$e(e,u.id,f.id,o);if(g&&(a++,s+=g.weight),h&&(a++,s+=h.weight),g&&h){const p={nodes:[l,u,f],edges:[g.edge,h.edge],totalWeight:g.weight+h.weight};r.push(p);const m=(g.weight+h.weight)/2,v=p.nodes.map(y=>y.id).join("→");i.set(v,m)}}return{graph:e,groundTruthPaths:r,relevanceScores:i,metadata:{nodesAdded:0,edgesAdded:a,avgPathMI:r.length>0?s/r.length:0}}},Kl=(e,t,n,o)=>{const r=[],i=new Map;let a=0,s=0;for(let c=0;c<n.numPaths;c++){const d=c*3;if(d+3>t.length)break;const l=t[d],u=t[d+1],f=t[d+2],g=$e(e,l.id,u.id,o),h=$e(e,f.id,u.id,o);if(g&&(a++,s+=g.weight),h&&(a++,s+=h.weight),g&&h){const p={nodes:[l,u,f],edges:[g.edge,h.edge],totalWeight:g.weight+h.weight};r.push(p);const m=(g.weight+h.weight)/2,v=p.nodes.map(y=>y.id).join("→");i.set(v,m)}}return{graph:e,groundTruthPaths:r,relevanceScores:i,metadata:{nodesAdded:0,edgesAdded:a,avgPathMI:r.length>0?s/r.length:0}}},Hl=(e,t,n,o,r)=>{const i=zt(t,"Author");if(i.length===0)return We(e,o);const a=[],s=new Map;let c=0,d=0;for(let l=0;l<o.numPaths&&!(l+2>n.length);l++){const u=n[l],f=n[l+1],g=i[l%i.length],h=mn(e,u.id,g.id,r),p=mn(e,f.id,g.id,r);if(h&&(c++,d+=h.weight),p&&(c++,d+=p.weight),h&&p){const m={nodes:[u,g,f],edges:[h.edge,p.edge],totalWeight:h.weight+p.weight};a.push(m);const v=(h.weight+p.weight)/2,y=m.nodes.map(b=>b.id).join("→");s.set(y,v)}}return{graph:e,groundTruthPaths:a,relevanceScores:s,metadata:{nodesAdded:0,edgesAdded:c,avgPathMI:a.length>0?d/a.length:0}}},Jl=(e,t,n,o,r)=>{const i=zt(t,"Source");if(i.length===0)return We(e,o);const a=[],s=new Map;let c=0,d=0;for(let l=0;l<o.numPaths&&!(l+2>n.length);l++){const u=n[l],f=n[l+1],g=i[l%i.length],h=vn(e,u.id,g.id,r),p=vn(e,f.id,g.id,r);if(h&&(c++,d+=h.weight),p&&(c++,d+=p.weight),h&&p){const m={nodes:[u,g,f],edges:[h.edge,p.edge],totalWeight:h.weight+p.weight};a.push(m);const v=(h.weight+p.weight)/2,y=m.nodes.map(b=>b.id).join("→");s.set(y,v)}}return{graph:e,groundTruthPaths:a,relevanceScores:s,metadata:{nodesAdded:0,edgesAdded:c,avgPathMI:a.length>0?d/a.length:0}}},$e=(e,t,n,o)=>{const r=`citation_${t}_${n}`;if(e.getEdge(r).some)return null;const a=.5+o.nextDouble()*.5,s={id:r,source:t,target:n,weight:a};return e.addEdge(s),{edge:s,weight:a}},mn=(e,t,n,o)=>{const r=`authorship_${t}_${n}`;if(e.getEdge(r).some)return null;const a=.6+o.nextDouble()*.4,s={id:r,source:t,target:n,weight:a};return e.addEdge(s),{edge:s,weight:a}},vn=(e,t,n,o)=>{const r=`publication_${t}_${n}`;if(e.getEdge(r).some)return null;const a=.4+o.nextDouble()*.6,s={id:r,source:t,target:n,weight:a};return e.addEdge(s),{edge:s,weight:a}},Ql=e=>zt(e,"Work"),zt=(e,t)=>e.filter(n=>"type"in n&&typeof n.type=="string"?n.type===t:"entityType"in n&&typeof n.entityType=="string"?n.entityType===t:!1);let Xl=class{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}shuffle(t){const n=[...t];for(let o=n.length-1;o>0;o--){const r=Math.floor(this.nextDouble()*(o+1));[n[o],n[r]]=[n[r],n[o]]}return n}};const ho=e=>"type"in e&&typeof e.type=="string"?e.type:"entityType"in e&&typeof e.entityType=="string"?e.entityType:"unknown",Yl=(e,t,n)=>{if(t.length<2)throw new Error("Path template must have at least 2 node types");const o=new Map;for(const l of e.getAllNodes()){const u=ho(l);if(n.entityTypes.includes(u)){const f=o.get(u)??[];f.push(l),o.set(u,f)}}for(const l of t)if(!o.has(l))throw new Error(`No nodes found with type: ${l}`);const r=t[0],a=t.at(-1)??r,s=o.get(r)?.map(l=>l.id)??[],c=o.get(a)?.map(l=>l.id)??[],d={...n,sourceNodes:s,targetNodes:c};return We(e,d)},Zl=(e,t)=>{if(e.nodes.length!==t.length)return!1;for(let n=0;n<e.nodes.length;n++)if(ho(e.nodes[n])!==t[n])return!1;return!0},eu=(e,t,n,o)=>{if(n<=0)return e;const r=new nu(o??Date.now()),a=e.getAllNodes().map(l=>l.id);if(a.length<2)return e;const s=new Set;for(const l of t)s.add(yn(l));let c=0,d=0;for(let l=0;l<n;l++){const u=a[r.nextInt(0,a.length-1)],f=a[r.nextInt(0,a.length-1)];if(u===f)continue;const g=r.nextInt(1,4),h=tu(e,u,f,g,r,c,d),p=yn(h);if(!s.has(p)){for(const m of h.nodes)e.hasNode(m.id)||(e.addNode(m),c++);for(const m of h.edges)e.getEdge(m.id).some||(e.addEdge(m),d++);s.add(p)}}return e},tu=(e,t,n,o,r,i,a)=>{const s=[],c=[],d=e.getNode(t);if(!d.some)return{nodes:[],edges:[],totalWeight:0};s.push(d.value);let l=t;for(let h=0;h<o-1;h++){const p=`noise_node_${i+h}`,m=`noise_edge_${a+h}`,v={id:p},y={id:m,source:l,target:p,weight:r.nextDouble()*.3};s.push(v),c.push(y),l=p}const f={id:`noise_edge_${a+o-1}`,source:l,target:n,weight:r.nextDouble()*.3};c.push(f);const g=e.getNode(n);return g.some&&s.push(g.value),{nodes:s,edges:c,totalWeight:c.reduce((h,p)=>h+(p.weight??0),0)}},yn=e=>e.edges.map(t=>`${t.source}-${t.target}`).join("|");let nu=class{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}nextInt(t,n){return Math.floor(this.nextDouble()*(n-t+1))+t}};const po=(e,t,n=.05)=>{if(e.length!==t.length)throw new Error("Paired samples must have equal length");if(e.length<2)throw new Error("Paired t-test requires at least 2 observations");const o=e.length,r=[];for(let f=0;f<o;f++)r.push(e[f]-t[f]);const i=r.reduce((f,g)=>f+g,0)/o,a=r.reduce((f,g)=>f+(g-i)**2,0)/(o-1),c=Math.sqrt(a)/Math.sqrt(o);if(c===0)return{pValue:i===0?1:0,tStatistic:i===0?0:i>0?1/0:-1/0,significant:i!==0};const d=i/c,l=o-1,u=ou(d,l);return{pValue:u,tStatistic:d,significant:u<n}},mo=(e,t,n=.05)=>{if(e.length!==t.length)throw new Error("Paired samples must have equal length");if(e.length<2)throw new Error("Wilcoxon test requires at least 2 observations");const o=e.length,r=[];for(let g=0;g<o;g++){const h=e[g]-t[g];h!==0&&r.push({value:h,absValue:Math.abs(h)})}const i=r.length;if(i===0)return{pValue:1,statistic:0,significant:!1};const a=[...r].sort((g,h)=>g.absValue-h.absValue),s=[];let c=0;for(;c<i;){let g=c;for(;g<i&&a[g].absValue===a[c].absValue;)g++;const h=(c+1+g)/2;for(let p=c;p<g;p++)s.push(h);c=g}let d=0;for(let g=0;g<i;g++)a[g].value>0&&(d+=s[g]);const l=i*(i+1)/2-d,u=Math.min(d,l);let f;if(i>20){const g=i*(i+1)/4,h=Math.sqrt(i*(i+1)*(2*i+1)/24),p=(u-g)/h;f=2*(1-et(Math.abs(p)))}else{const g=i*(i+1)/4,h=Math.sqrt(i*(i+1)*(2*i+1)/24),p=(u-g)/h;f=2*(1-et(Math.abs(p)))}return{pValue:f,statistic:u,significant:f<n}},ou=(e,t)=>{if(t>30){const o=ru(e);return 2*(1-et(Math.abs(o)))}return 2*(1-et(Math.abs(e)))},ru=(e,t)=>e,et=e=>{const t=.254829592,n=-.284496736,o=1.421413741,r=-1.453152027,i=1.061405429,a=.3275911,s=e<0?-1:1;e=Math.abs(e)/Math.sqrt(2);const c=1/(1+a*e),d=1-((((i*c+r)*c+o)*c+n)*c+t)*c*Math.exp(-e*e);return .5*(1+s*d)},iu=(e,t=.95,n=1e4,o)=>{if(e.length<2)throw new Error("Bootstrap requires at least 2 samples");if(t<=0||t>=1)throw new Error("Confidence level must be between 0 and 1");const r=new yo(o??Date.now()),i=e.reduce((f,g)=>f+g,0)/e.length,a=[];for(let f=0;f<n;f++){const g=[];for(let p=0;p<e.length;p++){const m=Math.floor(r.nextDouble()*e.length);g.push(e[m])}const h=g.reduce((p,m)=>p+m,0)/g.length;a.push(h)}a.sort((f,g)=>f-g);const s=1-t,c=Math.floor(s/2*n),d=Math.ceil((1-s/2)*n)-1,l=a[c],u=a[d];return{lower:l,upper:u,mean:i}},vo=(e,t,n=1e4,o=.05,r)=>{if(e.length<2||t.length<2)throw new Error("Both methods require at least 2 samples");const i=new yo(r??Date.now()),a=e.reduce((v,y)=>v+y,0)/e.length,s=t.reduce((v,y)=>v+y,0)/t.length,c=a-s,d=[];for(let v=0;v<n;v++){const y=[];for(let C=0;C<e.length;C++){const x=Math.floor(i.nextDouble()*e.length);y.push(e[x])}const b=[];for(let C=0;C<t.length;C++){const x=Math.floor(i.nextDouble()*t.length);b.push(t[x])}const k=y.reduce((C,x)=>C+x,0)/y.length,w=b.reduce((C,x)=>C+x,0)/b.length;d.push(k-w)}d.sort((v,y)=>v-y);const l=Math.floor(o/2*n),u=Math.ceil((1-o/2)*n)-1,f={lower:d[l],upper:d[u]},g=d.filter(v=>v<=0).length,h=d.filter(v=>v>=2*c).length,p=Math.min(2*g/n,2*h/n),m=f.lower>0||f.upper<0;return{pValue:p,meanDifference:c,ci:f,significant:m}};class yo{seed;constructor(t=Date.now()){this.seed=t}nextDouble(){const t=Math.sin(this.seed++)*1e4;return t-Math.floor(t)}}const su=(e,t=.05)=>{if(e.length===0)return{correctedAlpha:t,significant:[]};const n=t/e.length,o=e.map(r=>r<n);return{correctedAlpha:n,significant:o}},au=(e,t=.05)=>{if(e.length===0)return{adjustedPValues:[],significant:[]};const n=e.length,o=e.map((s,c)=>({p:s,i:c}));o.sort((s,c)=>s.p-c.p);const r=[];for(const[s,c]of o.entries()){const{p:d,i:l}=c,u=d*n/(s+1);r.push({p:d,i:l,adjusted:Math.min(u,1)})}for(let s=r.length-2;s>=0;s--)r[s].adjusted=Math.min(r[s].adjusted,r[s+1].adjusted);const i=Array.from({length:e.length}),a=Array.from({length:e.length});for(const{i:s,adjusted:c}of r)i[s]=c,a[s]=c<t;return{adjustedPValues:i,significant:a}},cu=(e,t=.05)=>{if(e.length===0)return{adjustedPValues:[],significant:[]};const n=e.length,o=e.map((l,u)=>({p:l,i:u}));o.sort((l,u)=>l.p-u.p);const r=[];let i=0;for(const[l,u]of o.entries()){const{p:f,i:g}=u,h=Math.max(f*(n-l),i);r.push({i:g,adjusted:Math.min(h,1)}),i=h}const a=new Map;let s=n;for(let l=0;l<o.length;l++){const{p:u,i:f}=o[l];if(u<t/s)a.set(f,!0),s--;else{a.set(f,!1);for(let g=l+1;g<o.length;g++)a.set(o[g].i,!1);break}}const c=Array.from({length:e.length}),d=Array.from({length:e.length});for(const{i:l,adjusted:u}of r)c[l]=u,d[l]=a.get(l)??!1;return{adjustedPValues:c,significant:d}},du=(e,t=.05,n=.5)=>{if(e.length===0)return{qValues:[],significant:[],pi0:1};const o=e.length,r=e.filter(l=>l>n),i=Math.min(1,r.length/o/(1-n)),a=e.map((l,u)=>({p:l,i:u}));a.sort((l,u)=>l.p-u.p);const s=Array.from({length:e.length}),c=Array.from({length:e.length});let d=0;for(let l=a.length-1;l>=0;l--){const{p:u,i:f}=a[l],g=Math.min(1,u*o*i/(l+1)),h=Math.max(g,d);s[f]=h,d=h}for(let l=0;l<e.length;l++)c[l]=(s[l]??0)<t;return{qValues:s,significant:c,pi0:i}},lu=(e,t)=>{if(e.length<2||t.length<2)throw new Error("Cohen's d requires at least 2 samples per group");const n=e.reduce((u,f)=>u+f,0)/e.length,o=t.reduce((u,f)=>u+f,0)/t.length,r=e.reduce((u,f)=>u+(f-n)**2,0)/(e.length-1),i=t.reduce((u,f)=>u+(f-o)**2,0)/(t.length-1),a=((e.length-1)*r+(t.length-1)*i)/(e.length+t.length-2),s=Math.sqrt(a),c=s===0?0:(n-o)/s,d=Math.abs(c);let l;return d<.2?l="negligible":d<.5?l="small":d<.8?l="medium":l="very-large",{effectSize:c,interpretation:l,magnitude:d}},uu=(e,t)=>{if(e.length===0||t.length===0)throw new Error("Cliff's delta requires at least 1 sample per group");let n=0,o=0;for(const d of e)for(const l of t)d>l?n++:d<l&&o++;const r=e.length*t.length,i=r===0?0:(n-o)/r,a=r===0?.5:n/r,s=Math.abs(i);let c;return s<.147?c="negligible":s<.33?c="small":s<.474?c="medium":c="large",{effectSize:i,interpretation:c,probability:a,magnitude:s}},fu=(e,t)=>{if(e.length<2||t.length<2)throw new Error("Glass's delta requires at least 2 samples per group");const n=e.reduce((d,l)=>d+l,0)/e.length,o=t.reduce((d,l)=>d+l,0)/t.length,r=t.reduce((d,l)=>d+(l-o)**2,0)/(t.length-1),i=Math.sqrt(r),a=i===0?0:(n-o)/i,s=Math.abs(a);let c;return s<.2?c="negligible":s<.5?c="small":s<.8?c="medium":c="very-large",{effectSize:a,interpretation:c}},gu=(e,t)=>{if(e.length===0||t.length===0)throw new Error("Rank-biserial correlation requires at least 1 sample per group");const n=[...e.map(m=>({value:m,group:1})),...t.map(m=>({value:m,group:2}))];n.sort((m,v)=>m.value-v.value);const o=[];let r=0;for(;r<n.length;){let m=r;for(;m<n.length&&n[m].value===n[r].value;)m++;const v=(r+1+m)/2;for(let y=r;y<m;y++)o.push(v);r=m}let i=0,a=0;for(const m of n)m.group===1&&(i+=o[a]),a++;const s=e.length,c=t.length,d=s+c,l=s*(d+1)/2,u=2*(i-l),f=s*c,g=f===0?0:u/f,h=Math.abs(g);let p;return h<.147?p="negligible":h<.33?p="small":h<.474?p="medium":p="large",{effectSize:h,correlation:g,interpretation:p}},bo=async(e,t)=>{const n=Date.now(),o=We(t,e.pathPlanting),r=o.groundTruthPaths,i=o.relevanceScores,a=o.graph,s=[];for(const u of e.methods){const f=[];for(let g=0;g<e.repetitions;g++){const h=u.ranker(a,r),p=pu(h,r,i,e.metrics);f.push(p)}s.push({method:u.name,repetitions:f})}const c=s.map(({method:u,repetitions:f})=>{const g=mu(f,e.metrics);return{method:u,results:g,runtime:0}}),d=vu(s,e.statisticalTests,e.alpha??.05),l=yu(c,e.metrics[0]??"spearman");return{name:e.name,graphSpec:"custom",methods:c,statisticalTests:d,winner:l,timestamp:new Date().toISOString(),duration:Date.now()-n}},hu=async(e,t,n=5)=>{const o=[];for(let a=0;a<n;a++){const s={...e,seed:e.seed+a},c=await bo(s,t);o.push(c)}const r=bu(o),i=ku(o);return{foldResults:o,aggregated:r,stdDev:i}},pu=(e,t,n,o)=>{const r=new Map,i=e.map(s=>s.path.nodes[0]?.id??"unknown"),a=t.map((s,c)=>({path:s,index:c,relevance:n.get(s.nodes[0]?.id??"unknown")??0})).sort((s,c)=>c.relevance-s.relevance).map(s=>s.path.nodes[0]?.id??"unknown");for(const s of o)switch(s){case"spearman":{r.set("spearman",co(i,a));break}case"kendall":{r.set("kendall",lo(i,a));break}case"ndcg":{const c=e.map((l,u)=>({id:i[u],relevance:l.path.totalWeight??0})),d=t.map(l=>({id:l.nodes[0]?.id??"unknown",relevance:n.get(l.nodes[0]?.id??"unknown")??0}));d.sort((l,u)=>u.relevance-l.relevance),r.set("ndcg",uo(c,d));break}case"map":{const c=Math.min(10,t.length),d=new Set(t.slice(0,c).map(l=>l.nodes[0]?.id??"unknown"));r.set("map",fo(i,d));break}case"mrr":{const c=new Set(t.slice(0,5).map(d=>d.nodes[0]?.id??"unknown"));r.set("mrr",go(i,c));break}case"precision":{const c=new Set(t.slice(0,10).map(d=>d.nodes[0]?.id??"unknown"));r.set("precision_at_5",xt(i,c,5)),r.set("precision_at_10",xt(i,c,10));break}case"recall":{const c=new Set(t.slice(0,10).map(d=>d.nodes[0]?.id??"unknown"));r.set("recall_at_5",Mt(i,c,5)),r.set("recall_at_10",Mt(i,c,10));break}}return r},mu=(e,t)=>{const n={},o=new Map;for(const r of e)for(const[i,a]of r){let s=o.get(i);s||(s=[],o.set(i,s)),s.push(a)}for(const[r,i]of o){const a=i.reduce((s,c)=>s+c,0)/i.length;n[r]=a}for(const r of t)r in n||(n[r]=0);return n},vu=(e,t,n)=>{const o=[],r=[...e].sort((a,s)=>{const c="spearman",d=pt(a.repetitions,c);return pt(s.repetitions,c)-d}),i=r[0];pt(i.repetitions,"spearman");for(let a=1;a<r.length;a++){const s=r[a];for(const c of t){let d;switch(c){case"paired-t":{const l=i.repetitions.map(g=>g.get("spearman")??0),u=s.repetitions.map(g=>g.get("spearman")??0),f=po(l,u,n);d={type:"paired-t",comparison:`${i.method} vs ${s.method}`,pValue:f.pValue,significant:f.significant,statistic:f.tStatistic};break}case"wilcoxon":{const l=i.repetitions.map(g=>g.get("spearman")??0),u=s.repetitions.map(g=>g.get("spearman")??0),f=mo(l,u,n);d={type:"wilcoxon",comparison:`${i.method} vs ${s.method}`,pValue:f.pValue,significant:f.significant,statistic:f.statistic};break}case"bootstrap":{const l=i.repetitions.map(g=>g.get("spearman")??0),u=s.repetitions.map(g=>g.get("spearman")??0),f=vo(l,u,1e4,n);d={type:"bootstrap",comparison:`${i.method} vs ${s.method}`,pValue:f.pValue,significant:f.significant,ci:f.ci};break}default:continue}o.push(d)}}return o},yu=(e,t)=>[...e].sort((o,r)=>{const i=o.results[t]??0;return(r.results[t]??0)-i})[0]?.method??"unknown",pt=(e,t)=>{let n=0,o=0;for(const r of e){const i=r.get(t);i!==void 0&&(n+=i,o++)}return o>0?n/o:0},bu=e=>{const t=e[0],n=t.methods.map(r=>{const i={};for(const a of Object.keys(r.results)){const s=e.map(d=>d.methods.find(l=>l.method===r.method)?.results[a]),c=s.reduce((d,l)=>d+(l??0),0)/s.length;i[a]=c}return{method:r.method,results:i,runtime:r.runtime}});return{...t,methods:n,statisticalTests:[]}},ku=e=>{const t=e[0],n=t.methods.map(o=>{const r={};for(const i of Object.keys(o.results)){const a=e.map(d=>d.methods.find(l=>l.method===o.method)?.results[i]),s=a.reduce((d,l)=>d+(l??0),0)/a.length,c=a.reduce((d,l)=>d+((l??0)-s)**2,0)/a.length;r[i]=Math.sqrt(c)}return{method:o.method,results:r,runtime:0}});return{...t,methods:n,statisticalTests:[]}},wu=e=>{const t=[`# ${e.name}
2
2
  `,`**Timestamp:** ${e.timestamp}
3
3
  `,`**Graph Spec:** ${e.graphSpec}
4
4
  `];e.duration&&t.push(`**Duration:** ${e.duration}ms
@@ -25,24 +25,24 @@
25
25
  `):o>.2?t.push("The winner shows modest improvement, though practical ",`significance may depend on the use case.
26
26
  `):t.push(`Differences between methods are small; all methods perform similarly.
27
27
  `),t.join("")},Cu=e=>{const t=["<!DOCTYPE html>",'<html lang="en">',"<head>",'<meta charset="UTF-8">','<meta name="viewport" content="width=device-width, initial-scale=1.0">'];t.push("<title>"+ye(e.name)+"</title>","<style>",'body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; line-height: 1.6; }',"h1 { color: #333; border-bottom: 2px solid #4CAF50; padding-bottom: 10px; }","h2 { color: #555; margin-top: 30px; }","table { border-collapse: collapse; width: 100%; margin: 20px 0; }","th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }","th { background-color: #4CAF50; color: white; }","tr:nth-child(even) { background-color: #f9f9f9; }",".significant { color: #4CAF50; font-weight: bold; }",".not-significant { color: #f44336; }",".winner { background-color: #fff9c4; padding: 10px; border-left: 4px solid #4CAF50; margin: 20px 0; }","</style>","</head>","<body>"),t.push("<h1>"+ye(e.name)+"</h1>"),t.push("<p><strong>Timestamp:</strong> "+ye(e.timestamp)+"</p>"),t.push("<p><strong>Graph Spec:</strong> "+ye(e.graphSpec)+"</p>",'<div class="winner">',"<h2>Winner</h2>"),t.push("<p><strong>"+ye(e.winner)+"</strong></p>","</div>","<h2>Method Performance</h2>","<table>","<tr><th>Method</th>");for(const n of Bt(e))t.push("<th>"+ye(n)+"</th>");t.push("</tr>");for(const n of e.methods){const o=n.method===e.winner;t.push("<tr"+(o?' style="font-weight: bold;"':"")+">"),t.push("<td>"+ye(n.method)+"</td>");for(const r of Object.values(n.results))t.push("<td>"+r.toFixed(4)+"</td>");t.push("</tr>")}if(t.push("</table>"),e.statisticalTests.length>0){t.push("<h2>Statistical Tests</h2>","<table>","<tr><th>Test</th><th>Comparison</th><th>p-value</th><th>Significant</th></tr>");for(const n of e.statisticalTests){const o=n.significant?"significant":"not-significant",r=n.significant?"Yes":"No";let i="";n.statistic!==void 0&&(i=` (${n.statistic.toFixed(4)})`),t.push("<tr>"),t.push("<td>"+ye(n.type)+i+"</td>"),t.push("<td>"+ye(n.comparison)+"</td>"),t.push("<td>"+n.pValue.toExponential(4)+"</td>",'<td class="'+o+'">'+r+"</td>","</tr>")}t.push("</table>")}return t.push("</body>","</html>"),t.join(`
28
- `)},ye=e=>e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#039;"),_u=6,Nu=1e4,bo=(e,t,n,o={})=>{const r=o.maxPathLength??_u,i=o.maxPaths??Nu;o.directed;const a=new Set,s=new Set,c=[],d=new Set,l=[],u=(p,v,m)=>{if(!(c.length>=i)&&!(m>r)){if(d.add(p),l.push(p),p===v&&l.length>1){const y=[...l];c.push(y);for(const b of y)a.add(b);for(let b=0;b<y.length-1;b++){const[k,w]=[y[b],y[b+1]].sort();s.add(`${k}--${w}`)}}else{const y=e.getNeighbors(p),b=y.ok?y.value:[];for(const k of b)d.has(k)||u(k,v,m+1)}l.pop(),d.delete(p)}};u(t,n,0);const f=new Map;for(const p of a){let v=0;const m=e.getNeighbors(p),y=m.ok?m.value:[];for(const b of y)a.has(b)&&v++;f.set(p,v)}const g=c.map(p=>p.length),h={pathCount:c.length,maxPathLength:g.length>0?Math.max(...g):0,minPathLength:g.length>0?Math.min(...g):0,meanPathLength:g.length>0?g.reduce((p,v)=>p+v,0)/g.length:0};return{nodes:a,edges:s,paths:c,degrees:f,stats:h}},Eu=(e,t,n={})=>{const o=new Set,r=new Set,i=[];for(const[d,l]of t){const u=bo(e,d,l,n);for(const f of u.nodes)o.add(f);for(const f of u.edges)r.add(f);i.push(...u.paths)}const a=new Map;for(const d of o){let l=0;const u=e.getNeighbors(d),f=u.ok?u.value:[];for(const g of f)o.has(g)&&l++;a.set(d,l)}const s=i.map(d=>d.length),c={pathCount:i.length,maxPathLength:s.length>0?Math.max(...s):0,minPathLength:s.length>0?Math.min(...s):0,meanPathLength:s.length>0?s.reduce((d,l)=>d+l,0)/s.length:0};return{nodes:o,edges:r,paths:i,degrees:a,stats:c}},$u=(e,t,n=3)=>{const o=new Set,r=new Set,i=new Set,a=[{node:t,depth:0}];for(i.add(t);a.length>0;){const c=a.shift();if(!c)break;const{node:d,depth:l}=c;if(o.add(d),l<n){const u=e.getNeighbors(d),f=u.ok?u.value:[];for(const g of f)if(!i.has(g)){i.add(g),a.push({node:g,depth:l+1});const[h,p]=[d,g].sort();r.add(`${h}--${p}`)}}}const s=new Map;for(const c of o){let d=0;const l=e.getNeighbors(c),u=l.ok?l.value:[];for(const f of u)o.has(f)&&d++;s.set(c,d)}return{nodes:o,edges:r,paths:[],degrees:s,stats:{pathCount:0,maxPathLength:0,minPathLength:0,meanPathLength:0}}},Mt=e=>{const t=new Map;for(const o of e.getAllNodes()){const r=e.getNeighbors(o.id),i=r.ok?r.value.length:0;t.set(o.id,i)}const n=Math.max(...t.values(),1);for(const[o,r]of t)t.set(o,r/n);return t},St=(e,t=.85,n=100,o=1e-6)=>{const r=e.getAllNodes(),i=r.length;if(i===0)return new Map;const a=new Map,s=r.map(u=>u.id);for(const u of s)a.set(u,1/i);const c=new Map,d=new Map;for(const u of e.getAllEdges()){const f=c.get(u.source)??[];f.push(u.target),c.set(u.source,f);const g=d.get(u.target)??[];g.push(u.source),d.set(u.target,g)}for(let u=0;u<n;u++){const f=new Map;let g=0;for(const h of s){const p=d.get(h)??[];let v=0;for(const b of p){const k=(c.get(b)??[]).length,w=a.get(b)??0;k>0&&(v+=w/k)}const m=(1-t)/i+t*v;f.set(h,m);const y=a.get(h)??0;g=Math.max(g,Math.abs(m-y))}for(const[h,p]of f.entries())a.set(h,p);if(g<o)break}const l=Math.max(...a.values(),1e-10);for(const[u,f]of a)a.set(u,f/l);return a},Iu=(e,t=.85,n=.5)=>{const o=Mt(e),r=St(e,t),i=new Map;for(const a of e.getAllNodes()){const s=o.get(a.id)??0,c=r.get(a.id)??0;i.set(a.id,n*s+(1-n)*c)}return{degree:o,pagerank:r,combined:i}},Pu=(e,t)=>{if(e.length===0)return 0;switch(t){case"sum":return e.reduce((n,o)=>n+o,0);case"geometric-mean":{const n=e.reduce((o,r)=>o+Math.log(r+1e-10),0);return Math.exp(n/e.length)}default:return e.reduce((n,o)=>n+o,0)/e.length}},Fe=(e,t,n)=>{const{type:o,degreeWeight:r=.5,customImportance:i,dampingFactor:a=.85,aggregation:s="mean",precomputedImportance:c}=n;let d;if(c)d=c;else switch(o){case"degree":{d=Mt(e);break}case"pagerank":{d=St(e,a);break}case"combined":{const u=Mt(e),f=St(e,a);d=new Map;for(const g of e.getAllNodes()){const h=u.get(g.id)??0,p=f.get(g.id)??0;d.set(g.id,r*h+(1-r)*p)}break}case"domain-specific":{if(!i)throw new Error("domain-specific ground truth requires customImportance function");d=new Map;for(const u of e.getAllNodes())d.set(u.id,i(u.id));break}default:throw new Error(`Unknown ground truth type: ${o}`)}const l=t.map(u=>{const f=u.nodes.map(h=>d.get(h.id)??0),g=Pu(f,s);return{path:u,score:g,nodeScores:f}});return l.sort((u,f)=>f.score-u.score),l},Du=(e,t,n=0)=>{const o=new Map;for(const r of e)o.set(r.id,r);return r=>{const i=o.get(r);if(!i)return n;const a=i[t];return typeof a=="number"?a:n}},Tu=(e,t,n)=>({degree:Fe(e,t,{type:"degree"}),pagerank:Fe(e,t,{type:"pagerank"}),combined:Fe(e,t,{type:"combined"}),"domain-specific":n?Fe(e,t,{type:"domain-specific",customImportance:n}):[]}),Ot=(e,t)=>{if(e.size===0&&t.size===0)return 0;let n=0;for(const i of e)t.has(i)&&n++;const o=e.size+t.size-n;return 1-n/o},ko=e=>new Set(e),wo=e=>{if(e.length<2)return 0;const t=e.map(ko);let n=0,o=0;for(let r=0;r<t.length;r++)for(let i=r+1;i<t.length;i++)n+=Ot(t[r],t[i]),o++;return o>0?n/o:0},xo=e=>{if(e.length<2)return 0;const t=e.map(r=>{const i=new Set;for(let a=0;a<r.length-1;a++){const[s,c]=[r[a],r[a+1]].sort();i.add(`${s}--${c}`)}return i});let n=0,o=0;for(let r=0;r<t.length;r++)for(let i=r+1;i<t.length;i++)n+=Ot(t[r],t[i]),o++;return o>0?n/o:0},Au=e=>{if(e.length===0)return{pathCount:0,nodeJaccardDistance:0,edgeJaccardDistance:0,uniqueNodeCount:0,uniqueEdgeCount:0,meanPathLength:0,stdPathLength:0};const t=new Set,n=new Set;for(const s of e){for(const c of s)t.add(c);for(let c=0;c<s.length-1;c++){const[d,l]=[s[c],s[c+1]].sort();n.add(`${d}--${l}`)}}const o=e.map(s=>s.length),r=o.reduce((s,c)=>s+c,0)/o.length,i=o.reduce((s,c)=>s+(c-r)**2,0)/o.length,a=Math.sqrt(i);return{pathCount:e.length,nodeJaccardDistance:wo(e),edgeJaccardDistance:xo(e),uniqueNodeCount:t.size,uniqueEdgeCount:n.size,meanPathLength:r,stdPathLength:a}},Ru=(e,t)=>{if(e.length===0)return 0;let n=0;for(const o of e)o.some(i=>t.has(i))&&n++;return n/e.length},Fu=(e,t=.1)=>{const n=[...e.entries()].sort((i,a)=>a[1]-i[1]),o=Math.max(1,Math.ceil(n.length*t)),r=new Set;for(let i=0;i<o&&i<n.length;i++)r.add(n[i][0]);return r},Ie=e=>{if(e.length===0)return new Map;const t=new Map;for(const r of e)t.set(r,(t.get(r)??0)+1);const n=e.length,o=new Map;for(const[r,i]of t)o.set(r,i/n);return o},Be=(e,t,n=1e-10)=>{const o=new Set([...e.keys(),...t.keys()]);let r=0;for(const i of o){const a=e.get(i)??0,s=t.get(i)??0,c=a+n,d=s+n;c>0&&(r+=c*Math.log(c/d))}return Math.max(0,r)},qt=(e,t)=>{const n=new Set([...e.keys(),...t.keys()]),o=new Map;for(const r of n){const i=e.get(r)??0,a=t.get(r)??0;o.set(r,.5*(i+a))}return .5*Be(e,o)+.5*Be(t,o)},Mo=(e,t)=>{const n=[...new Set([...e.keys(),...t.keys()])].sort((a,s)=>a-s);if(n.length===0)return 0;let o=0,r=0,i=0;for(let a=0;a<n.length;a++){const s=n[a];o+=e.get(s)??0,r+=t.get(s)??0;const c=a<n.length-1?n[a+1]-s:1;i+=Math.abs(o-r)*c}return i},ju=(e,t)=>{const n=Ie(e),o=Ie(t),r=c=>c.length>0?c.reduce((d,l)=>d+l,0)/c.length:0,i=(c,d)=>c.length>0?Math.sqrt(c.reduce((l,u)=>l+(u-d)**2,0)/c.length):0,a=r(e),s=r(t);return{klDivergence:Be(o,n),jsDivergence:qt(o,n),emd:Mo(o,n),sampledMeanDegree:a,groundTruthMeanDegree:s,sampledStdDegree:i(e,a),groundTruthStdDegree:i(t,s),sampledMaxDegree:e.length>0?Math.max(...e):0,groundTruthMaxDegree:t.length>0?Math.max(...t):0}},Lu=e=>Ie([...e.values()]),zu=e=>{const t=new Map,n=["1-5","6-10","11-50","51-100","101-500","501-1000","1000+"];for(const o of n)t.set(o,0);for(const o of e){let r;o<=5?r="1-5":o<=10?r="6-10":o<=50?r="11-50":o<=100?r="51-100":o<=500?r="101-500":o<=1e3?r="501-1000":r="1000+",t.set(r,(t.get(r)??0)+1)}return t},So=(e,t)=>{if(t.size===0)return{coverage:0,precision:0,f1Score:0,intersection:0};let n=0;for(const a of e)t.has(a)&&n++;const o=n/t.size,r=e.size>0?n/e.size:0,i=r+o>0?2*r*o/(r+o):0;return{coverage:o,precision:r,f1Score:i,intersection:n}},Co=(e,t,n)=>{if(n.size<2)return 0;const o=[...n],r=o.length,i=[],a=[];for(const d of o)i.push(e.get(d)??0),a.push(t.get(d)??0);let s=0;for(let d=0;d<r;d++){const l=i[d]-a[d];s+=l*l}return 1-6*s/(r*(r*r-1))},Ct=e=>{const t=[...e.entries()].sort((o,r)=>r[1]-o[1]),n=new Map;for(const[o,r]of t.entries())n.set(r[0],o+1);return n},_o=(e,t)=>{if(t.length===0)return 0;let n=0;for(const o of t)[...o].some(i=>e.has(i))&&n++;return n/t.length},Bu=(e,t,n,o,r=[])=>{const i=So(e,t),a=[...n.values()],s=[...o.values()],c=Ie(a),d=Ie(s),l=Be(d,c),u=qt(d,c),f=new Set;for(const b of e)t.has(b)&&f.add(b);const g=Ct(n),h=Ct(o),p=Co(g,h,f),v=_o(e,r);let m=0;for(const b of e)t.has(b)||m++;let y=0;for(const b of t)e.has(b)||y++;return{coverage:i.coverage,precision:i.precision,f1Score:i.f1Score,degreeKL:l,degreeJS:u,betweennessCorrelation:p,communityCoverage:v,intersectionSize:i.intersection,falsePositives:m,falseNegatives:y}},Ou=e=>{if(e.length===0)return{coverage:0,precision:0,f1Score:0,degreeKL:0,degreeJS:0,betweennessCorrelation:0,communityCoverage:0,intersectionSize:0,falsePositives:0,falseNegatives:0};const t=e.length;return{coverage:e.reduce((n,o)=>n+o.coverage,0)/t,precision:e.reduce((n,o)=>n+o.precision,0)/t,f1Score:e.reduce((n,o)=>n+o.f1Score,0)/t,degreeKL:e.reduce((n,o)=>n+o.degreeKL,0)/t,degreeJS:e.reduce((n,o)=>n+o.degreeJS,0)/t,betweennessCorrelation:e.reduce((n,o)=>n+o.betweennessCorrelation,0)/t,communityCoverage:e.reduce((n,o)=>n+o.communityCoverage,0)/t,intersectionSize:e.reduce((n,o)=>n+o.intersectionSize,0)/t,falsePositives:e.reduce((n,o)=>n+o.falsePositives,0)/t,falseNegatives:e.reduce((n,o)=>n+o.falseNegatives,0)/t}},qu=e=>{const t=[];let n=0;for(;n<e.length;){const o=e[n];if(/\s/.test(o)){n++;continue}if(o==="#"){for(;n<e.length&&e[n]!==`
28
+ `)},ye=e=>e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#039;"),_u=6,Nu=1e4,ko=(e,t,n,o={})=>{const r=o.maxPathLength??_u,i=o.maxPaths??Nu;o.directed;const a=new Set,s=new Set,c=[],d=new Set,l=[],u=(p,m,v)=>{if(!(c.length>=i)&&!(v>r)){if(d.add(p),l.push(p),p===m&&l.length>1){const y=[...l];c.push(y);for(const b of y)a.add(b);for(let b=0;b<y.length-1;b++){const[k,w]=[y[b],y[b+1]].sort();s.add(`${k}--${w}`)}}else{const y=e.getNeighbors(p),b=y.ok?y.value:[];for(const k of b)d.has(k)||u(k,m,v+1)}l.pop(),d.delete(p)}};u(t,n,0);const f=new Map;for(const p of a){let m=0;const v=e.getNeighbors(p),y=v.ok?v.value:[];for(const b of y)a.has(b)&&m++;f.set(p,m)}const g=c.map(p=>p.length),h={pathCount:c.length,maxPathLength:g.length>0?Math.max(...g):0,minPathLength:g.length>0?Math.min(...g):0,meanPathLength:g.length>0?g.reduce((p,m)=>p+m,0)/g.length:0};return{nodes:a,edges:s,paths:c,degrees:f,stats:h}},Eu=(e,t,n={})=>{const o=new Set,r=new Set,i=[];for(const[d,l]of t){const u=ko(e,d,l,n);for(const f of u.nodes)o.add(f);for(const f of u.edges)r.add(f);i.push(...u.paths)}const a=new Map;for(const d of o){let l=0;const u=e.getNeighbors(d),f=u.ok?u.value:[];for(const g of f)o.has(g)&&l++;a.set(d,l)}const s=i.map(d=>d.length),c={pathCount:i.length,maxPathLength:s.length>0?Math.max(...s):0,minPathLength:s.length>0?Math.min(...s):0,meanPathLength:s.length>0?s.reduce((d,l)=>d+l,0)/s.length:0};return{nodes:o,edges:r,paths:i,degrees:a,stats:c}},$u=(e,t,n=3)=>{const o=new Set,r=new Set,i=new Set,a=[{node:t,depth:0}];for(i.add(t);a.length>0;){const c=a.shift();if(!c)break;const{node:d,depth:l}=c;if(o.add(d),l<n){const u=e.getNeighbors(d),f=u.ok?u.value:[];for(const g of f)if(!i.has(g)){i.add(g),a.push({node:g,depth:l+1});const[h,p]=[d,g].sort();r.add(`${h}--${p}`)}}}const s=new Map;for(const c of o){let d=0;const l=e.getNeighbors(c),u=l.ok?l.value:[];for(const f of u)o.has(f)&&d++;s.set(c,d)}return{nodes:o,edges:r,paths:[],degrees:s,stats:{pathCount:0,maxPathLength:0,minPathLength:0,meanPathLength:0}}},St=e=>{const t=new Map;for(const o of e.getAllNodes()){const r=e.getNeighbors(o.id),i=r.ok?r.value.length:0;t.set(o.id,i)}const n=Math.max(...t.values(),1);for(const[o,r]of t)t.set(o,r/n);return t},Ct=(e,t=.85,n=100,o=1e-6)=>{const r=e.getAllNodes(),i=r.length;if(i===0)return new Map;const a=new Map,s=r.map(u=>u.id);for(const u of s)a.set(u,1/i);const c=new Map,d=new Map;for(const u of e.getAllEdges()){const f=c.get(u.source)??[];f.push(u.target),c.set(u.source,f);const g=d.get(u.target)??[];g.push(u.source),d.set(u.target,g)}for(let u=0;u<n;u++){const f=new Map;let g=0;for(const h of s){const p=d.get(h)??[];let m=0;for(const b of p){const k=(c.get(b)??[]).length,w=a.get(b)??0;k>0&&(m+=w/k)}const v=(1-t)/i+t*m;f.set(h,v);const y=a.get(h)??0;g=Math.max(g,Math.abs(v-y))}for(const[h,p]of f.entries())a.set(h,p);if(g<o)break}const l=Math.max(...a.values(),1e-10);for(const[u,f]of a)a.set(u,f/l);return a},Iu=(e,t=.85,n=.5)=>{const o=St(e),r=Ct(e,t),i=new Map;for(const a of e.getAllNodes()){const s=o.get(a.id)??0,c=r.get(a.id)??0;i.set(a.id,n*s+(1-n)*c)}return{degree:o,pagerank:r,combined:i}},Pu=(e,t)=>{if(e.length===0)return 0;switch(t){case"sum":return e.reduce((n,o)=>n+o,0);case"geometric-mean":{const n=e.reduce((o,r)=>o+Math.log(r+1e-10),0);return Math.exp(n/e.length)}default:return e.reduce((n,o)=>n+o,0)/e.length}},Fe=(e,t,n)=>{const{type:o,degreeWeight:r=.5,customImportance:i,dampingFactor:a=.85,aggregation:s="mean",precomputedImportance:c}=n;let d;if(c)d=c;else switch(o){case"degree":{d=St(e);break}case"pagerank":{d=Ct(e,a);break}case"combined":{const u=St(e),f=Ct(e,a);d=new Map;for(const g of e.getAllNodes()){const h=u.get(g.id)??0,p=f.get(g.id)??0;d.set(g.id,r*h+(1-r)*p)}break}case"domain-specific":{if(!i)throw new Error("domain-specific ground truth requires customImportance function");d=new Map;for(const u of e.getAllNodes())d.set(u.id,i(u.id));break}default:throw new Error(`Unknown ground truth type: ${o}`)}const l=t.map(u=>{const f=u.nodes.map(h=>d.get(h.id)??0),g=Pu(f,s);return{path:u,score:g,nodeScores:f}});return l.sort((u,f)=>f.score-u.score),l},Du=(e,t,n=0)=>{const o=new Map;for(const r of e)o.set(r.id,r);return r=>{const i=o.get(r);if(!i)return n;const a=i[t];return typeof a=="number"?a:n}},Tu=(e,t,n)=>({degree:Fe(e,t,{type:"degree"}),pagerank:Fe(e,t,{type:"pagerank"}),combined:Fe(e,t,{type:"combined"}),"domain-specific":n?Fe(e,t,{type:"domain-specific",customImportance:n}):[]}),Ot=(e,t)=>{if(e.size===0&&t.size===0)return 0;let n=0;for(const i of e)t.has(i)&&n++;const o=e.size+t.size-n;return 1-n/o},wo=e=>new Set(e),xo=e=>{if(e.length<2)return 0;const t=e.map(wo);let n=0,o=0;for(let r=0;r<t.length;r++)for(let i=r+1;i<t.length;i++)n+=Ot(t[r],t[i]),o++;return o>0?n/o:0},Mo=e=>{if(e.length<2)return 0;const t=e.map(r=>{const i=new Set;for(let a=0;a<r.length-1;a++){const[s,c]=[r[a],r[a+1]].sort();i.add(`${s}--${c}`)}return i});let n=0,o=0;for(let r=0;r<t.length;r++)for(let i=r+1;i<t.length;i++)n+=Ot(t[r],t[i]),o++;return o>0?n/o:0},Au=e=>{if(e.length===0)return{pathCount:0,nodeJaccardDistance:0,edgeJaccardDistance:0,uniqueNodeCount:0,uniqueEdgeCount:0,meanPathLength:0,stdPathLength:0};const t=new Set,n=new Set;for(const s of e){for(const c of s)t.add(c);for(let c=0;c<s.length-1;c++){const[d,l]=[s[c],s[c+1]].sort();n.add(`${d}--${l}`)}}const o=e.map(s=>s.length),r=o.reduce((s,c)=>s+c,0)/o.length,i=o.reduce((s,c)=>s+(c-r)**2,0)/o.length,a=Math.sqrt(i);return{pathCount:e.length,nodeJaccardDistance:xo(e),edgeJaccardDistance:Mo(e),uniqueNodeCount:t.size,uniqueEdgeCount:n.size,meanPathLength:r,stdPathLength:a}},Ru=(e,t)=>{if(e.length===0)return 0;let n=0;for(const o of e)o.some(i=>t.has(i))&&n++;return n/e.length},Fu=(e,t=.1)=>{const n=[...e.entries()].sort((i,a)=>a[1]-i[1]),o=Math.max(1,Math.ceil(n.length*t)),r=new Set;for(let i=0;i<o&&i<n.length;i++)r.add(n[i][0]);return r},Ie=e=>{if(e.length===0)return new Map;const t=new Map;for(const r of e)t.set(r,(t.get(r)??0)+1);const n=e.length,o=new Map;for(const[r,i]of t)o.set(r,i/n);return o},Be=(e,t,n=1e-10)=>{const o=new Set([...e.keys(),...t.keys()]);let r=0;for(const i of o){const a=e.get(i)??0,s=t.get(i)??0,c=a+n,d=s+n;c>0&&(r+=c*Math.log(c/d))}return Math.max(0,r)},qt=(e,t)=>{const n=new Set([...e.keys(),...t.keys()]),o=new Map;for(const r of n){const i=e.get(r)??0,a=t.get(r)??0;o.set(r,.5*(i+a))}return .5*Be(e,o)+.5*Be(t,o)},So=(e,t)=>{const n=[...new Set([...e.keys(),...t.keys()])].sort((a,s)=>a-s);if(n.length===0)return 0;let o=0,r=0,i=0;for(let a=0;a<n.length;a++){const s=n[a];o+=e.get(s)??0,r+=t.get(s)??0;const c=a<n.length-1?n[a+1]-s:1;i+=Math.abs(o-r)*c}return i},ju=(e,t)=>{const n=Ie(e),o=Ie(t),r=c=>c.length>0?c.reduce((d,l)=>d+l,0)/c.length:0,i=(c,d)=>c.length>0?Math.sqrt(c.reduce((l,u)=>l+(u-d)**2,0)/c.length):0,a=r(e),s=r(t);return{klDivergence:Be(o,n),jsDivergence:qt(o,n),emd:So(o,n),sampledMeanDegree:a,groundTruthMeanDegree:s,sampledStdDegree:i(e,a),groundTruthStdDegree:i(t,s),sampledMaxDegree:e.length>0?Math.max(...e):0,groundTruthMaxDegree:t.length>0?Math.max(...t):0}},Lu=e=>Ie([...e.values()]),zu=e=>{const t=new Map,n=["1-5","6-10","11-50","51-100","101-500","501-1000","1000+"];for(const o of n)t.set(o,0);for(const o of e){let r;o<=5?r="1-5":o<=10?r="6-10":o<=50?r="11-50":o<=100?r="51-100":o<=500?r="101-500":o<=1e3?r="501-1000":r="1000+",t.set(r,(t.get(r)??0)+1)}return t},Co=(e,t)=>{if(t.size===0)return{coverage:0,precision:0,f1Score:0,intersection:0};let n=0;for(const a of e)t.has(a)&&n++;const o=n/t.size,r=e.size>0?n/e.size:0,i=r+o>0?2*r*o/(r+o):0;return{coverage:o,precision:r,f1Score:i,intersection:n}},_o=(e,t,n)=>{if(n.size<2)return 0;const o=[...n],r=o.length,i=[],a=[];for(const d of o)i.push(e.get(d)??0),a.push(t.get(d)??0);let s=0;for(let d=0;d<r;d++){const l=i[d]-a[d];s+=l*l}return 1-6*s/(r*(r*r-1))},_t=e=>{const t=[...e.entries()].sort((o,r)=>r[1]-o[1]),n=new Map;for(const[o,r]of t.entries())n.set(r[0],o+1);return n},No=(e,t)=>{if(t.length===0)return 0;let n=0;for(const o of t)[...o].some(i=>e.has(i))&&n++;return n/t.length},Bu=(e,t,n,o,r=[])=>{const i=Co(e,t),a=[...n.values()],s=[...o.values()],c=Ie(a),d=Ie(s),l=Be(d,c),u=qt(d,c),f=new Set;for(const b of e)t.has(b)&&f.add(b);const g=_t(n),h=_t(o),p=_o(g,h,f),m=No(e,r);let v=0;for(const b of e)t.has(b)||v++;let y=0;for(const b of t)e.has(b)||y++;return{coverage:i.coverage,precision:i.precision,f1Score:i.f1Score,degreeKL:l,degreeJS:u,betweennessCorrelation:p,communityCoverage:m,intersectionSize:i.intersection,falsePositives:v,falseNegatives:y}},Ou=e=>{if(e.length===0)return{coverage:0,precision:0,f1Score:0,degreeKL:0,degreeJS:0,betweennessCorrelation:0,communityCoverage:0,intersectionSize:0,falsePositives:0,falseNegatives:0};const t=e.length;return{coverage:e.reduce((n,o)=>n+o.coverage,0)/t,precision:e.reduce((n,o)=>n+o.precision,0)/t,f1Score:e.reduce((n,o)=>n+o.f1Score,0)/t,degreeKL:e.reduce((n,o)=>n+o.degreeKL,0)/t,degreeJS:e.reduce((n,o)=>n+o.degreeJS,0)/t,betweennessCorrelation:e.reduce((n,o)=>n+o.betweennessCorrelation,0)/t,communityCoverage:e.reduce((n,o)=>n+o.communityCoverage,0)/t,intersectionSize:e.reduce((n,o)=>n+o.intersectionSize,0)/t,falsePositives:e.reduce((n,o)=>n+o.falsePositives,0)/t,falseNegatives:e.reduce((n,o)=>n+o.falseNegatives,0)/t}},qu=e=>{const t=[];let n=0;for(;n<e.length;){const o=e[n];if(/\s/.test(o)){n++;continue}if(o==="#"){for(;n<e.length&&e[n]!==`
29
29
  `;)n++;continue}if(o==="["){t.push({type:"LBRACKET",value:"["}),n++;continue}if(o==="]"){t.push({type:"RBRACKET",value:"]"}),n++;continue}if(o==='"'){n++;let r="";for(;n<e.length&&e[n]!=='"';){if(e[n]==="\\"&&n+1<e.length){n++;const i=e[n];switch(i){case"n":{r+=`
30
30
  `;break}case"t":{r+=" ";break}case"\\":{r+="\\";break}case'"':{r+='"';break}default:r+=i}}else r+=e[n];n++}n++,t.push({type:"STRING",value:r});continue}if(/[-+\d.]/.test(o)){let r="";for((o==="-"||o==="+")&&(r+=o,n++);n<e.length&&/[\d.e+-]/i.test(e[n]);)r+=e[n],n++;if(/^[-+]?(?:\d+(?:\.\d+)?|\.\d+)(e[-+]?\d+)?$/i.test(r)){const i=Number.parseFloat(r);t.push({type:"NUMBER",value:i});continue}t.push({type:"KEY",value:r});continue}if(/[a-z_]/i.test(o)){let r="";for(;n<e.length&&/\w/.test(e[n]);)r+=e[n],n++;t.push({type:"KEY",value:r});continue}n++}return t},Uu=e=>{let t=0;const n=()=>{const i=e[t];if(!i)return null;if(i.type==="STRING"||i.type==="NUMBER")return t++,i.value;if(i.type==="LBRACKET"){t++;const a={};for(;t<e.length&&e[t].type!=="RBRACKET";){const s=e[t];if(s.type!=="KEY"){t++;continue}const c=s.value;t++;const d=n();c in a?(Array.isArray(a[c])||(a[c]=[a[c]]),a[c].push(d)):a[c]=d}return t++,a}return t++,null};let o;const r={graph:{},nodes:[],edges:[]};for(;t<e.length;){const i=e[t];if(i.type==="KEY"){const a=i.value;if(t++,a==="Creator"){const s=n();o=String(s)}else if(a==="graph"){const s=n();if(s){const c=s.node,d=s.edge;delete s.node,delete s.edge,r.graph=s,c&&(r.nodes=Array.isArray(c)?c:[c]),d&&(r.edges=Array.isArray(d)?d:[d])}}else n()}else t++}return o&&(r.creator=o),r},Ut=e=>{const t=qu(e);return Uu(t)},Gt=(e,t)=>{const{meta:n,nodeIdMapper:o}=t,r=e.graph.directed===1,i=new Map,s=o??((l,u)=>u.label&&typeof u.label=="string"?u.label:String(l)),c=e.nodes.map(l=>{const u=s(l.id,l);i.set(l.id,u);const f={id:u};for(const[g,h]of Object.entries(l))g!=="id"&&(g==="label"&&h===u||g!=="label"&&(f[g]=h));return f}),d=e.edges.map(l=>{const u=i.get(l.source),f=i.get(l.target);if(!u||!f)throw new Error(`Edge references unknown node: ${l.source} -> ${l.target}`);const g={source:u,target:f};for(const[h,p]of Object.entries(l))h==="source"||h==="target"||(h==="value"&&typeof p=="number"?g.value=p:h==="weight"&&typeof p=="number"?g.weight=p:g[h]=p);return g});return{meta:{...n,directed:r,creator:e.creator},nodes:c,edges:d}},Gu=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/gml/parse.ts <input.gml> [output.json]"),console.error(`
31
31
  Reads GML and outputs JSON to stdout or specified file.`),process.exit(1));const[t,n]=e,o=await import("node:fs"),r=await import("node:path"),i=o.readFileSync(t,"utf8"),a=Ut(i),s=r.basename(t,".gml"),c=r.resolve(t),d=Gt(a,{meta:{name:s,description:`Graph converted from ${r.basename(t)}`,source:c,url:c,citation:{authors:[],title:s,year:new Date().getFullYear()},retrieved:new Date().toISOString().split("T")[0]}}),l=JSON.stringify(d,null," ");n?(o.writeFileSync(n,l+`
32
32
  `),console.error(`Written to ${n}`)):console.log(l)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&Gu().catch(e=>{console.error("Error:",e),process.exit(1)});const tt=e=>e.replaceAll("\\","\\\\").replaceAll('"',String.raw`\"`).replaceAll(`
33
- `,String.raw`\n`).replaceAll(" ",String.raw`\t`),pt=e=>typeof e=="string"?`"${tt(e)}"`:typeof e=="number"?Number.isInteger(e)?String(e):e.toFixed(6):typeof e=="boolean"?e?"1":"0":`"${tt(String(e))}"`,No=(e,t={})=>{const{creator:n,indent:o=" ",useNumericIds:r=!1}=t,i=[];n?i.push(`Creator "${tt(n)}"`):e.meta.creator&&i.push(`Creator "${tt(e.meta.creator)}"`),i.push("graph","[",`${o}directed ${e.meta.directed?1:0}`);const a=new Map;if(r)for(const[s,c]of e.nodes.entries())a.set(c.id,s);for(const[s,c]of e.nodes.entries()){i.push(`${o}node`,`${o}[`);const d=s;if(i.push(`${o}${o}id ${d}`),r||c.label){const l=c.label??c.id;i.push(`${o}${o}label ${pt(l)}`)}for(const[l,u]of Object.entries(c))l==="id"||l==="label"||u!=null&&i.push(`${o}${o}${l} ${pt(u)}`);i.push(`${o}]`)}for(const s of e.edges){i.push(`${o}edge`,`${o}[`);const c=r?a.get(s.source):e.nodes.findIndex(l=>l.id===s.source),d=r?a.get(s.target):e.nodes.findIndex(l=>l.id===s.target);if(c===void 0||c===-1)throw new Error(`Unknown source node: ${s.source}`);if(d===void 0||d===-1)throw new Error(`Unknown target node: ${s.target}`);i.push(`${o}${o}source ${c}`,`${o}${o}target ${d}`);for(const[l,u]of Object.entries(s))l==="source"||l==="target"||l!=="directed"&&u!=null&&i.push(`${o}${o}${l} ${pt(u)}`);i.push(`${o}]`)}return i.push("]"),i.join(`
33
+ `,String.raw`\n`).replaceAll(" ",String.raw`\t`),mt=e=>typeof e=="string"?`"${tt(e)}"`:typeof e=="number"?Number.isInteger(e)?String(e):e.toFixed(6):typeof e=="boolean"?e?"1":"0":`"${tt(String(e))}"`,Eo=(e,t={})=>{const{creator:n,indent:o=" ",useNumericIds:r=!1}=t,i=[];n?i.push(`Creator "${tt(n)}"`):e.meta.creator&&i.push(`Creator "${tt(e.meta.creator)}"`),i.push("graph","[",`${o}directed ${e.meta.directed?1:0}`);const a=new Map;if(r)for(const[s,c]of e.nodes.entries())a.set(c.id,s);for(const[s,c]of e.nodes.entries()){i.push(`${o}node`,`${o}[`);const d=s;if(i.push(`${o}${o}id ${d}`),r||c.label){const l=c.label??c.id;i.push(`${o}${o}label ${mt(l)}`)}for(const[l,u]of Object.entries(c))l==="id"||l==="label"||u!=null&&i.push(`${o}${o}${l} ${mt(u)}`);i.push(`${o}]`)}for(const s of e.edges){i.push(`${o}edge`,`${o}[`);const c=r?a.get(s.source):e.nodes.findIndex(l=>l.id===s.source),d=r?a.get(s.target):e.nodes.findIndex(l=>l.id===s.target);if(c===void 0||c===-1)throw new Error(`Unknown source node: ${s.source}`);if(d===void 0||d===-1)throw new Error(`Unknown target node: ${s.target}`);i.push(`${o}${o}source ${c}`,`${o}${o}target ${d}`);for(const[l,u]of Object.entries(s))l==="source"||l==="target"||l!=="directed"&&u!=null&&i.push(`${o}${o}${l} ${mt(u)}`);i.push(`${o}]`)}return i.push("]"),i.join(`
34
34
  `)},Wu=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/gml/serialize.ts <input.json> [output.gml]"),console.error(`
35
- Reads JSON and outputs GML to stdout or specified file.`),process.exit(1));const[t,n]=e,o=await import("node:fs"),r=o.readFileSync(t,"utf8"),i=JSON.parse(r),a=No(i,{useNumericIds:!0});n?(o.writeFileSync(n,a+`
36
- `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&Wu().catch(e=>{console.error("Error:",e),process.exit(1)});var se=Uint8Array,Ne=Uint16Array,Vu=Int32Array,Eo=new se([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),$o=new se([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Ku=new se([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Io=function(e,t){for(var n=new Ne(31),o=0;o<31;++o)n[o]=t+=1<<e[o-1];for(var r=new Vu(n[30]),o=1;o<30;++o)for(var i=n[o];i<n[o+1];++i)r[i]=i-n[o]<<5|o;return{b:n,r}},Po=Io(Eo,2),Do=Po.b,Hu=Po.r;Do[28]=258,Hu[258]=28;var Ju=Io($o,0),Qu=Ju.b,_t=new Ne(32768);for(var V=0;V<32768;++V){var we=(V&43690)>>1|(V&21845)<<1;we=(we&52428)>>2|(we&13107)<<2,we=(we&61680)>>4|(we&3855)<<4,_t[V]=((we&65280)>>8|(we&255)<<8)>>1}var je=(function(e,t,n){for(var o=e.length,r=0,i=new Ne(t);r<o;++r)e[r]&&++i[e[r]-1];var a=new Ne(t);for(r=1;r<t;++r)a[r]=a[r-1]+i[r-1]<<1;var s;if(n){s=new Ne(1<<t);var c=15-t;for(r=0;r<o;++r)if(e[r])for(var d=r<<4|e[r],l=t-e[r],u=a[e[r]-1]++<<l,f=u|(1<<l)-1;u<=f;++u)s[_t[u]>>c]=d}else for(s=new Ne(o),r=0;r<o;++r)e[r]&&(s[r]=_t[a[e[r]-1]++]>>15-e[r]);return s}),Ve=new se(288);for(var V=0;V<144;++V)Ve[V]=8;for(var V=144;V<256;++V)Ve[V]=9;for(var V=256;V<280;++V)Ve[V]=7;for(var V=280;V<288;++V)Ve[V]=8;var To=new se(32);for(var V=0;V<32;++V)To[V]=5;var Xu=je(Ve,9,1),Yu=je(To,5,1),mt=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},ue=function(e,t,n){var o=t/8|0;return(e[o]|e[o+1]<<8)>>(t&7)&n},vt=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},Zu=function(e){return(e+7)/8|0},Wt=function(e,t,n){return(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length),new se(e.subarray(t,n))},ef=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],ie=function(e,t,n){var o=new Error(t||ef[e]);if(o.code=e,Error.captureStackTrace&&Error.captureStackTrace(o,ie),!n)throw o;return o},Ao=function(e,t,n,o){var r=e.length,i=o?o.length:0;if(!r||t.f&&!t.l)return n||new se(0);var a=!n,s=a||t.i!=2,c=t.i;a&&(n=new se(r*3));var d=function(G){var oe=n.length;if(G>oe){var De=new se(Math.max(oe*2,G));De.set(n),n=De}},l=t.f||0,u=t.p||0,f=t.b||0,g=t.l,h=t.d,p=t.m,v=t.n,m=r*8;do{if(!g){l=ue(e,u,1);var y=ue(e,u+1,3);if(u+=3,y)if(y==1)g=Xu,h=Yu,p=9,v=5;else if(y==2){var C=ue(e,u,31)+257,x=ue(e,u+10,15)+4,S=C+ue(e,u+5,31)+1;u+=14;for(var M=new se(S),I=new se(19),E=0;E<x;++E)I[Ku[E]]=ue(e,u+E*3,7);u+=x*3;for(var _=mt(I),P=(1<<_)-1,N=je(I,_,1),E=0;E<S;){var T=N[ue(e,u,P)];u+=T&15;var b=T>>4;if(b<16)M[E++]=b;else{var L=0,O=0;for(b==16?(O=3+ue(e,u,3),u+=2,L=M[E-1]):b==17?(O=3+ue(e,u,7),u+=3):b==18&&(O=11+ue(e,u,127),u+=7);O--;)M[E++]=L}}var ee=M.subarray(0,C),z=M.subarray(C);p=mt(ee),v=mt(z),g=je(ee,p,1),h=je(z,v,1)}else ie(1);else{var b=Zu(u)+4,k=e[b-4]|e[b-3]<<8,w=b+k;if(w>r){c&&ie(0);break}s&&d(f+k),n.set(e.subarray(b,w),f),t.b=f+=k,t.p=u=w*8,t.f=l;continue}if(u>m){c&&ie(0);break}}s&&d(f+131072);for(var Z=(1<<p)-1,W=(1<<v)-1,q=u;;q=u){var L=g[vt(e,u)&Z],Q=L>>4;if(u+=L&15,u>m){c&&ie(0);break}if(L||ie(2),Q<256)n[f++]=Q;else if(Q==256){q=u,g=null;break}else{var K=Q-254;if(Q>264){var E=Q-257,$=Eo[E];K=ue(e,u,(1<<$)-1)+Do[E],u+=$}var D=h[vt(e,u)&W],A=D>>4;D||ie(3),u+=D&15;var z=Qu[A];if(A>3){var $=$o[A];z+=vt(e,u)&(1<<$)-1,u+=$}if(u>m){c&&ie(0);break}s&&d(f+131072);var B=f+K;if(f<z){var j=i-z,U=Math.min(z,B);for(j+f<0&&ie(3);f<U;++f)n[f]=o[j+f]}for(;f<B;++f)n[f]=n[f-z]}}t.l=g,t.p=q,t.b=f,t.f=l,g&&(l=1,t.m=p,t.d=h,t.n=v)}while(!l);return f!=n.length&&a?Wt(n,0,f):n.subarray(0,f)},tf=new se(0),pe=function(e,t){return e[t]|e[t+1]<<8},fe=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},yt=function(e,t){return fe(e,t)+fe(e,t+4)*4294967296},nf=function(e){(e[0]!=31||e[1]!=139||e[2]!=8)&&ie(6,"invalid gzip data");var t=e[3],n=10;t&4&&(n+=(e[10]|e[11]<<8)+2);for(var o=(t>>3&1)+(t>>4&1);o>0;o-=!e[n++]);return n+(t&2)},of=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0};function rf(e,t){return Ao(e,{i:2},t&&t.out,t&&t.dictionary)}function Vt(e,t){var n=nf(e);return n+8>e.length&&ie(6,"invalid gzip data"),Ao(e.subarray(n,-8),{i:2},new se(of(e)),t)}var Nt=typeof TextDecoder<"u"&&new TextDecoder,sf=0;try{Nt.decode(tf,{stream:!0}),sf=1}catch{}var af=function(e){for(var t="",n=0;;){var o=e[n++],r=(o>127)+(o>223)+(o>239);if(n+r>e.length)return{s:t,r:Wt(e,n-1)};r?r==3?(o=((o&15)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,t+=String.fromCharCode(55296|o>>10,56320|o&1023)):r&1?t+=String.fromCharCode((o&31)<<6|e[n++]&63):t+=String.fromCharCode((o&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCharCode(o)}};function cf(e,t){if(t){for(var n="",o=0;o<e.length;o+=16384)n+=String.fromCharCode.apply(null,e.subarray(o,o+16384));return n}else{if(Nt)return Nt.decode(e);var r=af(e),i=r.s,n=r.r;return n.length&&ie(8),i}}var df=function(e,t){return t+30+pe(e,t+26)+pe(e,t+28)},lf=function(e,t,n){var o=pe(e,t+28),r=cf(e.subarray(t+46,t+46+o),!(pe(e,t+8)&2048)),i=t+46+o,a=fe(e,t+20),s=n&&a==4294967295?uf(e,i):[a,fe(e,t+24),fe(e,t+42)],c=s[0],d=s[1],l=s[2];return[pe(e,t+10),c,d,r,i+pe(e,t+30)+pe(e,t+32),l]},uf=function(e,t){for(;pe(e,t)!=1;t+=4+pe(e,t+2));return[yt(e,t+12),yt(e,t+4),yt(e,t+20)]};function Kt(e,t){for(var n={},o=e.length-22;fe(e,o)!=101010256;--o)(!o||e.length-o>65558)&&ie(13);var r=pe(e,o+8);if(!r)return{};var i=fe(e,o+16),a=i==4294967295||r==65535;if(a){var s=fe(e,o-12);a=fe(e,s)==101075792,a&&(r=fe(e,s+32),i=fe(e,s+48))}for(var c=0;c<r;++c){var d=lf(e,i,a),l=d[0],u=d[1],f=d[2],g=d[3],h=d[4],p=d[5],v=df(e,p);i=h,l?l==8?n[g]=rf(e.subarray(v,v+u),{out:new se(f)}):ie(14,"unknown compression type "+l):n[g]=Wt(e,v,v+u)}return n}const Ht=async(e,t)=>{const n=t.fetch??globalThis.fetch,o=t.extension??".gml",r=await n(e);if(!r.ok)throw new Error(`Failed to fetch ${e}: ${r.status} ${r.statusText}`);const i=await r.arrayBuffer(),a=i.byteLength,s=new Uint8Array(i),c=Kt(s),d=Object.keys(c).filter(m=>m.toLowerCase().endsWith(o.toLowerCase()));if(d.length===0){const m=Object.keys(c).join(", ");throw new Error(`No ${o} file found in archive. Files: ${m}`)}const l=d[0],u=c[l],f=u.byteLength,h=new TextDecoder("utf-8").decode(u),p=Ut(h);return{graph:Gt(p,t),filename:l,archiveSize:a,contentSize:f}},ff=async e=>Promise.all(e.map(([t,n])=>Ht(t,n))),gf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/gml/fetch.ts <url> [output.json]"),console.error(`
35
+ Reads JSON and outputs GML to stdout or specified file.`),process.exit(1));const[t,n]=e,o=await import("node:fs"),r=o.readFileSync(t,"utf8"),i=JSON.parse(r),a=Eo(i,{useNumericIds:!0});n?(o.writeFileSync(n,a+`
36
+ `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&Wu().catch(e=>{console.error("Error:",e),process.exit(1)});var se=Uint8Array,Ne=Uint16Array,Vu=Int32Array,$o=new se([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Io=new se([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Ku=new se([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Po=function(e,t){for(var n=new Ne(31),o=0;o<31;++o)n[o]=t+=1<<e[o-1];for(var r=new Vu(n[30]),o=1;o<30;++o)for(var i=n[o];i<n[o+1];++i)r[i]=i-n[o]<<5|o;return{b:n,r}},Do=Po($o,2),To=Do.b,Hu=Do.r;To[28]=258,Hu[258]=28;var Ju=Po(Io,0),Qu=Ju.b,Nt=new Ne(32768);for(var V=0;V<32768;++V){var we=(V&43690)>>1|(V&21845)<<1;we=(we&52428)>>2|(we&13107)<<2,we=(we&61680)>>4|(we&3855)<<4,Nt[V]=((we&65280)>>8|(we&255)<<8)>>1}var je=(function(e,t,n){for(var o=e.length,r=0,i=new Ne(t);r<o;++r)e[r]&&++i[e[r]-1];var a=new Ne(t);for(r=1;r<t;++r)a[r]=a[r-1]+i[r-1]<<1;var s;if(n){s=new Ne(1<<t);var c=15-t;for(r=0;r<o;++r)if(e[r])for(var d=r<<4|e[r],l=t-e[r],u=a[e[r]-1]++<<l,f=u|(1<<l)-1;u<=f;++u)s[Nt[u]>>c]=d}else for(s=new Ne(o),r=0;r<o;++r)e[r]&&(s[r]=Nt[a[e[r]-1]++]>>15-e[r]);return s}),Ve=new se(288);for(var V=0;V<144;++V)Ve[V]=8;for(var V=144;V<256;++V)Ve[V]=9;for(var V=256;V<280;++V)Ve[V]=7;for(var V=280;V<288;++V)Ve[V]=8;var Ao=new se(32);for(var V=0;V<32;++V)Ao[V]=5;var Xu=je(Ve,9,1),Yu=je(Ao,5,1),vt=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},ue=function(e,t,n){var o=t/8|0;return(e[o]|e[o+1]<<8)>>(t&7)&n},yt=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},Zu=function(e){return(e+7)/8|0},Wt=function(e,t,n){return(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length),new se(e.subarray(t,n))},ef=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],ie=function(e,t,n){var o=new Error(t||ef[e]);if(o.code=e,Error.captureStackTrace&&Error.captureStackTrace(o,ie),!n)throw o;return o},Ro=function(e,t,n,o){var r=e.length,i=o?o.length:0;if(!r||t.f&&!t.l)return n||new se(0);var a=!n,s=a||t.i!=2,c=t.i;a&&(n=new se(r*3));var d=function(G){var oe=n.length;if(G>oe){var De=new se(Math.max(oe*2,G));De.set(n),n=De}},l=t.f||0,u=t.p||0,f=t.b||0,g=t.l,h=t.d,p=t.m,m=t.n,v=r*8;do{if(!g){l=ue(e,u,1);var y=ue(e,u+1,3);if(u+=3,y)if(y==1)g=Xu,h=Yu,p=9,m=5;else if(y==2){var C=ue(e,u,31)+257,x=ue(e,u+10,15)+4,S=C+ue(e,u+5,31)+1;u+=14;for(var M=new se(S),I=new se(19),E=0;E<x;++E)I[Ku[E]]=ue(e,u+E*3,7);u+=x*3;for(var _=vt(I),P=(1<<_)-1,N=je(I,_,1),E=0;E<S;){var T=N[ue(e,u,P)];u+=T&15;var b=T>>4;if(b<16)M[E++]=b;else{var L=0,O=0;for(b==16?(O=3+ue(e,u,3),u+=2,L=M[E-1]):b==17?(O=3+ue(e,u,7),u+=3):b==18&&(O=11+ue(e,u,127),u+=7);O--;)M[E++]=L}}var te=M.subarray(0,C),z=M.subarray(C);p=vt(te),m=vt(z),g=je(te,p,1),h=je(z,m,1)}else ie(1);else{var b=Zu(u)+4,k=e[b-4]|e[b-3]<<8,w=b+k;if(w>r){c&&ie(0);break}s&&d(f+k),n.set(e.subarray(b,w),f),t.b=f+=k,t.p=u=w*8,t.f=l;continue}if(u>v){c&&ie(0);break}}s&&d(f+131072);for(var Z=(1<<p)-1,W=(1<<m)-1,q=u;;q=u){var L=g[yt(e,u)&Z],Q=L>>4;if(u+=L&15,u>v){c&&ie(0);break}if(L||ie(2),Q<256)n[f++]=Q;else if(Q==256){q=u,g=null;break}else{var K=Q-254;if(Q>264){var E=Q-257,$=$o[E];K=ue(e,u,(1<<$)-1)+To[E],u+=$}var D=h[yt(e,u)&W],A=D>>4;D||ie(3),u+=D&15;var z=Qu[A];if(A>3){var $=Io[A];z+=yt(e,u)&(1<<$)-1,u+=$}if(u>v){c&&ie(0);break}s&&d(f+131072);var B=f+K;if(f<z){var j=i-z,U=Math.min(z,B);for(j+f<0&&ie(3);f<U;++f)n[f]=o[j+f]}for(;f<B;++f)n[f]=n[f-z]}}t.l=g,t.p=q,t.b=f,t.f=l,g&&(l=1,t.m=p,t.d=h,t.n=m)}while(!l);return f!=n.length&&a?Wt(n,0,f):n.subarray(0,f)},tf=new se(0),pe=function(e,t){return e[t]|e[t+1]<<8},fe=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},bt=function(e,t){return fe(e,t)+fe(e,t+4)*4294967296},nf=function(e){(e[0]!=31||e[1]!=139||e[2]!=8)&&ie(6,"invalid gzip data");var t=e[3],n=10;t&4&&(n+=(e[10]|e[11]<<8)+2);for(var o=(t>>3&1)+(t>>4&1);o>0;o-=!e[n++]);return n+(t&2)},of=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0};function rf(e,t){return Ro(e,{i:2},t&&t.out,t&&t.dictionary)}function Vt(e,t){var n=nf(e);return n+8>e.length&&ie(6,"invalid gzip data"),Ro(e.subarray(n,-8),{i:2},new se(of(e)),t)}var Et=typeof TextDecoder<"u"&&new TextDecoder,sf=0;try{Et.decode(tf,{stream:!0}),sf=1}catch{}var af=function(e){for(var t="",n=0;;){var o=e[n++],r=(o>127)+(o>223)+(o>239);if(n+r>e.length)return{s:t,r:Wt(e,n-1)};r?r==3?(o=((o&15)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,t+=String.fromCharCode(55296|o>>10,56320|o&1023)):r&1?t+=String.fromCharCode((o&31)<<6|e[n++]&63):t+=String.fromCharCode((o&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCharCode(o)}};function cf(e,t){if(t){for(var n="",o=0;o<e.length;o+=16384)n+=String.fromCharCode.apply(null,e.subarray(o,o+16384));return n}else{if(Et)return Et.decode(e);var r=af(e),i=r.s,n=r.r;return n.length&&ie(8),i}}var df=function(e,t){return t+30+pe(e,t+26)+pe(e,t+28)},lf=function(e,t,n){var o=pe(e,t+28),r=cf(e.subarray(t+46,t+46+o),!(pe(e,t+8)&2048)),i=t+46+o,a=fe(e,t+20),s=n&&a==4294967295?uf(e,i):[a,fe(e,t+24),fe(e,t+42)],c=s[0],d=s[1],l=s[2];return[pe(e,t+10),c,d,r,i+pe(e,t+30)+pe(e,t+32),l]},uf=function(e,t){for(;pe(e,t)!=1;t+=4+pe(e,t+2));return[bt(e,t+12),bt(e,t+4),bt(e,t+20)]};function Kt(e,t){for(var n={},o=e.length-22;fe(e,o)!=101010256;--o)(!o||e.length-o>65558)&&ie(13);var r=pe(e,o+8);if(!r)return{};var i=fe(e,o+16),a=i==4294967295||r==65535;if(a){var s=fe(e,o-12);a=fe(e,s)==101075792,a&&(r=fe(e,s+32),i=fe(e,s+48))}for(var c=0;c<r;++c){var d=lf(e,i,a),l=d[0],u=d[1],f=d[2],g=d[3],h=d[4],p=d[5],m=df(e,p);i=h,l?l==8?n[g]=rf(e.subarray(m,m+u),{out:new se(f)}):ie(14,"unknown compression type "+l):n[g]=Wt(e,m,m+u)}return n}const Ht=async(e,t)=>{const n=t.fetch??globalThis.fetch,o=t.extension??".gml",r=await n(e);if(!r.ok)throw new Error(`Failed to fetch ${e}: ${r.status} ${r.statusText}`);const i=await r.arrayBuffer(),a=i.byteLength,s=new Uint8Array(i),c=Kt(s),d=Object.keys(c).filter(v=>v.toLowerCase().endsWith(o.toLowerCase()));if(d.length===0){const v=Object.keys(c).join(", ");throw new Error(`No ${o} file found in archive. Files: ${v}`)}const l=d[0],u=c[l],f=u.byteLength,h=new TextDecoder("utf-8").decode(u),p=Ut(h);return{graph:Gt(p,t),filename:l,archiveSize:a,contentSize:f}},ff=async e=>Promise.all(e.map(([t,n])=>Ht(t,n))),gf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/gml/fetch.ts <url> [output.json]"),console.error(`
37
37
  Fetches a zip archive containing GML and outputs JSON.`),console.error(`
38
38
  Example:`),console.error(" npx tsx src/formats/gml/fetch.ts https://websites.umich.edu/~mejn/netdata/karate.zip"),process.exit(1));const[t,n]=e;console.error(`Fetching ${t}...`);const r=new URL(t).pathname.split("/").pop()?.replace(/\.zip$/i,"")??"graph",i=await Ht(t,{meta:{name:r,description:`Graph fetched from ${t}`,source:t,url:t,citation:{authors:[],title:r,year:new Date().getFullYear()},retrieved:new Date().toISOString().split("T")[0]}});console.error(`Extracted: ${i.filename}`),console.error(`Archive size: ${(i.archiveSize/1024).toFixed(1)} KB`),console.error(`Content size: ${(i.contentSize/1024).toFixed(1)} KB`),console.error(`Nodes: ${i.graph.nodes.length}, Edges: ${i.graph.edges.length}`);const a=JSON.stringify(i.graph,null," ");n?((await import("node:fs")).writeFileSync(n,a+`
39
- `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&gf().catch(e=>{console.error("Error:",e),process.exit(1)});const Ro=e=>{const t=e.split(/\r?\n/);let n=0;const o=[],r=[],i=[];let a="initial";for(const s of t){const c=s.trim();if(c===""||c.startsWith("%"))continue;const d=c.toLowerCase();if(d.startsWith("*vertices")){const l=c.match(/\*vertices\s+(\d+)/i);l&&(n=Number.parseInt(l[1],10)),a="vertices";continue}if(d.startsWith("*edges")||d.startsWith("*edgeslist")){a="edges";continue}if(d.startsWith("*arcs")||d.startsWith("*arcslist")){a="arcs";continue}if(d.startsWith("*")){a="initial";continue}switch(a){case"vertices":{const l=hf(c);l&&o.push(l);break}case"edges":{const l=kn(c);l&&r.push(l);break}case"arcs":{const l=kn(c);l&&i.push(l);break}}}return{vertexCount:n,vertices:o,edges:r,arcs:i,directed:i.length>0&&r.length===0}},hf=e=>{const t=e.match(/^(\d+)(?:\s+"([^"]*)")?(?:\s+([0-9.e+-]+)\s+([0-9.e+-]+)(?:\s+([0-9.e+-]+))?)?/i);if(!t)return null;const n={id:Number.parseInt(t[1],10)};return t[2]!==void 0&&(n.label=t[2]),t[3]!==void 0&&t[4]!==void 0&&(n.x=Number.parseFloat(t[3]),n.y=Number.parseFloat(t[4]),t[5]!==void 0&&(n.z=Number.parseFloat(t[5]))),n},kn=e=>{const t=e.split(/\s+/);if(t.length<2)return null;const n=Number.parseInt(t[0],10),o=Number.parseInt(t[1],10);if(isNaN(n)||isNaN(o))return null;const r={source:n,target:o};if(t.length>=3){const i=Number.parseFloat(t[2]);isNaN(i)||(r.weight=i)}return r},Fo=(e,t)=>{const n=t.directed??e.directed,o=new Map;for(const s of e.vertices){const c={id:s.id.toString()};s.label!==void 0&&(c.label=s.label),s.x!==void 0&&s.y!==void 0&&(c.x=s.x,c.y=s.y,s.z!==void 0&&(c.z=s.z)),o.set(s.id,c)}const r=[...e.edges,...e.arcs];for(const s of r)o.has(s.source)||o.set(s.source,{id:s.source.toString()}),o.has(s.target)||o.set(s.target,{id:s.target.toString()});if(e.vertices.length===0&&e.vertexCount>0)for(let s=1;s<=e.vertexCount;s++)o.has(s)||o.set(s,{id:s.toString()});const i=[...o.values()].sort((s,c)=>Number.parseInt(s.id,10)-Number.parseInt(c.id,10)),a=r.map(s=>{const c={source:s.source.toString(),target:s.target.toString()};return s.weight!==void 0&&(c.weight=s.weight),c});return{meta:{...t.meta,directed:n},nodes:i,edges:a}},jo=async(e,t)=>{const o=await(t.fetch??globalThis.fetch)(e);if(!o.ok)throw new Error(`Failed to fetch ${e}: ${o.status} ${o.statusText}`);const r=await o.arrayBuffer(),i=r.byteLength,a=e.toLowerCase();let s,c,d;if(a.endsWith(".zip")){const f=new Uint8Array(r),g=Kt(f),h=Object.keys(g).find(m=>m.toLowerCase().endsWith(".net")&&!m.startsWith("__MACOSX"));if(!h)throw new Error("No .net file found in ZIP archive");const p=g[h];c=p.byteLength,s=new TextDecoder("utf-8").decode(p),d=h}else if(a.endsWith(".gz")){const f=new Uint8Array(r),g=Vt(f);c=g.byteLength,s=new TextDecoder("utf-8").decode(g),d=new URL(e).pathname.split("/").pop()?.replace(/\.gz$/i,"")??"network.net"}else s=new TextDecoder("utf-8").decode(r),c=r.byteLength,d=new URL(e).pathname.split("/").pop()??"network.net";const l=Ro(s);return{graph:Fo(l,{meta:t.meta,directed:t.directed}),filename:d,archiveSize:i,contentSize:c}},pf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/pajek/fetch.ts <url> [output.json]"),console.error(`
40
- Fetches a Pajek .net file and outputs JSON.`),process.exit(1));const[t,n]=e;console.error(`Fetching ${t}...`);const r=new URL(t).pathname.split("/").pop()?.replace(/\.(net|zip|gz)$/i,"")??"graph",i=await jo(t,{meta:{name:r,description:`Graph fetched from ${t}`,source:"http://vlado.fmf.uni-lj.si/pub/networks/pajek/",url:t,citation:{authors:["Vladimir Batagelj","Andrej Mrvar"],title:"Pajek - Program for Large Network Analysis",year:1998,type:"other"},retrieved:new Date().toISOString().split("T")[0]}});console.error(`Archive size: ${(i.archiveSize/1024).toFixed(1)} KB`),console.error(`Content size: ${(i.contentSize/1024).toFixed(1)} KB`),console.error(`Nodes: ${i.graph.nodes.length}, Edges: ${i.graph.edges.length}`);const a=JSON.stringify(i.graph,null," ");n?((await import("node:fs")).writeFileSync(n,a+`
39
+ `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&gf().catch(e=>{console.error("Error:",e),process.exit(1)});const Fo=e=>{const t=e.split(/\r?\n/);let n=0;const o=[],r=[],i=[];let a="initial";for(const s of t){const c=s.trim();if(c===""||c.startsWith("%"))continue;const d=c.toLowerCase();if(d.startsWith("*vertices")){const l=c.match(/\*vertices\s+(\d+)/i);l&&(n=Number.parseInt(l[1],10)),a="vertices";continue}if(d.startsWith("*edges")||d.startsWith("*edgeslist")){a="edges";continue}if(d.startsWith("*arcs")||d.startsWith("*arcslist")){a="arcs";continue}if(d.startsWith("*")){a="initial";continue}switch(a){case"vertices":{const l=hf(c);l&&o.push(l);break}case"edges":{const l=kn(c);l&&r.push(l);break}case"arcs":{const l=kn(c);l&&i.push(l);break}}}return{vertexCount:n,vertices:o,edges:r,arcs:i,directed:i.length>0&&r.length===0}},hf=e=>{const t=e.match(/^(\d+)(?:\s+"([^"]*)")?(?:\s+([0-9.e+-]+)\s+([0-9.e+-]+)(?:\s+([0-9.e+-]+))?)?/i);if(!t)return null;const n={id:Number.parseInt(t[1],10)};return t[2]!==void 0&&(n.label=t[2]),t[3]!==void 0&&t[4]!==void 0&&(n.x=Number.parseFloat(t[3]),n.y=Number.parseFloat(t[4]),t[5]!==void 0&&(n.z=Number.parseFloat(t[5]))),n},kn=e=>{const t=e.split(/\s+/);if(t.length<2)return null;const n=Number.parseInt(t[0],10),o=Number.parseInt(t[1],10);if(isNaN(n)||isNaN(o))return null;const r={source:n,target:o};if(t.length>=3){const i=Number.parseFloat(t[2]);isNaN(i)||(r.weight=i)}return r},jo=(e,t)=>{const n=t.directed??e.directed,o=new Map;for(const s of e.vertices){const c={id:s.id.toString()};s.label!==void 0&&(c.label=s.label),s.x!==void 0&&s.y!==void 0&&(c.x=s.x,c.y=s.y,s.z!==void 0&&(c.z=s.z)),o.set(s.id,c)}const r=[...e.edges,...e.arcs];for(const s of r)o.has(s.source)||o.set(s.source,{id:s.source.toString()}),o.has(s.target)||o.set(s.target,{id:s.target.toString()});if(e.vertices.length===0&&e.vertexCount>0)for(let s=1;s<=e.vertexCount;s++)o.has(s)||o.set(s,{id:s.toString()});const i=[...o.values()].sort((s,c)=>Number.parseInt(s.id,10)-Number.parseInt(c.id,10)),a=r.map(s=>{const c={source:s.source.toString(),target:s.target.toString()};return s.weight!==void 0&&(c.weight=s.weight),c});return{meta:{...t.meta,directed:n},nodes:i,edges:a}},Lo=async(e,t)=>{const o=await(t.fetch??globalThis.fetch)(e);if(!o.ok)throw new Error(`Failed to fetch ${e}: ${o.status} ${o.statusText}`);const r=await o.arrayBuffer(),i=r.byteLength,a=e.toLowerCase();let s,c,d;if(a.endsWith(".zip")){const f=new Uint8Array(r),g=Kt(f),h=Object.keys(g).find(v=>v.toLowerCase().endsWith(".net")&&!v.startsWith("__MACOSX"));if(!h)throw new Error("No .net file found in ZIP archive");const p=g[h];c=p.byteLength,s=new TextDecoder("utf-8").decode(p),d=h}else if(a.endsWith(".gz")){const f=new Uint8Array(r),g=Vt(f);c=g.byteLength,s=new TextDecoder("utf-8").decode(g),d=new URL(e).pathname.split("/").pop()?.replace(/\.gz$/i,"")??"network.net"}else s=new TextDecoder("utf-8").decode(r),c=r.byteLength,d=new URL(e).pathname.split("/").pop()??"network.net";const l=Fo(s);return{graph:jo(l,{meta:t.meta,directed:t.directed}),filename:d,archiveSize:i,contentSize:c}},pf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/pajek/fetch.ts <url> [output.json]"),console.error(`
40
+ Fetches a Pajek .net file and outputs JSON.`),process.exit(1));const[t,n]=e;console.error(`Fetching ${t}...`);const r=new URL(t).pathname.split("/").pop()?.replace(/\.(net|zip|gz)$/i,"")??"graph",i=await Lo(t,{meta:{name:r,description:`Graph fetched from ${t}`,source:"http://vlado.fmf.uni-lj.si/pub/networks/pajek/",url:t,citation:{authors:["Vladimir Batagelj","Andrej Mrvar"],title:"Pajek - Program for Large Network Analysis",year:1998,type:"other"},retrieved:new Date().toISOString().split("T")[0]}});console.error(`Archive size: ${(i.archiveSize/1024).toFixed(1)} KB`),console.error(`Content size: ${(i.contentSize/1024).toFixed(1)} KB`),console.error(`Nodes: ${i.graph.nodes.length}, Edges: ${i.graph.edges.length}`);const a=JSON.stringify(i.graph,null," ");n?((await import("node:fs")).writeFileSync(n,a+`
41
41
  `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&pf().catch(e=>{console.error("Error:",e),process.exit(1)});const Jt=e=>{const t=e.split(`
42
42
  `),n=[],o=[];let r,i,a;for(const s of t){const c=s.trim();if(c==="")continue;if(c.startsWith("#")){o.push(c);const l=c.toLowerCase(),u=l.match(/(\d+)\s*nodes?/i);u&&(r=Number.parseInt(u[1],10));const f=l.match(/(\d+)\s*edges?/i);f&&(i=Number.parseInt(f[1],10)),l.includes("directed")&&!l.includes("undirected")?a=!0:l.includes("undirected")&&(a=!1);continue}const d=c.split(/\s+/);d.length>=2&&n.push([d[0],d[1]])}return{edges:n,meta:{nodes:r,edges:i,directed:a,comments:o}}},Qt=(e,t)=>{const{meta:n}=t,o=t.directed??e.meta.directed??!1,r=new Set;for(const[s,c]of e.edges)r.add(s),r.add(c);const i=[...r].sort((s,c)=>{const d=Number.parseInt(s,10),l=Number.parseInt(c,10);return!Number.isNaN(d)&&!Number.isNaN(l)?d-l:s.localeCompare(c)}).map(s=>({id:s})),a=e.edges.map(([s,c])=>({source:s,target:c}));return{meta:{...n,directed:o},nodes:i,edges:a}},mf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/snap/parse.ts <input.txt> [output.json]"),console.error(`
43
43
  Reads SNAP edge list and outputs JSON to stdout or specified file.`),process.exit(1));const[t,n]=e,o=await import("node:fs"),r=await import("node:path"),i=o.readFileSync(t,"utf8"),a=Jt(i),s=r.basename(t).replace(/\.(txt|edges?)$/i,""),c=r.resolve(t),d=Qt(a,{meta:{name:s,description:`Graph converted from ${r.basename(t)}`,source:c,url:c,citation:{authors:[],title:s,year:new Date().getFullYear()},retrieved:new Date().toISOString().split("T")[0]}}),l=JSON.stringify(d,null," ");n?(o.writeFileSync(n,l+`
44
- `),console.error(`Written to ${n}`)):console.log(l),console.error(`Nodes: ${d.nodes.length}, Edges: ${d.edges.length}, Directed: ${d.meta.directed}`)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&mf().catch(e=>{console.error("Error:",e),process.exit(1)});const Lo=async(e,t)=>{const o=await(t.fetch??globalThis.fetch)(e);if(!o.ok)throw new Error(`Failed to fetch ${e}: ${o.status} ${o.statusText}`);const r=await o.arrayBuffer(),i=r.byteLength;let a,s;if(e.endsWith(".gz")){const l=new Uint8Array(r),u=Vt(l);s=u.byteLength,a=new TextDecoder("utf-8").decode(u)}else a=new TextDecoder("utf-8").decode(r),s=r.byteLength;const c=Jt(a);return{graph:Qt(c,{meta:t.meta,directed:t.directed}),archiveSize:i,contentSize:s}},vf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/snap/fetch.ts <url> [output.json]"),console.error(`
45
- Fetches a SNAP edge list (.txt.gz) and outputs JSON.`),process.exit(1));const[t,n]=e;console.error(`Fetching ${t}...`);const r=new URL(t).pathname.split("/").pop()?.replace(/\.(txt|edges?)(\.gz)?$/i,"")??"graph",i=await Lo(t,{meta:{name:r,description:`Graph fetched from ${t}`,source:"https://snap.stanford.edu/data/",url:t,citation:{authors:["Jure Leskovec","Andrej Krevl"],title:"SNAP Datasets: Stanford Large Network Dataset Collection",year:2014,type:"other"},retrieved:new Date().toISOString().split("T")[0]}});console.error(`Archive size: ${(i.archiveSize/1024).toFixed(1)} KB`),console.error(`Content size: ${(i.contentSize/1024).toFixed(1)} KB`),console.error(`Nodes: ${i.graph.nodes.length}, Edges: ${i.graph.edges.length}`);const a=JSON.stringify(i.graph,null," ");n?((await import("node:fs")).writeFileSync(n,a+`
46
- `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&vf().catch(e=>{console.error("Error:",e),process.exit(1)});const zo=e=>{const t=e.split(/\r?\n/);let n=0,o,r,i,a="fullmatrix",s=!0;const c=[],d=[],l=[],u=[],f=[];let g="header";const h=[];for(const p of t){const v=p.trim();if(v===""&&g==="header"||v.startsWith("!"))continue;const m=v.toLowerCase();if(m.startsWith("dl")){const y=v.match(/\bn\s*=\s*(\d+)/i);y&&(n=Number.parseInt(y[1],10));const b=v.match(/\bnm\s*=\s*(\d+)/i);b&&(o=Number.parseInt(b[1],10));const k=v.match(/\bnr\s*=\s*(\d+)/i);k&&(r=Number.parseInt(k[1],10));const w=v.match(/\bnc\s*=\s*(\d+)/i);w&&(i=Number.parseInt(w[1],10));const C=v.match(/\bformat\s*=\s*(\w+)/i);C&&(a=C[1].toLowerCase());continue}if(m.startsWith("labels:")||m==="labels"){g="labels";const y=v.slice(v.indexOf(":")+1).trim();y&&xe(y,c);continue}if(m.startsWith("row labels:")||m==="row labels"){g="rowlabels";const y=v.slice(v.indexOf(":")+1).trim();y&&xe(y,d);continue}if(m.startsWith("col labels:")||m==="col labels"||m.startsWith("column labels:")){g="collabels";const y=v.slice(v.indexOf(":")+1).trim();y&&xe(y,l);continue}if(m.startsWith("matrix labels:")||m==="matrix labels"){g="matrixlabels";const y=v.slice(v.indexOf(":")+1).trim();y&&xe(y,u);continue}if(m.startsWith("data:")||m==="data"){g="data";const y=v.slice(v.indexOf(":")+1).trim();y&&h.push(y);continue}if(m.includes("diagonal")){s=!m.includes("diagonal absent")&&!m.includes("diagonal=absent");continue}if(m.startsWith("format")){const y=v.match(/format\s*(?:[=:]\s*)?(\w+)/i);y&&(a=y[1].toLowerCase());continue}switch(g){case"labels":{xe(v,c);break}case"rowlabels":{xe(v,d);break}case"collabels":{xe(v,l);break}case"matrixlabels":{xe(v,u);break}case"data":{v!==""&&h.push(v);break}}}return yf(h,a,n,r,i,o,s,f),{n,nm:o===void 0?void 0:o,nr:r===void 0?void 0:r,nc:i===void 0?void 0:i,format:a,diagonal:s,labels:c.length>0?c:void 0,rowLabels:d.length>0?d:void 0,colLabels:l.length>0?l:void 0,matrixLabels:u.length>0?u:void 0,edges:f}},xe=(e,t)=>{const n=e.match(/"([^"]+)"/g);if(n){for(const r of n)t.push(r.slice(1,-1));return}const o=e.split(/[,\s]+/).filter(r=>r!=="");for(const r of o)t.push(r)},yf=(e,t,n,o,r,i,a,s)=>{switch(t){case"fullmatrix":{bf(e,n,o,r,i,a,s);break}case"edgelist1":{kf(e,s);break}case"edgelist2":{wf(e,s);break}case"nodelist1":{xf(e,s);break}case"nodelist2":{Mf(e,s);break}}},bf=(e,t,n,o,r,i,a)=>{const s=n??t,c=o??t,d=r??1,l=[];for(const f of e){const g=f.split(/\s+/).filter(h=>h!=="").map(Number);l.push(...g)}let u=0;for(let f=0;f<d;f++)for(let g=0;g<s;g++)for(let h=0;h<c;h++){if(!i&&g===h)continue;if(u>=l.length)break;const p=l[u++];p!==0&&a.push({source:g,target:h,weight:p,matrix:d>1?f:void 0})}},kf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(s=>s!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10)-1,i=Number.parseInt(o[1],10)-1,a=o.length>2?Number.parseFloat(o[2]):1;!isNaN(r)&&!isNaN(i)&&t.push({source:r,target:i,weight:a})}},wf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(s=>s!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10),i=Number.parseInt(o[1],10),a=o.length>2?Number.parseFloat(o[2]):1;!isNaN(r)&&!isNaN(i)&&t.push({source:r,target:i,weight:a})}},xf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(i=>i!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10)-1;if(!isNaN(r))for(let i=1;i<o.length;i++){const a=Number.parseInt(o[i],10)-1;isNaN(a)||t.push({source:r,target:a,weight:1})}}},Mf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(i=>i!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10);if(!isNaN(r))for(let i=1;i<o.length;i++){const a=Number.parseInt(o[i],10);isNaN(a)||t.push({source:r,target:a,weight:1})}}},Bo=(e,t)=>{const n=t.directed??!0,o=e.nr??e.nc??e.n,r=[];for(let a=0;a<o;a++){const s={id:a.toString()};e.labels?.[a]?s.label=e.labels[a]:e.rowLabels?.[a]&&(s.label=e.rowLabels[a]),r.push(s)}if(e.colLabels&&e.colLabels.length>0&&(!e.rowLabels||e.rowLabels.length===0))for(let a=0;a<e.colLabels.length;a++)a>=r.length?r.push({id:a.toString(),label:e.colLabels[a]}):r[a].label||(r[a].label=e.colLabels[a]);const i=e.edges.map(a=>{const s={source:a.source.toString(),target:a.target.toString()};return a.weight!==1&&(s.weight=a.weight),a.matrix!==void 0&&e.matrixLabels&&(s.relation=e.matrixLabels[a.matrix]),s});return{meta:{...t.meta,directed:n},nodes:r,edges:i}},Oo=async(e,t)=>{const o=await(t.fetch??globalThis.fetch)(e);if(!o.ok)throw new Error(`Failed to fetch ${e}: ${o.status} ${o.statusText}`);const r=await o.arrayBuffer(),i=r.byteLength,a=e.toLowerCase();let s,c,d;if(a.endsWith(".zip")){const f=new Uint8Array(r),g=Kt(f),h=Object.keys(g).find(m=>m.toLowerCase().endsWith(".dl")&&!m.startsWith("__MACOSX"));if(!h)throw new Error("No .dl file found in ZIP archive");const p=g[h];c=p.byteLength,s=new TextDecoder("utf-8").decode(p),d=h}else if(a.endsWith(".gz")){const f=new Uint8Array(r),g=Vt(f);c=g.byteLength,s=new TextDecoder("utf-8").decode(g),d=new URL(e).pathname.split("/").pop()?.replace(/\.gz$/i,"")??"network.dl"}else s=new TextDecoder("utf-8").decode(r),c=r.byteLength,d=new URL(e).pathname.split("/").pop()??"network.dl";const l=zo(s);return{graph:Bo(l,{meta:t.meta,directed:t.directed}),filename:d,archiveSize:i,contentSize:c}},Sf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/ucinet/fetch.ts <url> [output.json]"),console.error(`
47
- Fetches a UCINet .dl file and outputs JSON.`),process.exit(1));const[t,n]=e;console.error(`Fetching ${t}...`);const r=new URL(t).pathname.split("/").pop()?.replace(/\.(dl|zip|gz)$/i,"")??"graph",i=await Oo(t,{meta:{name:r,description:`Graph fetched from ${t}`,source:"https://sites.google.com/site/uaborea/datasets",url:t,citation:{authors:["Steve Borgatti","Martin Everett","Lin Freeman"],title:"UCINET for Windows: Software for Social Network Analysis",year:2002,type:"other"},retrieved:new Date().toISOString().split("T")[0]}});console.error(`Archive size: ${(i.archiveSize/1024).toFixed(1)} KB`),console.error(`Content size: ${(i.contentSize/1024).toFixed(1)} KB`),console.error(`Nodes: ${i.graph.nodes.length}, Edges: ${i.graph.edges.length}`);const a=JSON.stringify(i.graph,null," ");n?((await import("node:fs")).writeFileSync(n,a+`
48
- `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&Sf().catch(e=>{console.error("Error:",e),process.exit(1)});const Cf="graphbox-wayback/1.0",qo=3,Xt=(e,t,n=!0)=>`https://web.archive.org/web/${e}${n?"id_":""}/${t}`,nt=e=>new Promise(t=>setTimeout(t,e)),ot=e=>Math.min(5e3*Math.pow(2,e-1),6e4),_f=async(e,t={})=>{const n=t.maxRetries??qo,o=t.userAgent??Cf,r=t.raw??!0,i=async a=>{const s=`https://web.archive.org/save/${e}`;try{const c=await fetch(s,{method:"GET",headers:{"User-Agent":o},redirect:"follow"});if(c.status>=400){if(a<n){const l=ot(a);return await nt(l),i(a+1)}return null}const d=c.url.match(/\/web\/(\d{14})\//);return d?{original:e,archived:Xt(d[1],e,r)}:null}catch{if(a<n){const c=ot(a);return await nt(c),i(a+1)}return null}};return i(1)},Nf=async(e,t={})=>{const n=t.maxRetries??qo,o=t.raw??!0,r=async i=>{const a=`https://archive.org/wayback/available?url=${encodeURIComponent(e)}`;try{const s=await fetch(a);if(s.status>=400){if(i<n){const d=ot(i);return await nt(d),r(i+1)}return null}const c=await s.json();if(c.archived_snapshots?.closest?.available){const d=c.archived_snapshots.closest.timestamp??"";return{original:e,archived:Xt(d,e,o)}}return null}catch{if(i<n){const s=ot(i);return await nt(s),r(i+1)}return null}};return r(1)},Ef=async(e,t={})=>{const n=t.raw??!0,o=new URLSearchParams({url:e,output:"json",fl:"timestamp,original",collapse:"digest"});t.limit!==void 0&&o.set("limit",String(-t.limit)),t.from!==void 0&&o.set("from",t.from),t.to!==void 0&&o.set("to",t.to);const r=`https://web.archive.org/cdx/search/cdx?${o.toString()}`;try{const i=await fetch(r);if(!i.ok)return[];const a=await i.json();return a.length<=1?[]:a.slice(1).map(([s,c])=>({original:c,archived:Xt(s,c,n)})).reverse()}catch{return[]}},$f=e=>{const t=e.match(/\/web\/(\d{14})(?:id_)?\//);return t?t[1]:null},If=e=>{if(e.length!==14)return e;const t=e.slice(0,4),n=e.slice(4,6),o=e.slice(6,8),r=e.slice(8,10),i=e.slice(10,12),a=e.slice(12,14);return`${t}-${n}-${o} ${r}:${i}:${a}`},Uo=e=>{if(e.length!==14)return null;const t=Number.parseInt(e.slice(0,4),10),n=Number.parseInt(e.slice(4,6),10)-1,o=Number.parseInt(e.slice(6,8),10),r=Number.parseInt(e.slice(8,10),10),i=Number.parseInt(e.slice(10,12),10),a=Number.parseInt(e.slice(12,14),10);return new Date(Date.UTC(t,n,o,r,i,a))},Pf=e=>{const t=Uo(e);if(!t)return"unknown";const o=new Date().getTime()-t.getTime(),r=Math.floor(o/1e3),i=Math.floor(r/60),a=Math.floor(i/60),s=Math.floor(a/24),c=Math.floor(s/7),d=Math.floor(s/30),l=Math.floor(s/365);return l>0?`${l} year${l>1?"s":""} ago`:d>0?`${d} month${d>1?"s":""} ago`:c>0?`${c} week${c>1?"s":""} ago`:s>0?`${s} day${s>1?"s":""} ago`:a>0?`${a} hour${a>1?"s":""} ago`:i>0?`${i} minute${i>1?"s":""} ago`:"just now"};Object.defineProperty(exports,"loadEdgeList",{enumerable:!0,get:()=>rt.loadEdgeList});Object.defineProperty(exports,"loadGraph",{enumerable:!0,get:()=>rt.loadGraph});Object.defineProperty(exports,"loadGraphFromUrl",{enumerable:!0,get:()=>rt.loadGraphFromUrl});Object.defineProperty(exports,"loadTriples",{enumerable:!0,get:()=>rt.loadTriples});Object.defineProperty(exports,"BENCHMARK_DATASETS",{enumerable:!0,get:()=>ce.BENCHMARK_DATASETS});Object.defineProperty(exports,"CITESEER",{enumerable:!0,get:()=>ce.CITESEER});Object.defineProperty(exports,"CORA",{enumerable:!0,get:()=>ce.CORA});Object.defineProperty(exports,"DATASETS_BY_ID",{enumerable:!0,get:()=>ce.DATASETS_BY_ID});Object.defineProperty(exports,"DBLP",{enumerable:!0,get:()=>ce.DBLP});Object.defineProperty(exports,"FACEBOOK",{enumerable:!0,get:()=>ce.FACEBOOK});Object.defineProperty(exports,"KARATE",{enumerable:!0,get:()=>ce.KARATE});Object.defineProperty(exports,"LESMIS",{enumerable:!0,get:()=>ce.LESMIS});Object.defineProperty(exports,"getBenchmarkSummary",{enumerable:!0,get:()=>ce.getBenchmarkSummary});Object.defineProperty(exports,"loadAllBenchmarks",{enumerable:!0,get:()=>ce.loadAllBenchmarks});Object.defineProperty(exports,"loadBenchmark",{enumerable:!0,get:()=>ce.loadBenchmark});Object.defineProperty(exports,"loadBenchmarkById",{enumerable:!0,get:()=>ce.loadBenchmarkById});Object.defineProperty(exports,"resolveBenchmarkPath",{enumerable:!0,get:()=>ce.resolveBenchmarkPath});Object.defineProperty(exports,"validateBenchmark",{enumerable:!0,get:()=>ce.validateBenchmark});exports.BidirectionalBFS=qc;exports.DegreePrioritisedExpansion=Uc;exports.Err=R;exports.FrontierBalancedExpansion=Hc;exports.Graph=Se;exports.GraphAdapter=sl;exports.MinHeap=to;exports.None=ge;exports.Ok=F;exports.PriorityQueue=Xe;exports.RandomPriorityExpansion=Qc;exports.Some=me;exports.StandardBfsExpansion=Xc;exports.addNoisePaths=eu;exports.aggregateRepresentativenessResults=Ou;exports.allEqual=He;exports.allowsSelfLoops=pa;exports.analyzeGraphSpecConstraints=Tt;exports.axisEquals=jr;exports.axisKindIs=H;exports.benjaminiHochberg=au;exports.bfs=Oc;exports.biconnectedComponents=Rd;exports.bonferroniCorrection=su;exports.bootstrapCI=iu;exports.bootstrapDifferenceTest=mo;exports.buildAdjUndirectedBinary=ne;exports.calculateAverageConductance=Gn;exports.calculateAverageDensity=Wn;exports.calculateClusterMetrics=kt;exports.calculateCommunityModularity=od;exports.calculateConductance=dt;exports.calculateCoverageRatio=Vn;exports.calculateDensity=lt;exports.calculateModularity=At;exports.calculateModularityDelta=Ye;exports.calculateWeightedAverageConductance=nd;exports.checkArchived=Nf;exports.cliffsDelta=uu;exports.cohensD=lu;exports.compareDegreeDistributions=ju;exports.computeAllGroundTruths=Tu;exports.computeCommunityCoverage=_o;exports.computeDegreeDistribution=Ie;exports.computeDegreeHistogram=zu;exports.computeEdgeMI=Il;exports.computeEgoNetwork=$u;exports.computeGraphSpecFromGraph=qe;exports.computeGroundTruth=Fe;exports.computeHubCoverage=Ru;exports.computePathDiversityMetrics=Au;exports.computeSetOverlap=So;exports.computeStructuralRepresentativeness=Bu;exports.computeTriangleSupport=Yn;exports.connectedComponents=Yc;exports.corePeripheryDecomposition=zd;exports.countSelfLoopsBinary=It;exports.createAttributeImportance=Du;exports.createPathRanker=Al;exports.createSpec=ca;exports.dag=oa;exports.defaultComputePolicy=Pe;exports.defaultGraphSpec=Ln;exports.defaultWeightFunction=eo;exports.degreeBasedRanker=Rl;exports.degreeDistributionFromMap=Lu;exports.degreeToRanking=Ct;exports.degreesUndirectedBinary=ae;exports.describeSpec=aa;exports.detectBibliographicCoupling=ol;exports.detectCoCitations=nl;exports.detectCommunities=Cd;exports.detectCycle=Zc;exports.detectStarPatterns=tl;exports.detectTriangles=el;exports.determineOptimalMode=Jn;exports.dfs=Gc;exports.dijkstra=Cl;exports.dlToJson=Bo;exports.earthMoversDistance=Mo;exports.edgeKeyBinary=Je;exports.enumerateBetweenGraph=bo;exports.enumerateMultiSeedBetweenGraph=Eu;exports.extractEgoNetwork=Un;exports.extractInducedSubgraph=Vd;exports.extractKTruss=il;exports.extractMultiSourceEgoNetwork=Kc;exports.fetchDataset=Ht;exports.fetchDatasets=ff;exports.fetchDlDataset=Oo;exports.fetchPajekDataset=jo;exports.fetchSnapDataset=Lo;exports.filterByEdgeType=Kd;exports.filterGraph=Rt;exports.filterSubgraph=Qd;exports.findMaxCliqueSize=jc;exports.formatAge=Pf;exports.formatTimestamp=If;exports.generateCoreSpecPermutations=sa;exports.generateGraph=ea;exports.generateHTMLReport=Cu;exports.generateJSONSummary=Mu;exports.generateLatexTable=xu;exports.generateMarkdownReport=wu;exports.getAdaptiveIterationLimit=Hn;exports.getAdaptiveThreshold=Kn;exports.getAdjustedValidationExpectations=Si;exports.getBestPath=so;exports.getSnapshots=Ef;exports.glassDelta=fu;exports.gmlToJson=Gt;exports.greedyColoring=qn;exports.hasAnyDirectedEdges=Et;exports.hasAnyUndirectedEdges=$t;exports.hasGraphSpec=at;exports.hierarchicalClustering=fl;exports.hierarchicalLayout=ml;exports.holmBonferroni=cu;exports.identifyHubNodes=Fu;exports.infomap=id;exports.isAcyclic=ua;exports.isAcyclicDirectedBinary=wn;exports.isBipartite=Vr;exports.isBipartiteUndirectedBinary=Pt;exports.isChordal=ti;exports.isChordalUndirectedBinary=Le;exports.isClawFree=mi;exports.isCograph=gi;exports.isComparability=ii;exports.isComplete=Kr;exports.isCompleteBipartite=xi;exports.isConnected=fa;exports.isConnectedUndirectedBinary=Oe;exports.isCubic=vi;exports.isDAG=Wr;exports.isDense=Jr;exports.isDirected=da;exports.isEulerian=Yr;exports.isForest=Gr;exports.isGraphConnected=Xr;exports.isGraphSpecImpossible=Mi;exports.isHamiltonian=di;exports.isHeterogeneous=ga;exports.isInterval=ni;exports.isKRegular=yi;exports.isLineGraph=pi;exports.isModular=ci;exports.isMultigraph=ha;exports.isPerfect=ui;exports.isPermutation=oi;exports.isPlanar=ei;exports.isRegular=Qr;exports.isScaleFree=si;exports.isSelfComplementary=ki;exports.isSmallWorld=ai;exports.isSparse=Hr;exports.isSplit=fi;exports.isStar=Zr;exports.isStronglyRegular=bi;exports.isThreshold=hi;exports.isTraceable=li;exports.isTree=Ur;exports.isUnitDisk=ri;exports.isValidSpec=zn;exports.isVertexTransitive=wi;exports.isWeighted=la;exports.jaccardDistance=Ot;exports.jsDivergence=qt;exports.kCoreDecomposition=Wd;exports.kendallTau=co;exports.klDivergence=Be;exports.labelPropagation=hd;exports.leiden=pd;exports.makeGraphSpec=Ce;exports.meanAveragePrecision=uo;exports.meanPairwiseEdgeJaccardDistance=xo;exports.meanPairwiseJaccardDistance=wo;exports.meanReciprocalRank=fo;exports.ndcg=lo;exports.pageRankRanker=jl;exports.pairedTTest=ho;exports.pajekToJson=Fo;exports.parseDl=zo;exports.parseGml=Ut;exports.parsePajek=Ro;exports.parseSnap=Jt;exports.parseTimestamp=$f;exports.parseTimestampToDate=Uo;exports.pathFollowsTemplate=Zl;exports.pathToNodeSet=ko;exports.plantCitationPaths=Gl;exports.plantGroundTruthPaths=We;exports.plantHeterogeneousPaths=Yl;exports.precisionAtK=wt;exports.precomputeImportance=Iu;exports.precomputeMutualInformation=jt;exports.randomRanker=zl;exports.rankBiserialCorrelation=gu;exports.rankPaths=Lt;exports.recallAtK=xt;exports.runCrossValidation=hu;exports.runExperiment=yo;exports.serializeGml=No;exports.shortestPathRanker=Bl;exports.shuffle=Qn;exports.simpleDirectedGraph=na;exports.simpleUndirectedGraph=ta;exports.snapToJson=Qt;exports.spearmanCorrelation=ao;exports.spearmanRankCorrelation=Co;exports.spectralPartition=yl;exports.storeyQValues=du;exports.stronglyConnectedComponents=ed;exports.submitToArchive=_f;exports.toNodePositionMap=vl;exports.topologicalSort=td;exports.tree=ra;exports.unique=it;exports.updateCommunityDensities=rd;exports.validateAlgebraicConnectivity=lc;exports.validateArcTransitive=$c;exports.validateBipartite=gc;exports.validateCage=Ia;exports.validateCartesianProduct=tc;exports.validateChordal=yc;exports.validateCircumference=Qa;exports.validateClawFree=vc;exports.validateCograph=mc;exports.validateComparability=wc;exports.validateConnectivity=Ca;exports.validateCycles=Sa;exports.validateDensityAndCompleteness=fc;exports.validateDiameter=Ka;exports.validateDirectionality=xa;exports.validateDominationNumber=La;exports.validateEdgeMultiplicity=Na;exports.validateEdgeTransitive=Ec;exports.validateEulerian=Pc;exports.validateFlowNetwork=Bc;exports.validateGirth=Ja;exports.validateHamiltonian=Wa;exports.validateHereditaryClass=Ra;exports.validateIndependenceNumber=Fa;exports.validateIntegrity=cc;exports.validateInterval=bc;exports.validateKColorable=Lc;exports.validateKEdgeConnected=Tc;exports.validateKVertexConnected=Dc;exports.validateLexicographicProduct=rc;exports.validateLine=Mc;exports.validateMinorFree=Ba;exports.validateModular=Ga;exports.validateMooreGraph=Pa;exports.validatePerfect=xc;exports.validatePermutation=kc;exports.validatePlanar=Aa;exports.validateRadius=Ha;exports.validateRamanujan=Da;exports.validateRegularGraph=Ic;exports.validateScaleFree=qa;exports.validateSchema=_a;exports.validateSelfComplementary=Sc;exports.validateSelfLoops=Ea;exports.validateSmallWorld=Ua;exports.validateSpectralRadius=uc;exports.validateSpectrum=dc;exports.validateSplit=pc;exports.validateStrongProduct=oc;exports.validateStronglyRegular=_c;exports.validateTensorProduct=nc;exports.validateThreshold=Cc;exports.validateTopologicalMinorFree=Oa;exports.validateToughness=ac;exports.validateTournament=hc;exports.validateTraceable=Va;exports.validateTreewidth=Ac;exports.validateUnitDisk=Ta;exports.validateVertexCover=ja;exports.validateVertexTransitive=Nc;exports.validateWeighting=Ma;exports.weightBasedRanker=Ol;exports.weightedDirectedNetwork=ia;exports.wilcoxonSignedRank=po;
44
+ `),console.error(`Written to ${n}`)):console.log(l),console.error(`Nodes: ${d.nodes.length}, Edges: ${d.edges.length}, Directed: ${d.meta.directed}`)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&mf().catch(e=>{console.error("Error:",e),process.exit(1)});const zo=async(e,t)=>{const o=await(t.fetch??globalThis.fetch)(e);if(!o.ok)throw new Error(`Failed to fetch ${e}: ${o.status} ${o.statusText}`);const r=await o.arrayBuffer(),i=r.byteLength;let a,s;if(e.endsWith(".gz")){const l=new Uint8Array(r),u=Vt(l);s=u.byteLength,a=new TextDecoder("utf-8").decode(u)}else a=new TextDecoder("utf-8").decode(r),s=r.byteLength;const c=Jt(a);return{graph:Qt(c,{meta:t.meta,directed:t.directed}),archiveSize:i,contentSize:s}},vf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/snap/fetch.ts <url> [output.json]"),console.error(`
45
+ Fetches a SNAP edge list (.txt.gz) and outputs JSON.`),process.exit(1));const[t,n]=e;console.error(`Fetching ${t}...`);const r=new URL(t).pathname.split("/").pop()?.replace(/\.(txt|edges?)(\.gz)?$/i,"")??"graph",i=await zo(t,{meta:{name:r,description:`Graph fetched from ${t}`,source:"https://snap.stanford.edu/data/",url:t,citation:{authors:["Jure Leskovec","Andrej Krevl"],title:"SNAP Datasets: Stanford Large Network Dataset Collection",year:2014,type:"other"},retrieved:new Date().toISOString().split("T")[0]}});console.error(`Archive size: ${(i.archiveSize/1024).toFixed(1)} KB`),console.error(`Content size: ${(i.contentSize/1024).toFixed(1)} KB`),console.error(`Nodes: ${i.graph.nodes.length}, Edges: ${i.graph.edges.length}`);const a=JSON.stringify(i.graph,null," ");n?((await import("node:fs")).writeFileSync(n,a+`
46
+ `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&vf().catch(e=>{console.error("Error:",e),process.exit(1)});const Bo=e=>{const t=e.split(/\r?\n/);let n=0,o,r,i,a="fullmatrix",s=!0;const c=[],d=[],l=[],u=[],f=[];let g="header";const h=[];for(const p of t){const m=p.trim();if(m===""&&g==="header"||m.startsWith("!"))continue;const v=m.toLowerCase();if(v.startsWith("dl")){const y=m.match(/\bn\s*=\s*(\d+)/i);y&&(n=Number.parseInt(y[1],10));const b=m.match(/\bnm\s*=\s*(\d+)/i);b&&(o=Number.parseInt(b[1],10));const k=m.match(/\bnr\s*=\s*(\d+)/i);k&&(r=Number.parseInt(k[1],10));const w=m.match(/\bnc\s*=\s*(\d+)/i);w&&(i=Number.parseInt(w[1],10));const C=m.match(/\bformat\s*=\s*(\w+)/i);C&&(a=C[1].toLowerCase());continue}if(v.startsWith("labels:")||v==="labels"){g="labels";const y=m.slice(m.indexOf(":")+1).trim();y&&xe(y,c);continue}if(v.startsWith("row labels:")||v==="row labels"){g="rowlabels";const y=m.slice(m.indexOf(":")+1).trim();y&&xe(y,d);continue}if(v.startsWith("col labels:")||v==="col labels"||v.startsWith("column labels:")){g="collabels";const y=m.slice(m.indexOf(":")+1).trim();y&&xe(y,l);continue}if(v.startsWith("matrix labels:")||v==="matrix labels"){g="matrixlabels";const y=m.slice(m.indexOf(":")+1).trim();y&&xe(y,u);continue}if(v.startsWith("data:")||v==="data"){g="data";const y=m.slice(m.indexOf(":")+1).trim();y&&h.push(y);continue}if(v.includes("diagonal")){s=!v.includes("diagonal absent")&&!v.includes("diagonal=absent");continue}if(v.startsWith("format")){const y=m.match(/format\s*(?:[=:]\s*)?(\w+)/i);y&&(a=y[1].toLowerCase());continue}switch(g){case"labels":{xe(m,c);break}case"rowlabels":{xe(m,d);break}case"collabels":{xe(m,l);break}case"matrixlabels":{xe(m,u);break}case"data":{m!==""&&h.push(m);break}}}return yf(h,a,n,r,i,o,s,f),{n,nm:o===void 0?void 0:o,nr:r===void 0?void 0:r,nc:i===void 0?void 0:i,format:a,diagonal:s,labels:c.length>0?c:void 0,rowLabels:d.length>0?d:void 0,colLabels:l.length>0?l:void 0,matrixLabels:u.length>0?u:void 0,edges:f}},xe=(e,t)=>{const n=e.match(/"([^"]+)"/g);if(n){for(const r of n)t.push(r.slice(1,-1));return}const o=e.split(/[,\s]+/).filter(r=>r!=="");for(const r of o)t.push(r)},yf=(e,t,n,o,r,i,a,s)=>{switch(t){case"fullmatrix":{bf(e,n,o,r,i,a,s);break}case"edgelist1":{kf(e,s);break}case"edgelist2":{wf(e,s);break}case"nodelist1":{xf(e,s);break}case"nodelist2":{Mf(e,s);break}}},bf=(e,t,n,o,r,i,a)=>{const s=n??t,c=o??t,d=r??1,l=[];for(const f of e){const g=f.split(/\s+/).filter(h=>h!=="").map(Number);l.push(...g)}let u=0;for(let f=0;f<d;f++)for(let g=0;g<s;g++)for(let h=0;h<c;h++){if(!i&&g===h)continue;if(u>=l.length)break;const p=l[u++];p!==0&&a.push({source:g,target:h,weight:p,matrix:d>1?f:void 0})}},kf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(s=>s!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10)-1,i=Number.parseInt(o[1],10)-1,a=o.length>2?Number.parseFloat(o[2]):1;!isNaN(r)&&!isNaN(i)&&t.push({source:r,target:i,weight:a})}},wf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(s=>s!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10),i=Number.parseInt(o[1],10),a=o.length>2?Number.parseFloat(o[2]):1;!isNaN(r)&&!isNaN(i)&&t.push({source:r,target:i,weight:a})}},xf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(i=>i!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10)-1;if(!isNaN(r))for(let i=1;i<o.length;i++){const a=Number.parseInt(o[i],10)-1;isNaN(a)||t.push({source:r,target:a,weight:1})}}},Mf=(e,t)=>{for(const n of e){const o=n.split(/\s+/).filter(i=>i!=="");if(o.length<2)continue;const r=Number.parseInt(o[0],10);if(!isNaN(r))for(let i=1;i<o.length;i++){const a=Number.parseInt(o[i],10);isNaN(a)||t.push({source:r,target:a,weight:1})}}},Oo=(e,t)=>{const n=t.directed??!0,o=e.nr??e.nc??e.n,r=[];for(let a=0;a<o;a++){const s={id:a.toString()};e.labels?.[a]?s.label=e.labels[a]:e.rowLabels?.[a]&&(s.label=e.rowLabels[a]),r.push(s)}if(e.colLabels&&e.colLabels.length>0&&(!e.rowLabels||e.rowLabels.length===0))for(let a=0;a<e.colLabels.length;a++)a>=r.length?r.push({id:a.toString(),label:e.colLabels[a]}):r[a].label||(r[a].label=e.colLabels[a]);const i=e.edges.map(a=>{const s={source:a.source.toString(),target:a.target.toString()};return a.weight!==1&&(s.weight=a.weight),a.matrix!==void 0&&e.matrixLabels&&(s.relation=e.matrixLabels[a.matrix]),s});return{meta:{...t.meta,directed:n},nodes:r,edges:i}},qo=async(e,t)=>{const o=await(t.fetch??globalThis.fetch)(e);if(!o.ok)throw new Error(`Failed to fetch ${e}: ${o.status} ${o.statusText}`);const r=await o.arrayBuffer(),i=r.byteLength,a=e.toLowerCase();let s,c,d;if(a.endsWith(".zip")){const f=new Uint8Array(r),g=Kt(f),h=Object.keys(g).find(v=>v.toLowerCase().endsWith(".dl")&&!v.startsWith("__MACOSX"));if(!h)throw new Error("No .dl file found in ZIP archive");const p=g[h];c=p.byteLength,s=new TextDecoder("utf-8").decode(p),d=h}else if(a.endsWith(".gz")){const f=new Uint8Array(r),g=Vt(f);c=g.byteLength,s=new TextDecoder("utf-8").decode(g),d=new URL(e).pathname.split("/").pop()?.replace(/\.gz$/i,"")??"network.dl"}else s=new TextDecoder("utf-8").decode(r),c=r.byteLength,d=new URL(e).pathname.split("/").pop()??"network.dl";const l=Bo(s);return{graph:Oo(l,{meta:t.meta,directed:t.directed}),filename:d,archiveSize:i,contentSize:c}},Sf=async()=>{const e=process.argv.slice(2);e.length===0&&(console.error("Usage: npx tsx src/formats/ucinet/fetch.ts <url> [output.json]"),console.error(`
47
+ Fetches a UCINet .dl file and outputs JSON.`),process.exit(1));const[t,n]=e;console.error(`Fetching ${t}...`);const r=new URL(t).pathname.split("/").pop()?.replace(/\.(dl|zip|gz)$/i,"")??"graph",i=await qo(t,{meta:{name:r,description:`Graph fetched from ${t}`,source:"https://sites.google.com/site/uaborea/datasets",url:t,citation:{authors:["Steve Borgatti","Martin Everett","Lin Freeman"],title:"UCINET for Windows: Software for Social Network Analysis",year:2002,type:"other"},retrieved:new Date().toISOString().split("T")[0]}});console.error(`Archive size: ${(i.archiveSize/1024).toFixed(1)} KB`),console.error(`Content size: ${(i.contentSize/1024).toFixed(1)} KB`),console.error(`Nodes: ${i.graph.nodes.length}, Edges: ${i.graph.edges.length}`);const a=JSON.stringify(i.graph,null," ");n?((await import("node:fs")).writeFileSync(n,a+`
48
+ `),console.error(`Written to ${n}`)):console.log(a)};(typeof document>"u"?require("url").pathToFileURL(__filename).href:J&&J.tagName.toUpperCase()==="SCRIPT"&&J.src||new URL("index.cjs",document.baseURI).href)===`file://${process.argv[1]}`&&Sf().catch(e=>{console.error("Error:",e),process.exit(1)});const Cf="graphbox-wayback/1.0",Uo=3,Xt=(e,t,n=!0)=>`https://web.archive.org/web/${e}${n?"id_":""}/${t}`,nt=e=>new Promise(t=>setTimeout(t,e)),ot=e=>Math.min(5e3*Math.pow(2,e-1),6e4),_f=async(e,t={})=>{const n=t.maxRetries??Uo,o=t.userAgent??Cf,r=t.raw??!0,i=async a=>{const s=`https://web.archive.org/save/${e}`;try{const c=await fetch(s,{method:"GET",headers:{"User-Agent":o},redirect:"follow"});if(c.status>=400){if(a<n){const l=ot(a);return await nt(l),i(a+1)}return null}const d=c.url.match(/\/web\/(\d{14})\//);return d?{original:e,archived:Xt(d[1],e,r)}:null}catch{if(a<n){const c=ot(a);return await nt(c),i(a+1)}return null}};return i(1)},Nf=async(e,t={})=>{const n=t.maxRetries??Uo,o=t.raw??!0,r=async i=>{const a=`https://archive.org/wayback/available?url=${encodeURIComponent(e)}`;try{const s=await fetch(a);if(s.status>=400){if(i<n){const d=ot(i);return await nt(d),r(i+1)}return null}const c=await s.json();if(c.archived_snapshots?.closest?.available){const d=c.archived_snapshots.closest.timestamp??"";return{original:e,archived:Xt(d,e,o)}}return null}catch{if(i<n){const s=ot(i);return await nt(s),r(i+1)}return null}};return r(1)},Ef=async(e,t={})=>{const n=t.raw??!0,o=new URLSearchParams({url:e,output:"json",fl:"timestamp,original",collapse:"digest"});t.limit!==void 0&&o.set("limit",String(-t.limit)),t.from!==void 0&&o.set("from",t.from),t.to!==void 0&&o.set("to",t.to);const r=`https://web.archive.org/cdx/search/cdx?${o.toString()}`;try{const i=await fetch(r);if(!i.ok)return[];const a=await i.json();return a.length<=1?[]:a.slice(1).map(([s,c])=>({original:c,archived:Xt(s,c,n)})).reverse()}catch{return[]}},$f=e=>{const t=e.match(/\/web\/(\d{14})(?:id_)?\//);return t?t[1]:null},If=e=>{if(e.length!==14)return e;const t=e.slice(0,4),n=e.slice(4,6),o=e.slice(6,8),r=e.slice(8,10),i=e.slice(10,12),a=e.slice(12,14);return`${t}-${n}-${o} ${r}:${i}:${a}`},Go=e=>{if(e.length!==14)return null;const t=Number.parseInt(e.slice(0,4),10),n=Number.parseInt(e.slice(4,6),10)-1,o=Number.parseInt(e.slice(6,8),10),r=Number.parseInt(e.slice(8,10),10),i=Number.parseInt(e.slice(10,12),10),a=Number.parseInt(e.slice(12,14),10);return new Date(Date.UTC(t,n,o,r,i,a))},Pf=e=>{const t=Go(e);if(!t)return"unknown";const o=new Date().getTime()-t.getTime(),r=Math.floor(o/1e3),i=Math.floor(r/60),a=Math.floor(i/60),s=Math.floor(a/24),c=Math.floor(s/7),d=Math.floor(s/30),l=Math.floor(s/365);return l>0?`${l} year${l>1?"s":""} ago`:d>0?`${d} month${d>1?"s":""} ago`:c>0?`${c} week${c>1?"s":""} ago`:s>0?`${s} day${s>1?"s":""} ago`:a>0?`${a} hour${a>1?"s":""} ago`:i>0?`${i} minute${i>1?"s":""} ago`:"just now"};Object.defineProperty(exports,"loadEdgeList",{enumerable:!0,get:()=>rt.loadEdgeList});Object.defineProperty(exports,"loadGraph",{enumerable:!0,get:()=>rt.loadGraph});Object.defineProperty(exports,"loadGraphFromUrl",{enumerable:!0,get:()=>rt.loadGraphFromUrl});Object.defineProperty(exports,"loadTriples",{enumerable:!0,get:()=>rt.loadTriples});Object.defineProperty(exports,"BENCHMARK_DATASETS",{enumerable:!0,get:()=>ce.BENCHMARK_DATASETS});Object.defineProperty(exports,"CITESEER",{enumerable:!0,get:()=>ce.CITESEER});Object.defineProperty(exports,"CORA",{enumerable:!0,get:()=>ce.CORA});Object.defineProperty(exports,"DATASETS_BY_ID",{enumerable:!0,get:()=>ce.DATASETS_BY_ID});Object.defineProperty(exports,"DBLP",{enumerable:!0,get:()=>ce.DBLP});Object.defineProperty(exports,"FACEBOOK",{enumerable:!0,get:()=>ce.FACEBOOK});Object.defineProperty(exports,"KARATE",{enumerable:!0,get:()=>ce.KARATE});Object.defineProperty(exports,"LESMIS",{enumerable:!0,get:()=>ce.LESMIS});Object.defineProperty(exports,"getBenchmarkSummary",{enumerable:!0,get:()=>ce.getBenchmarkSummary});Object.defineProperty(exports,"loadAllBenchmarks",{enumerable:!0,get:()=>ce.loadAllBenchmarks});Object.defineProperty(exports,"loadBenchmark",{enumerable:!0,get:()=>ce.loadBenchmark});Object.defineProperty(exports,"loadBenchmarkById",{enumerable:!0,get:()=>ce.loadBenchmarkById});Object.defineProperty(exports,"resolveBenchmarkPath",{enumerable:!0,get:()=>ce.resolveBenchmarkPath});Object.defineProperty(exports,"validateBenchmark",{enumerable:!0,get:()=>ce.validateBenchmark});exports.BidirectionalBFS=qc;exports.DegreePrioritisedExpansion=Uc;exports.Err=R;exports.FrontierBalancedExpansion=Hc;exports.Graph=Se;exports.GraphAdapter=sl;exports.MinHeap=no;exports.None=ge;exports.Ok=F;exports.PriorityQueue=Xe;exports.RandomPriorityExpansion=Qc;exports.Some=me;exports.StandardBfsExpansion=Xc;exports.addNoisePaths=eu;exports.aggregateRepresentativenessResults=Ou;exports.allEqual=He;exports.allowsSelfLoops=pa;exports.analyzeGraphSpecConstraints=Tt;exports.axisEquals=Lr;exports.axisKindIs=H;exports.benjaminiHochberg=au;exports.bfs=Oc;exports.biconnectedComponents=Rd;exports.bonferroniCorrection=su;exports.bootstrapCI=iu;exports.bootstrapDifferenceTest=vo;exports.buildAdjUndirectedBinary=ee;exports.calculateAverageConductance=Wn;exports.calculateAverageDensity=Vn;exports.calculateClusterMetrics=wt;exports.calculateCommunityModularity=od;exports.calculateConductance=lt;exports.calculateCoverageRatio=Kn;exports.calculateDensity=ut;exports.calculateModularity=At;exports.calculateModularityDelta=Ye;exports.calculateWeightedAverageConductance=nd;exports.checkArchived=Nf;exports.cliffsDelta=uu;exports.cohensD=lu;exports.compareDegreeDistributions=ju;exports.computeAllGroundTruths=Tu;exports.computeCommunityCoverage=No;exports.computeDegreeDistribution=Ie;exports.computeDegreeHistogram=zu;exports.computeEdgeMI=Il;exports.computeEgoNetwork=$u;exports.computeGraphSpecFromGraph=qe;exports.computeGroundTruth=Fe;exports.computeHubCoverage=Ru;exports.computePathDiversityMetrics=Au;exports.computeSetOverlap=Co;exports.computeStructuralRepresentativeness=Bu;exports.computeTriangleSupport=Zn;exports.connectedComponents=Yc;exports.corePeripheryDecomposition=zd;exports.countSelfLoopsBinary=Pt;exports.createAttributeImportance=Du;exports.createPathRanker=Al;exports.createSpec=ca;exports.dag=oa;exports.defaultComputePolicy=Pe;exports.defaultGraphSpec=zn;exports.defaultWeightFunction=to;exports.degreeBasedRanker=Rl;exports.degreeDistributionFromMap=Lu;exports.degreeToRanking=_t;exports.degreesUndirectedBinary=ae;exports.describeSpec=aa;exports.detectBibliographicCoupling=ol;exports.detectCoCitations=nl;exports.detectCommunities=Cd;exports.detectCycle=Zc;exports.detectStarPatterns=tl;exports.detectTriangles=el;exports.determineOptimalMode=Qn;exports.dfs=Gc;exports.dijkstra=Cl;exports.dlToJson=Oo;exports.earthMoversDistance=So;exports.edgeKeyBinary=Je;exports.enumerateBetweenGraph=ko;exports.enumerateMultiSeedBetweenGraph=Eu;exports.extractEgoNetwork=Gn;exports.extractInducedSubgraph=Vd;exports.extractKTruss=il;exports.extractMultiSourceEgoNetwork=Kc;exports.fetchDataset=Ht;exports.fetchDatasets=ff;exports.fetchDlDataset=qo;exports.fetchPajekDataset=Lo;exports.fetchSnapDataset=zo;exports.filterByEdgeType=Kd;exports.filterGraph=Rt;exports.filterSubgraph=Qd;exports.findMaxCliqueSize=jc;exports.formatAge=Pf;exports.formatTimestamp=If;exports.generateCoreSpecPermutations=sa;exports.generateGraph=ea;exports.generateHTMLReport=Cu;exports.generateJSONSummary=Mu;exports.generateLatexTable=xu;exports.generateMarkdownReport=wu;exports.getAdaptiveIterationLimit=Jn;exports.getAdaptiveThreshold=Hn;exports.getAdjustedValidationExpectations=Si;exports.getBestPath=ao;exports.getSnapshots=Ef;exports.glassDelta=fu;exports.gmlToJson=Gt;exports.greedyColoring=Un;exports.hasAnyDirectedEdges=$t;exports.hasAnyUndirectedEdges=It;exports.hasGraphSpec=ct;exports.hierarchicalClustering=fl;exports.hierarchicalLayout=ml;exports.holmBonferroni=cu;exports.identifyHubNodes=Fu;exports.infomap=id;exports.isAcyclic=ua;exports.isAcyclicDirectedBinary=wn;exports.isBipartite=Vr;exports.isBipartiteUndirectedBinary=st;exports.isChordal=ti;exports.isChordalUndirectedBinary=Le;exports.isClawFree=mi;exports.isCograph=gi;exports.isComparability=ii;exports.isComplete=Kr;exports.isCompleteBipartite=xi;exports.isConnected=fa;exports.isConnectedUndirectedBinary=Oe;exports.isCubic=vi;exports.isDAG=Wr;exports.isDense=Jr;exports.isDirected=da;exports.isEulerian=Yr;exports.isForest=Gr;exports.isGraphConnected=Xr;exports.isGraphSpecImpossible=Mi;exports.isHamiltonian=di;exports.isHeterogeneous=ga;exports.isInterval=ni;exports.isKRegular=yi;exports.isLineGraph=pi;exports.isModular=ci;exports.isMultigraph=ha;exports.isPerfect=ui;exports.isPermutation=oi;exports.isPlanar=ei;exports.isRegular=Qr;exports.isScaleFree=si;exports.isSelfComplementary=ki;exports.isSmallWorld=ai;exports.isSparse=Hr;exports.isSplit=fi;exports.isStar=Zr;exports.isStronglyRegular=bi;exports.isThreshold=hi;exports.isTraceable=li;exports.isTree=Ur;exports.isUnitDisk=ri;exports.isValidSpec=Bn;exports.isVertexTransitive=wi;exports.isWeighted=la;exports.jaccardDistance=Ot;exports.jsDivergence=qt;exports.kCoreDecomposition=Wd;exports.kendallTau=lo;exports.klDivergence=Be;exports.labelPropagation=hd;exports.leiden=pd;exports.makeGraphSpec=Ce;exports.meanAveragePrecision=fo;exports.meanPairwiseEdgeJaccardDistance=Mo;exports.meanPairwiseJaccardDistance=xo;exports.meanReciprocalRank=go;exports.ndcg=uo;exports.pageRankRanker=jl;exports.pairedTTest=po;exports.pajekToJson=jo;exports.parseDl=Bo;exports.parseGml=Ut;exports.parsePajek=Fo;exports.parseSnap=Jt;exports.parseTimestamp=$f;exports.parseTimestampToDate=Go;exports.pathFollowsTemplate=Zl;exports.pathToNodeSet=wo;exports.plantCitationPaths=Gl;exports.plantGroundTruthPaths=We;exports.plantHeterogeneousPaths=Yl;exports.precisionAtK=xt;exports.precomputeImportance=Iu;exports.precomputeMutualInformation=jt;exports.randomRanker=zl;exports.rankBiserialCorrelation=gu;exports.rankPaths=Lt;exports.recallAtK=Mt;exports.runCrossValidation=hu;exports.runExperiment=bo;exports.serializeGml=Eo;exports.shortestPathRanker=Bl;exports.shuffle=Xn;exports.simpleDirectedGraph=na;exports.simpleUndirectedGraph=ta;exports.snapToJson=Qt;exports.spearmanCorrelation=co;exports.spearmanRankCorrelation=_o;exports.spectralPartition=yl;exports.storeyQValues=du;exports.stronglyConnectedComponents=ed;exports.submitToArchive=_f;exports.toNodePositionMap=vl;exports.topologicalSort=td;exports.tree=ra;exports.unique=it;exports.updateCommunityDensities=rd;exports.validateAlgebraicConnectivity=lc;exports.validateArcTransitive=$c;exports.validateBipartite=gc;exports.validateCage=Ia;exports.validateCartesianProduct=tc;exports.validateChordal=yc;exports.validateCircumference=Qa;exports.validateClawFree=vc;exports.validateCograph=mc;exports.validateComparability=wc;exports.validateConnectivity=Ca;exports.validateCycles=Sa;exports.validateDensityAndCompleteness=fc;exports.validateDiameter=Ka;exports.validateDirectionality=xa;exports.validateDominationNumber=La;exports.validateEdgeMultiplicity=Na;exports.validateEdgeTransitive=Ec;exports.validateEulerian=Pc;exports.validateFlowNetwork=Bc;exports.validateGirth=Ja;exports.validateHamiltonian=Wa;exports.validateHereditaryClass=Ra;exports.validateIndependenceNumber=Fa;exports.validateIntegrity=cc;exports.validateInterval=bc;exports.validateKColorable=Lc;exports.validateKEdgeConnected=Tc;exports.validateKVertexConnected=Dc;exports.validateLexicographicProduct=rc;exports.validateLine=Mc;exports.validateMinorFree=Ba;exports.validateModular=Ga;exports.validateMooreGraph=Pa;exports.validatePerfect=xc;exports.validatePermutation=kc;exports.validatePlanar=Aa;exports.validateRadius=Ha;exports.validateRamanujan=Da;exports.validateRegularGraph=Ic;exports.validateScaleFree=qa;exports.validateSchema=_a;exports.validateSelfComplementary=Sc;exports.validateSelfLoops=Ea;exports.validateSmallWorld=Ua;exports.validateSpectralRadius=uc;exports.validateSpectrum=dc;exports.validateSplit=pc;exports.validateStrongProduct=oc;exports.validateStronglyRegular=_c;exports.validateTensorProduct=nc;exports.validateThreshold=Cc;exports.validateTopologicalMinorFree=Oa;exports.validateToughness=ac;exports.validateTournament=hc;exports.validateTraceable=Va;exports.validateTreewidth=Ac;exports.validateUnitDisk=Ta;exports.validateVertexCover=ja;exports.validateVertexTransitive=Nc;exports.validateWeighting=Ma;exports.weightBasedRanker=Ol;exports.weightedDirectedNetwork=ia;exports.wilcoxonSignedRank=mo;