okstra 0.130.3 → 0.131.0

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 (367) hide show
  1. package/README.md +0 -1
  2. package/docs/architecture.md +2 -2
  3. package/docs/cli.md +1 -1
  4. package/docs/for-ai/README.md +0 -2
  5. package/docs/for-ai/skills/okstra-run.md +13 -2
  6. package/docs/for-ai/skills/okstra-setup.md +4 -1
  7. package/docs/project-structure-overview.md +5 -4
  8. package/docs/task-process/implementation-planning.md +13 -0
  9. package/docs/task-process/implementation.md +17 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +7 -0
  13. package/runtime/bin/lib/okstra/usage.sh +4 -4
  14. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  15. package/runtime/prompts/lead/plan-body-verification.md +26 -5
  16. package/runtime/prompts/lead/report-writer.md +6 -2
  17. package/runtime/prompts/profiles/_common-contract.md +2 -1
  18. package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
  19. package/runtime/prompts/profiles/_implementation-executor.md +2 -2
  20. package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
  21. package/runtime/prompts/profiles/final-verification.md +21 -6
  22. package/runtime/prompts/profiles/implementation-planning.md +21 -4
  23. package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
  24. package/runtime/python/okstra_ctl/conformance.py +49 -11
  25. package/runtime/python/okstra_ctl/report_finalize.py +52 -1
  26. package/runtime/python/okstra_ctl/report_views.py +32 -5
  27. package/runtime/python/okstra_ctl/run.py +15 -3
  28. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  29. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  30. package/runtime/python/okstra_vendor/__init__.py +0 -44
  31. package/runtime/schemas/final-report-v1.0.schema.json +101 -6
  32. package/runtime/skills/okstra-run/SKILL.md +11 -4
  33. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  34. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  35. package/runtime/templates/reports/final-report.template.md +18 -12
  36. package/runtime/templates/reports/i18n/en.json +1 -0
  37. package/runtime/templates/reports/i18n/ko.json +1 -0
  38. package/runtime/templates/reports/report.css +18 -0
  39. package/runtime/validators/lib/fixtures.sh +6 -0
  40. package/runtime/validators/validate-run.py +1722 -98
  41. package/src/cli-registry.mjs +0 -7
  42. package/src/commands/lifecycle/doctor.mjs +0 -9
  43. package/src/lib/skill-catalog.mjs +0 -1
  44. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  45. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  46. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  47. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  48. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  49. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  50. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  51. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  52. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  53. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  54. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  55. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  56. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  57. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  58. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  59. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  60. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  61. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  62. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  63. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  64. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  65. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  66. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  67. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  68. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  69. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  70. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  71. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  72. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  73. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  74. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  75. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  76. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  77. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  78. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  79. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  93. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  94. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  99. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  100. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  101. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  116. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  118. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  141. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  142. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  143. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  144. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  146. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  147. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  148. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  161. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  162. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  168. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  169. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  178. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  179. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  180. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  181. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  182. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  183. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  184. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  185. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  186. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  187. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  188. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  189. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  190. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  191. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  202. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  203. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  204. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  205. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  206. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  207. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  216. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  217. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  220. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  221. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  222. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  223. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  224. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  225. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  226. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  227. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  228. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  229. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  233. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  234. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  235. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  236. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  237. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  238. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  239. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  240. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  241. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  246. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  247. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  248. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  249. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  250. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  251. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  252. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  253. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  254. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  255. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  256. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  257. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  258. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  263. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  264. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  271. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  272. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  273. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  274. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  275. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  276. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  277. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  278. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  279. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  280. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  281. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  282. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  283. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  284. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  285. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  286. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  287. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  288. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  289. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  290. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  291. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  294. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  295. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  296. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  297. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  298. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  299. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  300. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  301. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  302. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  303. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  304. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  305. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  306. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  307. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  308. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  309. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  310. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  311. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  312. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  313. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  314. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  315. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  316. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  317. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  318. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  319. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  320. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  321. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  322. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  323. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  324. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  325. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  326. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  327. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  328. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  329. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  330. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  331. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  332. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  333. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  334. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  335. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  336. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  337. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  338. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  339. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  340. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  341. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  342. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  343. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  347. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  348. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  349. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  350. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  351. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  352. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  353. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  354. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  355. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  356. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  357. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  358. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  359. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  360. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  361. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  362. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  363. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  364. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  365. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  366. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  367. package/src/commands/graphify.mjs +0 -32
@@ -1,394 +0,0 @@
1
- """Biconnected components and articulation points."""
2
-
3
- from itertools import chain
4
-
5
- import networkx as nx
6
- from networkx.utils.decorators import not_implemented_for
7
-
8
- __all__ = [
9
- "biconnected_components",
10
- "biconnected_component_edges",
11
- "is_biconnected",
12
- "articulation_points",
13
- ]
14
-
15
-
16
- @not_implemented_for("directed")
17
- @nx._dispatchable
18
- def is_biconnected(G):
19
- """Returns True if the graph is biconnected, False otherwise.
20
-
21
- A graph is biconnected if, and only if, it cannot be disconnected by
22
- removing only one node (and all edges incident on that node). If
23
- removing a node increases the number of disconnected components
24
- in the graph, that node is called an articulation point, or cut
25
- vertex. A biconnected graph has no articulation points.
26
-
27
- Parameters
28
- ----------
29
- G : NetworkX Graph
30
- An undirected graph.
31
-
32
- Returns
33
- -------
34
- biconnected : bool
35
- True if the graph is biconnected, False otherwise.
36
-
37
- Raises
38
- ------
39
- NetworkXNotImplemented
40
- If the input graph is not undirected.
41
-
42
- Examples
43
- --------
44
- >>> G = nx.path_graph(4)
45
- >>> print(nx.is_biconnected(G))
46
- False
47
- >>> G.add_edge(0, 3)
48
- >>> print(nx.is_biconnected(G))
49
- True
50
-
51
- See Also
52
- --------
53
- biconnected_components
54
- articulation_points
55
- biconnected_component_edges
56
- is_strongly_connected
57
- is_weakly_connected
58
- is_connected
59
- is_semiconnected
60
-
61
- Notes
62
- -----
63
- The algorithm to find articulation points and biconnected
64
- components is implemented using a non-recursive depth-first-search
65
- (DFS) that keeps track of the highest level that back edges reach
66
- in the DFS tree. A node `n` is an articulation point if, and only
67
- if, there exists a subtree rooted at `n` such that there is no
68
- back edge from any successor of `n` that links to a predecessor of
69
- `n` in the DFS tree. By keeping track of all the edges traversed
70
- by the DFS we can obtain the biconnected components because all
71
- edges of a bicomponent will be traversed consecutively between
72
- articulation points.
73
-
74
- References
75
- ----------
76
- .. [1] Hopcroft, J.; Tarjan, R. (1973).
77
- "Efficient algorithms for graph manipulation".
78
- Communications of the ACM 16: 372–378. doi:10.1145/362248.362272
79
-
80
- """
81
- bccs = biconnected_components(G)
82
- try:
83
- bcc = next(bccs)
84
- except StopIteration:
85
- # No bicomponents (empty graph?)
86
- return False
87
- try:
88
- next(bccs)
89
- except StopIteration:
90
- # Only one bicomponent
91
- return len(bcc) == len(G)
92
- else:
93
- # Multiple bicomponents
94
- return False
95
-
96
-
97
- @not_implemented_for("directed")
98
- @nx._dispatchable
99
- def biconnected_component_edges(G):
100
- """Returns a generator of lists of edges, one list for each biconnected
101
- component of the input graph.
102
-
103
- Biconnected components are maximal subgraphs such that the removal of a
104
- node (and all edges incident on that node) will not disconnect the
105
- subgraph. Note that nodes may be part of more than one biconnected
106
- component. Those nodes are articulation points, or cut vertices.
107
- However, each edge belongs to one, and only one, biconnected component.
108
-
109
- Notice that by convention a dyad is considered a biconnected component.
110
-
111
- Parameters
112
- ----------
113
- G : NetworkX Graph
114
- An undirected graph.
115
-
116
- Returns
117
- -------
118
- edges : generator of lists
119
- Generator of lists of edges, one list for each bicomponent.
120
-
121
- Raises
122
- ------
123
- NetworkXNotImplemented
124
- If the input graph is not undirected.
125
-
126
- Examples
127
- --------
128
- >>> G = nx.barbell_graph(4, 2)
129
- >>> print(nx.is_biconnected(G))
130
- False
131
- >>> bicomponents_edges = list(nx.biconnected_component_edges(G))
132
- >>> len(bicomponents_edges)
133
- 5
134
- >>> G.add_edge(2, 8)
135
- >>> print(nx.is_biconnected(G))
136
- True
137
- >>> bicomponents_edges = list(nx.biconnected_component_edges(G))
138
- >>> len(bicomponents_edges)
139
- 1
140
-
141
- See Also
142
- --------
143
- is_biconnected,
144
- biconnected_components,
145
- articulation_points,
146
-
147
- Notes
148
- -----
149
- The algorithm to find articulation points and biconnected
150
- components is implemented using a non-recursive depth-first-search
151
- (DFS) that keeps track of the highest level that back edges reach
152
- in the DFS tree. A node `n` is an articulation point if, and only
153
- if, there exists a subtree rooted at `n` such that there is no
154
- back edge from any successor of `n` that links to a predecessor of
155
- `n` in the DFS tree. By keeping track of all the edges traversed
156
- by the DFS we can obtain the biconnected components because all
157
- edges of a bicomponent will be traversed consecutively between
158
- articulation points.
159
-
160
- References
161
- ----------
162
- .. [1] Hopcroft, J.; Tarjan, R. (1973).
163
- "Efficient algorithms for graph manipulation".
164
- Communications of the ACM 16: 372–378. doi:10.1145/362248.362272
165
-
166
- """
167
- yield from _biconnected_dfs(G, components=True)
168
-
169
-
170
- @not_implemented_for("directed")
171
- @nx._dispatchable
172
- def biconnected_components(G):
173
- """Returns a generator of sets of nodes, one set for each biconnected
174
- component of the graph
175
-
176
- Biconnected components are maximal subgraphs such that the removal of a
177
- node (and all edges incident on that node) will not disconnect the
178
- subgraph. Note that nodes may be part of more than one biconnected
179
- component. Those nodes are articulation points, or cut vertices. The
180
- removal of articulation points will increase the number of connected
181
- components of the graph.
182
-
183
- Notice that by convention a dyad is considered a biconnected component.
184
-
185
- Parameters
186
- ----------
187
- G : NetworkX Graph
188
- An undirected graph.
189
-
190
- Returns
191
- -------
192
- nodes : generator
193
- Generator of sets of nodes, one set for each biconnected component.
194
-
195
- Raises
196
- ------
197
- NetworkXNotImplemented
198
- If the input graph is not undirected.
199
-
200
- Examples
201
- --------
202
- >>> G = nx.lollipop_graph(5, 1)
203
- >>> print(nx.is_biconnected(G))
204
- False
205
- >>> bicomponents = list(nx.biconnected_components(G))
206
- >>> len(bicomponents)
207
- 2
208
- >>> G.add_edge(0, 5)
209
- >>> print(nx.is_biconnected(G))
210
- True
211
- >>> bicomponents = list(nx.biconnected_components(G))
212
- >>> len(bicomponents)
213
- 1
214
-
215
- You can generate a sorted list of biconnected components, largest
216
- first, using sort.
217
-
218
- >>> G.remove_edge(0, 5)
219
- >>> [len(c) for c in sorted(nx.biconnected_components(G), key=len, reverse=True)]
220
- [5, 2]
221
-
222
- If you only want the largest connected component, it's more
223
- efficient to use max instead of sort.
224
-
225
- >>> Gc = max(nx.biconnected_components(G), key=len)
226
-
227
- To create the components as subgraphs use:
228
- ``(G.subgraph(c).copy() for c in biconnected_components(G))``
229
-
230
- See Also
231
- --------
232
- is_biconnected
233
- articulation_points
234
- biconnected_component_edges
235
- k_components : this function is a special case where k=2
236
- bridge_components : similar to this function, but is defined using
237
- 2-edge-connectivity instead of 2-node-connectivity.
238
-
239
- Notes
240
- -----
241
- The algorithm to find articulation points and biconnected
242
- components is implemented using a non-recursive depth-first-search
243
- (DFS) that keeps track of the highest level that back edges reach
244
- in the DFS tree. A node `n` is an articulation point if, and only
245
- if, there exists a subtree rooted at `n` such that there is no
246
- back edge from any successor of `n` that links to a predecessor of
247
- `n` in the DFS tree. By keeping track of all the edges traversed
248
- by the DFS we can obtain the biconnected components because all
249
- edges of a bicomponent will be traversed consecutively between
250
- articulation points.
251
-
252
- References
253
- ----------
254
- .. [1] Hopcroft, J.; Tarjan, R. (1973).
255
- "Efficient algorithms for graph manipulation".
256
- Communications of the ACM 16: 372–378. doi:10.1145/362248.362272
257
-
258
- """
259
- for comp in _biconnected_dfs(G, components=True):
260
- yield set(chain.from_iterable(comp))
261
-
262
-
263
- @not_implemented_for("directed")
264
- @nx._dispatchable
265
- def articulation_points(G):
266
- """Yield the articulation points, or cut vertices, of a graph.
267
-
268
- An articulation point or cut vertex is any node whose removal (along with
269
- all its incident edges) increases the number of connected components of
270
- a graph. An undirected connected graph without articulation points is
271
- biconnected. Articulation points belong to more than one biconnected
272
- component of a graph.
273
-
274
- Notice that by convention a dyad is considered a biconnected component.
275
-
276
- Parameters
277
- ----------
278
- G : NetworkX Graph
279
- An undirected graph.
280
-
281
- Yields
282
- ------
283
- node
284
- An articulation point in the graph.
285
-
286
- Raises
287
- ------
288
- NetworkXNotImplemented
289
- If the input graph is not undirected.
290
-
291
- Examples
292
- --------
293
-
294
- >>> G = nx.barbell_graph(4, 2)
295
- >>> print(nx.is_biconnected(G))
296
- False
297
- >>> len(list(nx.articulation_points(G)))
298
- 4
299
- >>> G.add_edge(2, 8)
300
- >>> print(nx.is_biconnected(G))
301
- True
302
- >>> len(list(nx.articulation_points(G)))
303
- 0
304
-
305
- See Also
306
- --------
307
- is_biconnected
308
- biconnected_components
309
- biconnected_component_edges
310
-
311
- Notes
312
- -----
313
- The algorithm to find articulation points and biconnected
314
- components is implemented using a non-recursive depth-first-search
315
- (DFS) that keeps track of the highest level that back edges reach
316
- in the DFS tree. A node `n` is an articulation point if, and only
317
- if, there exists a subtree rooted at `n` such that there is no
318
- back edge from any successor of `n` that links to a predecessor of
319
- `n` in the DFS tree. By keeping track of all the edges traversed
320
- by the DFS we can obtain the biconnected components because all
321
- edges of a bicomponent will be traversed consecutively between
322
- articulation points.
323
-
324
- References
325
- ----------
326
- .. [1] Hopcroft, J.; Tarjan, R. (1973).
327
- "Efficient algorithms for graph manipulation".
328
- Communications of the ACM 16: 372–378. doi:10.1145/362248.362272
329
-
330
- """
331
- seen = set()
332
- for articulation in _biconnected_dfs(G, components=False):
333
- if articulation not in seen:
334
- seen.add(articulation)
335
- yield articulation
336
-
337
-
338
- @not_implemented_for("directed")
339
- def _biconnected_dfs(G, components=True):
340
- # depth-first search algorithm to generate articulation points
341
- # and biconnected components
342
- visited = set()
343
- for start in G:
344
- if start in visited:
345
- continue
346
- discovery = {start: 0} # time of first discovery of node during search
347
- low = {start: 0}
348
- root_children = 0
349
- visited.add(start)
350
- edge_stack = []
351
- stack = [(start, start, iter(G[start]))]
352
- edge_index = {}
353
- while stack:
354
- grandparent, parent, children = stack[-1]
355
- try:
356
- child = next(children)
357
- if grandparent == child:
358
- continue
359
- if child in visited:
360
- if discovery[child] <= discovery[parent]: # back edge
361
- low[parent] = min(low[parent], discovery[child])
362
- if components:
363
- edge_index[parent, child] = len(edge_stack)
364
- edge_stack.append((parent, child))
365
- else:
366
- low[child] = discovery[child] = len(discovery)
367
- visited.add(child)
368
- stack.append((parent, child, iter(G[child])))
369
- if components:
370
- edge_index[parent, child] = len(edge_stack)
371
- edge_stack.append((parent, child))
372
-
373
- except StopIteration:
374
- stack.pop()
375
- if len(stack) > 1:
376
- if low[parent] >= discovery[grandparent]:
377
- if components:
378
- ind = edge_index[grandparent, parent]
379
- yield edge_stack[ind:]
380
- del edge_stack[ind:]
381
-
382
- else:
383
- yield grandparent
384
- low[grandparent] = min(low[parent], low[grandparent])
385
- elif stack: # length 1 so grandparent is root
386
- root_children += 1
387
- if components:
388
- ind = edge_index[grandparent, parent]
389
- yield edge_stack[ind:]
390
- del edge_stack[ind:]
391
- if not components:
392
- # root node is articulation point if it has more than 1 child
393
- if root_children > 1:
394
- yield start
@@ -1,282 +0,0 @@
1
- """Connected components."""
2
-
3
- import networkx as nx
4
- from networkx.utils.decorators import not_implemented_for
5
-
6
- from ...utils import arbitrary_element
7
-
8
- __all__ = [
9
- "number_connected_components",
10
- "connected_components",
11
- "is_connected",
12
- "node_connected_component",
13
- ]
14
-
15
-
16
- @not_implemented_for("directed")
17
- @nx._dispatchable
18
- def connected_components(G):
19
- """Generate connected components.
20
-
21
- The connected components of an undirected graph partition the graph into
22
- disjoint sets of nodes. Each of these sets induces a subgraph of graph
23
- `G` that is connected and not part of any larger connected subgraph.
24
-
25
- A graph is connected (:func:`is_connected`) if, for every pair of distinct
26
- nodes, there is a path between them. If there is a pair of nodes for
27
- which such path does not exist, the graph is not connected (also referred
28
- to as "disconnected").
29
-
30
- A graph consisting of a single node and no edges is connected.
31
- Connectivity is undefined for the null graph (graph with no nodes).
32
-
33
- Parameters
34
- ----------
35
- G : NetworkX graph
36
- An undirected graph
37
-
38
- Yields
39
- ------
40
- comp : set
41
- A set of nodes in one connected component of the graph.
42
-
43
- Raises
44
- ------
45
- NetworkXNotImplemented
46
- If G is directed.
47
-
48
- Examples
49
- --------
50
- Generate a sorted list of connected components, largest first.
51
-
52
- >>> G = nx.path_graph(4)
53
- >>> nx.add_path(G, [10, 11, 12])
54
- >>> [len(c) for c in sorted(nx.connected_components(G), key=len, reverse=True)]
55
- [4, 3]
56
-
57
- If you only want the largest connected component, it's more
58
- efficient to use max instead of sort.
59
-
60
- >>> largest_cc = max(nx.connected_components(G), key=len)
61
-
62
- To create the induced subgraph of each component use:
63
-
64
- >>> S = [G.subgraph(c).copy() for c in nx.connected_components(G)]
65
-
66
- See Also
67
- --------
68
- number_connected_components
69
- is_connected
70
- number_weakly_connected_components
71
- number_strongly_connected_components
72
-
73
- Notes
74
- -----
75
- This function is for undirected graphs only. For directed graphs, use
76
- :func:`strongly_connected_components` or
77
- :func:`weakly_connected_components`.
78
-
79
- The algorithm is based on a Breadth-First Search (BFS) traversal and its
80
- time complexity is $O(n + m)$, where $n$ is the number of nodes and $m$ the
81
- number of edges in the graph.
82
-
83
- """
84
- seen = set()
85
- n = len(G) # must be outside the loop to avoid performance hit with graph views
86
- for v in G:
87
- if v not in seen:
88
- c = _plain_bfs(G, n - len(seen), v)
89
- seen.update(c)
90
- yield c
91
-
92
-
93
- @not_implemented_for("directed")
94
- @nx._dispatchable
95
- def number_connected_components(G):
96
- """Returns the number of connected components.
97
-
98
- The connected components of an undirected graph partition the graph into
99
- disjoint sets of nodes. Each of these sets induces a subgraph of graph
100
- `G` that is connected and not part of any larger connected subgraph.
101
-
102
- A graph is connected (:func:`is_connected`) if, for every pair of distinct
103
- nodes, there is a path between them. If there is a pair of nodes for
104
- which such path does not exist, the graph is not connected (also referred
105
- to as "disconnected").
106
-
107
- A graph consisting of a single node and no edges is connected.
108
- Connectivity is undefined for the null graph (graph with no nodes).
109
-
110
- Parameters
111
- ----------
112
- G : NetworkX graph
113
- An undirected graph.
114
-
115
- Returns
116
- -------
117
- n : integer
118
- Number of connected components
119
-
120
- Raises
121
- ------
122
- NetworkXNotImplemented
123
- If G is directed.
124
-
125
- Examples
126
- --------
127
- >>> G = nx.Graph([(0, 1), (1, 2), (5, 6), (3, 4)])
128
- >>> nx.number_connected_components(G)
129
- 3
130
-
131
- See Also
132
- --------
133
- connected_components
134
- is_connected
135
- number_weakly_connected_components
136
- number_strongly_connected_components
137
-
138
- Notes
139
- -----
140
- This function is for undirected graphs only. For directed graphs, use
141
- :func:`number_strongly_connected_components` or
142
- :func:`number_weakly_connected_components`.
143
-
144
- The algorithm is based on a Breadth-First Search (BFS) traversal and its
145
- time complexity is $O(n + m)$, where $n$ is the number of nodes and $m$ the
146
- number of edges in the graph.
147
-
148
- """
149
- return sum(1 for _ in connected_components(G))
150
-
151
-
152
- @not_implemented_for("directed")
153
- @nx._dispatchable
154
- def is_connected(G):
155
- """Returns True if the graph is connected, False otherwise.
156
-
157
- A graph is connected if, for every pair of distinct nodes, there is a
158
- path between them. If there is a pair of nodes for which such path does
159
- not exist, the graph is not connected (also referred to as "disconnected").
160
-
161
- A graph consisting of a single node and no edges is connected.
162
- Connectivity is undefined for the null graph (graph with no nodes).
163
-
164
- Parameters
165
- ----------
166
- G : NetworkX Graph
167
- An undirected graph.
168
-
169
- Returns
170
- -------
171
- connected : bool
172
- True if the graph is connected, False otherwise.
173
-
174
- Raises
175
- ------
176
- NetworkXNotImplemented
177
- If G is directed.
178
-
179
- Examples
180
- --------
181
- >>> G = nx.path_graph(4)
182
- >>> print(nx.is_connected(G))
183
- True
184
-
185
- See Also
186
- --------
187
- is_strongly_connected
188
- is_weakly_connected
189
- is_semiconnected
190
- is_biconnected
191
- connected_components
192
-
193
- Notes
194
- -----
195
- This function is for undirected graphs only. For directed graphs, use
196
- :func:`is_strongly_connected` or :func:`is_weakly_connected`.
197
-
198
- The algorithm is based on a Breadth-First Search (BFS) traversal and its
199
- time complexity is $O(n + m)$, where $n$ is the number of nodes and $m$ the
200
- number of edges in the graph.
201
-
202
- """
203
- n = len(G)
204
- if n == 0:
205
- raise nx.NetworkXPointlessConcept(
206
- "Connectivity is undefined for the null graph."
207
- )
208
- return len(next(connected_components(G))) == n
209
-
210
-
211
- @not_implemented_for("directed")
212
- @nx._dispatchable
213
- def node_connected_component(G, n):
214
- """Returns the set of nodes in the component of graph containing node n.
215
-
216
- A connected component is a set of nodes that induces a subgraph of graph
217
- `G` that is connected and not part of any larger connected subgraph.
218
-
219
- A graph is connected (:func:`is_connected`) if, for every pair of distinct
220
- nodes, there is a path between them. If there is a pair of nodes for
221
- which such path does not exist, the graph is not connected (also referred
222
- to as "disconnected").
223
-
224
- A graph consisting of a single node and no edges is connected.
225
- Connectivity is undefined for the null graph (graph with no nodes).
226
-
227
- Parameters
228
- ----------
229
- G : NetworkX Graph
230
- An undirected graph.
231
-
232
- n : node label
233
- A node in G
234
-
235
- Returns
236
- -------
237
- comp : set
238
- A set of nodes in the component of G containing node n.
239
-
240
- Raises
241
- ------
242
- NetworkXNotImplemented
243
- If G is directed.
244
-
245
- Examples
246
- --------
247
- >>> G = nx.Graph([(0, 1), (1, 2), (5, 6), (3, 4)])
248
- >>> nx.node_connected_component(G, 0) # nodes of component that contains node 0
249
- {0, 1, 2}
250
-
251
- See Also
252
- --------
253
- connected_components
254
-
255
- Notes
256
- -----
257
- This function is for undirected graphs only.
258
-
259
- The algorithm is based on a Breadth-First Search (BFS) traversal and its
260
- time complexity is $O(n + m)$, where $n$ is the number of nodes and $m$ the
261
- number of edges in the graph.
262
-
263
- """
264
- return _plain_bfs(G, len(G), n)
265
-
266
-
267
- def _plain_bfs(G, n, source):
268
- """A fast BFS node generator"""
269
- adj = G._adj
270
- seen = {source}
271
- nextlevel = [source]
272
- while nextlevel:
273
- thislevel = nextlevel
274
- nextlevel = []
275
- for v in thislevel:
276
- for w in adj[v]:
277
- if w not in seen:
278
- seen.add(w)
279
- nextlevel.append(w)
280
- if len(seen) == n:
281
- return seen
282
- return seen