okstra 0.107.2 → 0.109.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 (649) hide show
  1. package/package.json +1 -1
  2. package/runtime/BUILD.json +2 -2
  3. package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
  4. package/runtime/prompts/profiles/_common-contract.md +3 -2
  5. package/runtime/python/okstra_ctl/graphify_cmd.py +225 -0
  6. package/runtime/python/okstra_ctl/resolve_task_key.py +15 -9
  7. package/runtime/python/okstra_ctl/session.py +44 -0
  8. package/runtime/python/okstra_project/__init__.py +2 -0
  9. package/runtime/python/okstra_project/state.py +36 -0
  10. package/runtime/python/okstra_token_usage/claude.py +15 -9
  11. package/runtime/python/okstra_token_usage/cli.py +23 -0
  12. package/runtime/python/okstra_token_usage/collect.py +163 -4
  13. package/runtime/python/okstra_vendor/__init__.py +41 -0
  14. package/runtime/python/okstra_vendor/graphify/.vendored-version +1 -0
  15. package/runtime/python/okstra_vendor/graphify/__init__.py +28 -0
  16. package/runtime/python/okstra_vendor/graphify/__main__.py +1371 -0
  17. package/runtime/python/okstra_vendor/graphify/analyze.py +540 -0
  18. package/runtime/python/okstra_vendor/graphify/benchmark.py +129 -0
  19. package/runtime/python/okstra_vendor/graphify/build.py +107 -0
  20. package/runtime/python/okstra_vendor/graphify/cache.py +169 -0
  21. package/runtime/python/okstra_vendor/graphify/cluster.py +137 -0
  22. package/runtime/python/okstra_vendor/graphify/detect.py +510 -0
  23. package/runtime/python/okstra_vendor/graphify/export.py +1014 -0
  24. package/runtime/python/okstra_vendor/graphify/extract.py +3277 -0
  25. package/runtime/python/okstra_vendor/graphify/hooks.py +220 -0
  26. package/runtime/python/okstra_vendor/graphify/ingest.py +297 -0
  27. package/runtime/python/okstra_vendor/graphify/manifest.py +4 -0
  28. package/runtime/python/okstra_vendor/graphify/report.py +175 -0
  29. package/runtime/python/okstra_vendor/graphify/security.py +203 -0
  30. package/runtime/python/okstra_vendor/graphify/serve.py +373 -0
  31. package/runtime/python/okstra_vendor/graphify/skill-aider.md +1184 -0
  32. package/runtime/python/okstra_vendor/graphify/skill-claw.md +1184 -0
  33. package/runtime/python/okstra_vendor/graphify/skill-codex.md +1242 -0
  34. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +1268 -0
  35. package/runtime/python/okstra_vendor/graphify/skill-droid.md +1239 -0
  36. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +1183 -0
  37. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +1238 -0
  38. package/runtime/python/okstra_vendor/graphify/skill-trae.md +1208 -0
  39. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +253 -0
  40. package/runtime/python/okstra_vendor/graphify/skill-windows.md +1245 -0
  41. package/runtime/python/okstra_vendor/graphify/skill.md +1319 -0
  42. package/runtime/python/okstra_vendor/graphify/transcribe.py +182 -0
  43. package/runtime/python/okstra_vendor/graphify/validate.py +72 -0
  44. package/runtime/python/okstra_vendor/graphify/watch.py +188 -0
  45. package/runtime/python/okstra_vendor/graphify/wiki.py +214 -0
  46. package/runtime/python/okstra_vendor/networkx/__init__.py +62 -0
  47. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +134 -0
  48. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +26 -0
  49. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +259 -0
  50. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +71 -0
  51. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +412 -0
  52. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +396 -0
  53. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +150 -0
  54. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +149 -0
  55. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +369 -0
  56. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +44 -0
  57. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +143 -0
  58. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +53 -0
  59. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +265 -0
  60. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  61. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +41 -0
  62. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +112 -0
  63. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +199 -0
  64. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +146 -0
  65. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +59 -0
  66. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +78 -0
  67. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +303 -0
  68. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +8 -0
  69. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +94 -0
  70. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +31 -0
  71. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +306 -0
  72. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +1014 -0
  73. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +274 -0
  74. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +68 -0
  75. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +1508 -0
  76. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +255 -0
  77. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +83 -0
  78. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +5 -0
  79. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +122 -0
  80. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +302 -0
  81. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +255 -0
  82. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +160 -0
  83. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +127 -0
  84. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  85. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +81 -0
  86. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +143 -0
  87. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +122 -0
  88. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +174 -0
  89. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +107 -0
  90. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +87 -0
  91. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +164 -0
  92. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +88 -0
  93. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +322 -0
  94. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +290 -0
  95. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +289 -0
  96. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +57 -0
  97. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +360 -0
  98. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +105 -0
  99. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +603 -0
  100. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +316 -0
  101. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +590 -0
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +232 -0
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +526 -0
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +112 -0
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +69 -0
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +125 -0
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +192 -0
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +84 -0
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +33 -0
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +240 -0
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +334 -0
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +407 -0
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +218 -0
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +327 -0
  116. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +138 -0
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +409 -0
  118. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +35 -0
  119. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +80 -0
  120. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +168 -0
  121. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +205 -0
  122. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +164 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +20 -0
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +591 -0
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +236 -0
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +282 -0
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +364 -0
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +227 -0
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +96 -0
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +150 -0
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +107 -0
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +357 -0
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +130 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +787 -0
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +88 -0
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +331 -0
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +150 -0
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +200 -0
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +128 -0
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +209 -0
  141. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +141 -0
  142. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +361 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  144. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +923 -0
  145. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +354 -0
  146. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +274 -0
  147. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +259 -0
  148. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +147 -0
  149. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +43 -0
  150. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +144 -0
  151. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +73 -0
  152. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +186 -0
  153. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +277 -0
  154. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +122 -0
  155. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +345 -0
  156. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +220 -0
  157. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +344 -0
  158. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +87 -0
  159. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +140 -0
  160. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +82 -0
  161. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +110 -0
  162. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +302 -0
  163. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +64 -0
  164. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +181 -0
  165. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +95 -0
  166. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +172 -0
  167. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +443 -0
  168. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +818 -0
  169. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +732 -0
  170. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +4 -0
  171. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +505 -0
  172. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +565 -0
  173. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  174. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +863 -0
  175. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +163 -0
  176. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +28 -0
  177. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +153 -0
  178. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +354 -0
  179. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +171 -0
  180. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +30 -0
  181. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +216 -0
  182. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +79 -0
  183. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +338 -0
  184. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +162 -0
  185. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +220 -0
  186. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +384 -0
  187. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +227 -0
  188. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +452 -0
  189. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +347 -0
  190. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  191. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +147 -0
  192. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +157 -0
  193. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +85 -0
  194. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +106 -0
  195. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +91 -0
  196. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +241 -0
  197. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +138 -0
  198. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +76 -0
  199. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +264 -0
  200. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +152 -0
  201. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +340 -0
  202. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +139 -0
  203. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +26 -0
  204. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +6 -0
  205. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +115 -0
  206. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +394 -0
  207. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +282 -0
  208. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +71 -0
  209. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +359 -0
  210. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  211. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +70 -0
  212. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +248 -0
  213. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +138 -0
  214. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +55 -0
  215. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +193 -0
  216. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +96 -0
  217. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +196 -0
  218. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +11 -0
  219. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +811 -0
  220. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +616 -0
  221. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +408 -0
  222. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +1270 -0
  223. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +592 -0
  224. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +220 -0
  225. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +235 -0
  226. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +152 -0
  227. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  228. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +421 -0
  229. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +309 -0
  230. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +249 -0
  231. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +502 -0
  232. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +488 -0
  233. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +323 -0
  234. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +280 -0
  235. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +102 -0
  236. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +88 -0
  237. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +588 -0
  238. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +142 -0
  239. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +416 -0
  240. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +1234 -0
  241. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +677 -0
  242. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +1392 -0
  243. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +1095 -0
  244. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +272 -0
  245. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +142 -0
  246. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +268 -0
  247. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +167 -0
  248. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +470 -0
  249. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +11 -0
  250. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +370 -0
  251. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +407 -0
  252. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +238 -0
  253. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +241 -0
  254. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +178 -0
  255. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +611 -0
  256. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +356 -0
  257. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +662 -0
  258. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +425 -0
  259. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +300 -0
  260. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  261. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  262. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  263. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  264. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +128 -0
  265. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +573 -0
  266. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +155 -0
  267. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +475 -0
  268. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +481 -0
  269. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  270. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +194 -0
  271. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +435 -0
  272. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +483 -0
  273. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +57 -0
  274. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +196 -0
  275. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +107 -0
  276. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +7 -0
  277. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +1306 -0
  278. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +336 -0
  279. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +1262 -0
  280. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +352 -0
  281. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +308 -0
  282. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  283. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  284. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  285. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  286. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  287. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +719 -0
  288. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +103 -0
  289. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +490 -0
  290. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +64 -0
  291. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +212 -0
  292. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +202 -0
  293. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +1655 -0
  294. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +3118 -0
  295. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +196 -0
  296. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +264 -0
  297. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +1102 -0
  298. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +192 -0
  299. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +2 -0
  300. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +337 -0
  301. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +498 -0
  302. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  303. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +77 -0
  304. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +213 -0
  305. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +687 -0
  306. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +280 -0
  307. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +1148 -0
  308. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +27 -0
  309. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +738 -0
  310. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +544 -0
  311. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +78 -0
  312. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +59 -0
  313. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +219 -0
  314. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +155 -0
  315. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +4 -0
  316. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +324 -0
  317. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +468 -0
  318. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +633 -0
  319. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  320. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +328 -0
  321. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +451 -0
  322. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +491 -0
  323. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +55 -0
  324. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +77 -0
  325. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +73 -0
  326. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +464 -0
  327. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +1463 -0
  328. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +306 -0
  329. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +98 -0
  330. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +167 -0
  331. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +138 -0
  332. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +5 -0
  333. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +239 -0
  334. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +264 -0
  335. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +716 -0
  336. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  337. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +254 -0
  338. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +212 -0
  339. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +88 -0
  340. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +511 -0
  341. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +149 -0
  342. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +983 -0
  343. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +625 -0
  344. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +2542 -0
  345. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +2107 -0
  346. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +966 -0
  347. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +404 -0
  348. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +30 -0
  349. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +296 -0
  350. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +374 -0
  351. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +564 -0
  352. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +406 -0
  353. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  354. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +23 -0
  355. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +154 -0
  356. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +144 -0
  357. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +109 -0
  358. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +136 -0
  359. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +129 -0
  360. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +300 -0
  361. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +678 -0
  362. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +80 -0
  363. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +266 -0
  364. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +85 -0
  365. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +171 -0
  366. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +984 -0
  367. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +340 -0
  368. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +835 -0
  369. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +831 -0
  370. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +85 -0
  371. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +299 -0
  372. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +115 -0
  373. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +58 -0
  374. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +314 -0
  375. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +872 -0
  376. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +163 -0
  377. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +46 -0
  378. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +24 -0
  379. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +26 -0
  380. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +615 -0
  381. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +459 -0
  382. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +556 -0
  383. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +179 -0
  384. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +62 -0
  385. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +15 -0
  386. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +140 -0
  387. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +60 -0
  388. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +27 -0
  389. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +274 -0
  390. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +556 -0
  391. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +57 -0
  392. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +37 -0
  393. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +88 -0
  394. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +149 -0
  395. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +1158 -0
  396. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +803 -0
  397. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +76 -0
  398. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +8 -0
  399. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +138 -0
  400. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +191 -0
  401. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +642 -0
  402. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +179 -0
  403. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +270 -0
  404. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +431 -0
  405. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +161 -0
  406. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +248 -0
  407. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +41 -0
  408. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +103 -0
  409. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +54 -0
  410. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +157 -0
  411. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +981 -0
  412. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +142 -0
  413. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +406 -0
  414. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +5 -0
  415. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +90 -0
  416. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +576 -0
  417. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +529 -0
  418. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +185 -0
  419. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +182 -0
  420. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  421. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +25 -0
  422. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +203 -0
  423. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +307 -0
  424. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +147 -0
  425. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +131 -0
  426. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +7 -0
  427. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +1042 -0
  428. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +413 -0
  429. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +88 -0
  430. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +219 -0
  431. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +1281 -0
  432. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +106 -0
  433. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +273 -0
  434. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  435. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +624 -0
  436. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +114 -0
  437. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +79 -0
  438. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +99 -0
  439. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +934 -0
  440. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +53 -0
  441. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +174 -0
  442. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +500 -0
  443. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +76 -0
  444. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +86 -0
  445. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +77 -0
  446. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +278 -0
  447. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +13 -0
  448. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +435 -0
  449. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +1363 -0
  450. package/runtime/python/okstra_vendor/networkx/classes/filters.py +95 -0
  451. package/runtime/python/okstra_vendor/networkx/classes/function.py +1549 -0
  452. package/runtime/python/okstra_vendor/networkx/classes/graph.py +2082 -0
  453. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +269 -0
  454. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +977 -0
  455. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +1294 -0
  456. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +1447 -0
  457. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  458. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +192 -0
  459. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +476 -0
  460. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +362 -0
  461. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +331 -0
  462. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +110 -0
  463. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +177 -0
  464. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +1045 -0
  465. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +950 -0
  466. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +12 -0
  467. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +349 -0
  468. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +459 -0
  469. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +528 -0
  470. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +1421 -0
  471. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +131 -0
  472. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +371 -0
  473. package/runtime/python/okstra_vendor/networkx/conftest.py +261 -0
  474. package/runtime/python/okstra_vendor/networkx/convert.py +502 -0
  475. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +1314 -0
  476. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +7 -0
  477. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +2036 -0
  478. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +470 -0
  479. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +570 -0
  480. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +361 -0
  481. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +2978 -0
  482. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  483. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  484. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  485. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  486. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  487. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  488. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  489. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +237 -0
  490. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +229 -0
  491. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +285 -0
  492. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +631 -0
  493. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +146 -0
  494. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +1582 -0
  495. package/runtime/python/okstra_vendor/networkx/exception.py +131 -0
  496. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +34 -0
  497. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  498. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +227 -0
  499. package/runtime/python/okstra_vendor/networkx/generators/classic.py +1091 -0
  500. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +68 -0
  501. package/runtime/python/okstra_vendor/networkx/generators/community.py +1070 -0
  502. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +886 -0
  503. package/runtime/python/okstra_vendor/networkx/generators/directed.py +572 -0
  504. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +174 -0
  505. package/runtime/python/okstra_vendor/networkx/generators/ego.py +66 -0
  506. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +499 -0
  507. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +1037 -0
  508. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +163 -0
  509. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +443 -0
  510. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +125 -0
  511. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +70 -0
  512. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +664 -0
  513. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +405 -0
  514. package/runtime/python/okstra_vendor/networkx/generators/line.py +501 -0
  515. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +110 -0
  516. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +259 -0
  517. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +117 -0
  518. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +1416 -0
  519. package/runtime/python/okstra_vendor/networkx/generators/small.py +1070 -0
  520. package/runtime/python/okstra_vendor/networkx/generators/social.py +554 -0
  521. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +120 -0
  522. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +54 -0
  523. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +131 -0
  524. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  525. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +75 -0
  526. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +642 -0
  527. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +20 -0
  528. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +362 -0
  529. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +224 -0
  530. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +189 -0
  531. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +103 -0
  532. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +39 -0
  533. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +182 -0
  534. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +488 -0
  535. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +133 -0
  536. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +221 -0
  537. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +28 -0
  538. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +144 -0
  539. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +125 -0
  540. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +264 -0
  541. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +316 -0
  542. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +30 -0
  543. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +82 -0
  544. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +33 -0
  545. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +495 -0
  546. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +220 -0
  547. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +49 -0
  548. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +72 -0
  549. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +92 -0
  550. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +64 -0
  551. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +195 -0
  552. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +15 -0
  553. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +74 -0
  554. package/runtime/python/okstra_vendor/networkx/generators/trees.py +1070 -0
  555. package/runtime/python/okstra_vendor/networkx/generators/triads.py +94 -0
  556. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +188 -0
  557. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +13 -0
  558. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +650 -0
  559. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +466 -0
  560. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +77 -0
  561. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +168 -0
  562. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +512 -0
  563. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +166 -0
  564. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +186 -0
  565. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  566. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +400 -0
  567. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +108 -0
  568. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +40 -0
  569. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +275 -0
  570. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +334 -0
  571. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +86 -0
  572. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +70 -0
  573. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +17 -0
  574. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +330 -0
  575. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +489 -0
  576. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +1084 -0
  577. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +879 -0
  578. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +427 -0
  579. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +1053 -0
  580. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +19 -0
  581. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +156 -0
  582. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +190 -0
  583. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +261 -0
  584. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  585. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +78 -0
  586. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +78 -0
  587. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +109 -0
  588. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +48 -0
  589. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +137 -0
  590. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +108 -0
  591. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +393 -0
  592. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +113 -0
  593. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +286 -0
  594. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +379 -0
  595. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  596. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +354 -0
  597. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +318 -0
  598. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +612 -0
  599. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +744 -0
  600. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +181 -0
  601. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +1531 -0
  602. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +30 -0
  603. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +63 -0
  604. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +128 -0
  605. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +166 -0
  606. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +1742 -0
  607. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +851 -0
  608. package/runtime/python/okstra_vendor/networkx/relabel.py +285 -0
  609. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  610. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +248 -0
  611. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +321 -0
  612. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +531 -0
  613. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +349 -0
  614. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +281 -0
  615. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +40 -0
  616. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +11 -0
  617. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +96 -0
  618. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +349 -0
  619. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +8 -0
  620. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +8 -0
  621. package/runtime/python/okstra_vendor/networkx/utils/backends.py +2171 -0
  622. package/runtime/python/okstra_vendor/networkx/utils/configs.py +396 -0
  623. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +1233 -0
  624. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +338 -0
  625. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +297 -0
  626. package/runtime/python/okstra_vendor/networkx/utils/misc.py +703 -0
  627. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +198 -0
  628. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +159 -0
  629. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  630. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +11 -0
  631. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +225 -0
  632. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +263 -0
  633. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +510 -0
  634. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +131 -0
  635. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +268 -0
  636. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +393 -0
  637. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +53 -0
  638. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +63 -0
  639. package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +55 -0
  640. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +106 -0
  641. package/runtime/skills/okstra-graphify/SKILL.md +161 -0
  642. package/runtime/skills/okstra-inspect/SKILL.md +17 -9
  643. package/runtime/templates/reports/settings.template.json +4 -0
  644. package/runtime/validators/forbidden_actions.py +8 -2
  645. package/runtime/validators/validate_session_conformance.py +26 -5
  646. package/src/cli-registry.mjs +7 -0
  647. package/src/commands/graphify.mjs +32 -0
  648. package/src/commands/lifecycle/doctor.mjs +9 -0
  649. package/src/lib/skill-catalog.mjs +1 -0
@@ -0,0 +1,811 @@
1
+ """
2
+ Flow based connectivity algorithms
3
+ """
4
+
5
+ import itertools
6
+ from operator import itemgetter
7
+
8
+ import networkx as nx
9
+
10
+ # Define the default maximum flow function to use in all flow based
11
+ # connectivity algorithms.
12
+ from networkx.algorithms.flow import (
13
+ boykov_kolmogorov,
14
+ build_residual_network,
15
+ dinitz,
16
+ edmonds_karp,
17
+ preflow_push,
18
+ shortest_augmenting_path,
19
+ )
20
+
21
+ from .utils import build_auxiliary_edge_connectivity, build_auxiliary_node_connectivity
22
+
23
+ default_flow_func = edmonds_karp
24
+
25
+ __all__ = [
26
+ "average_node_connectivity",
27
+ "local_node_connectivity",
28
+ "node_connectivity",
29
+ "local_edge_connectivity",
30
+ "edge_connectivity",
31
+ "all_pairs_node_connectivity",
32
+ ]
33
+
34
+
35
+ @nx._dispatchable(graphs={"G": 0, "auxiliary?": 4}, preserve_graph_attrs={"auxiliary"})
36
+ def local_node_connectivity(
37
+ G, s, t, flow_func=None, auxiliary=None, residual=None, cutoff=None
38
+ ):
39
+ r"""Computes local node connectivity for nodes s and t.
40
+
41
+ Local node connectivity for two non adjacent nodes s and t is the
42
+ minimum number of nodes that must be removed (along with their incident
43
+ edges) to disconnect them.
44
+
45
+ This is a flow based implementation of node connectivity. We compute the
46
+ maximum flow on an auxiliary digraph build from the original input
47
+ graph (see below for details).
48
+
49
+ Parameters
50
+ ----------
51
+ G : NetworkX graph
52
+ Undirected graph
53
+
54
+ s : node
55
+ Source node
56
+
57
+ t : node
58
+ Target node
59
+
60
+ flow_func : function
61
+ A function for computing the maximum flow among a pair of nodes.
62
+ The function has to accept at least three parameters: a Digraph,
63
+ a source node, and a target node. And return a residual network
64
+ that follows NetworkX conventions (see :meth:`maximum_flow` for
65
+ details). If flow_func is None, the default maximum flow function
66
+ (:meth:`edmonds_karp`) is used. See below for details. The choice
67
+ of the default function may change from version to version and
68
+ should not be relied on. Default value: None.
69
+
70
+ auxiliary : NetworkX DiGraph
71
+ Auxiliary digraph to compute flow based node connectivity. It has
72
+ to have a graph attribute called mapping with a dictionary mapping
73
+ node names in G and in the auxiliary digraph. If provided
74
+ it will be reused instead of recreated. Default value: None.
75
+
76
+ residual : NetworkX DiGraph
77
+ Residual network to compute maximum flow. If provided it will be
78
+ reused instead of recreated. Default value: None.
79
+
80
+ cutoff : integer, float, or None (default: None)
81
+ If specified, the maximum flow algorithm will terminate when the
82
+ flow value reaches or exceeds the cutoff. This only works for flows
83
+ that support the cutoff parameter (most do) and is ignored otherwise.
84
+
85
+ Returns
86
+ -------
87
+ K : integer
88
+ local node connectivity for nodes s and t
89
+
90
+ Examples
91
+ --------
92
+ This function is not imported in the base NetworkX namespace, so you
93
+ have to explicitly import it from the connectivity package:
94
+
95
+ >>> from networkx.algorithms.connectivity import local_node_connectivity
96
+
97
+ We use in this example the platonic icosahedral graph, which has node
98
+ connectivity 5.
99
+
100
+ >>> G = nx.icosahedral_graph()
101
+ >>> local_node_connectivity(G, 0, 6)
102
+ 5
103
+
104
+ If you need to compute local connectivity on several pairs of
105
+ nodes in the same graph, it is recommended that you reuse the
106
+ data structures that NetworkX uses in the computation: the
107
+ auxiliary digraph for node connectivity, and the residual
108
+ network for the underlying maximum flow computation.
109
+
110
+ Example of how to compute local node connectivity among
111
+ all pairs of nodes of the platonic icosahedral graph reusing
112
+ the data structures.
113
+
114
+ >>> import itertools
115
+ >>> # You also have to explicitly import the function for
116
+ >>> # building the auxiliary digraph from the connectivity package
117
+ >>> from networkx.algorithms.connectivity import build_auxiliary_node_connectivity
118
+ >>> H = build_auxiliary_node_connectivity(G)
119
+ >>> # And the function for building the residual network from the
120
+ >>> # flow package
121
+ >>> from networkx.algorithms.flow import build_residual_network
122
+ >>> # Note that the auxiliary digraph has an edge attribute named capacity
123
+ >>> R = build_residual_network(H, "capacity")
124
+ >>> result = dict.fromkeys(G, dict())
125
+ >>> # Reuse the auxiliary digraph and the residual network by passing them
126
+ >>> # as parameters
127
+ >>> for u, v in itertools.combinations(G, 2):
128
+ ... k = local_node_connectivity(G, u, v, auxiliary=H, residual=R)
129
+ ... result[u][v] = k
130
+ >>> all(result[u][v] == 5 for u, v in itertools.combinations(G, 2))
131
+ True
132
+
133
+ You can also use alternative flow algorithms for computing node
134
+ connectivity. For instance, in dense networks the algorithm
135
+ :meth:`shortest_augmenting_path` will usually perform better than
136
+ the default :meth:`edmonds_karp` which is faster for sparse
137
+ networks with highly skewed degree distributions. Alternative flow
138
+ functions have to be explicitly imported from the flow package.
139
+
140
+ >>> from networkx.algorithms.flow import shortest_augmenting_path
141
+ >>> local_node_connectivity(G, 0, 6, flow_func=shortest_augmenting_path)
142
+ 5
143
+
144
+ Notes
145
+ -----
146
+ This is a flow based implementation of node connectivity. We compute the
147
+ maximum flow using, by default, the :meth:`edmonds_karp` algorithm (see:
148
+ :meth:`maximum_flow`) on an auxiliary digraph build from the original
149
+ input graph:
150
+
151
+ For an undirected graph G having `n` nodes and `m` edges we derive a
152
+ directed graph H with `2n` nodes and `2m+n` arcs by replacing each
153
+ original node `v` with two nodes `v_A`, `v_B` linked by an (internal)
154
+ arc in H. Then for each edge (`u`, `v`) in G we add two arcs
155
+ (`u_B`, `v_A`) and (`v_B`, `u_A`) in H. Finally we set the attribute
156
+ capacity = 1 for each arc in H [1]_ .
157
+
158
+ For a directed graph G having `n` nodes and `m` arcs we derive a
159
+ directed graph H with `2n` nodes and `m+n` arcs by replacing each
160
+ original node `v` with two nodes `v_A`, `v_B` linked by an (internal)
161
+ arc (`v_A`, `v_B`) in H. Then for each arc (`u`, `v`) in G we add one arc
162
+ (`u_B`, `v_A`) in H. Finally we set the attribute capacity = 1 for
163
+ each arc in H.
164
+
165
+ This is equal to the local node connectivity because the value of
166
+ a maximum s-t-flow is equal to the capacity of a minimum s-t-cut.
167
+
168
+ See also
169
+ --------
170
+ :meth:`local_edge_connectivity`
171
+ :meth:`node_connectivity`
172
+ :meth:`minimum_node_cut`
173
+ :meth:`maximum_flow`
174
+ :meth:`edmonds_karp`
175
+ :meth:`preflow_push`
176
+ :meth:`shortest_augmenting_path`
177
+
178
+ References
179
+ ----------
180
+ .. [1] Kammer, Frank and Hanjo Taubig. Graph Connectivity. in Brandes and
181
+ Erlebach, 'Network Analysis: Methodological Foundations', Lecture
182
+ Notes in Computer Science, Volume 3418, Springer-Verlag, 2005.
183
+ http://www.informatik.uni-augsburg.de/thi/personen/kammer/Graph_Connectivity.pdf
184
+
185
+ """
186
+ if flow_func is None:
187
+ flow_func = default_flow_func
188
+
189
+ if auxiliary is None:
190
+ H = build_auxiliary_node_connectivity(G)
191
+ else:
192
+ H = auxiliary
193
+
194
+ mapping = H.graph.get("mapping", None)
195
+ if mapping is None:
196
+ raise nx.NetworkXError("Invalid auxiliary digraph.")
197
+
198
+ kwargs = {"flow_func": flow_func, "residual": residual}
199
+
200
+ if flow_func is not preflow_push:
201
+ kwargs["cutoff"] = cutoff
202
+
203
+ if flow_func is shortest_augmenting_path:
204
+ kwargs["two_phase"] = True
205
+
206
+ return nx.maximum_flow_value(H, f"{mapping[s]}B", f"{mapping[t]}A", **kwargs)
207
+
208
+
209
+ @nx._dispatchable
210
+ def node_connectivity(G, s=None, t=None, flow_func=None):
211
+ r"""Returns node connectivity for a graph or digraph G.
212
+
213
+ Node connectivity is equal to the minimum number of nodes that
214
+ must be removed to disconnect G or render it trivial. If source
215
+ and target nodes are provided, this function returns the local node
216
+ connectivity: the minimum number of nodes that must be removed to break
217
+ all paths from source to target in G.
218
+
219
+ Parameters
220
+ ----------
221
+ G : NetworkX graph
222
+ Undirected graph
223
+
224
+ s : node
225
+ Source node. Optional. Default value: None.
226
+
227
+ t : node
228
+ Target node. Optional. Default value: None.
229
+
230
+ flow_func : function
231
+ A function for computing the maximum flow among a pair of nodes.
232
+ The function has to accept at least three parameters: a Digraph,
233
+ a source node, and a target node. And return a residual network
234
+ that follows NetworkX conventions (see :meth:`maximum_flow` for
235
+ details). If flow_func is None, the default maximum flow function
236
+ (:meth:`edmonds_karp`) is used. See below for details. The
237
+ choice of the default function may change from version
238
+ to version and should not be relied on. Default value: None.
239
+
240
+ Returns
241
+ -------
242
+ K : integer
243
+ Node connectivity of G, or local node connectivity if source
244
+ and target are provided.
245
+
246
+ Examples
247
+ --------
248
+ >>> # Platonic icosahedral graph is 5-node-connected
249
+ >>> G = nx.icosahedral_graph()
250
+ >>> nx.node_connectivity(G)
251
+ 5
252
+
253
+ You can use alternative flow algorithms for the underlying maximum
254
+ flow computation. In dense networks the algorithm
255
+ :meth:`shortest_augmenting_path` will usually perform better
256
+ than the default :meth:`edmonds_karp`, which is faster for
257
+ sparse networks with highly skewed degree distributions. Alternative
258
+ flow functions have to be explicitly imported from the flow package.
259
+
260
+ >>> from networkx.algorithms.flow import shortest_augmenting_path
261
+ >>> nx.node_connectivity(G, flow_func=shortest_augmenting_path)
262
+ 5
263
+
264
+ If you specify a pair of nodes (source and target) as parameters,
265
+ this function returns the value of local node connectivity.
266
+
267
+ >>> nx.node_connectivity(G, 3, 7)
268
+ 5
269
+
270
+ If you need to perform several local computations among different
271
+ pairs of nodes on the same graph, it is recommended that you reuse
272
+ the data structures used in the maximum flow computations. See
273
+ :meth:`local_node_connectivity` for details.
274
+
275
+ Notes
276
+ -----
277
+ This is a flow based implementation of node connectivity. The
278
+ algorithm works by solving $O((n-\delta-1+\delta(\delta-1)/2))$
279
+ maximum flow problems on an auxiliary digraph. Where $\delta$
280
+ is the minimum degree of G. For details about the auxiliary
281
+ digraph and the computation of local node connectivity see
282
+ :meth:`local_node_connectivity`. This implementation is based
283
+ on algorithm 11 in [1]_.
284
+
285
+ See also
286
+ --------
287
+ :meth:`local_node_connectivity`
288
+ :meth:`edge_connectivity`
289
+ :meth:`maximum_flow`
290
+ :meth:`edmonds_karp`
291
+ :meth:`preflow_push`
292
+ :meth:`shortest_augmenting_path`
293
+
294
+ References
295
+ ----------
296
+ .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms.
297
+ http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf
298
+
299
+ """
300
+ if (s is not None and t is None) or (s is None and t is not None):
301
+ raise nx.NetworkXError("Both source and target must be specified.")
302
+
303
+ # Local node connectivity
304
+ if s is not None and t is not None:
305
+ if s not in G:
306
+ raise nx.NetworkXError(f"node {s} not in graph")
307
+ if t not in G:
308
+ raise nx.NetworkXError(f"node {t} not in graph")
309
+ return local_node_connectivity(G, s, t, flow_func=flow_func)
310
+
311
+ # Global node connectivity
312
+ if G.is_directed():
313
+ if not nx.is_weakly_connected(G):
314
+ return 0
315
+ iter_func = itertools.permutations
316
+ # It is necessary to consider both predecessors
317
+ # and successors for directed graphs
318
+
319
+ def neighbors(v):
320
+ return itertools.chain.from_iterable([G.predecessors(v), G.successors(v)])
321
+
322
+ else:
323
+ if not nx.is_connected(G):
324
+ return 0
325
+ iter_func = itertools.combinations
326
+ neighbors = G.neighbors
327
+
328
+ # Reuse the auxiliary digraph and the residual network
329
+ H = build_auxiliary_node_connectivity(G)
330
+ R = build_residual_network(H, "capacity")
331
+ kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
332
+
333
+ # Pick a node with minimum degree
334
+ # Node connectivity is bounded by degree.
335
+ v, K = min(G.degree(), key=itemgetter(1))
336
+ # compute local node connectivity with all its non-neighbors nodes
337
+ for w in set(G) - set(neighbors(v)) - {v}:
338
+ kwargs["cutoff"] = K
339
+ K = min(K, local_node_connectivity(G, v, w, **kwargs))
340
+ # Also for non adjacent pairs of neighbors of v
341
+ for x, y in iter_func(neighbors(v), 2):
342
+ if y in G[x]:
343
+ continue
344
+ kwargs["cutoff"] = K
345
+ K = min(K, local_node_connectivity(G, x, y, **kwargs))
346
+
347
+ return K
348
+
349
+
350
+ @nx._dispatchable
351
+ def average_node_connectivity(G, flow_func=None):
352
+ r"""Returns the average connectivity of a graph G.
353
+
354
+ The average connectivity `\bar{\kappa}` of a graph G is the average
355
+ of local node connectivity over all pairs of nodes of G [1]_ .
356
+
357
+ .. math::
358
+
359
+ \bar{\kappa}(G) = \frac{\sum_{u,v} \kappa_{G}(u,v)}{{n \choose 2}}
360
+
361
+ Parameters
362
+ ----------
363
+
364
+ G : NetworkX graph
365
+ Undirected graph
366
+
367
+ flow_func : function
368
+ A function for computing the maximum flow among a pair of nodes.
369
+ The function has to accept at least three parameters: a Digraph,
370
+ a source node, and a target node. And return a residual network
371
+ that follows NetworkX conventions (see :meth:`maximum_flow` for
372
+ details). If flow_func is None, the default maximum flow function
373
+ (:meth:`edmonds_karp`) is used. See :meth:`local_node_connectivity`
374
+ for details. The choice of the default function may change from
375
+ version to version and should not be relied on. Default value: None.
376
+
377
+ Returns
378
+ -------
379
+ K : float
380
+ Average node connectivity
381
+
382
+ See also
383
+ --------
384
+ :meth:`local_node_connectivity`
385
+ :meth:`node_connectivity`
386
+ :meth:`edge_connectivity`
387
+ :meth:`maximum_flow`
388
+ :meth:`edmonds_karp`
389
+ :meth:`preflow_push`
390
+ :meth:`shortest_augmenting_path`
391
+
392
+ References
393
+ ----------
394
+ .. [1] Beineke, L., O. Oellermann, and R. Pippert (2002). The average
395
+ connectivity of a graph. Discrete mathematics 252(1-3), 31-45.
396
+ http://www.sciencedirect.com/science/article/pii/S0012365X01001807
397
+
398
+ """
399
+ if G.is_directed():
400
+ iter_func = itertools.permutations
401
+ else:
402
+ iter_func = itertools.combinations
403
+
404
+ # Reuse the auxiliary digraph and the residual network
405
+ H = build_auxiliary_node_connectivity(G)
406
+ R = build_residual_network(H, "capacity")
407
+ kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
408
+
409
+ num, den = 0, 0
410
+ for u, v in iter_func(G, 2):
411
+ num += local_node_connectivity(G, u, v, **kwargs)
412
+ den += 1
413
+
414
+ if den == 0: # Null Graph
415
+ return 0
416
+ return num / den
417
+
418
+
419
+ @nx._dispatchable
420
+ def all_pairs_node_connectivity(G, nbunch=None, flow_func=None):
421
+ """Compute node connectivity between all pairs of nodes of G.
422
+
423
+ Parameters
424
+ ----------
425
+ G : NetworkX graph
426
+ Undirected graph
427
+
428
+ nbunch: container
429
+ Container of nodes. If provided node connectivity will be computed
430
+ only over pairs of nodes in nbunch.
431
+
432
+ flow_func : function
433
+ A function for computing the maximum flow among a pair of nodes.
434
+ The function has to accept at least three parameters: a Digraph,
435
+ a source node, and a target node. And return a residual network
436
+ that follows NetworkX conventions (see :meth:`maximum_flow` for
437
+ details). If flow_func is None, the default maximum flow function
438
+ (:meth:`edmonds_karp`) is used. See below for details. The
439
+ choice of the default function may change from version
440
+ to version and should not be relied on. Default value: None.
441
+
442
+ Returns
443
+ -------
444
+ all_pairs : dict
445
+ A dictionary with node connectivity between all pairs of nodes
446
+ in G, or in nbunch if provided.
447
+
448
+ See also
449
+ --------
450
+ :meth:`local_node_connectivity`
451
+ :meth:`edge_connectivity`
452
+ :meth:`local_edge_connectivity`
453
+ :meth:`maximum_flow`
454
+ :meth:`edmonds_karp`
455
+ :meth:`preflow_push`
456
+ :meth:`shortest_augmenting_path`
457
+
458
+ """
459
+ if nbunch is None:
460
+ nbunch = G
461
+ else:
462
+ nbunch = set(nbunch)
463
+
464
+ directed = G.is_directed()
465
+ if directed:
466
+ iter_func = itertools.permutations
467
+ else:
468
+ iter_func = itertools.combinations
469
+
470
+ all_pairs = {n: {} for n in nbunch}
471
+
472
+ # Reuse auxiliary digraph and residual network
473
+ H = build_auxiliary_node_connectivity(G)
474
+ mapping = H.graph["mapping"]
475
+ R = build_residual_network(H, "capacity")
476
+ kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
477
+
478
+ for u, v in iter_func(nbunch, 2):
479
+ K = local_node_connectivity(G, u, v, **kwargs)
480
+ all_pairs[u][v] = K
481
+ if not directed:
482
+ all_pairs[v][u] = K
483
+
484
+ return all_pairs
485
+
486
+
487
+ @nx._dispatchable(graphs={"G": 0, "auxiliary?": 4})
488
+ def local_edge_connectivity(
489
+ G, s, t, flow_func=None, auxiliary=None, residual=None, cutoff=None
490
+ ):
491
+ r"""Returns local edge connectivity for nodes s and t in G.
492
+
493
+ Local edge connectivity for two nodes s and t is the minimum number
494
+ of edges that must be removed to disconnect them.
495
+
496
+ This is a flow based implementation of edge connectivity. We compute the
497
+ maximum flow on an auxiliary digraph build from the original
498
+ network (see below for details). This is equal to the local edge
499
+ connectivity because the value of a maximum s-t-flow is equal to the
500
+ capacity of a minimum s-t-cut (Ford and Fulkerson theorem) [1]_ .
501
+
502
+ Parameters
503
+ ----------
504
+ G : NetworkX graph
505
+ Undirected or directed graph
506
+
507
+ s : node
508
+ Source node
509
+
510
+ t : node
511
+ Target node
512
+
513
+ flow_func : function
514
+ A function for computing the maximum flow among a pair of nodes.
515
+ The function has to accept at least three parameters: a Digraph,
516
+ a source node, and a target node. And return a residual network
517
+ that follows NetworkX conventions (see :meth:`maximum_flow` for
518
+ details). If flow_func is None, the default maximum flow function
519
+ (:meth:`edmonds_karp`) is used. See below for details. The
520
+ choice of the default function may change from version
521
+ to version and should not be relied on. Default value: None.
522
+
523
+ auxiliary : NetworkX DiGraph
524
+ Auxiliary digraph for computing flow based edge connectivity. If
525
+ provided it will be reused instead of recreated. Default value: None.
526
+
527
+ residual : NetworkX DiGraph
528
+ Residual network to compute maximum flow. If provided it will be
529
+ reused instead of recreated. Default value: None.
530
+
531
+ cutoff : integer, float, or None (default: None)
532
+ If specified, the maximum flow algorithm will terminate when the
533
+ flow value reaches or exceeds the cutoff. This only works for flows
534
+ that support the cutoff parameter (most do) and is ignored otherwise.
535
+
536
+ Returns
537
+ -------
538
+ K : integer
539
+ local edge connectivity for nodes s and t.
540
+
541
+ Examples
542
+ --------
543
+ This function is not imported in the base NetworkX namespace, so you
544
+ have to explicitly import it from the connectivity package:
545
+
546
+ >>> from networkx.algorithms.connectivity import local_edge_connectivity
547
+
548
+ We use in this example the platonic icosahedral graph, which has edge
549
+ connectivity 5.
550
+
551
+ >>> G = nx.icosahedral_graph()
552
+ >>> local_edge_connectivity(G, 0, 6)
553
+ 5
554
+
555
+ If you need to compute local connectivity on several pairs of
556
+ nodes in the same graph, it is recommended that you reuse the
557
+ data structures that NetworkX uses in the computation: the
558
+ auxiliary digraph for edge connectivity, and the residual
559
+ network for the underlying maximum flow computation.
560
+
561
+ Example of how to compute local edge connectivity among
562
+ all pairs of nodes of the platonic icosahedral graph reusing
563
+ the data structures.
564
+
565
+ >>> import itertools
566
+ >>> # You also have to explicitly import the function for
567
+ >>> # building the auxiliary digraph from the connectivity package
568
+ >>> from networkx.algorithms.connectivity import build_auxiliary_edge_connectivity
569
+ >>> H = build_auxiliary_edge_connectivity(G)
570
+ >>> # And the function for building the residual network from the
571
+ >>> # flow package
572
+ >>> from networkx.algorithms.flow import build_residual_network
573
+ >>> # Note that the auxiliary digraph has an edge attribute named capacity
574
+ >>> R = build_residual_network(H, "capacity")
575
+ >>> result = dict.fromkeys(G, dict())
576
+ >>> # Reuse the auxiliary digraph and the residual network by passing them
577
+ >>> # as parameters
578
+ >>> for u, v in itertools.combinations(G, 2):
579
+ ... k = local_edge_connectivity(G, u, v, auxiliary=H, residual=R)
580
+ ... result[u][v] = k
581
+ >>> all(result[u][v] == 5 for u, v in itertools.combinations(G, 2))
582
+ True
583
+
584
+ You can also use alternative flow algorithms for computing edge
585
+ connectivity. For instance, in dense networks the algorithm
586
+ :meth:`shortest_augmenting_path` will usually perform better than
587
+ the default :meth:`edmonds_karp` which is faster for sparse
588
+ networks with highly skewed degree distributions. Alternative flow
589
+ functions have to be explicitly imported from the flow package.
590
+
591
+ >>> from networkx.algorithms.flow import shortest_augmenting_path
592
+ >>> local_edge_connectivity(G, 0, 6, flow_func=shortest_augmenting_path)
593
+ 5
594
+
595
+ Notes
596
+ -----
597
+ This is a flow based implementation of edge connectivity. We compute the
598
+ maximum flow using, by default, the :meth:`edmonds_karp` algorithm on an
599
+ auxiliary digraph build from the original input graph:
600
+
601
+ If the input graph is undirected, we replace each edge (`u`,`v`) with
602
+ two reciprocal arcs (`u`, `v`) and (`v`, `u`) and then we set the attribute
603
+ 'capacity' for each arc to 1. If the input graph is directed we simply
604
+ add the 'capacity' attribute. This is an implementation of algorithm 1
605
+ in [1]_.
606
+
607
+ The maximum flow in the auxiliary network is equal to the local edge
608
+ connectivity because the value of a maximum s-t-flow is equal to the
609
+ capacity of a minimum s-t-cut (Ford and Fulkerson theorem).
610
+
611
+ See also
612
+ --------
613
+ :meth:`edge_connectivity`
614
+ :meth:`local_node_connectivity`
615
+ :meth:`node_connectivity`
616
+ :meth:`maximum_flow`
617
+ :meth:`edmonds_karp`
618
+ :meth:`preflow_push`
619
+ :meth:`shortest_augmenting_path`
620
+
621
+ References
622
+ ----------
623
+ .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms.
624
+ http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf
625
+
626
+ """
627
+ if flow_func is None:
628
+ flow_func = default_flow_func
629
+
630
+ if auxiliary is None:
631
+ H = build_auxiliary_edge_connectivity(G)
632
+ else:
633
+ H = auxiliary
634
+
635
+ kwargs = {"flow_func": flow_func, "residual": residual}
636
+
637
+ if flow_func is not preflow_push:
638
+ kwargs["cutoff"] = cutoff
639
+
640
+ if flow_func is shortest_augmenting_path:
641
+ kwargs["two_phase"] = True
642
+
643
+ return nx.maximum_flow_value(H, s, t, **kwargs)
644
+
645
+
646
+ @nx._dispatchable
647
+ def edge_connectivity(G, s=None, t=None, flow_func=None, cutoff=None):
648
+ r"""Returns the edge connectivity of the graph or digraph G.
649
+
650
+ The edge connectivity is equal to the minimum number of edges that
651
+ must be removed to disconnect G or render it trivial. If source
652
+ and target nodes are provided, this function returns the local edge
653
+ connectivity: the minimum number of edges that must be removed to
654
+ break all paths from source to target in G.
655
+
656
+ Parameters
657
+ ----------
658
+ G : NetworkX graph
659
+ Undirected or directed graph
660
+
661
+ s : node
662
+ Source node. Optional. Default value: None.
663
+
664
+ t : node
665
+ Target node. Optional. Default value: None.
666
+
667
+ flow_func : function
668
+ A function for computing the maximum flow among a pair of nodes.
669
+ The function has to accept at least three parameters: a Digraph,
670
+ a source node, and a target node. And return a residual network
671
+ that follows NetworkX conventions (see :meth:`maximum_flow` for
672
+ details). If flow_func is None, the default maximum flow function
673
+ (:meth:`edmonds_karp`) is used. See below for details. The
674
+ choice of the default function may change from version
675
+ to version and should not be relied on. Default value: None.
676
+
677
+ cutoff : integer, float, or None (default: None)
678
+ If specified, the maximum flow algorithm will terminate when the
679
+ flow value reaches or exceeds the cutoff. This only works for flows
680
+ that support the cutoff parameter (most do) and is ignored otherwise.
681
+
682
+ Returns
683
+ -------
684
+ K : integer
685
+ Edge connectivity for G, or local edge connectivity if source
686
+ and target were provided
687
+
688
+ Examples
689
+ --------
690
+ >>> # Platonic icosahedral graph is 5-edge-connected
691
+ >>> G = nx.icosahedral_graph()
692
+ >>> nx.edge_connectivity(G)
693
+ 5
694
+
695
+ You can use alternative flow algorithms for the underlying
696
+ maximum flow computation. In dense networks the algorithm
697
+ :meth:`shortest_augmenting_path` will usually perform better
698
+ than the default :meth:`edmonds_karp`, which is faster for
699
+ sparse networks with highly skewed degree distributions.
700
+ Alternative flow functions have to be explicitly imported
701
+ from the flow package.
702
+
703
+ >>> from networkx.algorithms.flow import shortest_augmenting_path
704
+ >>> nx.edge_connectivity(G, flow_func=shortest_augmenting_path)
705
+ 5
706
+
707
+ If you specify a pair of nodes (source and target) as parameters,
708
+ this function returns the value of local edge connectivity.
709
+
710
+ >>> nx.edge_connectivity(G, 3, 7)
711
+ 5
712
+
713
+ If you need to perform several local computations among different
714
+ pairs of nodes on the same graph, it is recommended that you reuse
715
+ the data structures used in the maximum flow computations. See
716
+ :meth:`local_edge_connectivity` for details.
717
+
718
+ Notes
719
+ -----
720
+ This is a flow based implementation of global edge connectivity.
721
+ For undirected graphs the algorithm works by finding a 'small'
722
+ dominating set of nodes of G (see algorithm 7 in [1]_ ) and
723
+ computing local maximum flow (see :meth:`local_edge_connectivity`)
724
+ between an arbitrary node in the dominating set and the rest of
725
+ nodes in it. This is an implementation of algorithm 6 in [1]_ .
726
+ For directed graphs, the algorithm does n calls to the maximum
727
+ flow function. This is an implementation of algorithm 8 in [1]_ .
728
+
729
+ See also
730
+ --------
731
+ :meth:`local_edge_connectivity`
732
+ :meth:`local_node_connectivity`
733
+ :meth:`node_connectivity`
734
+ :meth:`maximum_flow`
735
+ :meth:`edmonds_karp`
736
+ :meth:`preflow_push`
737
+ :meth:`shortest_augmenting_path`
738
+ :meth:`k_edge_components`
739
+ :meth:`k_edge_subgraphs`
740
+
741
+ References
742
+ ----------
743
+ .. [1] Abdol-Hossein Esfahanian. Connectivity Algorithms.
744
+ http://www.cse.msu.edu/~cse835/Papers/Graph_connectivity_revised.pdf
745
+
746
+ """
747
+ if (s is not None and t is None) or (s is None and t is not None):
748
+ raise nx.NetworkXError("Both source and target must be specified.")
749
+
750
+ # Local edge connectivity
751
+ if s is not None and t is not None:
752
+ if s not in G:
753
+ raise nx.NetworkXError(f"node {s} not in graph")
754
+ if t not in G:
755
+ raise nx.NetworkXError(f"node {t} not in graph")
756
+ return local_edge_connectivity(G, s, t, flow_func=flow_func, cutoff=cutoff)
757
+
758
+ # Global edge connectivity
759
+ # reuse auxiliary digraph and residual network
760
+ H = build_auxiliary_edge_connectivity(G)
761
+ R = build_residual_network(H, "capacity")
762
+ kwargs = {"flow_func": flow_func, "auxiliary": H, "residual": R}
763
+
764
+ if G.is_directed():
765
+ # Algorithm 8 in [1]
766
+ if not nx.is_weakly_connected(G):
767
+ return 0
768
+
769
+ # initial value for \lambda is minimum degree
770
+ L = min(d for n, d in G.degree())
771
+ nodes = list(G)
772
+ n = len(nodes)
773
+
774
+ if cutoff is not None:
775
+ L = min(cutoff, L)
776
+
777
+ for i in range(n):
778
+ kwargs["cutoff"] = L
779
+ try:
780
+ L = min(L, local_edge_connectivity(G, nodes[i], nodes[i + 1], **kwargs))
781
+ except IndexError: # last node!
782
+ L = min(L, local_edge_connectivity(G, nodes[i], nodes[0], **kwargs))
783
+ return L
784
+ else: # undirected
785
+ # Algorithm 6 in [1]
786
+ if not nx.is_connected(G):
787
+ return 0
788
+
789
+ # initial value for \lambda is minimum degree
790
+ L = min(d for n, d in G.degree())
791
+
792
+ if cutoff is not None:
793
+ L = min(cutoff, L)
794
+
795
+ # A dominating set is \lambda-covering
796
+ # We need a dominating set with at least two nodes
797
+ for node in G:
798
+ D = nx.dominating_set(G, start_with=node)
799
+ v = D.pop()
800
+ if D:
801
+ break
802
+ else:
803
+ # in complete graphs the dominating sets will always be of one node
804
+ # thus we return min degree
805
+ return L
806
+
807
+ for w in D:
808
+ kwargs["cutoff"] = L
809
+ L = min(L, local_edge_connectivity(G, v, w, **kwargs))
810
+
811
+ return L