okstra 0.107.2 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (649) hide show
  1. package/package.json +1 -1
  2. package/runtime/BUILD.json +2 -2
  3. package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
  4. package/runtime/prompts/profiles/_common-contract.md +3 -2
  5. package/runtime/python/okstra_ctl/graphify_cmd.py +225 -0
  6. package/runtime/python/okstra_ctl/resolve_task_key.py +15 -9
  7. package/runtime/python/okstra_ctl/session.py +44 -0
  8. package/runtime/python/okstra_project/__init__.py +2 -0
  9. package/runtime/python/okstra_project/state.py +36 -0
  10. package/runtime/python/okstra_token_usage/claude.py +15 -9
  11. package/runtime/python/okstra_token_usage/cli.py +23 -0
  12. package/runtime/python/okstra_token_usage/collect.py +163 -4
  13. package/runtime/python/okstra_vendor/__init__.py +41 -0
  14. package/runtime/python/okstra_vendor/graphify/.vendored-version +1 -0
  15. package/runtime/python/okstra_vendor/graphify/__init__.py +28 -0
  16. package/runtime/python/okstra_vendor/graphify/__main__.py +1371 -0
  17. package/runtime/python/okstra_vendor/graphify/analyze.py +540 -0
  18. package/runtime/python/okstra_vendor/graphify/benchmark.py +129 -0
  19. package/runtime/python/okstra_vendor/graphify/build.py +107 -0
  20. package/runtime/python/okstra_vendor/graphify/cache.py +169 -0
  21. package/runtime/python/okstra_vendor/graphify/cluster.py +137 -0
  22. package/runtime/python/okstra_vendor/graphify/detect.py +510 -0
  23. package/runtime/python/okstra_vendor/graphify/export.py +1014 -0
  24. package/runtime/python/okstra_vendor/graphify/extract.py +3277 -0
  25. package/runtime/python/okstra_vendor/graphify/hooks.py +220 -0
  26. package/runtime/python/okstra_vendor/graphify/ingest.py +297 -0
  27. package/runtime/python/okstra_vendor/graphify/manifest.py +4 -0
  28. package/runtime/python/okstra_vendor/graphify/report.py +175 -0
  29. package/runtime/python/okstra_vendor/graphify/security.py +203 -0
  30. package/runtime/python/okstra_vendor/graphify/serve.py +373 -0
  31. package/runtime/python/okstra_vendor/graphify/skill-aider.md +1184 -0
  32. package/runtime/python/okstra_vendor/graphify/skill-claw.md +1184 -0
  33. package/runtime/python/okstra_vendor/graphify/skill-codex.md +1242 -0
  34. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +1268 -0
  35. package/runtime/python/okstra_vendor/graphify/skill-droid.md +1239 -0
  36. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +1183 -0
  37. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +1238 -0
  38. package/runtime/python/okstra_vendor/graphify/skill-trae.md +1208 -0
  39. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +253 -0
  40. package/runtime/python/okstra_vendor/graphify/skill-windows.md +1245 -0
  41. package/runtime/python/okstra_vendor/graphify/skill.md +1319 -0
  42. package/runtime/python/okstra_vendor/graphify/transcribe.py +182 -0
  43. package/runtime/python/okstra_vendor/graphify/validate.py +72 -0
  44. package/runtime/python/okstra_vendor/graphify/watch.py +188 -0
  45. package/runtime/python/okstra_vendor/graphify/wiki.py +214 -0
  46. package/runtime/python/okstra_vendor/networkx/__init__.py +62 -0
  47. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +134 -0
  48. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +26 -0
  49. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +259 -0
  50. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +71 -0
  51. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +412 -0
  52. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +396 -0
  53. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +150 -0
  54. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +149 -0
  55. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +369 -0
  56. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +44 -0
  57. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +143 -0
  58. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +53 -0
  59. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +265 -0
  60. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  61. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +41 -0
  62. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +112 -0
  63. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +199 -0
  64. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +146 -0
  65. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +59 -0
  66. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +78 -0
  67. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +303 -0
  68. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +8 -0
  69. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +94 -0
  70. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +31 -0
  71. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +306 -0
  72. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +1014 -0
  73. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +274 -0
  74. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +68 -0
  75. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +1508 -0
  76. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +255 -0
  77. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +83 -0
  78. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +5 -0
  79. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +122 -0
  80. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +302 -0
  81. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +255 -0
  82. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +160 -0
  83. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +127 -0
  84. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  85. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +81 -0
  86. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +143 -0
  87. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +122 -0
  88. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +174 -0
  89. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +107 -0
  90. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +87 -0
  91. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +164 -0
  92. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +88 -0
  93. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +322 -0
  94. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +290 -0
  95. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +289 -0
  96. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +57 -0
  97. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +360 -0
  98. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +105 -0
  99. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +603 -0
  100. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +316 -0
  101. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +590 -0
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +232 -0
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +526 -0
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +112 -0
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +69 -0
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +125 -0
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +192 -0
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +84 -0
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +33 -0
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +240 -0
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +334 -0
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +407 -0
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +218 -0
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +327 -0
  116. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +138 -0
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +409 -0
  118. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +35 -0
  119. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +80 -0
  120. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +168 -0
  121. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +205 -0
  122. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +164 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +20 -0
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +591 -0
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +236 -0
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +282 -0
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +364 -0
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +227 -0
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +96 -0
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +150 -0
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +107 -0
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +357 -0
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +130 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +787 -0
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +88 -0
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +331 -0
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +150 -0
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +200 -0
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +128 -0
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +209 -0
  141. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +141 -0
  142. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +361 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  144. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +923 -0
  145. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +354 -0
  146. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +274 -0
  147. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +259 -0
  148. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +147 -0
  149. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +43 -0
  150. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +144 -0
  151. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +73 -0
  152. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +186 -0
  153. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +277 -0
  154. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +122 -0
  155. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +345 -0
  156. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +220 -0
  157. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +344 -0
  158. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +87 -0
  159. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +140 -0
  160. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +82 -0
  161. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +110 -0
  162. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +302 -0
  163. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +64 -0
  164. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +181 -0
  165. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +95 -0
  166. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +172 -0
  167. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +443 -0
  168. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +818 -0
  169. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +732 -0
  170. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +4 -0
  171. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +505 -0
  172. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +565 -0
  173. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  174. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +863 -0
  175. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +163 -0
  176. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +28 -0
  177. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +153 -0
  178. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +354 -0
  179. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +171 -0
  180. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +30 -0
  181. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +216 -0
  182. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +79 -0
  183. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +338 -0
  184. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +162 -0
  185. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +220 -0
  186. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +384 -0
  187. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +227 -0
  188. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +452 -0
  189. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +347 -0
  190. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  191. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +147 -0
  192. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +157 -0
  193. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +85 -0
  194. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +106 -0
  195. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +91 -0
  196. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +241 -0
  197. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +138 -0
  198. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +76 -0
  199. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +264 -0
  200. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +152 -0
  201. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +340 -0
  202. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +139 -0
  203. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +26 -0
  204. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +6 -0
  205. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +115 -0
  206. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +394 -0
  207. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +282 -0
  208. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +71 -0
  209. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +359 -0
  210. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  211. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +70 -0
  212. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +248 -0
  213. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +138 -0
  214. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +55 -0
  215. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +193 -0
  216. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +96 -0
  217. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +196 -0
  218. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +11 -0
  219. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +811 -0
  220. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +616 -0
  221. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +408 -0
  222. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +1270 -0
  223. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +592 -0
  224. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +220 -0
  225. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +235 -0
  226. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +152 -0
  227. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  228. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +421 -0
  229. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +309 -0
  230. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +249 -0
  231. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +502 -0
  232. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +488 -0
  233. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +323 -0
  234. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +280 -0
  235. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +102 -0
  236. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +88 -0
  237. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +588 -0
  238. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +142 -0
  239. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +416 -0
  240. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +1234 -0
  241. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +677 -0
  242. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +1392 -0
  243. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +1095 -0
  244. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +272 -0
  245. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +142 -0
  246. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +268 -0
  247. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +167 -0
  248. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +470 -0
  249. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +11 -0
  250. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +370 -0
  251. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +407 -0
  252. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +238 -0
  253. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +241 -0
  254. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +178 -0
  255. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +611 -0
  256. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +356 -0
  257. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +662 -0
  258. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +425 -0
  259. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +300 -0
  260. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  261. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  262. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  263. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  264. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +128 -0
  265. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +573 -0
  266. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +155 -0
  267. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +475 -0
  268. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +481 -0
  269. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  270. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +194 -0
  271. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +435 -0
  272. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +483 -0
  273. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +57 -0
  274. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +196 -0
  275. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +107 -0
  276. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +7 -0
  277. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +1306 -0
  278. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +336 -0
  279. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +1262 -0
  280. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +352 -0
  281. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +308 -0
  282. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  283. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  284. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  285. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  286. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  287. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +719 -0
  288. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +103 -0
  289. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +490 -0
  290. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +64 -0
  291. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +212 -0
  292. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +202 -0
  293. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +1655 -0
  294. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +3118 -0
  295. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +196 -0
  296. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +264 -0
  297. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +1102 -0
  298. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +192 -0
  299. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +2 -0
  300. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +337 -0
  301. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +498 -0
  302. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  303. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +77 -0
  304. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +213 -0
  305. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +687 -0
  306. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +280 -0
  307. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +1148 -0
  308. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +27 -0
  309. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +738 -0
  310. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +544 -0
  311. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +78 -0
  312. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +59 -0
  313. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +219 -0
  314. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +155 -0
  315. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +4 -0
  316. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +324 -0
  317. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +468 -0
  318. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +633 -0
  319. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  320. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +328 -0
  321. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +451 -0
  322. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +491 -0
  323. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +55 -0
  324. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +77 -0
  325. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +73 -0
  326. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +464 -0
  327. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +1463 -0
  328. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +306 -0
  329. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +98 -0
  330. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +167 -0
  331. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +138 -0
  332. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +5 -0
  333. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +239 -0
  334. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +264 -0
  335. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +716 -0
  336. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  337. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +254 -0
  338. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +212 -0
  339. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +88 -0
  340. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +511 -0
  341. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +149 -0
  342. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +983 -0
  343. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +625 -0
  344. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +2542 -0
  345. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +2107 -0
  346. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +966 -0
  347. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +404 -0
  348. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +30 -0
  349. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +296 -0
  350. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +374 -0
  351. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +564 -0
  352. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +406 -0
  353. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  354. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +23 -0
  355. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +154 -0
  356. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +144 -0
  357. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +109 -0
  358. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +136 -0
  359. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +129 -0
  360. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +300 -0
  361. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +678 -0
  362. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +80 -0
  363. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +266 -0
  364. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +85 -0
  365. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +171 -0
  366. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +984 -0
  367. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +340 -0
  368. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +835 -0
  369. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +831 -0
  370. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +85 -0
  371. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +299 -0
  372. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +115 -0
  373. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +58 -0
  374. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +314 -0
  375. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +872 -0
  376. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +163 -0
  377. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +46 -0
  378. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +24 -0
  379. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +26 -0
  380. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +615 -0
  381. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +459 -0
  382. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +556 -0
  383. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +179 -0
  384. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +62 -0
  385. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +15 -0
  386. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +140 -0
  387. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +60 -0
  388. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +27 -0
  389. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +274 -0
  390. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +556 -0
  391. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +57 -0
  392. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +37 -0
  393. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +88 -0
  394. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +149 -0
  395. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +1158 -0
  396. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +803 -0
  397. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +76 -0
  398. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +8 -0
  399. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +138 -0
  400. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +191 -0
  401. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +642 -0
  402. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +179 -0
  403. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +270 -0
  404. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +431 -0
  405. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +161 -0
  406. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +248 -0
  407. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +41 -0
  408. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +103 -0
  409. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +54 -0
  410. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +157 -0
  411. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +981 -0
  412. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +142 -0
  413. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +406 -0
  414. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +5 -0
  415. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +90 -0
  416. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +576 -0
  417. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +529 -0
  418. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +185 -0
  419. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +182 -0
  420. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  421. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +25 -0
  422. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +203 -0
  423. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +307 -0
  424. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +147 -0
  425. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +131 -0
  426. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +7 -0
  427. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +1042 -0
  428. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +413 -0
  429. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +88 -0
  430. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +219 -0
  431. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +1281 -0
  432. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +106 -0
  433. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +273 -0
  434. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  435. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +624 -0
  436. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +114 -0
  437. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +79 -0
  438. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +99 -0
  439. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +934 -0
  440. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +53 -0
  441. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +174 -0
  442. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +500 -0
  443. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +76 -0
  444. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +86 -0
  445. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +77 -0
  446. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +278 -0
  447. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +13 -0
  448. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +435 -0
  449. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +1363 -0
  450. package/runtime/python/okstra_vendor/networkx/classes/filters.py +95 -0
  451. package/runtime/python/okstra_vendor/networkx/classes/function.py +1549 -0
  452. package/runtime/python/okstra_vendor/networkx/classes/graph.py +2082 -0
  453. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +269 -0
  454. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +977 -0
  455. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +1294 -0
  456. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +1447 -0
  457. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  458. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +192 -0
  459. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +476 -0
  460. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +362 -0
  461. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +331 -0
  462. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +110 -0
  463. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +177 -0
  464. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +1045 -0
  465. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +950 -0
  466. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +12 -0
  467. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +349 -0
  468. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +459 -0
  469. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +528 -0
  470. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +1421 -0
  471. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +131 -0
  472. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +371 -0
  473. package/runtime/python/okstra_vendor/networkx/conftest.py +261 -0
  474. package/runtime/python/okstra_vendor/networkx/convert.py +502 -0
  475. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +1314 -0
  476. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +7 -0
  477. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +2036 -0
  478. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +470 -0
  479. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +570 -0
  480. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +361 -0
  481. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +2978 -0
  482. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  483. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  484. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  485. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  486. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  487. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  488. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  489. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +237 -0
  490. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +229 -0
  491. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +285 -0
  492. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +631 -0
  493. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +146 -0
  494. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +1582 -0
  495. package/runtime/python/okstra_vendor/networkx/exception.py +131 -0
  496. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +34 -0
  497. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  498. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +227 -0
  499. package/runtime/python/okstra_vendor/networkx/generators/classic.py +1091 -0
  500. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +68 -0
  501. package/runtime/python/okstra_vendor/networkx/generators/community.py +1070 -0
  502. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +886 -0
  503. package/runtime/python/okstra_vendor/networkx/generators/directed.py +572 -0
  504. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +174 -0
  505. package/runtime/python/okstra_vendor/networkx/generators/ego.py +66 -0
  506. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +499 -0
  507. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +1037 -0
  508. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +163 -0
  509. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +443 -0
  510. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +125 -0
  511. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +70 -0
  512. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +664 -0
  513. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +405 -0
  514. package/runtime/python/okstra_vendor/networkx/generators/line.py +501 -0
  515. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +110 -0
  516. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +259 -0
  517. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +117 -0
  518. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +1416 -0
  519. package/runtime/python/okstra_vendor/networkx/generators/small.py +1070 -0
  520. package/runtime/python/okstra_vendor/networkx/generators/social.py +554 -0
  521. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +120 -0
  522. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +54 -0
  523. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +131 -0
  524. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  525. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +75 -0
  526. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +642 -0
  527. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +20 -0
  528. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +362 -0
  529. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +224 -0
  530. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +189 -0
  531. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +103 -0
  532. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +39 -0
  533. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +182 -0
  534. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +488 -0
  535. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +133 -0
  536. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +221 -0
  537. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +28 -0
  538. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +144 -0
  539. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +125 -0
  540. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +264 -0
  541. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +316 -0
  542. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +30 -0
  543. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +82 -0
  544. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +33 -0
  545. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +495 -0
  546. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +220 -0
  547. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +49 -0
  548. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +72 -0
  549. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +92 -0
  550. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +64 -0
  551. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +195 -0
  552. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +15 -0
  553. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +74 -0
  554. package/runtime/python/okstra_vendor/networkx/generators/trees.py +1070 -0
  555. package/runtime/python/okstra_vendor/networkx/generators/triads.py +94 -0
  556. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +188 -0
  557. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +13 -0
  558. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +650 -0
  559. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +466 -0
  560. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +77 -0
  561. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +168 -0
  562. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +512 -0
  563. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +166 -0
  564. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +186 -0
  565. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  566. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +400 -0
  567. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +108 -0
  568. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +40 -0
  569. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +275 -0
  570. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +334 -0
  571. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +86 -0
  572. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +70 -0
  573. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +17 -0
  574. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +330 -0
  575. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +489 -0
  576. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +1084 -0
  577. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +879 -0
  578. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +427 -0
  579. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +1053 -0
  580. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +19 -0
  581. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +156 -0
  582. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +190 -0
  583. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +261 -0
  584. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  585. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +78 -0
  586. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +78 -0
  587. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +109 -0
  588. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +48 -0
  589. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +137 -0
  590. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +108 -0
  591. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +393 -0
  592. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +113 -0
  593. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +286 -0
  594. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +379 -0
  595. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  596. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +354 -0
  597. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +318 -0
  598. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +612 -0
  599. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +744 -0
  600. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +181 -0
  601. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +1531 -0
  602. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +30 -0
  603. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +63 -0
  604. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +128 -0
  605. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +166 -0
  606. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +1742 -0
  607. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +851 -0
  608. package/runtime/python/okstra_vendor/networkx/relabel.py +285 -0
  609. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  610. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +248 -0
  611. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +321 -0
  612. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +531 -0
  613. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +349 -0
  614. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +281 -0
  615. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +40 -0
  616. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +11 -0
  617. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +96 -0
  618. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +349 -0
  619. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +8 -0
  620. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +8 -0
  621. package/runtime/python/okstra_vendor/networkx/utils/backends.py +2171 -0
  622. package/runtime/python/okstra_vendor/networkx/utils/configs.py +396 -0
  623. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +1233 -0
  624. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +338 -0
  625. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +297 -0
  626. package/runtime/python/okstra_vendor/networkx/utils/misc.py +703 -0
  627. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +198 -0
  628. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +159 -0
  629. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  630. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +11 -0
  631. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +225 -0
  632. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +263 -0
  633. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +510 -0
  634. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +131 -0
  635. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +268 -0
  636. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +393 -0
  637. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +53 -0
  638. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +63 -0
  639. package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +55 -0
  640. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +106 -0
  641. package/runtime/skills/okstra-graphify/SKILL.md +161 -0
  642. package/runtime/skills/okstra-inspect/SKILL.md +17 -9
  643. package/runtime/templates/reports/settings.template.json +4 -0
  644. package/runtime/validators/forbidden_actions.py +8 -2
  645. package/runtime/validators/validate_session_conformance.py +26 -5
  646. package/src/cli-registry.mjs +7 -0
  647. package/src/commands/graphify.mjs +32 -0
  648. package/src/commands/lifecycle/doctor.mjs +9 -0
  649. package/src/lib/skill-catalog.mjs +1 -0
@@ -0,0 +1,738 @@
1
+ """Provides functions for computing minors of a graph."""
2
+
3
+ from itertools import chain, combinations, permutations, product
4
+
5
+ import networkx as nx
6
+ from networkx import density
7
+ from networkx.exception import NetworkXException
8
+ from networkx.utils import arbitrary_element
9
+
10
+ __all__ = [
11
+ "contracted_edge",
12
+ "contracted_nodes",
13
+ "equivalence_classes",
14
+ "identified_nodes",
15
+ "quotient_graph",
16
+ ]
17
+
18
+ chaini = chain.from_iterable
19
+
20
+
21
+ def equivalence_classes(iterable, relation):
22
+ """Returns equivalence classes of `relation` when applied to `iterable`.
23
+
24
+ The equivalence classes, or blocks, consist of objects from `iterable`
25
+ which are all equivalent. They are defined to be equivalent if the
26
+ `relation` function returns `True` when passed any two objects from that
27
+ class, and `False` otherwise. To define an equivalence relation the
28
+ function must be reflexive, symmetric and transitive.
29
+
30
+ Parameters
31
+ ----------
32
+ iterable : list, tuple, or set
33
+ An iterable of elements/nodes.
34
+
35
+ relation : function
36
+ A Boolean-valued function that implements an equivalence relation
37
+ (reflexive, symmetric, transitive binary relation) on the elements
38
+ of `iterable` - it must take two elements and return `True` if
39
+ they are related, or `False` if not.
40
+
41
+ Returns
42
+ -------
43
+ set of frozensets
44
+ A set of frozensets representing the partition induced by the equivalence
45
+ relation function `relation` on the elements of `iterable`. Each
46
+ member set in the return set represents an equivalence class, or
47
+ block, of the partition.
48
+
49
+ Duplicate elements will be ignored so it makes the most sense for
50
+ `iterable` to be a :class:`set`.
51
+
52
+ Notes
53
+ -----
54
+ This function does not check that `relation` represents an equivalence
55
+ relation. You can check that your equivalence classes provide a partition
56
+ using `is_partition`.
57
+
58
+ Examples
59
+ --------
60
+ Let `X` be the set of integers from `0` to `9`, and consider an equivalence
61
+ relation `R` on `X` of congruence modulo `3`: this means that two integers
62
+ `x` and `y` in `X` are equivalent under `R` if they leave the same
63
+ remainder when divided by `3`, i.e. `(x - y) mod 3 = 0`.
64
+
65
+ The equivalence classes of this relation are `{0, 3, 6, 9}`, `{1, 4, 7}`,
66
+ `{2, 5, 8}`: `0`, `3`, `6`, `9` are all divisible by `3` and leave zero
67
+ remainder; `1`, `4`, `7` leave remainder `1`; while `2`, `5` and `8` leave
68
+ remainder `2`. We can see this by calling `equivalence_classes` with
69
+ `X` and a function implementation of `R`.
70
+
71
+ >>> X = set(range(10))
72
+ >>> def mod3(x, y):
73
+ ... return (x - y) % 3 == 0
74
+ >>> equivalence_classes(X, mod3) # doctest: +SKIP
75
+ {frozenset({1, 4, 7}), frozenset({8, 2, 5}), frozenset({0, 9, 3, 6})}
76
+ """
77
+ # For simplicity of implementation, we initialize the return value as a
78
+ # list of lists, then convert it to a set of sets at the end of the
79
+ # function.
80
+ blocks = []
81
+ # Determine the equivalence class for each element of the iterable.
82
+ for y in iterable:
83
+ # Each element y must be in *exactly one* equivalence class.
84
+ #
85
+ # Each block is guaranteed to be non-empty
86
+ for block in blocks:
87
+ x = arbitrary_element(block)
88
+ if relation(x, y):
89
+ block.append(y)
90
+ break
91
+ else:
92
+ # If the element y is not part of any known equivalence class, it
93
+ # must be in its own, so we create a new singleton equivalence
94
+ # class for it.
95
+ blocks.append([y])
96
+ return {frozenset(block) for block in blocks}
97
+
98
+
99
+ @nx._dispatchable(edge_attrs="weight", returns_graph=True)
100
+ def quotient_graph(
101
+ G,
102
+ partition,
103
+ edge_relation=None,
104
+ node_data=None,
105
+ edge_data=None,
106
+ weight="weight",
107
+ relabel=False,
108
+ create_using=None,
109
+ ):
110
+ """Returns the quotient graph of `G` under the specified equivalence
111
+ relation on nodes.
112
+
113
+ Parameters
114
+ ----------
115
+ G : NetworkX graph
116
+ The graph for which to return the quotient graph with the
117
+ specified node relation.
118
+
119
+ partition : function, or dict or list of lists, tuples or sets
120
+ If a function, this function must represent an equivalence
121
+ relation on the nodes of `G`. It must take two arguments *u*
122
+ and *v* and return True exactly when *u* and *v* are in the
123
+ same equivalence class. The equivalence classes form the nodes
124
+ in the returned graph.
125
+
126
+ If a dict of lists/tuples/sets, the keys can be any meaningful
127
+ block labels, but the values must be the block lists/tuples/sets
128
+ (one list/tuple/set per block), and the blocks must form a valid
129
+ partition of the nodes of the graph. That is, each node must be
130
+ in exactly one block of the partition.
131
+
132
+ If a list of sets, the list must form a valid partition of
133
+ the nodes of the graph. That is, each node must be in exactly
134
+ one block of the partition.
135
+
136
+ edge_relation : Boolean function with two arguments
137
+ This function must represent an edge relation on the *blocks* of
138
+ the `partition` of `G`. It must take two arguments, *B* and *C*,
139
+ each one a set of nodes, and return True exactly when there should be
140
+ an edge joining block *B* to block *C* in the returned graph.
141
+
142
+ If `edge_relation` is not specified, it is assumed to be the
143
+ following relation. Block *B* is related to block *C* if and
144
+ only if some node in *B* is adjacent to some node in *C*,
145
+ according to the edge set of `G`.
146
+
147
+ node_data : function
148
+ This function takes one argument, *B*, a set of nodes in `G`,
149
+ and must return a dictionary representing the node data
150
+ attributes to set on the node representing *B* in the quotient graph.
151
+ If None, the following node attributes will be set:
152
+
153
+ * 'graph', the subgraph of the graph `G` that this block
154
+ represents,
155
+ * 'nnodes', the number of nodes in this block,
156
+ * 'nedges', the number of edges within this block,
157
+ * 'density', the density of the subgraph of `G` that this
158
+ block represents.
159
+
160
+ edge_data : function
161
+ This function takes two arguments, *B* and *C*, each one a set
162
+ of nodes, and must return a dictionary representing the edge
163
+ data attributes to set on the edge joining *B* and *C*, should
164
+ there be an edge joining *B* and *C* in the quotient graph (if
165
+ no such edge occurs in the quotient graph as determined by
166
+ `edge_relation`, then the output of this function is ignored).
167
+
168
+ If the quotient graph would be a multigraph, this function is
169
+ not applied, since the edge data from each edge in the graph
170
+ `G` appears in the edges of the quotient graph.
171
+
172
+ weight : string or None, optional (default="weight")
173
+ The name of an edge attribute that holds the numerical value
174
+ used as a weight. If None then each edge has weight 1.
175
+
176
+ relabel : bool
177
+ If True, relabel the nodes of the quotient graph to be
178
+ nonnegative integers. Otherwise, the nodes are identified with
179
+ :class:`frozenset` instances representing the blocks given in
180
+ `partition`.
181
+
182
+ create_using : NetworkX graph constructor, optional (default=nx.Graph)
183
+ Graph type to create. If graph instance, then cleared before populated.
184
+
185
+ Returns
186
+ -------
187
+ NetworkX graph
188
+ The quotient graph of `G` under the equivalence relation
189
+ specified by `partition`. If the partition were given as a
190
+ list of :class:`set` instances and `relabel` is False,
191
+ each node will be a :class:`frozenset` corresponding to the same
192
+ :class:`set`.
193
+
194
+ Raises
195
+ ------
196
+ NetworkXException
197
+ If the given partition is not a valid partition of the nodes of
198
+ `G`.
199
+
200
+ Examples
201
+ --------
202
+ The quotient graph of the complete bipartite graph under the "same
203
+ neighbors" equivalence relation is `K_2`. Under this relation, two nodes
204
+ are equivalent if they are not adjacent but have the same neighbor set.
205
+
206
+ >>> G = nx.complete_bipartite_graph(2, 3)
207
+ >>> same_neighbors = lambda u, v: (u not in G[v] and v not in G[u] and G[u] == G[v])
208
+ >>> Q = nx.quotient_graph(G, same_neighbors)
209
+ >>> K2 = nx.complete_graph(2)
210
+ >>> nx.is_isomorphic(Q, K2)
211
+ True
212
+
213
+ The quotient graph of a directed graph under the "same strongly connected
214
+ component" equivalence relation is the condensation of the graph (see
215
+ :func:`condensation`). This example comes from the Wikipedia article
216
+ *`Strongly connected component`_*.
217
+
218
+ >>> G = nx.DiGraph()
219
+ >>> edges = [
220
+ ... "ab",
221
+ ... "be",
222
+ ... "bf",
223
+ ... "bc",
224
+ ... "cg",
225
+ ... "cd",
226
+ ... "dc",
227
+ ... "dh",
228
+ ... "ea",
229
+ ... "ef",
230
+ ... "fg",
231
+ ... "gf",
232
+ ... "hd",
233
+ ... "hf",
234
+ ... ]
235
+ >>> G.add_edges_from(tuple(x) for x in edges)
236
+ >>> components = list(nx.strongly_connected_components(G))
237
+ >>> sorted(sorted(component) for component in components)
238
+ [['a', 'b', 'e'], ['c', 'd', 'h'], ['f', 'g']]
239
+ >>>
240
+ >>> C = nx.condensation(G, components)
241
+ >>> component_of = C.graph["mapping"]
242
+ >>> same_component = lambda u, v: component_of[u] == component_of[v]
243
+ >>> Q = nx.quotient_graph(G, same_component)
244
+ >>> nx.is_isomorphic(C, Q)
245
+ True
246
+
247
+ Node identification can be represented as the quotient of a graph under the
248
+ equivalence relation that places the two nodes in one block and each other
249
+ node in its own singleton block.
250
+
251
+ >>> K24 = nx.complete_bipartite_graph(2, 4)
252
+ >>> K34 = nx.complete_bipartite_graph(3, 4)
253
+ >>> C = nx.contracted_nodes(K34, 1, 2)
254
+ >>> nodes = {1, 2}
255
+ >>> is_contracted = lambda u, v: u in nodes and v in nodes
256
+ >>> Q = nx.quotient_graph(K34, is_contracted)
257
+ >>> nx.is_isomorphic(Q, C)
258
+ True
259
+ >>> nx.is_isomorphic(Q, K24)
260
+ True
261
+
262
+ The blockmodeling technique described in [1]_ can be implemented as a
263
+ quotient graph.
264
+
265
+ >>> G = nx.path_graph(6)
266
+ >>> partition = [{0, 1}, {2, 3}, {4, 5}]
267
+ >>> M = nx.quotient_graph(G, partition, relabel=True)
268
+ >>> list(M.edges())
269
+ [(0, 1), (1, 2)]
270
+
271
+ Here is the sample example but using partition as a dict of block sets.
272
+
273
+ >>> G = nx.path_graph(6)
274
+ >>> partition = {0: {0, 1}, 2: {2, 3}, 4: {4, 5}}
275
+ >>> M = nx.quotient_graph(G, partition, relabel=True)
276
+ >>> list(M.edges())
277
+ [(0, 1), (1, 2)]
278
+
279
+ Partitions can be represented in various ways:
280
+
281
+ 0. a list/tuple/set of block lists/tuples/sets
282
+ 1. a dict with block labels as keys and blocks lists/tuples/sets as values
283
+ 2. a dict with block lists/tuples/sets as keys and block labels as values
284
+ 3. a function from nodes in the original iterable to block labels
285
+ 4. an equivalence relation function on the target iterable
286
+
287
+ As `quotient_graph` is designed to accept partitions represented as (0), (1) or
288
+ (4) only, the `equivalence_classes` function can be used to get the partitions
289
+ in the right form, in order to call `quotient_graph`.
290
+
291
+ .. _Strongly connected component: https://en.wikipedia.org/wiki/Strongly_connected_component
292
+
293
+ References
294
+ ----------
295
+ .. [1] Patrick Doreian, Vladimir Batagelj, and Anuska Ferligoj.
296
+ *Generalized Blockmodeling*.
297
+ Cambridge University Press, 2004.
298
+
299
+ """
300
+ # If the user provided an equivalence relation as a function to compute
301
+ # the blocks of the partition on the nodes of G induced by the
302
+ # equivalence relation.
303
+ if callable(partition):
304
+ # equivalence_classes always return partition of whole G.
305
+ partition = equivalence_classes(G, partition)
306
+ if not nx.community.is_partition(G, partition):
307
+ raise nx.NetworkXException(
308
+ "Input `partition` is not an equivalence relation for nodes of G"
309
+ )
310
+ return _quotient_graph(
311
+ G,
312
+ partition,
313
+ edge_relation,
314
+ node_data,
315
+ edge_data,
316
+ weight,
317
+ relabel,
318
+ create_using,
319
+ )
320
+
321
+ # If the partition is a dict, it is assumed to be one where the keys are
322
+ # user-defined block labels, and values are block lists, tuples or sets.
323
+ if isinstance(partition, dict):
324
+ partition = list(partition.values())
325
+
326
+ # If the user provided partition as a collection of sets. Then we
327
+ # need to check if partition covers all of G nodes. If the answer
328
+ # is 'No' then we need to prepare suitable subgraph view.
329
+ partition_nodes = set().union(*partition)
330
+ if len(partition_nodes) != len(G):
331
+ G = G.subgraph(partition_nodes)
332
+ # Each node in the graph/subgraph must be in exactly one block.
333
+ if not nx.community.is_partition(G, partition):
334
+ raise NetworkXException("each node must be in exactly one part of `partition`")
335
+ return _quotient_graph(
336
+ G,
337
+ partition,
338
+ edge_relation,
339
+ node_data,
340
+ edge_data,
341
+ weight,
342
+ relabel,
343
+ create_using,
344
+ )
345
+
346
+
347
+ def _quotient_graph(
348
+ G, partition, edge_relation, node_data, edge_data, weight, relabel, create_using
349
+ ):
350
+ """Construct the quotient graph assuming input has been checked"""
351
+ if create_using is None:
352
+ H = G.__class__()
353
+ else:
354
+ H = nx.empty_graph(0, create_using)
355
+ # By default set some basic information about the subgraph that each block
356
+ # represents on the nodes in the quotient graph.
357
+ if node_data is None:
358
+
359
+ def node_data(b):
360
+ S = G.subgraph(b)
361
+ return {
362
+ "graph": S,
363
+ "nnodes": len(S),
364
+ "nedges": S.number_of_edges(),
365
+ "density": density(S),
366
+ }
367
+
368
+ # Each block of the partition becomes a node in the quotient graph.
369
+ partition = [frozenset(b) for b in partition]
370
+ H.add_nodes_from((b, node_data(b)) for b in partition)
371
+ # By default, the edge relation is the relation defined as follows. B is
372
+ # adjacent to C if a node in B is adjacent to a node in C, according to the
373
+ # edge set of G.
374
+ #
375
+ # This is not a particularly efficient implementation of this relation:
376
+ # there are O(n^2) pairs to check and each check may require O(log n) time
377
+ # (to check set membership). This can certainly be parallelized.
378
+ if edge_relation is None:
379
+
380
+ def edge_relation(b, c):
381
+ return any(v in G[u] for u, v in product(b, c))
382
+
383
+ # By default, sum the weights of the edges joining pairs of nodes across
384
+ # blocks to get the weight of the edge joining those two blocks.
385
+ if edge_data is None:
386
+
387
+ def edge_data(b, c):
388
+ edgedata = (
389
+ d
390
+ for u, v, d in G.edges(b | c, data=True)
391
+ if (u in b and v in c) or (u in c and v in b)
392
+ )
393
+ return {"weight": sum(d.get(weight, 1) for d in edgedata)}
394
+
395
+ block_pairs = permutations(H, 2) if H.is_directed() else combinations(H, 2)
396
+ # In a multigraph, add one edge in the quotient graph for each edge
397
+ # in the original graph.
398
+ if H.is_multigraph():
399
+ edges = chaini(
400
+ (
401
+ (b, c, G.get_edge_data(u, v, default={}))
402
+ for u, v in product(b, c)
403
+ if v in G[u]
404
+ )
405
+ for b, c in block_pairs
406
+ if edge_relation(b, c)
407
+ )
408
+ # In a simple graph, apply the edge data function to each pair of
409
+ # blocks to determine the edge data attributes to apply to each edge
410
+ # in the quotient graph.
411
+ else:
412
+ edges = (
413
+ (b, c, edge_data(b, c)) for (b, c) in block_pairs if edge_relation(b, c)
414
+ )
415
+ H.add_edges_from(edges)
416
+ # If requested by the user, relabel the nodes to be integers,
417
+ # numbered in increasing order from zero in the same order as the
418
+ # iteration order of `partition`.
419
+ if relabel:
420
+ # Can't use nx.convert_node_labels_to_integers() here since we
421
+ # want the order of iteration to be the same for backward
422
+ # compatibility with the nx.blockmodel() function.
423
+ labels = {b: i for i, b in enumerate(partition)}
424
+ H = nx.relabel_nodes(H, labels)
425
+ return H
426
+
427
+
428
+ @nx._dispatchable(
429
+ preserve_all_attrs=True, mutates_input={"not copy": 4}, returns_graph=True
430
+ )
431
+ def contracted_nodes(
432
+ G, u, v, self_loops=True, copy=True, *, store_contraction_as="contraction"
433
+ ):
434
+ """Returns the graph that results from contracting `u` and `v`.
435
+
436
+ Node contraction identifies the two nodes as a single node incident to any
437
+ edge that was incident to the original two nodes.
438
+ Information about the contracted nodes and any modified edges are stored on
439
+ the output graph in a ``"contraction"`` attribute - see Examples for details.
440
+
441
+ Parameters
442
+ ----------
443
+ G : NetworkX graph
444
+ The graph whose nodes will be contracted.
445
+
446
+ u, v : nodes
447
+ Must be nodes in `G`.
448
+
449
+ self_loops : Boolean
450
+ If this is True, any edges joining `u` and `v` in `G` become
451
+ self-loops on the new node in the returned graph.
452
+
453
+ copy : Boolean
454
+ If this is True (the default), make a copy of
455
+ `G` and return that instead of directly changing `G`.
456
+
457
+ store_contraction_as : str or None, default="contraction"
458
+ Name of the node/edge attribute where information about the contraction
459
+ should be stored. By default information about the contracted node and
460
+ any contracted edges is stored in a ``"contraction"`` attribute on the
461
+ resulting node and edge. If `None`, information about the contracted
462
+ nodes/edges and their data are not stored.
463
+
464
+ Returns
465
+ -------
466
+ Networkx graph
467
+ If `copy` is True,
468
+ A new graph object of the same type as `G` (leaving `G` unmodified)
469
+ with `u` and `v` identified in a single node. The right node `v`
470
+ will be merged into the node `u`, so only `u` will appear in the
471
+ returned graph.
472
+ If `copy` is False,
473
+ Modifies `G` with `u` and `v` identified in a single node.
474
+ The right node `v` will be merged into the node `u`, so
475
+ only `u` will appear in the returned graph.
476
+
477
+ Notes
478
+ -----
479
+ For multigraphs, the edge keys for the realigned edges may
480
+ not be the same as the edge keys for the old edges. This is
481
+ natural because edge keys are unique only within each pair of nodes.
482
+
483
+ This function is also available as `identified_nodes`.
484
+
485
+ Examples
486
+ --------
487
+ Contracting two nonadjacent nodes of the cycle graph on four nodes `C_4`
488
+ yields the path graph (ignoring parallel edges):
489
+
490
+ >>> G = nx.cycle_graph(4)
491
+ >>> M = nx.contracted_nodes(G, 1, 3)
492
+ >>> P3 = nx.path_graph(3)
493
+ >>> nx.is_isomorphic(M, P3)
494
+ True
495
+
496
+ Information about the contracted nodes is stored on the resulting graph in
497
+ a ``"contraction"`` attribute. For instance, the contracted node is stored
498
+ as an attribute on ``u``:
499
+
500
+ >>> H = nx.contracted_nodes(P3, 0, 2)
501
+ >>> H.nodes(data=True)
502
+ NodeDataView({0: {'contraction': {2: {}}}, 1: {}})
503
+
504
+ Any node attributes on the contracted node are also preserved:
505
+
506
+ >>> nx.set_node_attributes(P3, dict(enumerate("rgb")), name="color")
507
+ >>> P3.nodes(data=True)
508
+ NodeDataView({0: {'color': 'r'}, 1: {'color': 'g'}, 2: {'color': 'b'}})
509
+ >>> H = nx.contracted_nodes(P3, 0, 2)
510
+ >>> H.nodes[0]
511
+ {'color': 'r', 'contraction': {2: {'color': 'b'}}}
512
+
513
+ Edges are handled similarly: when ``u`` and ``v`` are adjacent to a third node
514
+ ``w``, the edge ``(v, w)`` will be contracted into the edge ``(u, w)`` with
515
+ its attributes stored into a ``"contraction"`` attribute on edge ``(u, w)``:
516
+
517
+ >>> nx.set_edge_attributes(P3, {(0, 1): 10, (1, 2): 100}, name="weight")
518
+ >>> P3.edges(data=True)
519
+ EdgeDataView([(0, 1, {'weight': 10}), (1, 2, {'weight': 100})])
520
+ >>> H = nx.contracted_nodes(P3, 0, 2)
521
+ >>> H.edges(data=True)
522
+ EdgeDataView([(0, 1, {'weight': 10, 'contraction': {(2, 1): {'weight': 100}}})])
523
+
524
+ Attributes from contracted nodes/edges can be combined with those of the
525
+ nodes/edges onto which they were contracted:
526
+
527
+ >>> # Concatenate colors of contracted nodes
528
+ >>> for u, cdict in H.nodes(data="contraction"):
529
+ ... if cdict is not None:
530
+ ... H.nodes[u]["color"] += "".join(n["color"] for n in cdict.values())
531
+ ... del H.nodes[u]["contraction"] # Remove contraction attr (optional)
532
+ >>> H.nodes(data=True)
533
+ NodeDataView({0: {'color': 'rb'}, 1: {'color': 'g'}})
534
+ >>> # Sum contracted edge weights
535
+ >>> for u, v, cdict in H.edges(data="contraction"):
536
+ ... if cdict is not None:
537
+ ... H[u][v]["weight"] += sum(n["weight"] for n in cdict.values())
538
+ ... del H.edges[(u, v)]["contraction"] # Remove contraction attr (optional)
539
+ >>> H.edges(data=True)
540
+ EdgeDataView([(0, 1, {'weight': 110})])
541
+
542
+ If `G` is a multigraph, then a new edge is added instead. Any edge attributes
543
+ are still preserved:
544
+
545
+ >>> MG = nx.MultiGraph(P3)
546
+ >>> MH = nx.contracted_nodes(MG, 0, 2)
547
+ >>> MH.edges(keys=True, data=True)
548
+ MultiEdgeDataView([(0, 1, 0, {'weight': 10}), (0, 1, 1, {'weight': 100})])
549
+
550
+ If ``selfloops=True`` (the default), any edges adjoining `u` and `v` become
551
+ self-loops on ``u`` in the resulting graph:
552
+
553
+ >>> G = nx.Graph([(1, 2)])
554
+ >>> H = nx.contracted_nodes(G, 1, 2)
555
+ >>> H.nodes, H.edges
556
+ (NodeView((1,)), EdgeView([(1, 1)]))
557
+ >>> H = nx.contracted_nodes(G, 1, 2, self_loops=False)
558
+ >>> H.nodes, H.edges
559
+ (NodeView((1,)), EdgeView([]))
560
+
561
+ Note however that any self loops in the original graph `G` are preserved:
562
+
563
+ >>> G = nx.Graph([(1, 2), (2, 2)])
564
+ >>> H = nx.contracted_nodes(G, 1, 2, self_loops=False)
565
+ >>> H.nodes, H.edges
566
+ (NodeView((1,)), EdgeView([(1, 1)]))
567
+
568
+ The same reasoning applies to MultiGraphs:
569
+
570
+ >>> MG = nx.MultiGraph([(1, 2), (2, 2)])
571
+ >>> # Edge (1, 1, 0) in MH corresponds to edge (2, 2) in MG
572
+ >>> MH = nx.contracted_nodes(MG, 1, 2, self_loops=False)
573
+ >>> MH.edges(keys=True)
574
+ MultiEdgeView([(1, 1, 0)])
575
+ >>> # MH has two (1, 1) edges - one from edge (2, 2) in MG, and one
576
+ >>> # resulting from the contraction of 2->1
577
+ >>> MH = nx.contracted_nodes(MG, 1, 2, self_loops=True)
578
+ >>> MH.edges(keys=True)
579
+ MultiEdgeView([(1, 1, 0), (1, 1, 1)])
580
+
581
+
582
+ In a ``MultiDiGraph`` with a self loop, the in and out edges will
583
+ be treated separately as edges, so while contracting a node which
584
+ has a self loop the contraction will add multiple edges:
585
+
586
+ >>> G = nx.MultiDiGraph([(1, 2), (2, 2)])
587
+ >>> H = nx.contracted_nodes(G, 1, 2)
588
+ >>> list(H.edges()) # edge 1->2, 2->2, 2<-2 from the original Graph G
589
+ [(1, 1), (1, 1), (1, 1)]
590
+ >>> H = nx.contracted_nodes(G, 1, 2, self_loops=False)
591
+ >>> list(H.edges()) # edge 2->2, 2<-2 from the original Graph G
592
+ [(1, 1), (1, 1)]
593
+
594
+ See Also
595
+ --------
596
+ contracted_edge
597
+ quotient_graph
598
+
599
+ """
600
+ # Copying has significant overhead and can be disabled if needed
601
+ H = G.copy() if copy else G
602
+
603
+ # edge code uses G.edges(v) instead of G.adj[v] to handle multiedges
604
+ if H.is_directed():
605
+ edges_to_remap = chain(G.in_edges(v, data=True), G.out_edges(v, data=True))
606
+ else:
607
+ edges_to_remap = G.edges(v, data=True)
608
+
609
+ # If the H=G, the generators change as H changes
610
+ # This makes the edges_to_remap independent of H
611
+ if not copy:
612
+ edges_to_remap = list(edges_to_remap)
613
+
614
+ v_data = H.nodes[v]
615
+ H.remove_node(v)
616
+
617
+ # A bit of input munging to extract whether contraction info should be
618
+ # stored, and if so bind to a shorter name
619
+ if _store_contraction := (store_contraction_as is not None):
620
+ contraction = store_contraction_as
621
+
622
+ for prev_w, prev_x, d in edges_to_remap:
623
+ w = prev_w if prev_w != v else u
624
+ x = prev_x if prev_x != v else u
625
+
626
+ if ({prev_w, prev_x} == {u, v}) and not self_loops:
627
+ continue
628
+
629
+ if not H.has_edge(w, x) or G.is_multigraph():
630
+ H.add_edge(w, x, **d)
631
+ continue
632
+
633
+ # Store information about the contracted edge iff `store_contraction` is not None
634
+ if _store_contraction:
635
+ if contraction in H.edges[(w, x)]:
636
+ H.edges[(w, x)][contraction][(prev_w, prev_x)] = d
637
+ else:
638
+ H.edges[(w, x)][contraction] = {(prev_w, prev_x): d}
639
+
640
+ # Store information about the contracted node iff `store_contraction`
641
+ if _store_contraction:
642
+ if contraction in H.nodes[u]:
643
+ H.nodes[u][contraction][v] = v_data
644
+ else:
645
+ H.nodes[u][contraction] = {v: v_data}
646
+
647
+ return H
648
+
649
+
650
+ identified_nodes = contracted_nodes
651
+
652
+
653
+ @nx._dispatchable(
654
+ preserve_all_attrs=True, mutates_input={"not copy": 3}, returns_graph=True
655
+ )
656
+ def contracted_edge(
657
+ G, edge, self_loops=True, copy=True, *, store_contraction_as="contraction"
658
+ ):
659
+ """Returns the graph that results from contracting the specified edge.
660
+
661
+ Edge contraction identifies the two endpoints of the edge as a single node
662
+ incident to any edge that was incident to the original two nodes. A graph
663
+ that results from edge contraction is called a *minor* of the original
664
+ graph.
665
+
666
+ Parameters
667
+ ----------
668
+ G : NetworkX graph
669
+ The graph whose edge will be contracted.
670
+
671
+ edge : tuple
672
+ Must be a pair of nodes in `G`.
673
+
674
+ self_loops : Boolean
675
+ If this is True, any edges (including `edge`) joining the
676
+ endpoints of `edge` in `G` become self-loops on the new node in the
677
+ returned graph.
678
+
679
+ copy : Boolean (default True)
680
+ If this is True, a the contraction will be performed on a copy of `G`,
681
+ otherwise the contraction will happen in place.
682
+
683
+ store_contraction_as : str or None, default="contraction"
684
+ Name of the node/edge attribute where information about the contraction
685
+ should be stored. By default information about the contracted node and
686
+ any contracted edges is stored in a ``"contraction"`` attribute on the
687
+ resulting node and edge. If `None`, information about the contracted
688
+ nodes/edges and their data are not stored.
689
+
690
+ Returns
691
+ -------
692
+ Networkx graph
693
+ A new graph object of the same type as `G` (leaving `G` unmodified)
694
+ with endpoints of `edge` identified in a single node. The right node
695
+ of `edge` will be merged into the left one, so only the left one will
696
+ appear in the returned graph.
697
+
698
+ Raises
699
+ ------
700
+ ValueError
701
+ If `edge` is not an edge in `G`.
702
+
703
+ Examples
704
+ --------
705
+ Attempting to contract two nonadjacent nodes yields an error:
706
+
707
+ >>> G = nx.cycle_graph(4)
708
+ >>> nx.contracted_edge(G, (1, 3))
709
+ Traceback (most recent call last):
710
+ ...
711
+ ValueError: Edge (1, 3) does not exist in graph G; cannot contract it
712
+
713
+ Contracting two adjacent nodes in the cycle graph on *n* nodes yields the
714
+ cycle graph on *n - 1* nodes:
715
+
716
+ >>> C5 = nx.cycle_graph(5)
717
+ >>> C4 = nx.cycle_graph(4)
718
+ >>> M = nx.contracted_edge(C5, (0, 1), self_loops=False)
719
+ >>> nx.is_isomorphic(M, C4)
720
+ True
721
+
722
+ See also
723
+ --------
724
+ contracted_nodes
725
+ quotient_graph
726
+
727
+ """
728
+ u, v = edge[:2]
729
+ if not G.has_edge(u, v):
730
+ raise ValueError(f"Edge {edge} does not exist in graph G; cannot contract it")
731
+ return contracted_nodes(
732
+ G,
733
+ u,
734
+ v,
735
+ self_loops=self_loops,
736
+ copy=copy,
737
+ store_contraction_as=store_contraction_as,
738
+ )