okstra 0.130.4 → 0.131.1

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 (365) 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 +16 -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/run.py +15 -3
  27. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  28. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  29. package/runtime/python/okstra_vendor/__init__.py +0 -44
  30. package/runtime/schemas/final-report-v1.0.schema.json +99 -5
  31. package/runtime/skills/okstra-run/SKILL.md +11 -4
  32. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  33. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  34. package/runtime/templates/reports/final-report.template.md +15 -9
  35. package/runtime/templates/reports/i18n/en.json +1 -0
  36. package/runtime/templates/reports/i18n/ko.json +1 -0
  37. package/runtime/validators/lib/fixtures.sh +6 -0
  38. package/runtime/validators/validate-run.py +2019 -96
  39. package/src/cli-registry.mjs +0 -7
  40. package/src/commands/lifecycle/doctor.mjs +0 -9
  41. package/src/lib/skill-catalog.mjs +0 -1
  42. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  43. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  44. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  45. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  46. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  47. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  48. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  49. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  50. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  51. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  52. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  53. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  54. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  55. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  56. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  57. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  58. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  59. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  60. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  61. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  62. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  63. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  64. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  65. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  66. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  67. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  68. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  69. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  70. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  71. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  72. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  73. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  74. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  75. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  76. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  77. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  78. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  79. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  93. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  94. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  99. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  100. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  101. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  114. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  116. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  117. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  118. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  139. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  140. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  141. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  142. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  143. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  144. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  146. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  147. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  148. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  161. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  162. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  168. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  169. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  178. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  179. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  180. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  181. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  182. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  183. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  184. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  185. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  186. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  187. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  188. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  189. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  190. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  191. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  202. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  203. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  204. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  205. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  206. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  207. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  216. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  217. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  220. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  221. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  222. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  223. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  224. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  225. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  226. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  227. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  228. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  229. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  233. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  234. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  235. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  236. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  237. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  238. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  239. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  240. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  241. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  246. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  247. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  248. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  249. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  250. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  251. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  252. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  253. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  254. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  255. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  256. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  257. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  258. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  263. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  264. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  271. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  272. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  273. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  274. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  275. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  276. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  277. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  278. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  279. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  280. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  281. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  282. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  283. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  284. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  285. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  286. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  287. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  288. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  289. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  290. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  291. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  294. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  295. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  296. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  297. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  298. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  299. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  300. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  301. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  302. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  303. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  304. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  305. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  306. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  307. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  308. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  309. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  310. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  311. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  312. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  313. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  314. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  315. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  316. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  317. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  318. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  319. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  320. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  321. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  322. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  323. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  324. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  325. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  326. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  327. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  328. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  329. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  330. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  331. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  332. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  333. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  334. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  335. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  336. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  337. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  338. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  339. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  340. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  341. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  342. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  343. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  347. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  348. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  349. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  350. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  351. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  352. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  353. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  354. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  355. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  356. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  357. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  358. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  359. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  360. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  361. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  362. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  363. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  364. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  365. 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