okstra 0.130.3 → 0.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +0 -1
  2. package/docs/architecture.md +2 -2
  3. package/docs/cli.md +1 -1
  4. package/docs/for-ai/README.md +0 -2
  5. package/docs/for-ai/skills/okstra-run.md +13 -2
  6. package/docs/for-ai/skills/okstra-setup.md +4 -1
  7. package/docs/project-structure-overview.md +5 -4
  8. package/docs/task-process/implementation-planning.md +13 -0
  9. package/docs/task-process/implementation.md +17 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +7 -0
  13. package/runtime/bin/lib/okstra/usage.sh +4 -4
  14. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  15. package/runtime/prompts/lead/plan-body-verification.md +26 -5
  16. package/runtime/prompts/lead/report-writer.md +6 -2
  17. package/runtime/prompts/profiles/_common-contract.md +2 -1
  18. package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
  19. package/runtime/prompts/profiles/_implementation-executor.md +2 -2
  20. package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
  21. package/runtime/prompts/profiles/final-verification.md +21 -6
  22. package/runtime/prompts/profiles/implementation-planning.md +21 -4
  23. package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
  24. package/runtime/python/okstra_ctl/conformance.py +49 -11
  25. package/runtime/python/okstra_ctl/report_finalize.py +52 -1
  26. package/runtime/python/okstra_ctl/report_views.py +32 -5
  27. package/runtime/python/okstra_ctl/run.py +15 -3
  28. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  29. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  30. package/runtime/python/okstra_vendor/__init__.py +0 -44
  31. package/runtime/schemas/final-report-v1.0.schema.json +101 -6
  32. package/runtime/skills/okstra-run/SKILL.md +11 -4
  33. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  34. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  35. package/runtime/templates/reports/final-report.template.md +18 -12
  36. package/runtime/templates/reports/i18n/en.json +1 -0
  37. package/runtime/templates/reports/i18n/ko.json +1 -0
  38. package/runtime/templates/reports/report.css +18 -0
  39. package/runtime/validators/lib/fixtures.sh +6 -0
  40. package/runtime/validators/validate-run.py +1722 -98
  41. package/src/cli-registry.mjs +0 -7
  42. package/src/commands/lifecycle/doctor.mjs +0 -9
  43. package/src/lib/skill-catalog.mjs +0 -1
  44. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  45. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  46. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  47. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  48. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  49. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  50. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  51. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  52. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  53. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  54. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  55. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  56. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  57. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  58. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  59. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  60. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  61. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  62. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  63. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  64. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  65. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  66. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  67. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  68. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  69. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  70. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  71. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  72. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  73. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  74. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  75. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  76. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  77. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  78. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  79. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  93. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  94. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  99. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  100. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  101. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  116. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  118. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  141. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  142. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  143. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  144. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  146. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  147. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  148. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  161. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  162. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  168. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  169. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  178. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  179. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  180. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  181. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  182. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  183. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  184. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  185. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  186. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  187. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  188. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  189. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  190. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  191. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  202. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  203. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  204. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  205. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  206. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  207. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  216. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  217. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  220. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  221. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  222. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  223. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  224. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  225. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  226. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  227. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  228. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  229. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  233. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  234. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  235. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  236. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  237. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  238. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  239. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  240. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  241. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  246. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  247. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  248. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  249. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  250. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  251. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  252. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  253. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  254. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  255. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  256. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  257. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  258. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  263. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  264. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  271. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  272. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  273. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  274. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  275. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  276. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  277. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  278. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  279. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  280. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  281. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  282. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  283. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  284. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  285. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  286. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  287. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  288. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  289. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  290. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  291. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  294. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  295. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  296. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  297. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  298. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  299. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  300. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  301. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  302. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  303. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  304. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  305. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  306. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  307. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  308. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  309. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  310. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  311. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  312. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  313. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  314. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  315. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  316. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  317. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  318. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  319. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  320. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  321. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  322. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  323. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  324. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  325. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  326. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  327. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  328. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  329. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  330. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  331. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  332. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  333. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  334. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  335. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  336. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  337. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  338. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  339. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  340. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  341. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  342. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  343. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  347. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  348. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  349. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  350. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  351. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  352. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  353. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  354. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  355. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  356. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  357. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  358. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  359. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  360. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  361. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  362. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  363. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  364. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  365. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  366. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  367. package/src/commands/graphify.mjs +0 -32
@@ -1,306 +0,0 @@
1
- """Provides algorithms supporting the computation of graph polynomials.
2
-
3
- Graph polynomials are polynomial-valued graph invariants that encode a wide
4
- variety of structural information. Examples include the Tutte polynomial,
5
- chromatic polynomial, characteristic polynomial, and matching polynomial. An
6
- extensive treatment is provided in [1]_.
7
-
8
- For a simple example, the `~sympy.matrices.matrices.MatrixDeterminant.charpoly`
9
- method can be used to compute the characteristic polynomial from the adjacency
10
- matrix of a graph. Consider the complete graph ``K_4``:
11
-
12
- >>> import sympy
13
- >>> x = sympy.Symbol("x")
14
- >>> G = nx.complete_graph(4)
15
- >>> A = nx.to_numpy_array(G, dtype=int)
16
- >>> M = sympy.SparseMatrix(A)
17
- >>> M.charpoly(x).as_expr()
18
- x**4 - 6*x**2 - 8*x - 3
19
-
20
-
21
- .. [1] Y. Shi, M. Dehmer, X. Li, I. Gutman,
22
- "Graph Polynomials"
23
- """
24
-
25
- from collections import deque
26
-
27
- import networkx as nx
28
- from networkx.utils import not_implemented_for
29
-
30
- __all__ = ["tutte_polynomial", "chromatic_polynomial"]
31
-
32
-
33
- @not_implemented_for("directed")
34
- @nx._dispatchable
35
- def tutte_polynomial(G):
36
- r"""Returns the Tutte polynomial of `G`
37
-
38
- This function computes the Tutte polynomial via an iterative version of
39
- the deletion-contraction algorithm.
40
-
41
- The Tutte polynomial `T_G(x, y)` is a fundamental graph polynomial invariant in
42
- two variables. It encodes a wide array of information related to the
43
- edge-connectivity of a graph; "Many problems about graphs can be reduced to
44
- problems of finding and evaluating the Tutte polynomial at certain values" [1]_.
45
- In fact, every deletion-contraction-expressible feature of a graph is a
46
- specialization of the Tutte polynomial [2]_ (see Notes for examples).
47
-
48
- There are several equivalent definitions; here are three:
49
-
50
- Def 1 (rank-nullity expansion): For `G` an undirected graph, `n(G)` the
51
- number of vertices of `G`, `E` the edge set of `G`, `V` the vertex set of
52
- `G`, and `c(A)` the number of connected components of the graph with vertex
53
- set `V` and edge set `A` [3]_:
54
-
55
- .. math::
56
-
57
- T_G(x, y) = \sum_{A \in E} (x-1)^{c(A) - c(E)} (y-1)^{c(A) + |A| - n(G)}
58
-
59
- Def 2 (spanning tree expansion): Let `G` be an undirected graph, `T` a spanning
60
- tree of `G`, and `E` the edge set of `G`. Let `E` have an arbitrary strict
61
- linear order `L`. Let `B_e` be the unique minimal nonempty edge cut of
62
- $E \setminus T \cup {e}$. An edge `e` is internally active with respect to
63
- `T` and `L` if `e` is the least edge in `B_e` according to the linear order
64
- `L`. The internal activity of `T` (denoted `i(T)`) is the number of edges
65
- in $E \setminus T$ that are internally active with respect to `T` and `L`.
66
- Let `P_e` be the unique path in $T \cup {e}$ whose source and target vertex
67
- are the same. An edge `e` is externally active with respect to `T` and `L`
68
- if `e` is the least edge in `P_e` according to the linear order `L`. The
69
- external activity of `T` (denoted `e(T)`) is the number of edges in
70
- $E \setminus T$ that are externally active with respect to `T` and `L`.
71
- Then [4]_ [5]_:
72
-
73
- .. math::
74
-
75
- T_G(x, y) = \sum_{T \text{ a spanning tree of } G} x^{i(T)} y^{e(T)}
76
-
77
- Def 3 (deletion-contraction recurrence): For `G` an undirected graph, `G-e`
78
- the graph obtained from `G` by deleting edge `e`, `G/e` the graph obtained
79
- from `G` by contracting edge `e`, `k(G)` the number of cut-edges of `G`,
80
- and `l(G)` the number of self-loops of `G`:
81
-
82
- .. math::
83
- T_G(x, y) = \begin{cases}
84
- x^{k(G)} y^{l(G)}, & \text{if all edges are cut-edges or self-loops} \\
85
- T_{G-e}(x, y) + T_{G/e}(x, y), & \text{otherwise, for an arbitrary edge $e$ not a cut-edge or loop}
86
- \end{cases}
87
-
88
- Parameters
89
- ----------
90
- G : NetworkX graph
91
-
92
- Returns
93
- -------
94
- instance of `sympy.core.add.Add`
95
- A Sympy expression representing the Tutte polynomial for `G`.
96
-
97
- Examples
98
- --------
99
- >>> C = nx.cycle_graph(5)
100
- >>> nx.tutte_polynomial(C)
101
- x**4 + x**3 + x**2 + x + y
102
-
103
- >>> D = nx.diamond_graph()
104
- >>> nx.tutte_polynomial(D)
105
- x**3 + 2*x**2 + 2*x*y + x + y**2 + y
106
-
107
- Notes
108
- -----
109
- Some specializations of the Tutte polynomial:
110
-
111
- - `T_G(1, 1)` counts the number of spanning trees of `G`
112
- - `T_G(1, 2)` counts the number of connected spanning subgraphs of `G`
113
- - `T_G(2, 1)` counts the number of spanning forests in `G`
114
- - `T_G(0, 2)` counts the number of strong orientations of `G`
115
- - `T_G(2, 0)` counts the number of acyclic orientations of `G`
116
-
117
- Edge contraction is defined and deletion-contraction is introduced in [6]_.
118
- Combinatorial meaning of the coefficients is introduced in [7]_.
119
- Universality, properties, and applications are discussed in [8]_.
120
-
121
- Practically, up-front computation of the Tutte polynomial may be useful when
122
- users wish to repeatedly calculate edge-connectivity-related information
123
- about one or more graphs.
124
-
125
- References
126
- ----------
127
- .. [1] M. Brandt,
128
- "The Tutte Polynomial."
129
- Talking About Combinatorial Objects Seminar, 2015
130
- https://math.berkeley.edu/~brandtm/talks/tutte.pdf
131
- .. [2] A. Björklund, T. Husfeldt, P. Kaski, M. Koivisto,
132
- "Computing the Tutte polynomial in vertex-exponential time"
133
- 49th Annual IEEE Symposium on Foundations of Computer Science, 2008
134
- https://ieeexplore.ieee.org/abstract/document/4691000
135
- .. [3] Y. Shi, M. Dehmer, X. Li, I. Gutman,
136
- "Graph Polynomials," p. 14
137
- .. [4] Y. Shi, M. Dehmer, X. Li, I. Gutman,
138
- "Graph Polynomials," p. 46
139
- .. [5] A. Nešetril, J. Goodall,
140
- "Graph invariants, homomorphisms, and the Tutte polynomial"
141
- https://iuuk.mff.cuni.cz/~andrew/Tutte.pdf
142
- .. [6] D. B. West,
143
- "Introduction to Graph Theory," p. 84
144
- .. [7] G. Coutinho,
145
- "A brief introduction to the Tutte polynomial"
146
- Structural Analysis of Complex Networks, 2011
147
- https://homepages.dcc.ufmg.br/~gabriel/seminars/coutinho_tuttepolynomial_seminar.pdf
148
- .. [8] J. A. Ellis-Monaghan, C. Merino,
149
- "Graph polynomials and their applications I: The Tutte polynomial"
150
- Structural Analysis of Complex Networks, 2011
151
- https://arxiv.org/pdf/0803.3079.pdf
152
- """
153
- import sympy
154
-
155
- x = sympy.Symbol("x")
156
- y = sympy.Symbol("y")
157
- stack = deque()
158
- stack.append(nx.MultiGraph(G))
159
-
160
- polynomial = 0
161
- while stack:
162
- G = stack.pop()
163
- bridges = set(nx.bridges(G))
164
-
165
- e = None
166
- for i in G.edges:
167
- if (i[0], i[1]) not in bridges and i[0] != i[1]:
168
- e = i
169
- break
170
- if not e:
171
- loops = list(nx.selfloop_edges(G, keys=True))
172
- polynomial += x ** len(bridges) * y ** len(loops)
173
- else:
174
- # deletion-contraction
175
- C = nx.contracted_edge(G, e, self_loops=True)
176
- C.remove_edge(e[0], e[0])
177
- G.remove_edge(*e)
178
- stack.append(G)
179
- stack.append(C)
180
- return sympy.simplify(polynomial)
181
-
182
-
183
- @not_implemented_for("directed")
184
- @nx._dispatchable
185
- def chromatic_polynomial(G):
186
- r"""Returns the chromatic polynomial of `G`
187
-
188
- This function computes the chromatic polynomial via an iterative version of
189
- the deletion-contraction algorithm.
190
-
191
- The chromatic polynomial `X_G(x)` is a fundamental graph polynomial
192
- invariant in one variable. Evaluating `X_G(k)` for an natural number `k`
193
- enumerates the proper k-colorings of `G`.
194
-
195
- There are several equivalent definitions; here are three:
196
-
197
- Def 1 (explicit formula):
198
- For `G` an undirected graph, `c(G)` the number of connected components of
199
- `G`, `E` the edge set of `G`, and `G(S)` the spanning subgraph of `G` with
200
- edge set `S` [1]_:
201
-
202
- .. math::
203
-
204
- X_G(x) = \sum_{S \subseteq E} (-1)^{|S|} x^{c(G(S))}
205
-
206
-
207
- Def 2 (interpolating polynomial):
208
- For `G` an undirected graph, `n(G)` the number of vertices of `G`, `k_0 = 0`,
209
- and `k_i` the number of distinct ways to color the vertices of `G` with `i`
210
- unique colors (for `i` a natural number at most `n(G)`), `X_G(x)` is the
211
- unique Lagrange interpolating polynomial of degree `n(G)` through the points
212
- `(0, k_0), (1, k_1), \dots, (n(G), k_{n(G)})` [2]_.
213
-
214
-
215
- Def 3 (chromatic recurrence):
216
- For `G` an undirected graph, `G-e` the graph obtained from `G` by deleting
217
- edge `e`, `G/e` the graph obtained from `G` by contracting edge `e`, `n(G)`
218
- the number of vertices of `G`, and `e(G)` the number of edges of `G` [3]_:
219
-
220
- .. math::
221
- X_G(x) = \begin{cases}
222
- x^{n(G)}, & \text{if $e(G)=0$} \\
223
- X_{G-e}(x) - X_{G/e}(x), & \text{otherwise, for an arbitrary edge $e$}
224
- \end{cases}
225
-
226
- This formulation is also known as the Fundamental Reduction Theorem [4]_.
227
-
228
-
229
- Parameters
230
- ----------
231
- G : NetworkX graph
232
-
233
- Returns
234
- -------
235
- instance of `sympy.core.add.Add`
236
- A Sympy expression representing the chromatic polynomial for `G`.
237
-
238
- Examples
239
- --------
240
- >>> C = nx.cycle_graph(5)
241
- >>> nx.chromatic_polynomial(C)
242
- x**5 - 5*x**4 + 10*x**3 - 10*x**2 + 4*x
243
-
244
- >>> G = nx.complete_graph(4)
245
- >>> nx.chromatic_polynomial(G)
246
- x**4 - 6*x**3 + 11*x**2 - 6*x
247
-
248
- Notes
249
- -----
250
- Interpretation of the coefficients is discussed in [5]_. Several special
251
- cases are listed in [2]_.
252
-
253
- The chromatic polynomial is a specialization of the Tutte polynomial; in
254
- particular, ``X_G(x) = T_G(x, 0)`` [6]_.
255
-
256
- The chromatic polynomial may take negative arguments, though evaluations
257
- may not have chromatic interpretations. For instance, ``X_G(-1)`` enumerates
258
- the acyclic orientations of `G` [7]_.
259
-
260
- References
261
- ----------
262
- .. [1] D. B. West,
263
- "Introduction to Graph Theory," p. 222
264
- .. [2] E. W. Weisstein
265
- "Chromatic Polynomial"
266
- MathWorld--A Wolfram Web Resource
267
- https://mathworld.wolfram.com/ChromaticPolynomial.html
268
- .. [3] D. B. West,
269
- "Introduction to Graph Theory," p. 221
270
- .. [4] J. Zhang, J. Goodall,
271
- "An Introduction to Chromatic Polynomials"
272
- https://math.mit.edu/~apost/courses/18.204_2018/Julie_Zhang_paper.pdf
273
- .. [5] R. C. Read,
274
- "An Introduction to Chromatic Polynomials"
275
- Journal of Combinatorial Theory, 1968
276
- https://math.berkeley.edu/~mrklug/ReadChromatic.pdf
277
- .. [6] W. T. Tutte,
278
- "Graph-polynomials"
279
- Advances in Applied Mathematics, 2004
280
- https://www.sciencedirect.com/science/article/pii/S0196885803000411
281
- .. [7] R. P. Stanley,
282
- "Acyclic orientations of graphs"
283
- Discrete Mathematics, 2006
284
- https://math.mit.edu/~rstan/pubs/pubfiles/18.pdf
285
- """
286
- import sympy
287
-
288
- x = sympy.Symbol("x")
289
- stack = deque()
290
- stack.append(nx.MultiGraph(G, contraction_idx=0))
291
-
292
- polynomial = 0
293
- while stack:
294
- G = stack.pop()
295
- edges = list(G.edges)
296
- if not edges:
297
- polynomial += (-1) ** G.graph["contraction_idx"] * x ** len(G)
298
- else:
299
- e = edges[0]
300
- C = nx.contracted_edge(G, e, self_loops=True)
301
- C.graph["contraction_idx"] = G.graph["contraction_idx"] + 1
302
- C.remove_edge(e[0], e[0])
303
- G.remove_edge(*e)
304
- stack.append(G)
305
- stack.append(C)
306
- return polynomial
@@ -1,98 +0,0 @@
1
- """Algorithms to calculate reciprocity in a directed graph."""
2
-
3
- import networkx as nx
4
- from networkx import NetworkXError
5
-
6
- from ..utils import not_implemented_for
7
-
8
- __all__ = ["reciprocity", "overall_reciprocity"]
9
-
10
-
11
- @not_implemented_for("undirected", "multigraph")
12
- @nx._dispatchable
13
- def reciprocity(G, nodes=None):
14
- r"""Compute the reciprocity in a directed graph.
15
-
16
- The reciprocity of a directed graph is defined as the ratio
17
- of the number of edges pointing in both directions to the total
18
- number of edges in the graph.
19
- Formally, $r = |{(u,v) \in G|(v,u) \in G}| / |{(u,v) \in G}|$.
20
-
21
- The reciprocity of a single node u is defined similarly,
22
- it is the ratio of the number of edges in both directions to
23
- the total number of edges attached to node u.
24
-
25
- Parameters
26
- ----------
27
- G : graph
28
- A networkx directed graph
29
- nodes : container of nodes, optional (default=whole graph)
30
- Compute reciprocity for nodes in this container.
31
-
32
- Returns
33
- -------
34
- out : dictionary
35
- Reciprocity keyed by node label.
36
-
37
- Notes
38
- -----
39
- The reciprocity is not defined for isolated nodes.
40
- In such cases this function will return None.
41
-
42
- """
43
- # If `nodes` is not specified, calculate the reciprocity of the graph.
44
- if nodes is None:
45
- return overall_reciprocity(G)
46
-
47
- # If `nodes` represents a single node in the graph, return only its
48
- # reciprocity.
49
- if nodes in G:
50
- reciprocity = next(_reciprocity_iter(G, nodes))[1]
51
- if reciprocity is None:
52
- raise NetworkXError("Not defined for isolated nodes.")
53
- else:
54
- return reciprocity
55
-
56
- # Otherwise, `nodes` represents an iterable of nodes, so return a
57
- # dictionary mapping node to its reciprocity.
58
- return dict(_reciprocity_iter(G, nodes))
59
-
60
-
61
- def _reciprocity_iter(G, nodes):
62
- """Return an iterator of (node, reciprocity)."""
63
- n = G.nbunch_iter(nodes)
64
- for node in n:
65
- pred = set(G.predecessors(node))
66
- succ = set(G.successors(node))
67
- overlap = pred & succ
68
- n_total = len(pred) + len(succ)
69
-
70
- # Reciprocity is not defined for isolated nodes.
71
- # Return None.
72
- if n_total == 0:
73
- yield (node, None)
74
- else:
75
- reciprocity = 2 * len(overlap) / n_total
76
- yield (node, reciprocity)
77
-
78
-
79
- @not_implemented_for("undirected", "multigraph")
80
- @nx._dispatchable
81
- def overall_reciprocity(G):
82
- """Compute the reciprocity for the whole graph.
83
-
84
- See the doc of reciprocity for the definition.
85
-
86
- Parameters
87
- ----------
88
- G : graph
89
- A networkx graph
90
-
91
- """
92
- n_all_edge = G.number_of_edges()
93
- n_overlap_edge = (n_all_edge - G.to_undirected().number_of_edges()) * 2
94
-
95
- if n_all_edge == 0:
96
- raise NetworkXError("Not defined for empty graphs")
97
-
98
- return n_overlap_edge / n_all_edge
@@ -1,167 +0,0 @@
1
- """Functions for computing and verifying regular graphs."""
2
-
3
- import networkx as nx
4
- from networkx.utils import not_implemented_for
5
-
6
- __all__ = ["is_regular", "is_k_regular", "k_factor"]
7
-
8
-
9
- @nx._dispatchable
10
- def is_regular(G):
11
- """Determines whether a graph is regular.
12
-
13
- A regular graph is a graph where all nodes have the same degree. A regular
14
- digraph is a graph where all nodes have the same indegree and all nodes
15
- have the same outdegree.
16
-
17
- Parameters
18
- ----------
19
- G : NetworkX graph
20
-
21
- Returns
22
- -------
23
- bool
24
- Whether the given graph or digraph is regular.
25
-
26
- Examples
27
- --------
28
- >>> G = nx.DiGraph([(1, 2), (2, 3), (3, 4), (4, 1)])
29
- >>> nx.is_regular(G)
30
- True
31
-
32
- """
33
- if len(G) == 0:
34
- raise nx.NetworkXPointlessConcept("Graph has no nodes.")
35
- n1 = nx.utils.arbitrary_element(G)
36
- if not G.is_directed():
37
- d1 = G.degree(n1)
38
- return all(d1 == d for _, d in G.degree)
39
- else:
40
- d_in = G.in_degree(n1)
41
- in_regular = (d_in == d for _, d in G.in_degree)
42
- d_out = G.out_degree(n1)
43
- out_regular = (d_out == d for _, d in G.out_degree)
44
- return all(in_regular) and all(out_regular)
45
-
46
-
47
- @not_implemented_for("directed")
48
- @nx._dispatchable
49
- def is_k_regular(G, k):
50
- """Determines whether the graph ``G`` is a k-regular graph.
51
-
52
- A k-regular graph is a graph where each vertex has degree k.
53
-
54
- Parameters
55
- ----------
56
- G : NetworkX graph
57
-
58
- Returns
59
- -------
60
- bool
61
- Whether the given graph is k-regular.
62
-
63
- Examples
64
- --------
65
- >>> G = nx.Graph([(1, 2), (2, 3), (3, 4), (4, 1)])
66
- >>> nx.is_k_regular(G, k=3)
67
- False
68
-
69
- """
70
- return all(d == k for n, d in G.degree)
71
-
72
-
73
- @not_implemented_for("directed")
74
- @not_implemented_for("multigraph")
75
- @nx._dispatchable(preserve_edge_attrs=True, returns_graph=True)
76
- def k_factor(G, k, matching_weight="weight"):
77
- """Compute a `k`-factor of a graph.
78
-
79
- A `k`-factor of a graph is a spanning `k`-regular subgraph.
80
- A spanning `k`-regular subgraph of `G` is a subgraph that contains
81
- each node of `G` and a subset of the edges of `G` such that each
82
- node has degree `k`.
83
-
84
- Parameters
85
- ----------
86
- G : NetworkX graph
87
- An undirected graph.
88
-
89
- k : int
90
- The degree of the `k`-factor.
91
-
92
- matching_weight: string, optional (default="weight")
93
- Edge attribute name corresponding to the edge weight.
94
- If not present, the edge is assumed to have weight 1.
95
- Used for finding the max-weighted perfect matching.
96
-
97
- Returns
98
- -------
99
- NetworkX graph
100
- A `k`-factor of `G`.
101
-
102
- Examples
103
- --------
104
- >>> G = nx.Graph([(1, 2), (2, 3), (3, 4), (4, 1)])
105
- >>> KF = nx.k_factor(G, k=1)
106
- >>> KF.edges()
107
- EdgeView([(1, 2), (3, 4)])
108
-
109
- References
110
- ----------
111
- .. [1] "An algorithm for computing simple k-factors.",
112
- Meijer, Henk, Yurai Núñez-Rodríguez, and David Rappaport,
113
- Information processing letters, 2009.
114
- """
115
- # Validate minimum degree requirement.
116
- if any(d < k for _, d in G.degree):
117
- raise nx.NetworkXUnfeasible("Graph contains a vertex with degree less than k")
118
-
119
- g = G.copy()
120
- gadgets = []
121
-
122
- # Replace each node with a gadget.
123
- for node, degree in G.degree:
124
- is_large = k >= degree / 2.0
125
-
126
- # Create gadget nodes.
127
- outer = [(node, i) for i in range(degree)]
128
- if is_large:
129
- core = [(node, i) for i in range(degree, 2 * degree - k)]
130
- inner = []
131
- else:
132
- core = [(node, i) for i in range(2 * degree, 2 * degree + k)]
133
- inner = [(node, i) for i in range(degree, 2 * degree)]
134
-
135
- # Connect gadget nodes to neighbors.
136
- g.add_edges_from(zip(outer, inner))
137
- for outer_n, (neighbor, attrs) in zip(outer, g[node].items()):
138
- g.add_edge(outer_n, neighbor, **attrs)
139
-
140
- # Add internal edges.
141
- g.add_edges_from((u, v) for u in core for v in (outer if is_large else inner))
142
-
143
- g.remove_node(node)
144
- gadgets.append((node, outer, core, inner))
145
-
146
- # Find perfect matching.
147
- m = nx.max_weight_matching(g, maxcardinality=True, weight=matching_weight)
148
- if not nx.is_perfect_matching(g, m):
149
- raise nx.NetworkXUnfeasible(
150
- "Cannot find k-factor because no perfect matching exists"
151
- )
152
-
153
- # Keep only edges in matching.
154
- g.remove_edges_from(e for e in g.edges if e not in m and e[::-1] not in m)
155
-
156
- # Restore original nodes and remove gadgets.
157
- for node, outer, core, inner in gadgets:
158
- g.add_node(node)
159
- core_set = set(core)
160
- for outer_n in outer:
161
- for neighbor, attrs in g._adj[outer_n].items():
162
- if neighbor not in core_set:
163
- g.add_edge(node, neighbor, **attrs)
164
- break
165
- g.remove_nodes_from(outer + core + inner)
166
-
167
- return g