okstra 0.108.0 → 0.110.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 (648) hide show
  1. package/README.kr.md +1 -1
  2. package/README.md +1 -1
  3. package/docs/kr/architecture.md +3 -3
  4. package/docs/kr/cli.md +2 -2
  5. package/docs/project-structure-overview.md +3 -3
  6. package/package.json +1 -1
  7. package/runtime/BUILD.json +2 -2
  8. package/runtime/prompts/profiles/_common-contract.md +1 -1
  9. package/runtime/python/okstra_ctl/graphify_cmd.py +225 -0
  10. package/runtime/python/okstra_ctl/resolve_task_key.py +15 -9
  11. package/runtime/python/okstra_ctl/worktree.py +14 -13
  12. package/runtime/python/okstra_project/__init__.py +2 -0
  13. package/runtime/python/okstra_project/state.py +36 -0
  14. package/runtime/python/okstra_vendor/__init__.py +41 -0
  15. package/runtime/python/okstra_vendor/graphify/.vendored-version +1 -0
  16. package/runtime/python/okstra_vendor/graphify/__init__.py +28 -0
  17. package/runtime/python/okstra_vendor/graphify/__main__.py +1371 -0
  18. package/runtime/python/okstra_vendor/graphify/analyze.py +540 -0
  19. package/runtime/python/okstra_vendor/graphify/benchmark.py +129 -0
  20. package/runtime/python/okstra_vendor/graphify/build.py +107 -0
  21. package/runtime/python/okstra_vendor/graphify/cache.py +169 -0
  22. package/runtime/python/okstra_vendor/graphify/cluster.py +137 -0
  23. package/runtime/python/okstra_vendor/graphify/detect.py +510 -0
  24. package/runtime/python/okstra_vendor/graphify/export.py +1014 -0
  25. package/runtime/python/okstra_vendor/graphify/extract.py +3277 -0
  26. package/runtime/python/okstra_vendor/graphify/hooks.py +220 -0
  27. package/runtime/python/okstra_vendor/graphify/ingest.py +297 -0
  28. package/runtime/python/okstra_vendor/graphify/manifest.py +4 -0
  29. package/runtime/python/okstra_vendor/graphify/report.py +175 -0
  30. package/runtime/python/okstra_vendor/graphify/security.py +203 -0
  31. package/runtime/python/okstra_vendor/graphify/serve.py +373 -0
  32. package/runtime/python/okstra_vendor/graphify/skill-aider.md +1184 -0
  33. package/runtime/python/okstra_vendor/graphify/skill-claw.md +1184 -0
  34. package/runtime/python/okstra_vendor/graphify/skill-codex.md +1242 -0
  35. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +1268 -0
  36. package/runtime/python/okstra_vendor/graphify/skill-droid.md +1239 -0
  37. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +1183 -0
  38. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +1238 -0
  39. package/runtime/python/okstra_vendor/graphify/skill-trae.md +1208 -0
  40. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +253 -0
  41. package/runtime/python/okstra_vendor/graphify/skill-windows.md +1245 -0
  42. package/runtime/python/okstra_vendor/graphify/skill.md +1319 -0
  43. package/runtime/python/okstra_vendor/graphify/transcribe.py +182 -0
  44. package/runtime/python/okstra_vendor/graphify/validate.py +72 -0
  45. package/runtime/python/okstra_vendor/graphify/watch.py +188 -0
  46. package/runtime/python/okstra_vendor/graphify/wiki.py +214 -0
  47. package/runtime/python/okstra_vendor/networkx/__init__.py +62 -0
  48. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +134 -0
  49. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +26 -0
  50. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +259 -0
  51. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +71 -0
  52. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +412 -0
  53. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +396 -0
  54. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +150 -0
  55. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +149 -0
  56. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +369 -0
  57. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +44 -0
  58. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +143 -0
  59. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +53 -0
  60. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +265 -0
  61. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  62. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +41 -0
  63. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +112 -0
  64. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +199 -0
  65. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +146 -0
  66. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +59 -0
  67. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +78 -0
  68. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +303 -0
  69. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +8 -0
  70. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +94 -0
  71. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +31 -0
  72. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +306 -0
  73. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +1014 -0
  74. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +274 -0
  75. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +68 -0
  76. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +1508 -0
  77. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +255 -0
  78. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +83 -0
  79. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +5 -0
  80. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +122 -0
  81. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +302 -0
  82. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +255 -0
  83. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +160 -0
  84. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +127 -0
  85. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  86. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +81 -0
  87. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +143 -0
  88. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +122 -0
  89. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +174 -0
  90. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +107 -0
  91. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +87 -0
  92. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +164 -0
  93. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +88 -0
  94. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +322 -0
  95. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +290 -0
  96. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +289 -0
  97. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +57 -0
  98. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +360 -0
  99. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +105 -0
  100. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +603 -0
  101. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +316 -0
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +590 -0
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +232 -0
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +526 -0
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +112 -0
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +69 -0
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +125 -0
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +192 -0
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +84 -0
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +33 -0
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +240 -0
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +334 -0
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +407 -0
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +218 -0
  116. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +327 -0
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +138 -0
  118. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +409 -0
  119. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +35 -0
  120. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +80 -0
  121. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +168 -0
  122. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +205 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +164 -0
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +20 -0
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +591 -0
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +236 -0
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +282 -0
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +364 -0
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +227 -0
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +96 -0
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +150 -0
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +107 -0
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +357 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +130 -0
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +787 -0
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +88 -0
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +331 -0
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +150 -0
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +200 -0
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +128 -0
  141. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +209 -0
  142. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +141 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +361 -0
  144. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  145. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +923 -0
  146. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +354 -0
  147. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +274 -0
  148. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +259 -0
  149. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +147 -0
  150. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +43 -0
  151. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +144 -0
  152. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +73 -0
  153. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +186 -0
  154. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +277 -0
  155. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +122 -0
  156. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +345 -0
  157. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +220 -0
  158. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +344 -0
  159. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +87 -0
  160. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +140 -0
  161. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +82 -0
  162. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +110 -0
  163. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +302 -0
  164. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +64 -0
  165. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +181 -0
  166. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +95 -0
  167. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +172 -0
  168. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +443 -0
  169. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +818 -0
  170. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +732 -0
  171. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +4 -0
  172. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +505 -0
  173. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +565 -0
  174. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  175. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +863 -0
  176. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +163 -0
  177. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +28 -0
  178. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +153 -0
  179. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +354 -0
  180. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +171 -0
  181. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +30 -0
  182. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +216 -0
  183. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +79 -0
  184. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +338 -0
  185. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +162 -0
  186. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +220 -0
  187. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +384 -0
  188. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +227 -0
  189. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +452 -0
  190. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +347 -0
  191. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  192. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +147 -0
  193. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +157 -0
  194. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +85 -0
  195. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +106 -0
  196. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +91 -0
  197. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +241 -0
  198. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +138 -0
  199. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +76 -0
  200. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +264 -0
  201. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +152 -0
  202. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +340 -0
  203. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +139 -0
  204. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +26 -0
  205. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +6 -0
  206. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +115 -0
  207. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +394 -0
  208. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +282 -0
  209. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +71 -0
  210. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +359 -0
  211. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  212. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +70 -0
  213. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +248 -0
  214. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +138 -0
  215. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +55 -0
  216. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +193 -0
  217. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +96 -0
  218. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +196 -0
  219. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +11 -0
  220. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +811 -0
  221. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +616 -0
  222. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +408 -0
  223. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +1270 -0
  224. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +592 -0
  225. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +220 -0
  226. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +235 -0
  227. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +152 -0
  228. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  229. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +421 -0
  230. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +309 -0
  231. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +249 -0
  232. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +502 -0
  233. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +488 -0
  234. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +323 -0
  235. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +280 -0
  236. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +102 -0
  237. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +88 -0
  238. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +588 -0
  239. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +142 -0
  240. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +416 -0
  241. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +1234 -0
  242. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +677 -0
  243. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +1392 -0
  244. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +1095 -0
  245. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +272 -0
  246. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +142 -0
  247. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +268 -0
  248. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +167 -0
  249. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +470 -0
  250. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +11 -0
  251. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +370 -0
  252. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +407 -0
  253. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +238 -0
  254. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +241 -0
  255. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +178 -0
  256. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +611 -0
  257. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +356 -0
  258. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +662 -0
  259. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +425 -0
  260. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +300 -0
  261. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  262. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  263. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  264. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  265. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +128 -0
  266. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +573 -0
  267. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +155 -0
  268. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +475 -0
  269. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +481 -0
  270. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  271. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +194 -0
  272. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +435 -0
  273. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +483 -0
  274. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +57 -0
  275. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +196 -0
  276. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +107 -0
  277. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +7 -0
  278. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +1306 -0
  279. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +336 -0
  280. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +1262 -0
  281. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +352 -0
  282. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +308 -0
  283. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  284. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  285. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  286. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  287. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  288. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +719 -0
  289. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +103 -0
  290. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +490 -0
  291. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +64 -0
  292. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +212 -0
  293. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +202 -0
  294. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +1655 -0
  295. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +3118 -0
  296. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +196 -0
  297. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +264 -0
  298. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +1102 -0
  299. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +192 -0
  300. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +2 -0
  301. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +337 -0
  302. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +498 -0
  303. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  304. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +77 -0
  305. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +213 -0
  306. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +687 -0
  307. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +280 -0
  308. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +1148 -0
  309. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +27 -0
  310. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +738 -0
  311. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +544 -0
  312. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +78 -0
  313. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +59 -0
  314. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +219 -0
  315. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +155 -0
  316. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +4 -0
  317. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +324 -0
  318. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +468 -0
  319. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +633 -0
  320. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  321. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +328 -0
  322. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +451 -0
  323. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +491 -0
  324. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +55 -0
  325. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +77 -0
  326. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +73 -0
  327. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +464 -0
  328. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +1463 -0
  329. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +306 -0
  330. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +98 -0
  331. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +167 -0
  332. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +138 -0
  333. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +5 -0
  334. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +239 -0
  335. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +264 -0
  336. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +716 -0
  337. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  338. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +254 -0
  339. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +212 -0
  340. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +88 -0
  341. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +511 -0
  342. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +149 -0
  343. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +983 -0
  344. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +625 -0
  345. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +2542 -0
  346. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +2107 -0
  347. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +966 -0
  348. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +404 -0
  349. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +30 -0
  350. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +296 -0
  351. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +374 -0
  352. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +564 -0
  353. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +406 -0
  354. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  355. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +23 -0
  356. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +154 -0
  357. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +144 -0
  358. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +109 -0
  359. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +136 -0
  360. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +129 -0
  361. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +300 -0
  362. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +678 -0
  363. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +80 -0
  364. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +266 -0
  365. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +85 -0
  366. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +171 -0
  367. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +984 -0
  368. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +340 -0
  369. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +835 -0
  370. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +831 -0
  371. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +85 -0
  372. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +299 -0
  373. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +115 -0
  374. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +58 -0
  375. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +314 -0
  376. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +872 -0
  377. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +163 -0
  378. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +46 -0
  379. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +24 -0
  380. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +26 -0
  381. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +615 -0
  382. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +459 -0
  383. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +556 -0
  384. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +179 -0
  385. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +62 -0
  386. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +15 -0
  387. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +140 -0
  388. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +60 -0
  389. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +27 -0
  390. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +274 -0
  391. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +556 -0
  392. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +57 -0
  393. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +37 -0
  394. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +88 -0
  395. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +149 -0
  396. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +1158 -0
  397. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +803 -0
  398. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +76 -0
  399. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +8 -0
  400. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +138 -0
  401. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +191 -0
  402. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +642 -0
  403. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +179 -0
  404. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +270 -0
  405. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +431 -0
  406. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +161 -0
  407. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +248 -0
  408. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +41 -0
  409. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +103 -0
  410. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +54 -0
  411. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +157 -0
  412. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +981 -0
  413. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +142 -0
  414. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +406 -0
  415. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +5 -0
  416. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +90 -0
  417. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +576 -0
  418. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +529 -0
  419. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +185 -0
  420. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +182 -0
  421. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  422. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +25 -0
  423. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +203 -0
  424. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +307 -0
  425. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +147 -0
  426. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +131 -0
  427. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +7 -0
  428. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +1042 -0
  429. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +413 -0
  430. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +88 -0
  431. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +219 -0
  432. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +1281 -0
  433. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +106 -0
  434. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +273 -0
  435. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  436. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +624 -0
  437. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +114 -0
  438. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +79 -0
  439. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +99 -0
  440. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +934 -0
  441. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +53 -0
  442. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +174 -0
  443. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +500 -0
  444. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +76 -0
  445. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +86 -0
  446. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +77 -0
  447. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +278 -0
  448. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +13 -0
  449. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +435 -0
  450. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +1363 -0
  451. package/runtime/python/okstra_vendor/networkx/classes/filters.py +95 -0
  452. package/runtime/python/okstra_vendor/networkx/classes/function.py +1549 -0
  453. package/runtime/python/okstra_vendor/networkx/classes/graph.py +2082 -0
  454. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +269 -0
  455. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +977 -0
  456. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +1294 -0
  457. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +1447 -0
  458. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  459. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +192 -0
  460. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +476 -0
  461. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +362 -0
  462. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +331 -0
  463. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +110 -0
  464. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +177 -0
  465. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +1045 -0
  466. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +950 -0
  467. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +12 -0
  468. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +349 -0
  469. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +459 -0
  470. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +528 -0
  471. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +1421 -0
  472. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +131 -0
  473. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +371 -0
  474. package/runtime/python/okstra_vendor/networkx/conftest.py +261 -0
  475. package/runtime/python/okstra_vendor/networkx/convert.py +502 -0
  476. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +1314 -0
  477. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +7 -0
  478. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +2036 -0
  479. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +470 -0
  480. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +570 -0
  481. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +361 -0
  482. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +2978 -0
  483. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  484. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  485. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  486. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  487. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  488. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  489. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  490. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +237 -0
  491. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +229 -0
  492. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +285 -0
  493. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +631 -0
  494. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +146 -0
  495. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +1582 -0
  496. package/runtime/python/okstra_vendor/networkx/exception.py +131 -0
  497. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +34 -0
  498. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  499. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +227 -0
  500. package/runtime/python/okstra_vendor/networkx/generators/classic.py +1091 -0
  501. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +68 -0
  502. package/runtime/python/okstra_vendor/networkx/generators/community.py +1070 -0
  503. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +886 -0
  504. package/runtime/python/okstra_vendor/networkx/generators/directed.py +572 -0
  505. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +174 -0
  506. package/runtime/python/okstra_vendor/networkx/generators/ego.py +66 -0
  507. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +499 -0
  508. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +1037 -0
  509. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +163 -0
  510. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +443 -0
  511. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +125 -0
  512. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +70 -0
  513. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +664 -0
  514. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +405 -0
  515. package/runtime/python/okstra_vendor/networkx/generators/line.py +501 -0
  516. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +110 -0
  517. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +259 -0
  518. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +117 -0
  519. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +1416 -0
  520. package/runtime/python/okstra_vendor/networkx/generators/small.py +1070 -0
  521. package/runtime/python/okstra_vendor/networkx/generators/social.py +554 -0
  522. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +120 -0
  523. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +54 -0
  524. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +131 -0
  525. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  526. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +75 -0
  527. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +642 -0
  528. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +20 -0
  529. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +362 -0
  530. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +224 -0
  531. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +189 -0
  532. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +103 -0
  533. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +39 -0
  534. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +182 -0
  535. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +488 -0
  536. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +133 -0
  537. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +221 -0
  538. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +28 -0
  539. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +144 -0
  540. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +125 -0
  541. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +264 -0
  542. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +316 -0
  543. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +30 -0
  544. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +82 -0
  545. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +33 -0
  546. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +495 -0
  547. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +220 -0
  548. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +49 -0
  549. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +72 -0
  550. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +92 -0
  551. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +64 -0
  552. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +195 -0
  553. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +15 -0
  554. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +74 -0
  555. package/runtime/python/okstra_vendor/networkx/generators/trees.py +1070 -0
  556. package/runtime/python/okstra_vendor/networkx/generators/triads.py +94 -0
  557. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +188 -0
  558. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +13 -0
  559. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +650 -0
  560. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +466 -0
  561. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +77 -0
  562. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +168 -0
  563. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +512 -0
  564. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +166 -0
  565. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +186 -0
  566. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  567. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +400 -0
  568. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +108 -0
  569. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +40 -0
  570. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +275 -0
  571. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +334 -0
  572. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +86 -0
  573. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +70 -0
  574. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +17 -0
  575. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +330 -0
  576. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +489 -0
  577. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +1084 -0
  578. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +879 -0
  579. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +427 -0
  580. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +1053 -0
  581. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +19 -0
  582. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +156 -0
  583. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +190 -0
  584. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +261 -0
  585. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  586. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +78 -0
  587. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +78 -0
  588. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +109 -0
  589. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +48 -0
  590. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +137 -0
  591. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +108 -0
  592. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +393 -0
  593. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +113 -0
  594. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +286 -0
  595. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +379 -0
  596. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  597. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +354 -0
  598. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +318 -0
  599. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +612 -0
  600. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +744 -0
  601. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +181 -0
  602. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +1531 -0
  603. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +30 -0
  604. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +63 -0
  605. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +128 -0
  606. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +166 -0
  607. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +1742 -0
  608. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +851 -0
  609. package/runtime/python/okstra_vendor/networkx/relabel.py +285 -0
  610. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  611. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +248 -0
  612. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +321 -0
  613. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +531 -0
  614. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +349 -0
  615. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +281 -0
  616. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +40 -0
  617. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +11 -0
  618. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +96 -0
  619. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +349 -0
  620. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +8 -0
  621. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +8 -0
  622. package/runtime/python/okstra_vendor/networkx/utils/backends.py +2171 -0
  623. package/runtime/python/okstra_vendor/networkx/utils/configs.py +396 -0
  624. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +1233 -0
  625. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +338 -0
  626. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +297 -0
  627. package/runtime/python/okstra_vendor/networkx/utils/misc.py +703 -0
  628. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +198 -0
  629. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +159 -0
  630. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  631. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +11 -0
  632. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +225 -0
  633. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +263 -0
  634. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +510 -0
  635. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +131 -0
  636. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +268 -0
  637. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +393 -0
  638. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +53 -0
  639. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +63 -0
  640. package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +55 -0
  641. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +106 -0
  642. package/runtime/skills/okstra-graphify/SKILL.md +161 -0
  643. package/runtime/skills/okstra-inspect/SKILL.md +17 -9
  644. package/runtime/templates/reports/settings.template.json +4 -0
  645. package/src/cli-registry.mjs +7 -0
  646. package/src/commands/graphify.mjs +32 -0
  647. package/src/commands/lifecycle/doctor.mjs +9 -0
  648. package/src/lib/skill-catalog.mjs +1 -0
@@ -0,0 +1,1095 @@
1
+ """Graph diameter, radius, eccentricity and other properties."""
2
+
3
+ import math
4
+
5
+ import networkx as nx
6
+ from networkx.utils import not_implemented_for
7
+
8
+ __all__ = [
9
+ "eccentricity",
10
+ "diameter",
11
+ "harmonic_diameter",
12
+ "radius",
13
+ "periphery",
14
+ "center",
15
+ "barycenter",
16
+ "resistance_distance",
17
+ "kemeny_constant",
18
+ "effective_graph_resistance",
19
+ ]
20
+
21
+
22
+ def _extrema_bounding(G, compute="diameter", weight=None):
23
+ """Compute requested extreme distance metric of undirected graph G
24
+
25
+ Computation is based on smart lower and upper bounds, and in practice
26
+ linear in the number of nodes, rather than quadratic (except for some
27
+ border cases such as complete graphs or circle shaped graphs).
28
+
29
+ Parameters
30
+ ----------
31
+ G : NetworkX graph
32
+ An undirected graph
33
+
34
+ compute : string denoting the requesting metric
35
+ "diameter" for the maximal eccentricity value,
36
+ "radius" for the minimal eccentricity value,
37
+ "periphery" for the set of nodes with eccentricity equal to the diameter,
38
+ "center" for the set of nodes with eccentricity equal to the radius,
39
+ "eccentricities" for the maximum distance from each node to all other nodes in G
40
+
41
+ weight : string, function, or None
42
+ If this is a string, then edge weights will be accessed via the
43
+ edge attribute with this key (that is, the weight of the edge
44
+ joining `u` to `v` will be ``G.edges[u, v][weight]``). If no
45
+ such edge attribute exists, the weight of the edge is assumed to
46
+ be one.
47
+
48
+ If this is a function, the weight of an edge is the value
49
+ returned by the function. The function must accept exactly three
50
+ positional arguments: the two endpoints of an edge and the
51
+ dictionary of edge attributes for that edge. The function must
52
+ return a number.
53
+
54
+ If this is None, every edge has weight/distance/cost 1.
55
+
56
+ Weights stored as floating point values can lead to small round-off
57
+ errors in distances. Use integer weights to avoid this.
58
+
59
+ Weights should be positive, since they are distances.
60
+
61
+ Returns
62
+ -------
63
+ value : value of the requested metric
64
+ int for "diameter" and "radius" or
65
+ list of nodes for "center" and "periphery" or
66
+ dictionary of eccentricity values keyed by node for "eccentricities"
67
+
68
+ Raises
69
+ ------
70
+ NetworkXError
71
+ If the graph consists of multiple components
72
+ ValueError
73
+ If `compute` is not one of "diameter", "radius", "periphery", "center", or "eccentricities".
74
+
75
+ Notes
76
+ -----
77
+ This algorithm was proposed in [1]_ and discussed further in [2]_ and [3]_.
78
+
79
+ References
80
+ ----------
81
+ .. [1] F. W. Takes, W. A. Kosters,
82
+ "Determining the diameter of small world networks."
83
+ Proceedings of the 20th ACM international conference on Information and
84
+ knowledge management, 2011
85
+ https://dl.acm.org/doi/abs/10.1145/2063576.2063748
86
+ .. [2] F. W. Takes, W. A. Kosters,
87
+ "Computing the Eccentricity Distribution of Large Graphs."
88
+ Algorithms, 2013
89
+ https://www.mdpi.com/1999-4893/6/1/100
90
+ .. [3] M. Borassi, P. Crescenzi, M. Habib, W. A. Kosters, A. Marino, F. W. Takes,
91
+ "Fast diameter and radius BFS-based computation in (weakly connected)
92
+ real-world graphs: With an application to the six degrees of separation
93
+ games."
94
+ Theoretical Computer Science, 2015
95
+ https://www.sciencedirect.com/science/article/pii/S0304397515001644
96
+ """
97
+ # init variables
98
+ degrees = dict(G.degree()) # start with the highest degree node
99
+ minlowernode = max(degrees, key=degrees.get)
100
+ N = len(degrees) # number of nodes
101
+ # alternate between smallest lower and largest upper bound
102
+ high = False
103
+ # status variables
104
+ ecc_lower = dict.fromkeys(G, 0)
105
+ ecc_upper = dict.fromkeys(G, math.inf)
106
+ candidates = set(G)
107
+
108
+ # (re)set bound extremes
109
+ minlower = math.inf
110
+ maxlower = 0
111
+ minupper = math.inf
112
+ maxupper = 0
113
+
114
+ # repeat the following until there are no more candidates
115
+ while candidates:
116
+ if high:
117
+ current = maxuppernode # select node with largest upper bound
118
+ else:
119
+ current = minlowernode # select node with smallest lower bound
120
+ high = not high
121
+
122
+ # get distances from/to current node and derive eccentricity
123
+ dist = nx.shortest_path_length(G, source=current, weight=weight)
124
+
125
+ if len(dist) != N:
126
+ msg = "Cannot compute metric because graph is not connected."
127
+ raise nx.NetworkXError(msg)
128
+ current_ecc = max(dist.values())
129
+
130
+ # print status update
131
+ # print ("ecc of " + str(current) + " (" + str(ecc_lower[current]) + "/"
132
+ # + str(ecc_upper[current]) + ", deg: " + str(dist[current]) + ") is "
133
+ # + str(current_ecc))
134
+ # print(ecc_upper)
135
+
136
+ # (re)set bound extremes
137
+ maxuppernode = None
138
+ minlowernode = None
139
+
140
+ # update node bounds
141
+ for i in candidates:
142
+ # update eccentricity bounds
143
+ d = dist[i]
144
+ ecc_lower[i] = low = max(ecc_lower[i], max(d, (current_ecc - d)))
145
+ ecc_upper[i] = upp = min(ecc_upper[i], current_ecc + d)
146
+
147
+ # update min/max values of lower and upper bounds
148
+ minlower = min(ecc_lower[i], minlower)
149
+ maxlower = max(ecc_lower[i], maxlower)
150
+ minupper = min(ecc_upper[i], minupper)
151
+ maxupper = max(ecc_upper[i], maxupper)
152
+
153
+ # update candidate set
154
+ if compute == "diameter":
155
+ ruled_out = {
156
+ i
157
+ for i in candidates
158
+ if ecc_upper[i] <= maxlower and 2 * ecc_lower[i] >= maxupper
159
+ }
160
+ elif compute == "radius":
161
+ ruled_out = {
162
+ i
163
+ for i in candidates
164
+ if ecc_lower[i] >= minupper and ecc_upper[i] + 1 <= 2 * minlower
165
+ }
166
+ elif compute == "periphery":
167
+ ruled_out = {
168
+ i
169
+ for i in candidates
170
+ if ecc_upper[i] < maxlower
171
+ and (maxlower == maxupper or ecc_lower[i] > maxupper)
172
+ }
173
+ elif compute == "center":
174
+ ruled_out = {
175
+ i
176
+ for i in candidates
177
+ if ecc_lower[i] > minupper
178
+ and (minlower == minupper or ecc_upper[i] + 1 < 2 * minlower)
179
+ }
180
+ elif compute == "eccentricities":
181
+ ruled_out = set()
182
+ else:
183
+ msg = "compute must be one of 'diameter', 'radius', 'periphery', 'center', 'eccentricities'"
184
+ raise ValueError(msg)
185
+
186
+ ruled_out.update(i for i in candidates if ecc_lower[i] == ecc_upper[i])
187
+ candidates -= ruled_out
188
+
189
+ # for i in ruled_out:
190
+ # print("removing %g: ecc_u: %g maxl: %g ecc_l: %g maxu: %g"%
191
+ # (i,ecc_upper[i],maxlower,ecc_lower[i],maxupper))
192
+ # print("node %g: ecc_u: %g maxl: %g ecc_l: %g maxu: %g"%
193
+ # (4,ecc_upper[4],maxlower,ecc_lower[4],maxupper))
194
+ # print("NODE 4: %g"%(ecc_upper[4] <= maxlower))
195
+ # print("NODE 4: %g"%(2 * ecc_lower[4] >= maxupper))
196
+ # print("NODE 4: %g"%(ecc_upper[4] <= maxlower
197
+ # and 2 * ecc_lower[4] >= maxupper))
198
+
199
+ # updating maxuppernode and minlowernode for selection in next round
200
+ for i in candidates:
201
+ if (
202
+ minlowernode is None
203
+ or (
204
+ ecc_lower[i] == ecc_lower[minlowernode]
205
+ and degrees[i] > degrees[minlowernode]
206
+ )
207
+ or (ecc_lower[i] < ecc_lower[minlowernode])
208
+ ):
209
+ minlowernode = i
210
+
211
+ if (
212
+ maxuppernode is None
213
+ or (
214
+ ecc_upper[i] == ecc_upper[maxuppernode]
215
+ and degrees[i] > degrees[maxuppernode]
216
+ )
217
+ or (ecc_upper[i] > ecc_upper[maxuppernode])
218
+ ):
219
+ maxuppernode = i
220
+
221
+ # print status update
222
+ # print (" min=" + str(minlower) + "/" + str(minupper) +
223
+ # " max=" + str(maxlower) + "/" + str(maxupper) +
224
+ # " candidates: " + str(len(candidates)))
225
+ # print("cand:",candidates)
226
+ # print("ecc_l",ecc_lower)
227
+ # print("ecc_u",ecc_upper)
228
+ # wait = input("press Enter to continue")
229
+
230
+ # return the correct value of the requested metric
231
+ if compute == "diameter":
232
+ return maxlower
233
+ if compute == "radius":
234
+ return minupper
235
+ if compute == "periphery":
236
+ p = [v for v in G if ecc_lower[v] == maxlower]
237
+ return p
238
+ if compute == "center":
239
+ c = [v for v in G if ecc_upper[v] == minupper]
240
+ return c
241
+ if compute == "eccentricities":
242
+ return ecc_lower
243
+ return None
244
+
245
+
246
+ @nx._dispatchable(edge_attrs="weight")
247
+ def eccentricity(G, v=None, sp=None, weight=None):
248
+ """Returns the eccentricity of nodes in G.
249
+
250
+ The eccentricity of a node v is the maximum distance from v to
251
+ all other nodes in G.
252
+
253
+ Parameters
254
+ ----------
255
+ G : NetworkX graph
256
+ A graph
257
+
258
+ v : node, optional
259
+ Return value of specified node
260
+
261
+ sp : dict of dicts, optional
262
+ All pairs shortest path lengths as a dictionary of dictionaries
263
+
264
+ weight : string, function, or None (default=None)
265
+ If this is a string, then edge weights will be accessed via the
266
+ edge attribute with this key (that is, the weight of the edge
267
+ joining `u` to `v` will be ``G.edges[u, v][weight]``). If no
268
+ such edge attribute exists, the weight of the edge is assumed to
269
+ be one.
270
+
271
+ If this is a function, the weight of an edge is the value
272
+ returned by the function. The function must accept exactly three
273
+ positional arguments: the two endpoints of an edge and the
274
+ dictionary of edge attributes for that edge. The function must
275
+ return a number.
276
+
277
+ If this is None, every edge has weight/distance/cost 1.
278
+
279
+ Weights stored as floating point values can lead to small round-off
280
+ errors in distances. Use integer weights to avoid this.
281
+
282
+ Weights should be positive, since they are distances.
283
+
284
+ Returns
285
+ -------
286
+ ecc : dictionary
287
+ A dictionary of eccentricity values keyed by node.
288
+
289
+ Examples
290
+ --------
291
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
292
+ >>> dict(nx.eccentricity(G))
293
+ {1: 2, 2: 3, 3: 2, 4: 2, 5: 3}
294
+
295
+ >>> dict(
296
+ ... nx.eccentricity(G, v=[1, 5])
297
+ ... ) # This returns the eccentricity of node 1 & 5
298
+ {1: 2, 5: 3}
299
+
300
+ """
301
+ # if v is None: # none, use entire graph
302
+ # nodes=G.nodes()
303
+ # elif v in G: # is v a single node
304
+ # nodes=[v]
305
+ # else: # assume v is a container of nodes
306
+ # nodes=v
307
+ order = G.order()
308
+ e = {}
309
+ for n in G.nbunch_iter(v):
310
+ if sp is None:
311
+ length = nx.shortest_path_length(G, source=n, weight=weight)
312
+
313
+ L = len(length)
314
+ else:
315
+ try:
316
+ length = sp[n]
317
+ L = len(length)
318
+ except TypeError as err:
319
+ raise nx.NetworkXError('Format of "sp" is invalid.') from err
320
+ if L != order:
321
+ if G.is_directed():
322
+ msg = (
323
+ "Found infinite path length because the digraph is not"
324
+ " strongly connected"
325
+ )
326
+ else:
327
+ msg = "Found infinite path length because the graph is not connected"
328
+ raise nx.NetworkXError(msg)
329
+
330
+ e[n] = max(length.values())
331
+
332
+ if v in G:
333
+ return e[v] # return single value
334
+ return e
335
+
336
+
337
+ @nx._dispatchable(edge_attrs="weight")
338
+ def diameter(G, e=None, usebounds=False, weight=None):
339
+ """Returns the diameter of the graph G.
340
+
341
+ The diameter is the maximum eccentricity.
342
+
343
+ Parameters
344
+ ----------
345
+ G : NetworkX graph
346
+ A graph
347
+
348
+ e : eccentricity dictionary, optional
349
+ A precomputed dictionary of eccentricities.
350
+
351
+ usebounds : bool, optional
352
+ If `True`, use extrema bounding (see Notes) when computing the diameter
353
+ for undirected graphs. Extrema bounding may accelerate the
354
+ distance calculation for some graphs. `usebounds` is ignored if `G` is
355
+ directed or if `e` is not `None`. Default is `False`.
356
+
357
+ weight : string, function, or None
358
+ If this is a string, then edge weights will be accessed via the
359
+ edge attribute with this key (that is, the weight of the edge
360
+ joining `u` to `v` will be ``G.edges[u, v][weight]``). If no
361
+ such edge attribute exists, the weight of the edge is assumed to
362
+ be one.
363
+
364
+ If this is a function, the weight of an edge is the value
365
+ returned by the function. The function must accept exactly three
366
+ positional arguments: the two endpoints of an edge and the
367
+ dictionary of edge attributes for that edge. The function must
368
+ return a number.
369
+
370
+ If this is None, every edge has weight/distance/cost 1.
371
+
372
+ Weights stored as floating point values can lead to small round-off
373
+ errors in distances. Use integer weights to avoid this.
374
+
375
+ Weights should be positive, since they are distances.
376
+
377
+ Returns
378
+ -------
379
+ d : integer
380
+ Diameter of graph
381
+
382
+ Notes
383
+ -----
384
+ When ``usebounds=True``, the computation makes use of smart lower
385
+ and upper bounds and is often linear in the number of nodes, rather than
386
+ quadratic (except for some border cases such as complete graphs or circle
387
+ shaped-graphs).
388
+
389
+ Examples
390
+ --------
391
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
392
+ >>> nx.diameter(G)
393
+ 3
394
+
395
+ See Also
396
+ --------
397
+ eccentricity
398
+ """
399
+ if usebounds is True and e is None and not G.is_directed():
400
+ return _extrema_bounding(G, compute="diameter", weight=weight)
401
+ if e is None:
402
+ e = eccentricity(G, weight=weight)
403
+ return max(e.values())
404
+
405
+
406
+ @nx._dispatchable(edge_attrs="weight")
407
+ def harmonic_diameter(G, sp=None, *, weight=None):
408
+ """Returns the harmonic diameter of the graph G.
409
+
410
+ The harmonic diameter of a graph is the harmonic mean of the distances
411
+ between all pairs of distinct vertices. Graphs that are not strongly
412
+ connected have infinite diameter and mean distance, making such
413
+ measures not useful. Restricting the diameter or mean distance to
414
+ finite distances yields paradoxical values (e.g., a perfect match
415
+ would have diameter one). The harmonic mean handles gracefully
416
+ infinite distances (e.g., a perfect match has harmonic diameter equal
417
+ to the number of vertices minus one), making it possible to assign a
418
+ meaningful value to all graphs.
419
+
420
+ Note that in [1] the harmonic diameter is called "connectivity length":
421
+ however, "harmonic diameter" is a more standard name from the
422
+ theory of metric spaces. The name "harmonic mean distance" is perhaps
423
+ a more descriptive name, but is not used in the literature, so we use the
424
+ name "harmonic diameter" here.
425
+
426
+ Parameters
427
+ ----------
428
+ G : NetworkX graph
429
+ A graph
430
+
431
+ sp : dict of dicts, optional
432
+ All-pairs shortest path lengths as a dictionary of dictionaries
433
+
434
+ weight : string, function, or None (default=None)
435
+ If None, every edge has weight/distance 1.
436
+ If a string, use this edge attribute as the edge weight.
437
+ Any edge attribute not present defaults to 1.
438
+ If a function, the weight of an edge is the value returned by the function.
439
+ The function must accept exactly three positional arguments:
440
+ the two endpoints of an edge and the dictionary of edge attributes for
441
+ that edge. The function must return a number.
442
+
443
+ Returns
444
+ -------
445
+ hd : float
446
+ Harmonic diameter of graph
447
+
448
+ References
449
+ ----------
450
+ .. [1] Massimo Marchiori and Vito Latora, "Harmony in the small-world".
451
+ *Physica A: Statistical Mechanics and Its Applications*
452
+ 285(3-4), pages 539-546, 2000.
453
+ <https://doi.org/10.1016/S0378-4371(00)00311-3>
454
+ """
455
+ order = G.order()
456
+
457
+ sum_invd = 0
458
+ for n in G:
459
+ if sp is None:
460
+ length = nx.single_source_dijkstra_path_length(G, n, weight=weight)
461
+ else:
462
+ try:
463
+ length = sp[n]
464
+ L = len(length)
465
+ except TypeError as err:
466
+ raise nx.NetworkXError('Format of "sp" is invalid.') from err
467
+
468
+ for d in length.values():
469
+ # Note that this will skip the zero distance from n to itself,
470
+ # as it should be, but also zero-weight paths in weighted graphs.
471
+ if d != 0:
472
+ sum_invd += 1 / d
473
+
474
+ if sum_invd != 0:
475
+ return order * (order - 1) / sum_invd
476
+ if order > 1:
477
+ return math.inf
478
+ return math.nan
479
+
480
+
481
+ @nx._dispatchable(edge_attrs="weight")
482
+ def periphery(G, e=None, usebounds=False, weight=None):
483
+ """Returns the periphery of the graph G.
484
+
485
+ The periphery is the set of nodes with eccentricity equal to the diameter.
486
+
487
+ Parameters
488
+ ----------
489
+ G : NetworkX graph
490
+ A graph
491
+
492
+ e : eccentricity dictionary, optional
493
+ A precomputed dictionary of eccentricities.
494
+
495
+ usebounds : bool, optional
496
+ If `True`, use extrema bounding (see Notes) when computing the periphery
497
+ for undirected graphs. Extrema bounding may accelerate the
498
+ distance calculation for some graphs. `usebounds` is ignored if `G` is
499
+ directed or if `e` is not `None`. Default is `False`.
500
+
501
+ weight : string, function, or None
502
+ If this is a string, then edge weights will be accessed via the
503
+ edge attribute with this key (that is, the weight of the edge
504
+ joining `u` to `v` will be ``G.edges[u, v][weight]``). If no
505
+ such edge attribute exists, the weight of the edge is assumed to
506
+ be one.
507
+
508
+ If this is a function, the weight of an edge is the value
509
+ returned by the function. The function must accept exactly three
510
+ positional arguments: the two endpoints of an edge and the
511
+ dictionary of edge attributes for that edge. The function must
512
+ return a number.
513
+
514
+ If this is None, every edge has weight/distance/cost 1.
515
+
516
+ Weights stored as floating point values can lead to small round-off
517
+ errors in distances. Use integer weights to avoid this.
518
+
519
+ Weights should be positive, since they are distances.
520
+
521
+ Returns
522
+ -------
523
+ p : list
524
+ List of nodes in periphery
525
+
526
+ Notes
527
+ -----
528
+ When ``usebounds=True``, the computation makes use of smart lower
529
+ and upper bounds and is often linear in the number of nodes, rather than
530
+ quadratic (except for some border cases such as complete graphs or circle
531
+ shaped-graphs).
532
+
533
+ Examples
534
+ --------
535
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
536
+ >>> nx.periphery(G)
537
+ [2, 5]
538
+
539
+ See Also
540
+ --------
541
+ barycenter
542
+ center
543
+ """
544
+ if usebounds is True and e is None and not G.is_directed():
545
+ return _extrema_bounding(G, compute="periphery", weight=weight)
546
+ if e is None:
547
+ e = eccentricity(G, weight=weight)
548
+ diameter = max(e.values())
549
+ p = [v for v in e if e[v] == diameter]
550
+ return p
551
+
552
+
553
+ @nx._dispatchable(edge_attrs="weight")
554
+ def radius(G, e=None, usebounds=False, weight=None):
555
+ """Returns the radius of the graph G.
556
+
557
+ The radius is the minimum eccentricity.
558
+
559
+ Parameters
560
+ ----------
561
+ G : NetworkX graph
562
+ A graph
563
+
564
+ e : eccentricity dictionary, optional
565
+ A precomputed dictionary of eccentricities.
566
+
567
+ usebounds : bool, optional
568
+ If `True`, use extrema bounding (see Notes) when computing the radius
569
+ for undirected graphs. Extrema bounding may accelerate the
570
+ distance calculation for some graphs. `usebounds` is ignored if `G` is
571
+ directed or if `e` is not `None`. Default is `False`.
572
+
573
+ weight : string, function, or None
574
+ If this is a string, then edge weights will be accessed via the
575
+ edge attribute with this key (that is, the weight of the edge
576
+ joining `u` to `v` will be ``G.edges[u, v][weight]``). If no
577
+ such edge attribute exists, the weight of the edge is assumed to
578
+ be one.
579
+
580
+ If this is a function, the weight of an edge is the value
581
+ returned by the function. The function must accept exactly three
582
+ positional arguments: the two endpoints of an edge and the
583
+ dictionary of edge attributes for that edge. The function must
584
+ return a number.
585
+
586
+ If this is None, every edge has weight/distance/cost 1.
587
+
588
+ Weights stored as floating point values can lead to small round-off
589
+ errors in distances. Use integer weights to avoid this.
590
+
591
+ Weights should be positive, since they are distances.
592
+
593
+ Returns
594
+ -------
595
+ r : integer
596
+ Radius of graph
597
+
598
+ Notes
599
+ -----
600
+ When ``usebounds=True``, the computation makes use of smart lower
601
+ and upper bounds and is often linear in the number of nodes, rather than
602
+ quadratic (except for some border cases such as complete graphs or circle
603
+ shaped-graphs).
604
+
605
+ Examples
606
+ --------
607
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
608
+ >>> nx.radius(G)
609
+ 2
610
+
611
+ """
612
+ if usebounds is True and e is None and not G.is_directed():
613
+ return _extrema_bounding(G, compute="radius", weight=weight)
614
+ if e is None:
615
+ e = eccentricity(G, weight=weight)
616
+ return min(e.values())
617
+
618
+
619
+ @nx._dispatchable(edge_attrs="weight")
620
+ def center(G, e=None, usebounds=False, weight=None):
621
+ """Returns the center of the graph G.
622
+
623
+ The center is the set of nodes with eccentricity equal to radius.
624
+
625
+ Parameters
626
+ ----------
627
+ G : NetworkX graph
628
+ A graph
629
+
630
+ e : eccentricity dictionary, optional
631
+ A precomputed dictionary of eccentricities.
632
+
633
+ usebounds : bool, optional
634
+ If `True`, use extrema bounding (see Notes) when computing the center
635
+ for undirected graphs. Extrema bounding may accelerate the
636
+ distance calculation for some graphs. `usebounds` is ignored if `G` is
637
+ directed or if `e` is not `None`. Default is `False`.
638
+
639
+ weight : string, function, or None
640
+ If this is a string, then edge weights will be accessed via the
641
+ edge attribute with this key (that is, the weight of the edge
642
+ joining `u` to `v` will be ``G.edges[u, v][weight]``). If no
643
+ such edge attribute exists, the weight of the edge is assumed to
644
+ be one.
645
+
646
+ If this is a function, the weight of an edge is the value
647
+ returned by the function. The function must accept exactly three
648
+ positional arguments: the two endpoints of an edge and the
649
+ dictionary of edge attributes for that edge. The function must
650
+ return a number.
651
+
652
+ If this is None, every edge has weight/distance/cost 1.
653
+
654
+ Weights stored as floating point values can lead to small round-off
655
+ errors in distances. Use integer weights to avoid this.
656
+
657
+ Weights should be positive, since they are distances.
658
+
659
+ Returns
660
+ -------
661
+ c : list
662
+ List of nodes in center
663
+
664
+ Notes
665
+ -----
666
+ When ``usebounds=True``, the computation makes use of smart lower
667
+ and upper bounds and is often linear in the number of nodes, rather than
668
+ quadratic (except for some border cases such as complete graphs or circle
669
+ shaped-graphs).
670
+
671
+ Examples
672
+ --------
673
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
674
+ >>> list(nx.center(G))
675
+ [1, 3, 4]
676
+
677
+ See Also
678
+ --------
679
+ :func:`~networkx.algorithms.tree.distance_measures.center` : tree center
680
+ barycenter
681
+ periphery
682
+ :func:`~networkx.algorithms.tree.distance_measures.centroid` : tree centroid
683
+ """
684
+ if usebounds is True and e is None and not G.is_directed():
685
+ return _extrema_bounding(G, compute="center", weight=weight)
686
+ if e is None and weight is None and not G.is_directed() and nx.is_tree(G):
687
+ return nx.tree.center(G)
688
+ if e is None:
689
+ e = eccentricity(G, weight=weight)
690
+ radius = min(e.values())
691
+ p = [v for v in e if e[v] == radius]
692
+ return p
693
+
694
+
695
+ @nx._dispatchable(edge_attrs="weight", mutates_input={"attr": 2})
696
+ def barycenter(G, weight=None, attr=None, sp=None):
697
+ r"""Calculate barycenter of a connected graph, optionally with edge weights.
698
+
699
+ The :dfn:`barycenter` a
700
+ :func:`connected <networkx.algorithms.components.is_connected>` graph
701
+ :math:`G` is the subgraph induced by the set of its nodes :math:`v`
702
+ minimizing the objective function
703
+
704
+ .. math::
705
+
706
+ \sum_{u \in V(G)} d_G(u, v),
707
+
708
+ where :math:`d_G` is the (possibly weighted) :func:`path length
709
+ <networkx.algorithms.shortest_paths.generic.shortest_path_length>`.
710
+ The barycenter is also called the :dfn:`median`. See [West01]_, p. 78.
711
+
712
+ Parameters
713
+ ----------
714
+ G : :class:`networkx.Graph`
715
+ The connected graph :math:`G`.
716
+ weight : :class:`str`, optional
717
+ Passed through to
718
+ :func:`~networkx.algorithms.shortest_paths.generic.shortest_path_length`.
719
+ attr : :class:`str`, optional
720
+ If given, write the value of the objective function to each node's
721
+ `attr` attribute. Otherwise do not store the value.
722
+ sp : dict of dicts, optional
723
+ All pairs shortest path lengths as a dictionary of dictionaries
724
+
725
+ Returns
726
+ -------
727
+ list
728
+ Nodes of `G` that induce the barycenter of `G`.
729
+
730
+ Raises
731
+ ------
732
+ NetworkXNoPath
733
+ If `G` is disconnected. `G` may appear disconnected to
734
+ :func:`barycenter` if `sp` is given but is missing shortest path
735
+ lengths for any pairs.
736
+ ValueError
737
+ If `sp` and `weight` are both given.
738
+
739
+ Examples
740
+ --------
741
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
742
+ >>> nx.barycenter(G)
743
+ [1, 3, 4]
744
+
745
+ See Also
746
+ --------
747
+ center
748
+ periphery
749
+ :func:`~networkx.algorithms.tree.distance_measures.centroid` : tree centroid
750
+ """
751
+ if weight is None and attr is None and sp is None:
752
+ if not G.is_directed() and nx.is_tree(G):
753
+ return nx.tree.centroid(G)
754
+
755
+ if sp is None:
756
+ sp = nx.shortest_path_length(G, weight=weight)
757
+ else:
758
+ sp = sp.items()
759
+ if weight is not None:
760
+ raise ValueError("Cannot use both sp, weight arguments together")
761
+ smallest, barycenter_vertices, n = float("inf"), [], len(G)
762
+ for v, dists in sp:
763
+ if len(dists) < n:
764
+ raise nx.NetworkXNoPath(
765
+ f"Input graph {G} is disconnected, so every induced subgraph "
766
+ "has infinite barycentricity."
767
+ )
768
+ barycentricity = sum(dists.values())
769
+ if attr is not None:
770
+ G.nodes[v][attr] = barycentricity
771
+ if barycentricity < smallest:
772
+ smallest = barycentricity
773
+ barycenter_vertices = [v]
774
+ elif barycentricity == smallest:
775
+ barycenter_vertices.append(v)
776
+ if attr is not None:
777
+ nx._clear_cache(G)
778
+ return barycenter_vertices
779
+
780
+
781
+ @not_implemented_for("directed")
782
+ @nx._dispatchable(edge_attrs="weight")
783
+ def resistance_distance(G, nodeA=None, nodeB=None, weight=None, invert_weight=True):
784
+ """Returns the resistance distance between pairs of nodes in graph G.
785
+
786
+ The resistance distance between two nodes of a graph is akin to treating
787
+ the graph as a grid of resistors with a resistance equal to the provided
788
+ weight [1]_, [2]_.
789
+
790
+ If weight is not provided, then a weight of 1 is used for all edges.
791
+
792
+ If two nodes are the same, the resistance distance is zero.
793
+
794
+ Parameters
795
+ ----------
796
+ G : NetworkX graph
797
+ A graph
798
+
799
+ nodeA : node or None, optional (default=None)
800
+ A node within graph G.
801
+ If None, compute resistance distance using all nodes as source nodes.
802
+
803
+ nodeB : node or None, optional (default=None)
804
+ A node within graph G.
805
+ If None, compute resistance distance using all nodes as target nodes.
806
+
807
+ weight : string or None, optional (default=None)
808
+ The edge data key used to compute the resistance distance.
809
+ If None, then each edge has weight 1.
810
+
811
+ invert_weight : boolean (default=True)
812
+ Proper calculation of resistance distance requires building the
813
+ Laplacian matrix with the reciprocal of the weight. Not required
814
+ if the weight is already inverted. Weight cannot be zero.
815
+
816
+ Returns
817
+ -------
818
+ rd : dict or float
819
+ If `nodeA` and `nodeB` are given, resistance distance between `nodeA`
820
+ and `nodeB`. If `nodeA` or `nodeB` is unspecified (the default), a
821
+ dictionary of nodes with resistance distances as the value.
822
+
823
+ Raises
824
+ ------
825
+ NetworkXNotImplemented
826
+ If `G` is a directed graph.
827
+
828
+ NetworkXError
829
+ If `G` is not connected, or contains no nodes,
830
+ or `nodeA` is not in `G` or `nodeB` is not in `G`.
831
+
832
+ Examples
833
+ --------
834
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
835
+ >>> round(nx.resistance_distance(G, 1, 3), 10)
836
+ 0.625
837
+
838
+ Notes
839
+ -----
840
+ The implementation is based on Theorem A in [2]_. Self-loops are ignored.
841
+ Multi-edges are contracted in one edge with weight equal to the harmonic sum of the weights.
842
+
843
+ References
844
+ ----------
845
+ .. [1] Wikipedia
846
+ "Resistance distance."
847
+ https://en.wikipedia.org/wiki/Resistance_distance
848
+ .. [2] D. J. Klein and M. Randic.
849
+ Resistance distance.
850
+ J. of Math. Chem. 12:81-95, 1993.
851
+ """
852
+ import numpy as np
853
+
854
+ if len(G) == 0:
855
+ raise nx.NetworkXError("Graph G must contain at least one node.")
856
+ if not nx.is_connected(G):
857
+ raise nx.NetworkXError("Graph G must be strongly connected.")
858
+ if nodeA is not None and nodeA not in G:
859
+ raise nx.NetworkXError("Node A is not in graph G.")
860
+ if nodeB is not None and nodeB not in G:
861
+ raise nx.NetworkXError("Node B is not in graph G.")
862
+
863
+ G = G.copy()
864
+ node_list = list(G)
865
+
866
+ # Invert weights
867
+ if invert_weight and weight is not None:
868
+ if G.is_multigraph():
869
+ for u, v, k, d in G.edges(keys=True, data=True):
870
+ d[weight] = 1 / d[weight]
871
+ else:
872
+ for u, v, d in G.edges(data=True):
873
+ d[weight] = 1 / d[weight]
874
+
875
+ # Compute resistance distance using the Pseudo-inverse of the Laplacian
876
+ # Self-loops are ignored
877
+ L = nx.laplacian_matrix(G, weight=weight).todense()
878
+ Linv = np.linalg.pinv(L, hermitian=True)
879
+
880
+ # Return relevant distances
881
+ if nodeA is not None and nodeB is not None:
882
+ i = node_list.index(nodeA)
883
+ j = node_list.index(nodeB)
884
+ return Linv.item(i, i) + Linv.item(j, j) - Linv.item(i, j) - Linv.item(j, i)
885
+
886
+ elif nodeA is not None:
887
+ i = node_list.index(nodeA)
888
+ d = {}
889
+ for n in G:
890
+ j = node_list.index(n)
891
+ d[n] = Linv.item(i, i) + Linv.item(j, j) - Linv.item(i, j) - Linv.item(j, i)
892
+ return d
893
+
894
+ elif nodeB is not None:
895
+ j = node_list.index(nodeB)
896
+ d = {}
897
+ for n in G:
898
+ i = node_list.index(n)
899
+ d[n] = Linv.item(i, i) + Linv.item(j, j) - Linv.item(i, j) - Linv.item(j, i)
900
+ return d
901
+
902
+ else:
903
+ d = {}
904
+ for n in G:
905
+ i = node_list.index(n)
906
+ d[n] = {}
907
+ for n2 in G:
908
+ j = node_list.index(n2)
909
+ d[n][n2] = (
910
+ Linv.item(i, i)
911
+ + Linv.item(j, j)
912
+ - Linv.item(i, j)
913
+ - Linv.item(j, i)
914
+ )
915
+ return d
916
+
917
+
918
+ @not_implemented_for("directed")
919
+ @nx._dispatchable(edge_attrs="weight")
920
+ def effective_graph_resistance(G, weight=None, invert_weight=True):
921
+ """Returns the Effective graph resistance of G.
922
+
923
+ Also known as the Kirchhoff index.
924
+
925
+ The effective graph resistance is defined as the sum
926
+ of the resistance distance of every node pair in G [1]_.
927
+
928
+ If weight is not provided, then a weight of 1 is used for all edges.
929
+
930
+ The effective graph resistance of a disconnected graph is infinite.
931
+
932
+ Parameters
933
+ ----------
934
+ G : NetworkX graph
935
+ A graph
936
+
937
+ weight : string or None, optional (default=None)
938
+ The edge data key used to compute the effective graph resistance.
939
+ If None, then each edge has weight 1.
940
+
941
+ invert_weight : boolean (default=True)
942
+ Proper calculation of resistance distance requires building the
943
+ Laplacian matrix with the reciprocal of the weight. Not required
944
+ if the weight is already inverted. Weight cannot be zero.
945
+
946
+ Returns
947
+ -------
948
+ RG : float
949
+ The effective graph resistance of `G`.
950
+
951
+ Raises
952
+ ------
953
+ NetworkXNotImplemented
954
+ If `G` is a directed graph.
955
+
956
+ NetworkXError
957
+ If `G` does not contain any nodes.
958
+
959
+ Examples
960
+ --------
961
+ >>> G = nx.Graph([(1, 2), (1, 3), (1, 4), (3, 4), (3, 5), (4, 5)])
962
+ >>> round(nx.effective_graph_resistance(G), 10)
963
+ 10.25
964
+
965
+ Notes
966
+ -----
967
+ The implementation is based on Theorem 2.2 in [2]_. Self-loops are ignored.
968
+ Multi-edges are contracted in one edge with weight equal to the harmonic sum of the weights.
969
+
970
+ References
971
+ ----------
972
+ .. [1] Wolfram
973
+ "Kirchhoff Index."
974
+ https://mathworld.wolfram.com/KirchhoffIndex.html
975
+ .. [2] W. Ellens, F. M. Spieksma, P. Van Mieghem, A. Jamakovic, R. E. Kooij.
976
+ Effective graph resistance.
977
+ Lin. Alg. Appl. 435:2491-2506, 2011.
978
+ """
979
+ import numpy as np
980
+
981
+ if len(G) == 0:
982
+ raise nx.NetworkXError("Graph G must contain at least one node.")
983
+
984
+ # Disconnected graphs have infinite Effective graph resistance
985
+ if not nx.is_connected(G):
986
+ return float("inf")
987
+
988
+ # Invert weights
989
+ G = G.copy()
990
+ if invert_weight and weight is not None:
991
+ if G.is_multigraph():
992
+ for u, v, k, d in G.edges(keys=True, data=True):
993
+ d[weight] = 1 / d[weight]
994
+ else:
995
+ for u, v, d in G.edges(data=True):
996
+ d[weight] = 1 / d[weight]
997
+
998
+ # Get Laplacian eigenvalues
999
+ mu = np.sort(nx.laplacian_spectrum(G, weight=weight))
1000
+
1001
+ # Compute Effective graph resistance based on spectrum of the Laplacian
1002
+ # Self-loops are ignored
1003
+ return float(np.sum(1 / mu[1:]) * G.number_of_nodes())
1004
+
1005
+
1006
+ @nx.utils.not_implemented_for("directed")
1007
+ @nx._dispatchable(edge_attrs="weight")
1008
+ def kemeny_constant(G, *, weight=None):
1009
+ """Returns the Kemeny constant of the given graph.
1010
+
1011
+ The *Kemeny constant* (or Kemeny's constant) of a graph `G`
1012
+ can be computed by regarding the graph as a Markov chain.
1013
+ The Kemeny constant is then the expected number of time steps
1014
+ to transition from a starting state i to a random destination state
1015
+ sampled from the Markov chain's stationary distribution.
1016
+ The Kemeny constant is independent of the chosen initial state [1]_.
1017
+
1018
+ The Kemeny constant measures the time needed for spreading
1019
+ across a graph. Low values indicate a closely connected graph
1020
+ whereas high values indicate a spread-out graph.
1021
+
1022
+ If weight is not provided, then a weight of 1 is used for all edges.
1023
+
1024
+ Since `G` represents a Markov chain, the weights must be positive.
1025
+
1026
+ Parameters
1027
+ ----------
1028
+ G : NetworkX graph
1029
+
1030
+ weight : string or None, optional (default=None)
1031
+ The edge data key used to compute the Kemeny constant.
1032
+ If None, then each edge has weight 1.
1033
+
1034
+ Returns
1035
+ -------
1036
+ float
1037
+ The Kemeny constant of the graph `G`.
1038
+
1039
+ Raises
1040
+ ------
1041
+ NetworkXNotImplemented
1042
+ If the graph `G` is directed.
1043
+
1044
+ NetworkXError
1045
+ If the graph `G` is not connected, or contains no nodes,
1046
+ or has edges with negative weights.
1047
+
1048
+ Examples
1049
+ --------
1050
+ >>> G = nx.complete_graph(5)
1051
+ >>> round(nx.kemeny_constant(G), 10)
1052
+ 3.2
1053
+
1054
+ Notes
1055
+ -----
1056
+ The implementation is based on equation (3.3) in [2]_.
1057
+ Self-loops are allowed and indicate a Markov chain where
1058
+ the state can remain the same. Multi-edges are contracted
1059
+ in one edge with weight equal to the sum of the weights.
1060
+
1061
+ References
1062
+ ----------
1063
+ .. [1] Wikipedia
1064
+ "Kemeny's constant."
1065
+ https://en.wikipedia.org/wiki/Kemeny%27s_constant
1066
+ .. [2] Lovász L.
1067
+ Random walks on graphs: A survey.
1068
+ Paul Erdös is Eighty, vol. 2, Bolyai Society,
1069
+ Mathematical Studies, Keszthely, Hungary (1993), pp. 1-46
1070
+ """
1071
+ import numpy as np
1072
+ import scipy as sp
1073
+
1074
+ if len(G) == 0:
1075
+ raise nx.NetworkXError("Graph G must contain at least one node.")
1076
+ if not nx.is_connected(G):
1077
+ raise nx.NetworkXError("Graph G must be connected.")
1078
+ if nx.is_negatively_weighted(G, weight=weight):
1079
+ raise nx.NetworkXError("The weights of graph G must be nonnegative.")
1080
+
1081
+ # Compute matrix H = D^-1/2 A D^-1/2
1082
+ A = nx.adjacency_matrix(G, weight=weight)
1083
+ n, m = A.shape
1084
+ diags = A.sum(axis=1)
1085
+ with np.errstate(divide="ignore"):
1086
+ diags_sqrt = 1.0 / np.sqrt(diags)
1087
+ diags_sqrt[np.isinf(diags_sqrt)] = 0
1088
+ DH = sp.sparse.dia_array((diags_sqrt, 0), shape=(m, n)).tocsr()
1089
+ H = DH @ (A @ DH)
1090
+
1091
+ # Compute eigenvalues of H
1092
+ eig = np.sort(sp.linalg.eigvalsh(H.todense()))
1093
+
1094
+ # Compute the Kemeny constant
1095
+ return float(np.sum(1 / (1 - eig[:-1])))