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,611 +0,0 @@
1
- """
2
- Maximum flow (and minimum cut) algorithms on capacitated graphs.
3
- """
4
-
5
- import networkx as nx
6
-
7
- from .boykovkolmogorov import boykov_kolmogorov
8
- from .dinitz_alg import dinitz
9
- from .edmondskarp import edmonds_karp
10
- from .preflowpush import preflow_push
11
- from .shortestaugmentingpath import shortest_augmenting_path
12
- from .utils import build_flow_dict
13
-
14
- # Define the default flow function for computing maximum flow.
15
- default_flow_func = preflow_push
16
-
17
- __all__ = ["maximum_flow", "maximum_flow_value", "minimum_cut", "minimum_cut_value"]
18
-
19
-
20
- @nx._dispatchable(graphs="flowG", edge_attrs={"capacity": float("inf")})
21
- def maximum_flow(flowG, _s, _t, capacity="capacity", flow_func=None, **kwargs):
22
- """Find a maximum single-commodity flow.
23
-
24
- Parameters
25
- ----------
26
- flowG : NetworkX graph
27
- Edges of the graph are expected to have an attribute called
28
- 'capacity'. If this attribute is not present, the edge is
29
- considered to have infinite capacity.
30
-
31
- _s : node
32
- Source node for the flow.
33
-
34
- _t : node
35
- Sink node for the flow.
36
-
37
- capacity : string
38
- Edges of the graph G are expected to have an attribute capacity
39
- that indicates how much flow the edge can support. If this
40
- attribute is not present, the edge is considered to have
41
- infinite capacity. Default value: 'capacity'.
42
-
43
- flow_func : function
44
- A function for computing the maximum flow among a pair of nodes
45
- in a capacitated graph. The function has to accept at least three
46
- parameters: a Graph or Digraph, a source node, and a target node.
47
- And return a residual network that follows NetworkX conventions
48
- (see Notes). If flow_func is None, the default maximum
49
- flow function (:meth:`preflow_push`) is used. See below for
50
- alternative algorithms. The choice of the default function may change
51
- from version to version and should not be relied on. Default value:
52
- None.
53
-
54
- kwargs : Any other keyword parameter is passed to the function that
55
- computes the maximum flow.
56
-
57
- Returns
58
- -------
59
- flow_value : integer, float
60
- Value of the maximum flow, i.e., net outflow from the source.
61
-
62
- flow_dict : dict
63
- A dictionary containing the value of the flow that went through
64
- each edge.
65
-
66
- Raises
67
- ------
68
- NetworkXError
69
- The algorithm does not support MultiGraph and MultiDiGraph. If
70
- the input graph is an instance of one of these two classes, a
71
- NetworkXError is raised.
72
-
73
- NetworkXUnbounded
74
- If the graph has a path of infinite capacity, the value of a
75
- feasible flow on the graph is unbounded above and the function
76
- raises a NetworkXUnbounded.
77
-
78
- See also
79
- --------
80
- :meth:`maximum_flow_value`
81
- :meth:`minimum_cut`
82
- :meth:`minimum_cut_value`
83
- :meth:`edmonds_karp`
84
- :meth:`preflow_push`
85
- :meth:`shortest_augmenting_path`
86
-
87
- Notes
88
- -----
89
- The function used in the flow_func parameter has to return a residual
90
- network that follows NetworkX conventions:
91
-
92
- The residual network :samp:`R` from an input graph :samp:`G` has the
93
- same nodes as :samp:`G`. :samp:`R` is a DiGraph that contains a pair
94
- of edges :samp:`(u, v)` and :samp:`(v, u)` iff :samp:`(u, v)` is not a
95
- self-loop, and at least one of :samp:`(u, v)` and :samp:`(v, u)` exists
96
- in :samp:`G`.
97
-
98
- For each edge :samp:`(u, v)` in :samp:`R`, :samp:`R[u][v]['capacity']`
99
- is equal to the capacity of :samp:`(u, v)` in :samp:`G` if it exists
100
- in :samp:`G` or zero otherwise. If the capacity is infinite,
101
- :samp:`R[u][v]['capacity']` will have a high arbitrary finite value
102
- that does not affect the solution of the problem. This value is stored in
103
- :samp:`R.graph['inf']`. For each edge :samp:`(u, v)` in :samp:`R`,
104
- :samp:`R[u][v]['flow']` represents the flow function of :samp:`(u, v)` and
105
- satisfies :samp:`R[u][v]['flow'] == -R[v][u]['flow']`.
106
-
107
- The flow value, defined as the total flow into :samp:`t`, the sink, is
108
- stored in :samp:`R.graph['flow_value']`. Reachability to :samp:`t` using
109
- only edges :samp:`(u, v)` such that
110
- :samp:`R[u][v]['flow'] < R[u][v]['capacity']` induces a minimum
111
- :samp:`s`-:samp:`t` cut.
112
-
113
- Specific algorithms may store extra data in :samp:`R`.
114
-
115
- The function should supports an optional boolean parameter value_only. When
116
- True, it can optionally terminate the algorithm as soon as the maximum flow
117
- value and the minimum cut can be determined.
118
-
119
- Note that the resulting maximum flow may contain flow cycles,
120
- back-flow to the source, or some flow exiting the sink.
121
- These are possible if there are cycles in the network.
122
-
123
- Examples
124
- --------
125
- >>> G = nx.DiGraph()
126
- >>> G.add_edge("x", "a", capacity=3.0)
127
- >>> G.add_edge("x", "b", capacity=1.0)
128
- >>> G.add_edge("a", "c", capacity=3.0)
129
- >>> G.add_edge("b", "c", capacity=5.0)
130
- >>> G.add_edge("b", "d", capacity=4.0)
131
- >>> G.add_edge("d", "e", capacity=2.0)
132
- >>> G.add_edge("c", "y", capacity=2.0)
133
- >>> G.add_edge("e", "y", capacity=3.0)
134
-
135
- maximum_flow returns both the value of the maximum flow and a
136
- dictionary with all flows.
137
-
138
- >>> flow_value, flow_dict = nx.maximum_flow(G, "x", "y")
139
- >>> flow_value
140
- 3.0
141
- >>> print(flow_dict["x"]["b"])
142
- 1.0
143
-
144
- You can also use alternative algorithms for computing the
145
- maximum flow by using the flow_func parameter.
146
-
147
- >>> from networkx.algorithms.flow import shortest_augmenting_path
148
- >>> flow_value == nx.maximum_flow(G, "x", "y", flow_func=shortest_augmenting_path)[
149
- ... 0
150
- ... ]
151
- True
152
-
153
- """
154
- if flow_func is None:
155
- if kwargs:
156
- raise nx.NetworkXError(
157
- "You have to explicitly set a flow_func if"
158
- " you need to pass parameters via kwargs."
159
- )
160
- flow_func = default_flow_func
161
-
162
- if not callable(flow_func):
163
- raise nx.NetworkXError("flow_func has to be callable.")
164
-
165
- R = flow_func(flowG, _s, _t, capacity=capacity, value_only=False, **kwargs)
166
- flow_dict = build_flow_dict(flowG, R)
167
-
168
- return (R.graph["flow_value"], flow_dict)
169
-
170
-
171
- @nx._dispatchable(graphs="flowG", edge_attrs={"capacity": float("inf")})
172
- def maximum_flow_value(flowG, _s, _t, capacity="capacity", flow_func=None, **kwargs):
173
- """Find the value of maximum single-commodity flow.
174
-
175
- Parameters
176
- ----------
177
- flowG : NetworkX graph
178
- Edges of the graph are expected to have an attribute called
179
- 'capacity'. If this attribute is not present, the edge is
180
- considered to have infinite capacity.
181
-
182
- _s : node
183
- Source node for the flow.
184
-
185
- _t : node
186
- Sink node for the flow.
187
-
188
- capacity : string
189
- Edges of the graph G are expected to have an attribute capacity
190
- that indicates how much flow the edge can support. If this
191
- attribute is not present, the edge is considered to have
192
- infinite capacity. Default value: 'capacity'.
193
-
194
- flow_func : function
195
- A function for computing the maximum flow among a pair of nodes
196
- in a capacitated graph. The function has to accept at least three
197
- parameters: a Graph or Digraph, a source node, and a target node.
198
- And return a residual network that follows NetworkX conventions
199
- (see Notes). If flow_func is None, the default maximum
200
- flow function (:meth:`preflow_push`) is used. See below for
201
- alternative algorithms. The choice of the default function may change
202
- from version to version and should not be relied on. Default value:
203
- None.
204
-
205
- kwargs : Any other keyword parameter is passed to the function that
206
- computes the maximum flow.
207
-
208
- Returns
209
- -------
210
- flow_value : integer, float
211
- Value of the maximum flow, i.e., net outflow from the source.
212
-
213
- Raises
214
- ------
215
- NetworkXError
216
- The algorithm does not support MultiGraph and MultiDiGraph. If
217
- the input graph is an instance of one of these two classes, a
218
- NetworkXError is raised.
219
-
220
- NetworkXUnbounded
221
- If the graph has a path of infinite capacity, the value of a
222
- feasible flow on the graph is unbounded above and the function
223
- raises a NetworkXUnbounded.
224
-
225
- See also
226
- --------
227
- :meth:`maximum_flow`
228
- :meth:`minimum_cut`
229
- :meth:`minimum_cut_value`
230
- :meth:`edmonds_karp`
231
- :meth:`preflow_push`
232
- :meth:`shortest_augmenting_path`
233
-
234
- Notes
235
- -----
236
- The function used in the flow_func parameter has to return a residual
237
- network that follows NetworkX conventions:
238
-
239
- The residual network :samp:`R` from an input graph :samp:`G` has the
240
- same nodes as :samp:`G`. :samp:`R` is a DiGraph that contains a pair
241
- of edges :samp:`(u, v)` and :samp:`(v, u)` iff :samp:`(u, v)` is not a
242
- self-loop, and at least one of :samp:`(u, v)` and :samp:`(v, u)` exists
243
- in :samp:`G`.
244
-
245
- For each edge :samp:`(u, v)` in :samp:`R`, :samp:`R[u][v]['capacity']`
246
- is equal to the capacity of :samp:`(u, v)` in :samp:`G` if it exists
247
- in :samp:`G` or zero otherwise. If the capacity is infinite,
248
- :samp:`R[u][v]['capacity']` will have a high arbitrary finite value
249
- that does not affect the solution of the problem. This value is stored in
250
- :samp:`R.graph['inf']`. For each edge :samp:`(u, v)` in :samp:`R`,
251
- :samp:`R[u][v]['flow']` represents the flow function of :samp:`(u, v)` and
252
- satisfies :samp:`R[u][v]['flow'] == -R[v][u]['flow']`.
253
-
254
- The flow value, defined as the total flow into :samp:`t`, the sink, is
255
- stored in :samp:`R.graph['flow_value']`. Reachability to :samp:`t` using
256
- only edges :samp:`(u, v)` such that
257
- :samp:`R[u][v]['flow'] < R[u][v]['capacity']` induces a minimum
258
- :samp:`s`-:samp:`t` cut.
259
-
260
- Specific algorithms may store extra data in :samp:`R`.
261
-
262
- The function should supports an optional boolean parameter value_only. When
263
- True, it can optionally terminate the algorithm as soon as the maximum flow
264
- value and the minimum cut can be determined.
265
-
266
- Examples
267
- --------
268
- >>> G = nx.DiGraph()
269
- >>> G.add_edge("x", "a", capacity=3.0)
270
- >>> G.add_edge("x", "b", capacity=1.0)
271
- >>> G.add_edge("a", "c", capacity=3.0)
272
- >>> G.add_edge("b", "c", capacity=5.0)
273
- >>> G.add_edge("b", "d", capacity=4.0)
274
- >>> G.add_edge("d", "e", capacity=2.0)
275
- >>> G.add_edge("c", "y", capacity=2.0)
276
- >>> G.add_edge("e", "y", capacity=3.0)
277
-
278
- maximum_flow_value computes only the value of the
279
- maximum flow:
280
-
281
- >>> flow_value = nx.maximum_flow_value(G, "x", "y")
282
- >>> flow_value
283
- 3.0
284
-
285
- You can also use alternative algorithms for computing the
286
- maximum flow by using the flow_func parameter.
287
-
288
- >>> from networkx.algorithms.flow import shortest_augmenting_path
289
- >>> flow_value == nx.maximum_flow_value(
290
- ... G, "x", "y", flow_func=shortest_augmenting_path
291
- ... )
292
- True
293
-
294
- """
295
- if flow_func is None:
296
- if kwargs:
297
- raise nx.NetworkXError(
298
- "You have to explicitly set a flow_func if"
299
- " you need to pass parameters via kwargs."
300
- )
301
- flow_func = default_flow_func
302
-
303
- if not callable(flow_func):
304
- raise nx.NetworkXError("flow_func has to be callable.")
305
-
306
- R = flow_func(flowG, _s, _t, capacity=capacity, value_only=True, **kwargs)
307
-
308
- return R.graph["flow_value"]
309
-
310
-
311
- @nx._dispatchable(graphs="flowG", edge_attrs={"capacity": float("inf")})
312
- def minimum_cut(flowG, _s, _t, capacity="capacity", flow_func=None, **kwargs):
313
- """Compute the value and the node partition of a minimum (s, t)-cut.
314
-
315
- Use the max-flow min-cut theorem, i.e., the capacity of a minimum
316
- capacity cut is equal to the flow value of a maximum flow.
317
-
318
- Parameters
319
- ----------
320
- flowG : NetworkX graph
321
- Edges of the graph are expected to have an attribute called
322
- 'capacity'. If this attribute is not present, the edge is
323
- considered to have infinite capacity.
324
-
325
- _s : node
326
- Source node for the flow.
327
-
328
- _t : node
329
- Sink node for the flow.
330
-
331
- capacity : string
332
- Edges of the graph G are expected to have an attribute capacity
333
- that indicates how much flow the edge can support. If this
334
- attribute is not present, the edge is considered to have
335
- infinite capacity. Default value: 'capacity'.
336
-
337
- flow_func : function
338
- A function for computing the maximum flow among a pair of nodes
339
- in a capacitated graph. The function has to accept at least three
340
- parameters: a Graph or Digraph, a source node, and a target node.
341
- And return a residual network that follows NetworkX conventions
342
- (see Notes). If flow_func is None, the default maximum
343
- flow function (:meth:`preflow_push`) is used. See below for
344
- alternative algorithms. The choice of the default function may change
345
- from version to version and should not be relied on. Default value:
346
- None.
347
-
348
- kwargs : Any other keyword parameter is passed to the function that
349
- computes the maximum flow.
350
-
351
- Returns
352
- -------
353
- cut_value : integer, float
354
- Value of the minimum cut.
355
-
356
- partition : pair of node sets
357
- A partitioning of the nodes that defines a minimum cut.
358
-
359
- Raises
360
- ------
361
- NetworkXUnbounded
362
- If the graph has a path of infinite capacity, all cuts have
363
- infinite capacity and the function raises a NetworkXError.
364
-
365
- See also
366
- --------
367
- :meth:`maximum_flow`
368
- :meth:`maximum_flow_value`
369
- :meth:`minimum_cut_value`
370
- :meth:`edmonds_karp`
371
- :meth:`preflow_push`
372
- :meth:`shortest_augmenting_path`
373
-
374
- Notes
375
- -----
376
- The function used in the flow_func parameter has to return a residual
377
- network that follows NetworkX conventions:
378
-
379
- The residual network :samp:`R` from an input graph :samp:`G` has the
380
- same nodes as :samp:`G`. :samp:`R` is a DiGraph that contains a pair
381
- of edges :samp:`(u, v)` and :samp:`(v, u)` iff :samp:`(u, v)` is not a
382
- self-loop, and at least one of :samp:`(u, v)` and :samp:`(v, u)` exists
383
- in :samp:`G`.
384
-
385
- For each edge :samp:`(u, v)` in :samp:`R`, :samp:`R[u][v]['capacity']`
386
- is equal to the capacity of :samp:`(u, v)` in :samp:`G` if it exists
387
- in :samp:`G` or zero otherwise. If the capacity is infinite,
388
- :samp:`R[u][v]['capacity']` will have a high arbitrary finite value
389
- that does not affect the solution of the problem. This value is stored in
390
- :samp:`R.graph['inf']`. For each edge :samp:`(u, v)` in :samp:`R`,
391
- :samp:`R[u][v]['flow']` represents the flow function of :samp:`(u, v)` and
392
- satisfies :samp:`R[u][v]['flow'] == -R[v][u]['flow']`.
393
-
394
- The flow value, defined as the total flow into :samp:`t`, the sink, is
395
- stored in :samp:`R.graph['flow_value']`. Reachability to :samp:`t` using
396
- only edges :samp:`(u, v)` such that
397
- :samp:`R[u][v]['flow'] < R[u][v]['capacity']` induces a minimum
398
- :samp:`s`-:samp:`t` cut.
399
-
400
- Specific algorithms may store extra data in :samp:`R`.
401
-
402
- The function should supports an optional boolean parameter value_only. When
403
- True, it can optionally terminate the algorithm as soon as the maximum flow
404
- value and the minimum cut can be determined.
405
-
406
- Examples
407
- --------
408
- >>> G = nx.DiGraph()
409
- >>> G.add_edge("x", "a", capacity=3.0)
410
- >>> G.add_edge("x", "b", capacity=1.0)
411
- >>> G.add_edge("a", "c", capacity=3.0)
412
- >>> G.add_edge("b", "c", capacity=5.0)
413
- >>> G.add_edge("b", "d", capacity=4.0)
414
- >>> G.add_edge("d", "e", capacity=2.0)
415
- >>> G.add_edge("c", "y", capacity=2.0)
416
- >>> G.add_edge("e", "y", capacity=3.0)
417
-
418
- minimum_cut computes both the value of the
419
- minimum cut and the node partition:
420
-
421
- >>> cut_value, partition = nx.minimum_cut(G, "x", "y")
422
- >>> reachable, non_reachable = partition
423
-
424
- 'partition' here is a tuple with the two sets of nodes that define
425
- the minimum cut. You can compute the cut set of edges that induce
426
- the minimum cut as follows:
427
-
428
- >>> cutset = set()
429
- >>> for u, nbrs in ((n, G[n]) for n in reachable):
430
- ... cutset.update((u, v) for v in nbrs if v in non_reachable)
431
- >>> print(sorted(cutset))
432
- [('c', 'y'), ('x', 'b')]
433
- >>> cut_value == sum(G.edges[u, v]["capacity"] for (u, v) in cutset)
434
- True
435
-
436
- You can also use alternative algorithms for computing the
437
- minimum cut by using the flow_func parameter.
438
-
439
- >>> from networkx.algorithms.flow import shortest_augmenting_path
440
- >>> cut_value == nx.minimum_cut(G, "x", "y", flow_func=shortest_augmenting_path)[0]
441
- True
442
-
443
- """
444
- if flow_func is None:
445
- if kwargs:
446
- raise nx.NetworkXError(
447
- "You have to explicitly set a flow_func if"
448
- " you need to pass parameters via kwargs."
449
- )
450
- flow_func = default_flow_func
451
-
452
- if not callable(flow_func):
453
- raise nx.NetworkXError("flow_func has to be callable.")
454
-
455
- if kwargs.get("cutoff") is not None and flow_func is preflow_push:
456
- raise nx.NetworkXError("cutoff should not be specified.")
457
-
458
- R = flow_func(flowG, _s, _t, capacity=capacity, value_only=True, **kwargs)
459
- # Remove saturated edges from the residual network
460
- cutset = [(u, v, d) for u, v, d in R.edges(data=True) if d["flow"] == d["capacity"]]
461
- R.remove_edges_from(cutset)
462
-
463
- # Then, reachable and non reachable nodes from source in the
464
- # residual network form the node partition that defines
465
- # the minimum cut.
466
- non_reachable = set(nx.shortest_path_length(R, target=_t))
467
- partition = (set(flowG) - non_reachable, non_reachable)
468
- # Finally add again cutset edges to the residual network to make
469
- # sure that it is reusable.
470
- R.add_edges_from(cutset)
471
- return (R.graph["flow_value"], partition)
472
-
473
-
474
- @nx._dispatchable(graphs="flowG", edge_attrs={"capacity": float("inf")})
475
- def minimum_cut_value(flowG, _s, _t, capacity="capacity", flow_func=None, **kwargs):
476
- """Compute the value of a minimum (s, t)-cut.
477
-
478
- Use the max-flow min-cut theorem, i.e., the capacity of a minimum
479
- capacity cut is equal to the flow value of a maximum flow.
480
-
481
- Parameters
482
- ----------
483
- flowG : NetworkX graph
484
- Edges of the graph are expected to have an attribute called
485
- 'capacity'. If this attribute is not present, the edge is
486
- considered to have infinite capacity.
487
-
488
- _s : node
489
- Source node for the flow.
490
-
491
- _t : node
492
- Sink node for the flow.
493
-
494
- capacity : string
495
- Edges of the graph G are expected to have an attribute capacity
496
- that indicates how much flow the edge can support. If this
497
- attribute is not present, the edge is considered to have
498
- infinite capacity. Default value: 'capacity'.
499
-
500
- flow_func : function
501
- A function for computing the maximum flow among a pair of nodes
502
- in a capacitated graph. The function has to accept at least three
503
- parameters: a Graph or Digraph, a source node, and a target node.
504
- And return a residual network that follows NetworkX conventions
505
- (see Notes). If flow_func is None, the default maximum
506
- flow function (:meth:`preflow_push`) is used. See below for
507
- alternative algorithms. The choice of the default function may change
508
- from version to version and should not be relied on. Default value:
509
- None.
510
-
511
- kwargs : Any other keyword parameter is passed to the function that
512
- computes the maximum flow.
513
-
514
- Returns
515
- -------
516
- cut_value : integer, float
517
- Value of the minimum cut.
518
-
519
- Raises
520
- ------
521
- NetworkXUnbounded
522
- If the graph has a path of infinite capacity, all cuts have
523
- infinite capacity and the function raises a NetworkXError.
524
-
525
- See also
526
- --------
527
- :meth:`maximum_flow`
528
- :meth:`maximum_flow_value`
529
- :meth:`minimum_cut`
530
- :meth:`edmonds_karp`
531
- :meth:`preflow_push`
532
- :meth:`shortest_augmenting_path`
533
-
534
- Notes
535
- -----
536
- The function used in the flow_func parameter has to return a residual
537
- network that follows NetworkX conventions:
538
-
539
- The residual network :samp:`R` from an input graph :samp:`G` has the
540
- same nodes as :samp:`G`. :samp:`R` is a DiGraph that contains a pair
541
- of edges :samp:`(u, v)` and :samp:`(v, u)` iff :samp:`(u, v)` is not a
542
- self-loop, and at least one of :samp:`(u, v)` and :samp:`(v, u)` exists
543
- in :samp:`G`.
544
-
545
- For each edge :samp:`(u, v)` in :samp:`R`, :samp:`R[u][v]['capacity']`
546
- is equal to the capacity of :samp:`(u, v)` in :samp:`G` if it exists
547
- in :samp:`G` or zero otherwise. If the capacity is infinite,
548
- :samp:`R[u][v]['capacity']` will have a high arbitrary finite value
549
- that does not affect the solution of the problem. This value is stored in
550
- :samp:`R.graph['inf']`. For each edge :samp:`(u, v)` in :samp:`R`,
551
- :samp:`R[u][v]['flow']` represents the flow function of :samp:`(u, v)` and
552
- satisfies :samp:`R[u][v]['flow'] == -R[v][u]['flow']`.
553
-
554
- The flow value, defined as the total flow into :samp:`t`, the sink, is
555
- stored in :samp:`R.graph['flow_value']`. Reachability to :samp:`t` using
556
- only edges :samp:`(u, v)` such that
557
- :samp:`R[u][v]['flow'] < R[u][v]['capacity']` induces a minimum
558
- :samp:`s`-:samp:`t` cut.
559
-
560
- Specific algorithms may store extra data in :samp:`R`.
561
-
562
- The function should supports an optional boolean parameter value_only. When
563
- True, it can optionally terminate the algorithm as soon as the maximum flow
564
- value and the minimum cut can be determined.
565
-
566
- Examples
567
- --------
568
- >>> G = nx.DiGraph()
569
- >>> G.add_edge("x", "a", capacity=3.0)
570
- >>> G.add_edge("x", "b", capacity=1.0)
571
- >>> G.add_edge("a", "c", capacity=3.0)
572
- >>> G.add_edge("b", "c", capacity=5.0)
573
- >>> G.add_edge("b", "d", capacity=4.0)
574
- >>> G.add_edge("d", "e", capacity=2.0)
575
- >>> G.add_edge("c", "y", capacity=2.0)
576
- >>> G.add_edge("e", "y", capacity=3.0)
577
-
578
- minimum_cut_value computes only the value of the
579
- minimum cut:
580
-
581
- >>> cut_value = nx.minimum_cut_value(G, "x", "y")
582
- >>> cut_value
583
- 3.0
584
-
585
- You can also use alternative algorithms for computing the
586
- minimum cut by using the flow_func parameter.
587
-
588
- >>> from networkx.algorithms.flow import shortest_augmenting_path
589
- >>> cut_value == nx.minimum_cut_value(
590
- ... G, "x", "y", flow_func=shortest_augmenting_path
591
- ... )
592
- True
593
-
594
- """
595
- if flow_func is None:
596
- if kwargs:
597
- raise nx.NetworkXError(
598
- "You have to explicitly set a flow_func if"
599
- " you need to pass parameters via kwargs."
600
- )
601
- flow_func = default_flow_func
602
-
603
- if not callable(flow_func):
604
- raise nx.NetworkXError("flow_func has to be callable.")
605
-
606
- if kwargs.get("cutoff") is not None and flow_func is preflow_push:
607
- raise nx.NetworkXError("cutoff should not be specified.")
608
-
609
- R = flow_func(flowG, _s, _t, capacity=capacity, value_only=True, **kwargs)
610
-
611
- return R.graph["flow_value"]