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,811 +0,0 @@
1
- """
2
- Flow based connectivity algorithms
3
- """
4
-
5
- import itertools
6
- from operator import itemgetter
7
-
8
- import networkx as nx
9
-
10
- # Define the default maximum flow function to use in all flow based
11
- # connectivity algorithms.
12
- from networkx.algorithms.flow import (
13
- boykov_kolmogorov,
14
- build_residual_network,
15
- dinitz,
16
- edmonds_karp,
17
- preflow_push,
18
- shortest_augmenting_path,
19
- )
20
-
21
- from .utils import build_auxiliary_edge_connectivity, build_auxiliary_node_connectivity
22
-
23
- default_flow_func = edmonds_karp
24
-
25
- __all__ = [
26
- "average_node_connectivity",
27
- "local_node_connectivity",
28
- "node_connectivity",
29
- "local_edge_connectivity",
30
- "edge_connectivity",
31
- "all_pairs_node_connectivity",
32
- ]
33
-
34
-
35
- @nx._dispatchable(graphs={"G": 0, "auxiliary?": 4}, preserve_graph_attrs={"auxiliary"})
36
- def local_node_connectivity(
37
- G, s, t, flow_func=None, auxiliary=None, residual=None, cutoff=None
38
- ):
39
- r"""Computes local node connectivity for nodes s and t.
40
-
41
- Local node connectivity for two non adjacent nodes s and t is the
42
- minimum number of nodes that must be removed (along with their incident
43
- edges) to disconnect them.
44
-
45
- This is a flow based implementation of node connectivity. We compute the
46
- maximum flow on an auxiliary digraph build from the original input
47
- graph (see below for details).
48
-
49
- Parameters
50
- ----------
51
- G : NetworkX graph
52
- Undirected graph
53
-
54
- s : node
55
- Source node
56
-
57
- t : node
58
- Target node
59
-
60
- flow_func : function
61
- A function for computing the maximum flow among a pair of nodes.
62
- The function has to accept at least three parameters: a Digraph,
63
- a source node, and a target node. And return a residual network
64
- that follows NetworkX conventions (see :meth:`maximum_flow` for
65
- details). If flow_func is None, the default maximum flow function
66
- (:meth:`edmonds_karp`) is used. See below for details. The choice
67
- of the default function may change from version to version and
68
- should not be relied on. Default value: None.
69
-
70
- auxiliary : NetworkX DiGraph
71
- Auxiliary digraph to compute flow based node connectivity. It has
72
- to have a graph attribute called mapping with a dictionary mapping
73
- node names in G and in the auxiliary digraph. If provided
74
- it will be reused instead of recreated. Default value: None.
75
-
76
- residual : NetworkX DiGraph
77
- Residual network to compute maximum flow. If provided it will be
78
- reused instead of recreated. Default value: None.
79
-
80
- cutoff : integer, float, or None (default: None)
81
- If specified, the maximum flow algorithm will terminate when the
82
- flow value reaches or exceeds the cutoff. This only works for flows
83
- that support the cutoff parameter (most do) and is ignored otherwise.
84
-
85
- Returns
86
- -------
87
- K : integer
88
- local node connectivity for nodes s and t
89
-
90
- Examples
91
- --------
92
- This function is not imported in the base NetworkX namespace, so you
93
- have to explicitly import it from the connectivity package:
94
-
95
- >>> from networkx.algorithms.connectivity import local_node_connectivity
96
-
97
- We use in this example the platonic icosahedral graph, which has node
98
- connectivity 5.
99
-
100
- >>> G = nx.icosahedral_graph()
101
- >>> local_node_connectivity(G, 0, 6)
102
- 5
103
-
104
- If you need to compute local connectivity on several pairs of
105
- nodes in the same graph, it is recommended that you reuse the
106
- data structures that NetworkX uses in the computation: the
107
- auxiliary digraph for node connectivity, and the residual
108
- network for the underlying maximum flow computation.
109
-
110
- Example of how to compute local node connectivity among
111
- all pairs of nodes of the platonic icosahedral graph reusing
112
- the data structures.
113
-
114
- >>> import itertools
115
- >>> # You also have to explicitly import the function for
116
- >>> # building the auxiliary digraph from the connectivity package
117
- >>> from networkx.algorithms.connectivity import build_auxiliary_node_connectivity
118
- >>> H = build_auxiliary_node_connectivity(G)
119
- >>> # And the function for building the residual network from the
120
- >>> # flow package
121
- >>> from networkx.algorithms.flow import build_residual_network
122
- >>> # Note that the auxiliary digraph has an edge attribute named capacity
123
- >>> R = build_residual_network(H, "capacity")
124
- >>> result = dict.fromkeys(G, dict())
125
- >>> # Reuse the auxiliary digraph and the residual network by passing them
126
- >>> # as parameters
127
- >>> for u, v in itertools.combinations(G, 2):
128
- ... k = local_node_connectivity(G, u, v, auxiliary=H, residual=R)
129
- ... result[u][v] = k
130
- >>> all(result[u][v] == 5 for u, v in itertools.combinations(G, 2))
131
- True
132
-
133
- You can also use alternative flow algorithms for computing node
134
- connectivity. For instance, in dense networks the algorithm
135
- :meth:`shortest_augmenting_path` will usually perform better than
136
- the default :meth:`edmonds_karp` which is faster for sparse
137
- networks with highly skewed degree distributions. Alternative flow
138
- functions have to be explicitly imported from the flow package.
139
-
140
- >>> from networkx.algorithms.flow import shortest_augmenting_path
141
- >>> local_node_connectivity(G, 0, 6, flow_func=shortest_augmenting_path)
142
- 5
143
-
144
- Notes
145
- -----
146
- This is a flow based implementation of node connectivity. We compute the
147
- maximum flow using, by default, the :meth:`edmonds_karp` algorithm (see:
148
- :meth:`maximum_flow`) on an auxiliary digraph build from the original
149
- input graph:
150
-
151
- For an undirected graph G having `n` nodes and `m` edges we derive a
152
- directed graph H with `2n` nodes and `2m+n` arcs by replacing each
153
- original node `v` with two nodes `v_A`, `v_B` linked by an (internal)
154
- arc in H. Then for each edge (`u`, `v`) in G we add two arcs
155
- (`u_B`, `v_A`) and (`v_B`, `u_A`) in H. Finally we set the attribute
156
- capacity = 1 for each arc in H [1]_ .
157
-
158
- For a directed graph G having `n` nodes and `m` arcs we derive a
159
- directed graph H with `2n` nodes and `m+n` arcs by replacing each
160
- original node `v` with two nodes `v_A`, `v_B` linked by an (internal)
161
- arc (`v_A`, `v_B`) in H. Then for each arc (`u`, `v`) in G we add one arc
162
- (`u_B`, `v_A`) in H. Finally we set the attribute capacity = 1 for
163
- each arc in H.
164
-
165
- This is equal to the local node connectivity because the value of
166
- a maximum s-t-flow is equal to the capacity of a minimum s-t-cut.
167
-
168
- See also
169
- --------
170
- :meth:`local_edge_connectivity`
171
- :meth:`node_connectivity`
172
- :meth:`minimum_node_cut`
173
- :meth:`maximum_flow`
174
- :meth:`edmonds_karp`
175
- :meth:`preflow_push`
176
- :meth:`shortest_augmenting_path`
177
-
178
- References
179
- ----------
180
- .. [1] Kammer, Frank and Hanjo Taubig. Graph Connectivity. in Brandes and
181
- Erlebach, 'Network Analysis: Methodological Foundations', Lecture
182
- Notes in Computer Science, Volume 3418, Springer-Verlag, 2005.
183
- http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf
184
-
185
- """
186
- if flow_func is None:
187
- flow_func = default_flow_func
188
-
189
- if auxiliary is None:
190
- H = build_auxiliary_node_connectivity(G)
191
- else:
192
- H = auxiliary
193
-
194
- mapping = H.graph.get("mapping", None)
195
- if mapping is None:
196
- raise nx.NetworkXError("Invalid auxiliary digraph.")
197
-
198
- kwargs = {"flow_func": flow_func, "residual": residual}
199
-
200
- if flow_func is not preflow_push:
201
- kwargs["cutoff"] = cutoff
202
-
203
- if flow_func is shortest_augmenting_path:
204
- kwargs["two_phase"] = True
205
-
206
- return nx.maximum_flow_value(H, f"{mapping[s]}B", f"{mapping[t]}A", **kwargs)
207
-
208
-
209
- @nx._dispatchable
210
- def node_connectivity(G, s=None, t=None, flow_func=None):
211
- r"""Returns node connectivity for a graph or digraph G.
212
-
213
- Node connectivity is equal to the minimum number of nodes that
214
- must be removed to disconnect G or render it trivial. If source
215
- and target nodes are provided, this function returns the local node
216
- connectivity: the minimum number of nodes that must be removed to break
217
- all paths from source to target in G.
218
-
219
- Parameters
220
- ----------
221
- G : NetworkX graph
222
- Undirected graph
223
-
224
- s : node
225
- Source node. Optional. Default value: None.
226
-
227
- t : node
228
- Target node. Optional. Default value: None.
229
-
230
- flow_func : function
231
- A function for computing the maximum flow among a pair of nodes.
232
- The function has to accept at least three parameters: a Digraph,
233
- a source node, and a target node. And return a residual network
234
- that follows NetworkX conventions (see :meth:`maximum_flow` for
235
- details). If flow_func is None, the default maximum flow function
236
- (:meth:`edmonds_karp`) is used. See below for details. The
237
- choice of the default function may change from version
238
- to version and should not be relied on. Default value: None.
239
-
240
- Returns
241
- -------
242
- K : integer
243
- Node connectivity of G, or local node connectivity if source
244
- and target are provided.
245
-
246
- Examples
247
- --------
248
- >>> # Platonic icosahedral graph is 5-node-connected
249
- >>> G = nx.icosahedral_graph()
250
- >>> nx.node_connectivity(G)
251
- 5
252
-
253
- You can use alternative flow algorithms for the underlying maximum
254
- flow computation. In dense networks the algorithm
255
- :meth:`shortest_augmenting_path` will usually perform better
256
- than the default :meth:`edmonds_karp`, which is faster for
257
- sparse networks with highly skewed degree distributions. Alternative
258
- flow functions have to be explicitly imported from the flow package.
259
-
260
- >>> from networkx.algorithms.flow import shortest_augmenting_path
261
- >>> nx.node_connectivity(G, flow_func=shortest_augmenting_path)
262
- 5
263
-
264
- If you specify a pair of nodes (source and target) as parameters,
265
- this function returns the value of local node connectivity.
266
-
267
- >>> nx.node_connectivity(G, 3, 7)
268
- 5
269
-
270
- If you need to perform several local computations among different
271
- pairs of nodes on the same graph, it is recommended that you reuse
272
- the data structures used in the maximum flow computations. See
273
- :meth:`local_node_connectivity` for details.
274
-
275
- Notes
276
- -----
277
- This is a flow based implementation of node connectivity. The
278
- algorithm works by solving $O((n-\delta-1+\delta(\delta-1)/2))$
279
- maximum flow problems on an auxiliary digraph. Where $\delta$
280
- is the minimum degree of G. For details about the auxiliary
281
- digraph and the computation of local node connectivity see
282
- :meth:`local_node_connectivity`. This implementation is based
283
- on algorithm 11 in [1]_.
284
-
285
- See also
286
- --------
287
- :meth:`local_node_connectivity`
288
- :meth:`edge_connectivity`
289
- :meth:`maximum_flow`
290
- :meth:`edmonds_karp`
291
- :meth:`preflow_push`
292
- :meth:`shortest_augmenting_path`
293
-
294
- References
295
- ----------
296
- .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms.
297
- http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf
298
-
299
- """
300
- if (s is not None and t is None) or (s is None and t is not None):
301
- raise nx.NetworkXError("Both source and target must be specified.")
302
-
303
- # Local node connectivity
304
- if s is not None and t is not None:
305
- if s not in G:
306
- raise nx.NetworkXError(f"node {s} not in graph")
307
- if t not in G:
308
- raise nx.NetworkXError(f"node {t} not in graph")
309
- return local_node_connectivity(G, s, t, flow_func=flow_func)
310
-
311
- # Global node connectivity
312
- if G.is_directed():
313
- if not nx.is_weakly_connected(G):
314
- return 0
315
- iter_func = itertools.permutations
316
- # It is necessary to consider both predecessors
317
- # and successors for directed graphs
318
-
319
- def neighbors(v):
320
- return itertools.chain.from_iterable([G.predecessors(v), G.successors(v)])
321
-
322
- else:
323
- if not nx.is_connected(G):
324
- return 0
325
- iter_func = itertools.combinations
326
- neighbors = G.neighbors
327
-
328
- # Reuse the auxiliary digraph and the residual network
329
- H = build_auxiliary_node_connectivity(G)
330
- R = build_residual_network(H, "capacity")
331
- kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
332
-
333
- # Pick a node with minimum degree
334
- # Node connectivity is bounded by degree.
335
- v, K = min(G.degree(), key=itemgetter(1))
336
- # compute local node connectivity with all its non-neighbors nodes
337
- for w in set(G) - set(neighbors(v)) - {v}:
338
- kwargs["cutoff"] = K
339
- K = min(K, local_node_connectivity(G, v, w, **kwargs))
340
- # Also for non adjacent pairs of neighbors of v
341
- for x, y in iter_func(neighbors(v), 2):
342
- if y in G[x]:
343
- continue
344
- kwargs["cutoff"] = K
345
- K = min(K, local_node_connectivity(G, x, y, **kwargs))
346
-
347
- return K
348
-
349
-
350
- @nx._dispatchable
351
- def average_node_connectivity(G, flow_func=None):
352
- r"""Returns the average connectivity of a graph G.
353
-
354
- The average connectivity `\bar{\kappa}` of a graph G is the average
355
- of local node connectivity over all pairs of nodes of G [1]_ .
356
-
357
- .. math::
358
-
359
- \bar{\kappa}(G) = \frac{\sum_{u,v} \kappa_{G}(u,v)}{{n \choose 2}}
360
-
361
- Parameters
362
- ----------
363
-
364
- G : NetworkX graph
365
- Undirected graph
366
-
367
- flow_func : function
368
- A function for computing the maximum flow among a pair of nodes.
369
- The function has to accept at least three parameters: a Digraph,
370
- a source node, and a target node. And return a residual network
371
- that follows NetworkX conventions (see :meth:`maximum_flow` for
372
- details). If flow_func is None, the default maximum flow function
373
- (:meth:`edmonds_karp`) is used. See :meth:`local_node_connectivity`
374
- for details. The choice of the default function may change from
375
- version to version and should not be relied on. Default value: None.
376
-
377
- Returns
378
- -------
379
- K : float
380
- Average node connectivity
381
-
382
- See also
383
- --------
384
- :meth:`local_node_connectivity`
385
- :meth:`node_connectivity`
386
- :meth:`edge_connectivity`
387
- :meth:`maximum_flow`
388
- :meth:`edmonds_karp`
389
- :meth:`preflow_push`
390
- :meth:`shortest_augmenting_path`
391
-
392
- References
393
- ----------
394
- .. [1] Beineke, L., O. Oellermann, and R. Pippert (2002). The average
395
- connectivity of a graph. Discrete mathematics 252(1-3), 31-45.
396
- http://www.sciencedirect.com/science/article/pii/S0012365X01001807
397
-
398
- """
399
- if G.is_directed():
400
- iter_func = itertools.permutations
401
- else:
402
- iter_func = itertools.combinations
403
-
404
- # Reuse the auxiliary digraph and the residual network
405
- H = build_auxiliary_node_connectivity(G)
406
- R = build_residual_network(H, "capacity")
407
- kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
408
-
409
- num, den = 0, 0
410
- for u, v in iter_func(G, 2):
411
- num += local_node_connectivity(G, u, v, **kwargs)
412
- den += 1
413
-
414
- if den == 0: # Null Graph
415
- return 0
416
- return num / den
417
-
418
-
419
- @nx._dispatchable
420
- def all_pairs_node_connectivity(G, nbunch=None, flow_func=None):
421
- """Compute node connectivity between all pairs of nodes of G.
422
-
423
- Parameters
424
- ----------
425
- G : NetworkX graph
426
- Undirected graph
427
-
428
- nbunch: container
429
- Container of nodes. If provided node connectivity will be computed
430
- only over pairs of nodes in nbunch.
431
-
432
- flow_func : function
433
- A function for computing the maximum flow among a pair of nodes.
434
- The function has to accept at least three parameters: a Digraph,
435
- a source node, and a target node. And return a residual network
436
- that follows NetworkX conventions (see :meth:`maximum_flow` for
437
- details). If flow_func is None, the default maximum flow function
438
- (:meth:`edmonds_karp`) is used. See below for details. The
439
- choice of the default function may change from version
440
- to version and should not be relied on. Default value: None.
441
-
442
- Returns
443
- -------
444
- all_pairs : dict
445
- A dictionary with node connectivity between all pairs of nodes
446
- in G, or in nbunch if provided.
447
-
448
- See also
449
- --------
450
- :meth:`local_node_connectivity`
451
- :meth:`edge_connectivity`
452
- :meth:`local_edge_connectivity`
453
- :meth:`maximum_flow`
454
- :meth:`edmonds_karp`
455
- :meth:`preflow_push`
456
- :meth:`shortest_augmenting_path`
457
-
458
- """
459
- if nbunch is None:
460
- nbunch = G
461
- else:
462
- nbunch = set(nbunch)
463
-
464
- directed = G.is_directed()
465
- if directed:
466
- iter_func = itertools.permutations
467
- else:
468
- iter_func = itertools.combinations
469
-
470
- all_pairs = {n: {} for n in nbunch}
471
-
472
- # Reuse auxiliary digraph and residual network
473
- H = build_auxiliary_node_connectivity(G)
474
- mapping = H.graph["mapping"]
475
- R = build_residual_network(H, "capacity")
476
- kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
477
-
478
- for u, v in iter_func(nbunch, 2):
479
- K = local_node_connectivity(G, u, v, **kwargs)
480
- all_pairs[u][v] = K
481
- if not directed:
482
- all_pairs[v][u] = K
483
-
484
- return all_pairs
485
-
486
-
487
- @nx._dispatchable(graphs={"G": 0, "auxiliary?": 4})
488
- def local_edge_connectivity(
489
- G, s, t, flow_func=None, auxiliary=None, residual=None, cutoff=None
490
- ):
491
- r"""Returns local edge connectivity for nodes s and t in G.
492
-
493
- Local edge connectivity for two nodes s and t is the minimum number
494
- of edges that must be removed to disconnect them.
495
-
496
- This is a flow based implementation of edge connectivity. We compute the
497
- maximum flow on an auxiliary digraph build from the original
498
- network (see below for details). This is equal to the local edge
499
- connectivity because the value of a maximum s-t-flow is equal to the
500
- capacity of a minimum s-t-cut (Ford and Fulkerson theorem) [1]_ .
501
-
502
- Parameters
503
- ----------
504
- G : NetworkX graph
505
- Undirected or directed graph
506
-
507
- s : node
508
- Source node
509
-
510
- t : node
511
- Target node
512
-
513
- flow_func : function
514
- A function for computing the maximum flow among a pair of nodes.
515
- The function has to accept at least three parameters: a Digraph,
516
- a source node, and a target node. And return a residual network
517
- that follows NetworkX conventions (see :meth:`maximum_flow` for
518
- details). If flow_func is None, the default maximum flow function
519
- (:meth:`edmonds_karp`) is used. See below for details. The
520
- choice of the default function may change from version
521
- to version and should not be relied on. Default value: None.
522
-
523
- auxiliary : NetworkX DiGraph
524
- Auxiliary digraph for computing flow based edge connectivity. If
525
- provided it will be reused instead of recreated. Default value: None.
526
-
527
- residual : NetworkX DiGraph
528
- Residual network to compute maximum flow. If provided it will be
529
- reused instead of recreated. Default value: None.
530
-
531
- cutoff : integer, float, or None (default: None)
532
- If specified, the maximum flow algorithm will terminate when the
533
- flow value reaches or exceeds the cutoff. This only works for flows
534
- that support the cutoff parameter (most do) and is ignored otherwise.
535
-
536
- Returns
537
- -------
538
- K : integer
539
- local edge connectivity for nodes s and t.
540
-
541
- Examples
542
- --------
543
- This function is not imported in the base NetworkX namespace, so you
544
- have to explicitly import it from the connectivity package:
545
-
546
- >>> from networkx.algorithms.connectivity import local_edge_connectivity
547
-
548
- We use in this example the platonic icosahedral graph, which has edge
549
- connectivity 5.
550
-
551
- >>> G = nx.icosahedral_graph()
552
- >>> local_edge_connectivity(G, 0, 6)
553
- 5
554
-
555
- If you need to compute local connectivity on several pairs of
556
- nodes in the same graph, it is recommended that you reuse the
557
- data structures that NetworkX uses in the computation: the
558
- auxiliary digraph for edge connectivity, and the residual
559
- network for the underlying maximum flow computation.
560
-
561
- Example of how to compute local edge connectivity among
562
- all pairs of nodes of the platonic icosahedral graph reusing
563
- the data structures.
564
-
565
- >>> import itertools
566
- >>> # You also have to explicitly import the function for
567
- >>> # building the auxiliary digraph from the connectivity package
568
- >>> from networkx.algorithms.connectivity import build_auxiliary_edge_connectivity
569
- >>> H = build_auxiliary_edge_connectivity(G)
570
- >>> # And the function for building the residual network from the
571
- >>> # flow package
572
- >>> from networkx.algorithms.flow import build_residual_network
573
- >>> # Note that the auxiliary digraph has an edge attribute named capacity
574
- >>> R = build_residual_network(H, "capacity")
575
- >>> result = dict.fromkeys(G, dict())
576
- >>> # Reuse the auxiliary digraph and the residual network by passing them
577
- >>> # as parameters
578
- >>> for u, v in itertools.combinations(G, 2):
579
- ... k = local_edge_connectivity(G, u, v, auxiliary=H, residual=R)
580
- ... result[u][v] = k
581
- >>> all(result[u][v] == 5 for u, v in itertools.combinations(G, 2))
582
- True
583
-
584
- You can also use alternative flow algorithms for computing edge
585
- connectivity. For instance, in dense networks the algorithm
586
- :meth:`shortest_augmenting_path` will usually perform better than
587
- the default :meth:`edmonds_karp` which is faster for sparse
588
- networks with highly skewed degree distributions. Alternative flow
589
- functions have to be explicitly imported from the flow package.
590
-
591
- >>> from networkx.algorithms.flow import shortest_augmenting_path
592
- >>> local_edge_connectivity(G, 0, 6, flow_func=shortest_augmenting_path)
593
- 5
594
-
595
- Notes
596
- -----
597
- This is a flow based implementation of edge connectivity. We compute the
598
- maximum flow using, by default, the :meth:`edmonds_karp` algorithm on an
599
- auxiliary digraph build from the original input graph:
600
-
601
- If the input graph is undirected, we replace each edge (`u`,`v`) with
602
- two reciprocal arcs (`u`, `v`) and (`v`, `u`) and then we set the attribute
603
- 'capacity' for each arc to 1. If the input graph is directed we simply
604
- add the 'capacity' attribute. This is an implementation of algorithm 1
605
- in [1]_.
606
-
607
- The maximum flow in the auxiliary network is equal to the local edge
608
- connectivity because the value of a maximum s-t-flow is equal to the
609
- capacity of a minimum s-t-cut (Ford and Fulkerson theorem).
610
-
611
- See also
612
- --------
613
- :meth:`edge_connectivity`
614
- :meth:`local_node_connectivity`
615
- :meth:`node_connectivity`
616
- :meth:`maximum_flow`
617
- :meth:`edmonds_karp`
618
- :meth:`preflow_push`
619
- :meth:`shortest_augmenting_path`
620
-
621
- References
622
- ----------
623
- .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms.
624
- http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf
625
-
626
- """
627
- if flow_func is None:
628
- flow_func = default_flow_func
629
-
630
- if auxiliary is None:
631
- H = build_auxiliary_edge_connectivity(G)
632
- else:
633
- H = auxiliary
634
-
635
- kwargs = {"flow_func": flow_func, "residual": residual}
636
-
637
- if flow_func is not preflow_push:
638
- kwargs["cutoff"] = cutoff
639
-
640
- if flow_func is shortest_augmenting_path:
641
- kwargs["two_phase"] = True
642
-
643
- return nx.maximum_flow_value(H, s, t, **kwargs)
644
-
645
-
646
- @nx._dispatchable
647
- def edge_connectivity(G, s=None, t=None, flow_func=None, cutoff=None):
648
- r"""Returns the edge connectivity of the graph or digraph G.
649
-
650
- The edge connectivity is equal to the minimum number of edges that
651
- must be removed to disconnect G or render it trivial. If source
652
- and target nodes are provided, this function returns the local edge
653
- connectivity: the minimum number of edges that must be removed to
654
- break all paths from source to target in G.
655
-
656
- Parameters
657
- ----------
658
- G : NetworkX graph
659
- Undirected or directed graph
660
-
661
- s : node
662
- Source node. Optional. Default value: None.
663
-
664
- t : node
665
- Target node. Optional. Default value: None.
666
-
667
- flow_func : function
668
- A function for computing the maximum flow among a pair of nodes.
669
- The function has to accept at least three parameters: a Digraph,
670
- a source node, and a target node. And return a residual network
671
- that follows NetworkX conventions (see :meth:`maximum_flow` for
672
- details). If flow_func is None, the default maximum flow function
673
- (:meth:`edmonds_karp`) is used. See below for details. The
674
- choice of the default function may change from version
675
- to version and should not be relied on. Default value: None.
676
-
677
- cutoff : integer, float, or None (default: None)
678
- If specified, the maximum flow algorithm will terminate when the
679
- flow value reaches or exceeds the cutoff. This only works for flows
680
- that support the cutoff parameter (most do) and is ignored otherwise.
681
-
682
- Returns
683
- -------
684
- K : integer
685
- Edge connectivity for G, or local edge connectivity if source
686
- and target were provided
687
-
688
- Examples
689
- --------
690
- >>> # Platonic icosahedral graph is 5-edge-connected
691
- >>> G = nx.icosahedral_graph()
692
- >>> nx.edge_connectivity(G)
693
- 5
694
-
695
- You can use alternative flow algorithms for the underlying
696
- maximum flow computation. In dense networks the algorithm
697
- :meth:`shortest_augmenting_path` will usually perform better
698
- than the default :meth:`edmonds_karp`, which is faster for
699
- sparse networks with highly skewed degree distributions.
700
- Alternative flow functions have to be explicitly imported
701
- from the flow package.
702
-
703
- >>> from networkx.algorithms.flow import shortest_augmenting_path
704
- >>> nx.edge_connectivity(G, flow_func=shortest_augmenting_path)
705
- 5
706
-
707
- If you specify a pair of nodes (source and target) as parameters,
708
- this function returns the value of local edge connectivity.
709
-
710
- >>> nx.edge_connectivity(G, 3, 7)
711
- 5
712
-
713
- If you need to perform several local computations among different
714
- pairs of nodes on the same graph, it is recommended that you reuse
715
- the data structures used in the maximum flow computations. See
716
- :meth:`local_edge_connectivity` for details.
717
-
718
- Notes
719
- -----
720
- This is a flow based implementation of global edge connectivity.
721
- For undirected graphs the algorithm works by finding a 'small'
722
- dominating set of nodes of G (see algorithm 7 in [1]_ ) and
723
- computing local maximum flow (see :meth:`local_edge_connectivity`)
724
- between an arbitrary node in the dominating set and the rest of
725
- nodes in it. This is an implementation of algorithm 6 in [1]_ .
726
- For directed graphs, the algorithm does n calls to the maximum
727
- flow function. This is an implementation of algorithm 8 in [1]_ .
728
-
729
- See also
730
- --------
731
- :meth:`local_edge_connectivity`
732
- :meth:`local_node_connectivity`
733
- :meth:`node_connectivity`
734
- :meth:`maximum_flow`
735
- :meth:`edmonds_karp`
736
- :meth:`preflow_push`
737
- :meth:`shortest_augmenting_path`
738
- :meth:`k_edge_components`
739
- :meth:`k_edge_subgraphs`
740
-
741
- References
742
- ----------
743
- .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms.
744
- http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf
745
-
746
- """
747
- if (s is not None and t is None) or (s is None and t is not None):
748
- raise nx.NetworkXError("Both source and target must be specified.")
749
-
750
- # Local edge connectivity
751
- if s is not None and t is not None:
752
- if s not in G:
753
- raise nx.NetworkXError(f"node {s} not in graph")
754
- if t not in G:
755
- raise nx.NetworkXError(f"node {t} not in graph")
756
- return local_edge_connectivity(G, s, t, flow_func=flow_func, cutoff=cutoff)
757
-
758
- # Global edge connectivity
759
- # reuse auxiliary digraph and residual network
760
- H = build_auxiliary_edge_connectivity(G)
761
- R = build_residual_network(H, "capacity")
762
- kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
763
-
764
- if G.is_directed():
765
- # Algorithm 8 in [1]
766
- if not nx.is_weakly_connected(G):
767
- return 0
768
-
769
- # initial value for \lambda is minimum degree
770
- L = min(d for n, d in G.degree())
771
- nodes = list(G)
772
- n = len(nodes)
773
-
774
- if cutoff is not None:
775
- L = min(cutoff, L)
776
-
777
- for i in range(n):
778
- kwargs["cutoff"] = L
779
- try:
780
- L = min(L, local_edge_connectivity(G, nodes[i], nodes[i + 1], **kwargs))
781
- except IndexError: # last node!
782
- L = min(L, local_edge_connectivity(G, nodes[i], nodes[0], **kwargs))
783
- return L
784
- else: # undirected
785
- # Algorithm 6 in [1]
786
- if not nx.is_connected(G):
787
- return 0
788
-
789
- # initial value for \lambda is minimum degree
790
- L = min(d for n, d in G.degree())
791
-
792
- if cutoff is not None:
793
- L = min(cutoff, L)
794
-
795
- # A dominating set is \lambda-covering
796
- # We need a dominating set with at least two nodes
797
- for node in G:
798
- D = nx.dominating_set(G, start_with=node)
799
- v = D.pop()
800
- if D:
801
- break
802
- else:
803
- # in complete graphs the dominating sets will always be of one node
804
- # thus we return min degree
805
- return L
806
-
807
- for w in D:
808
- kwargs["cutoff"] = L
809
- L = min(L, local_edge_connectivity(G, v, w, **kwargs))
810
-
811
- return L