okstra 0.130.4 → 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 (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 +1722 -98
  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,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"]