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,241 +0,0 @@
1
- """
2
- Edmonds-Karp algorithm for maximum flow problems.
3
- """
4
-
5
- import networkx as nx
6
- from networkx.algorithms.flow.utils import build_residual_network
7
-
8
- __all__ = ["edmonds_karp"]
9
-
10
-
11
- def edmonds_karp_core(R, s, t, cutoff):
12
- """Implementation of the Edmonds-Karp algorithm."""
13
- R_nodes = R.nodes
14
- R_pred = R.pred
15
- R_succ = R.succ
16
-
17
- inf = R.graph["inf"]
18
-
19
- def augment(path):
20
- """Augment flow along a path from s to t."""
21
- # Determine the path residual capacity.
22
- flow = inf
23
- it = iter(path)
24
- u = next(it)
25
- for v in it:
26
- attr = R_succ[u][v]
27
- flow = min(flow, attr["capacity"] - attr["flow"])
28
- u = v
29
- if flow * 2 > inf:
30
- raise nx.NetworkXUnbounded("Infinite capacity path, flow unbounded above.")
31
- # Augment flow along the path.
32
- it = iter(path)
33
- u = next(it)
34
- for v in it:
35
- R_succ[u][v]["flow"] += flow
36
- R_succ[v][u]["flow"] -= flow
37
- u = v
38
- return flow
39
-
40
- def bidirectional_bfs():
41
- """Bidirectional breadth-first search for an augmenting path."""
42
- pred = {s: None}
43
- q_s = [s]
44
- succ = {t: None}
45
- q_t = [t]
46
- while True:
47
- q = []
48
- if len(q_s) <= len(q_t):
49
- for u in q_s:
50
- for v, attr in R_succ[u].items():
51
- if v not in pred and attr["flow"] < attr["capacity"]:
52
- pred[v] = u
53
- if v in succ:
54
- return v, pred, succ
55
- q.append(v)
56
- if not q:
57
- return None, None, None
58
- q_s = q
59
- else:
60
- for u in q_t:
61
- for v, attr in R_pred[u].items():
62
- if v not in succ and attr["flow"] < attr["capacity"]:
63
- succ[v] = u
64
- if v in pred:
65
- return v, pred, succ
66
- q.append(v)
67
- if not q:
68
- return None, None, None
69
- q_t = q
70
-
71
- # Look for shortest augmenting paths using breadth-first search.
72
- flow_value = 0
73
- while flow_value < cutoff:
74
- v, pred, succ = bidirectional_bfs()
75
- if pred is None:
76
- break
77
- path = [v]
78
- # Trace a path from s to v.
79
- u = v
80
- while u != s:
81
- u = pred[u]
82
- path.append(u)
83
- path.reverse()
84
- # Trace a path from v to t.
85
- u = v
86
- while u != t:
87
- u = succ[u]
88
- path.append(u)
89
- flow_value += augment(path)
90
-
91
- return flow_value
92
-
93
-
94
- def edmonds_karp_impl(G, s, t, capacity, residual, cutoff):
95
- """Implementation of the Edmonds-Karp algorithm."""
96
- if s not in G:
97
- raise nx.NetworkXError(f"node {str(s)} not in graph")
98
- if t not in G:
99
- raise nx.NetworkXError(f"node {str(t)} not in graph")
100
- if s == t:
101
- raise nx.NetworkXError("source and sink are the same node")
102
-
103
- if residual is None:
104
- R = build_residual_network(G, capacity)
105
- else:
106
- R = residual
107
-
108
- # Initialize/reset the residual network.
109
- for u in R:
110
- for e in R[u].values():
111
- e["flow"] = 0
112
-
113
- if cutoff is None:
114
- cutoff = float("inf")
115
- R.graph["flow_value"] = edmonds_karp_core(R, s, t, cutoff)
116
-
117
- return R
118
-
119
-
120
- @nx._dispatchable(edge_attrs={"capacity": float("inf")}, returns_graph=True)
121
- def edmonds_karp(
122
- G, s, t, capacity="capacity", residual=None, value_only=False, cutoff=None
123
- ):
124
- """Find a maximum single-commodity flow using the Edmonds-Karp algorithm.
125
-
126
- This function returns the residual network resulting after computing
127
- the maximum flow. See below for details about the conventions
128
- NetworkX uses for defining residual networks.
129
-
130
- This algorithm has a running time of $O(n m^2)$ for $n$ nodes and $m$
131
- edges.
132
-
133
-
134
- Parameters
135
- ----------
136
- G : NetworkX graph
137
- Edges of the graph are expected to have an attribute called
138
- 'capacity'. If this attribute is not present, the edge is
139
- considered to have infinite capacity.
140
-
141
- s : node
142
- Source node for the flow.
143
-
144
- t : node
145
- Sink node for the flow.
146
-
147
- capacity : string
148
- Edges of the graph G are expected to have an attribute capacity
149
- that indicates how much flow the edge can support. If this
150
- attribute is not present, the edge is considered to have
151
- infinite capacity. Default value: 'capacity'.
152
-
153
- residual : NetworkX graph
154
- Residual network on which the algorithm is to be executed. If None, a
155
- new residual network is created. Default value: None.
156
-
157
- value_only : bool
158
- If True compute only the value of the maximum flow. This parameter
159
- will be ignored by this algorithm because it is not applicable.
160
-
161
- cutoff : integer, float
162
- If specified, the algorithm will terminate when the flow value reaches
163
- or exceeds the cutoff. In this case, it may be unable to immediately
164
- determine a minimum cut. Default value: None.
165
-
166
- Returns
167
- -------
168
- R : NetworkX DiGraph
169
- Residual network after computing the maximum flow.
170
-
171
- Raises
172
- ------
173
- NetworkXError
174
- The algorithm does not support MultiGraph and MultiDiGraph. If
175
- the input graph is an instance of one of these two classes, a
176
- NetworkXError is raised.
177
-
178
- NetworkXUnbounded
179
- If the graph has a path of infinite capacity, the value of a
180
- feasible flow on the graph is unbounded above and the function
181
- raises a NetworkXUnbounded.
182
-
183
- See also
184
- --------
185
- :meth:`maximum_flow`
186
- :meth:`minimum_cut`
187
- :meth:`preflow_push`
188
- :meth:`shortest_augmenting_path`
189
-
190
- Notes
191
- -----
192
- The residual network :samp:`R` from an input graph :samp:`G` has the
193
- same nodes as :samp:`G`. :samp:`R` is a DiGraph that contains a pair
194
- of edges :samp:`(u, v)` and :samp:`(v, u)` iff :samp:`(u, v)` is not a
195
- self-loop, and at least one of :samp:`(u, v)` and :samp:`(v, u)` exists
196
- in :samp:`G`.
197
-
198
- For each edge :samp:`(u, v)` in :samp:`R`, :samp:`R[u][v]['capacity']`
199
- is equal to the capacity of :samp:`(u, v)` in :samp:`G` if it exists
200
- in :samp:`G` or zero otherwise. If the capacity is infinite,
201
- :samp:`R[u][v]['capacity']` will have a high arbitrary finite value
202
- that does not affect the solution of the problem. This value is stored in
203
- :samp:`R.graph['inf']`. For each edge :samp:`(u, v)` in :samp:`R`,
204
- :samp:`R[u][v]['flow']` represents the flow function of :samp:`(u, v)` and
205
- satisfies :samp:`R[u][v]['flow'] == -R[v][u]['flow']`.
206
-
207
- The flow value, defined as the total flow into :samp:`t`, the sink, is
208
- stored in :samp:`R.graph['flow_value']`. If :samp:`cutoff` is not
209
- specified, reachability to :samp:`t` using only edges :samp:`(u, v)` such
210
- that :samp:`R[u][v]['flow'] < R[u][v]['capacity']` induces a minimum
211
- :samp:`s`-:samp:`t` cut.
212
-
213
- Examples
214
- --------
215
- >>> from networkx.algorithms.flow import edmonds_karp
216
-
217
- The functions that implement flow algorithms and output a residual
218
- network, such as this one, are not imported to the base NetworkX
219
- namespace, so you have to explicitly import them from the flow package.
220
-
221
- >>> G = nx.DiGraph()
222
- >>> G.add_edge("x", "a", capacity=3.0)
223
- >>> G.add_edge("x", "b", capacity=1.0)
224
- >>> G.add_edge("a", "c", capacity=3.0)
225
- >>> G.add_edge("b", "c", capacity=5.0)
226
- >>> G.add_edge("b", "d", capacity=4.0)
227
- >>> G.add_edge("d", "e", capacity=2.0)
228
- >>> G.add_edge("c", "y", capacity=2.0)
229
- >>> G.add_edge("e", "y", capacity=3.0)
230
- >>> R = edmonds_karp(G, "x", "y")
231
- >>> flow_value = nx.maximum_flow_value(G, "x", "y")
232
- >>> flow_value
233
- 3.0
234
- >>> flow_value == R.graph["flow_value"]
235
- True
236
-
237
- """
238
- R = edmonds_karp_impl(G, s, t, capacity, residual, cutoff)
239
- R.graph["algorithm"] = "edmonds_karp"
240
- nx._clear_cache(R)
241
- return R
@@ -1,178 +0,0 @@
1
- """
2
- Gomory-Hu tree of undirected Graphs.
3
- """
4
-
5
- import networkx as nx
6
- from networkx.utils import not_implemented_for
7
-
8
- from .edmondskarp import edmonds_karp
9
- from .utils import build_residual_network
10
-
11
- default_flow_func = edmonds_karp
12
-
13
- __all__ = ["gomory_hu_tree"]
14
-
15
-
16
- @not_implemented_for("directed")
17
- @nx._dispatchable(edge_attrs={"capacity": float("inf")}, returns_graph=True)
18
- def gomory_hu_tree(G, capacity="capacity", flow_func=None):
19
- r"""Returns the Gomory-Hu tree of an undirected graph G.
20
-
21
- A Gomory-Hu tree of an undirected graph with capacities is a
22
- weighted tree that represents the minimum s-t cuts for all s-t
23
- pairs in the graph.
24
-
25
- It only requires `n-1` minimum cut computations instead of the
26
- obvious `n(n-1)/2`. The tree represents all s-t cuts as the
27
- minimum cut value among any pair of nodes is the minimum edge
28
- weight in the shortest path between the two nodes in the
29
- Gomory-Hu tree.
30
-
31
- The Gomory-Hu tree also has the property that removing the
32
- edge with the minimum weight in the shortest path between
33
- any two nodes leaves two connected components that form
34
- a partition of the nodes in G that defines the minimum s-t
35
- cut.
36
-
37
- See Examples section below for details.
38
-
39
- Parameters
40
- ----------
41
- G : NetworkX graph
42
- Undirected graph
43
-
44
- capacity : string
45
- Edges of the graph G are expected to have an attribute capacity
46
- that indicates how much flow the edge can support. If this
47
- attribute is not present, the edge is considered to have
48
- infinite capacity. Default value: 'capacity'.
49
-
50
- flow_func : function
51
- Function to perform the underlying flow computations. Default value
52
- :func:`edmonds_karp`. This function performs better in sparse graphs
53
- with right tailed degree distributions.
54
- :func:`shortest_augmenting_path` will perform better in denser
55
- graphs.
56
-
57
- Returns
58
- -------
59
- Tree : NetworkX graph
60
- A NetworkX graph representing the Gomory-Hu tree of the input graph.
61
-
62
- Raises
63
- ------
64
- NetworkXNotImplemented
65
- Raised if the input graph is directed.
66
-
67
- NetworkXError
68
- Raised if the input graph is an empty Graph.
69
-
70
- Examples
71
- --------
72
- >>> G = nx.karate_club_graph()
73
- >>> nx.set_edge_attributes(G, 1, "capacity")
74
- >>> T = nx.gomory_hu_tree(G)
75
- >>> # The value of the minimum cut between any pair
76
- ... # of nodes in G is the minimum edge weight in the
77
- ... # shortest path between the two nodes in the
78
- ... # Gomory-Hu tree.
79
- ... def minimum_edge_weight_in_shortest_path(T, u, v):
80
- ... path = nx.shortest_path(T, u, v, weight="weight")
81
- ... return min((T[u][v]["weight"], (u, v)) for (u, v) in zip(path, path[1:]))
82
- >>> u, v = 0, 33
83
- >>> cut_value, edge = minimum_edge_weight_in_shortest_path(T, u, v)
84
- >>> cut_value
85
- 10
86
- >>> nx.minimum_cut_value(G, u, v)
87
- 10
88
- >>> # The Gomory-Hu tree also has the property that removing the
89
- ... # edge with the minimum weight in the shortest path between
90
- ... # any two nodes leaves two connected components that form
91
- ... # a partition of the nodes in G that defines the minimum s-t
92
- ... # cut.
93
- ... cut_value, edge = minimum_edge_weight_in_shortest_path(T, u, v)
94
- >>> T.remove_edge(*edge)
95
- >>> U, V = list(nx.connected_components(T))
96
- >>> # Thus U and V form a partition that defines a minimum cut
97
- ... # between u and v in G. You can compute the edge cut set,
98
- ... # that is, the set of edges that if removed from G will
99
- ... # disconnect u from v in G, with this information:
100
- ... cutset = set()
101
- >>> for x, nbrs in ((n, G[n]) for n in U):
102
- ... cutset.update((x, y) for y in nbrs if y in V)
103
- >>> # Because we have set the capacities of all edges to 1
104
- ... # the cutset contains ten edges
105
- ... len(cutset)
106
- 10
107
- >>> # You can use any maximum flow algorithm for the underlying
108
- ... # flow computations using the argument flow_func
109
- ... from networkx.algorithms import flow
110
- >>> T = nx.gomory_hu_tree(G, flow_func=flow.boykov_kolmogorov)
111
- >>> cut_value, edge = minimum_edge_weight_in_shortest_path(T, u, v)
112
- >>> cut_value
113
- 10
114
- >>> nx.minimum_cut_value(G, u, v, flow_func=flow.boykov_kolmogorov)
115
- 10
116
-
117
- Notes
118
- -----
119
- This implementation is based on Gusfield approach [1]_ to compute
120
- Gomory-Hu trees, which does not require node contractions and has
121
- the same computational complexity than the original method.
122
-
123
- See also
124
- --------
125
- :func:`minimum_cut`
126
- :func:`maximum_flow`
127
-
128
- References
129
- ----------
130
- .. [1] Gusfield D: Very simple methods for all pairs network flow analysis.
131
- SIAM J Comput 19(1):143-155, 1990.
132
-
133
- """
134
- if flow_func is None:
135
- flow_func = default_flow_func
136
-
137
- if len(G) == 0: # empty graph
138
- msg = "Empty Graph does not have a Gomory-Hu tree representation"
139
- raise nx.NetworkXError(msg)
140
-
141
- # Start the tree as a star graph with an arbitrary node at the center
142
- tree = {}
143
- labels = {}
144
- iter_nodes = iter(G)
145
- root = next(iter_nodes)
146
- for n in iter_nodes:
147
- tree[n] = root
148
-
149
- # Reuse residual network
150
- R = build_residual_network(G, capacity)
151
-
152
- # For all the leaves in the star graph tree (that is n-1 nodes).
153
- for source in tree:
154
- # Find neighbor in the tree
155
- target = tree[source]
156
- # compute minimum cut
157
- cut_value, partition = nx.minimum_cut(
158
- G, source, target, capacity=capacity, flow_func=flow_func, residual=R
159
- )
160
- labels[(source, target)] = cut_value
161
- # Update the tree
162
- # Source will always be in partition[0] and target in partition[1]
163
- for node in partition[0]:
164
- if node != source and node in tree and tree[node] == target:
165
- tree[node] = source
166
- labels[node, source] = labels.get((node, target), cut_value)
167
- #
168
- if target != root and tree[target] in partition[0]:
169
- labels[source, tree[target]] = labels[target, tree[target]]
170
- labels[target, source] = cut_value
171
- tree[source] = tree[target]
172
- tree[target] = source
173
-
174
- # Build the tree
175
- T = nx.Graph()
176
- T.add_nodes_from(G)
177
- T.add_weighted_edges_from(((u, v, labels[u, v]) for u, v in tree.items()))
178
- return T