okstra 0.130.4 → 0.131.1

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 (365) 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 +16 -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/run.py +15 -3
  27. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  28. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  29. package/runtime/python/okstra_vendor/__init__.py +0 -44
  30. package/runtime/schemas/final-report-v1.0.schema.json +99 -5
  31. package/runtime/skills/okstra-run/SKILL.md +11 -4
  32. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  33. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  34. package/runtime/templates/reports/final-report.template.md +15 -9
  35. package/runtime/templates/reports/i18n/en.json +1 -0
  36. package/runtime/templates/reports/i18n/ko.json +1 -0
  37. package/runtime/validators/lib/fixtures.sh +6 -0
  38. package/runtime/validators/validate-run.py +2019 -96
  39. package/src/cli-registry.mjs +0 -7
  40. package/src/commands/lifecycle/doctor.mjs +0 -9
  41. package/src/lib/skill-catalog.mjs +0 -1
  42. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  43. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  44. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  45. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  46. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  47. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  48. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  49. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  50. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  51. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  52. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  53. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  54. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  55. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  56. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  57. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  58. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  59. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  60. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  61. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  62. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  63. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  64. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  65. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  66. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  67. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  68. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  69. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  70. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  71. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  72. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  73. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  74. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  75. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  76. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  77. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  78. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  79. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  93. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  94. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  99. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  100. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  101. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  114. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  116. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  117. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  118. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  139. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  140. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  141. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  142. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  143. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  144. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  146. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  147. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  148. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  161. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  162. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  168. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  169. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  178. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  179. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  180. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  181. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  182. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  183. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  184. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  185. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  186. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  187. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  188. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  189. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  190. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  191. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  202. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  203. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  204. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  205. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  206. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  207. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  216. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  217. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  220. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  221. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  222. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  223. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  224. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  225. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  226. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  227. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  228. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  229. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  233. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  234. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  235. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  236. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  237. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  238. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  239. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  240. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  241. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  246. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  247. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  248. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  249. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  250. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  251. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  252. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  253. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  254. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  255. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  256. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  257. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  258. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  263. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  264. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  271. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  272. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  273. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  274. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  275. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  276. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  277. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  278. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  279. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  280. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  281. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  282. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  283. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  284. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  285. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  286. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  287. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  288. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  289. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  290. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  291. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  294. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  295. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  296. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  297. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  298. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  299. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  300. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  301. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  302. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  303. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  304. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  305. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  306. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  307. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  308. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  309. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  310. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  311. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  312. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  313. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  314. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  315. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  316. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  317. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  318. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  319. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  320. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  321. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  322. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  323. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  324. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  325. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  326. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  327. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  328. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  329. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  330. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  331. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  332. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  333. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  334. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  335. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  336. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  337. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  338. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  339. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  340. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  341. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  342. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  343. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  347. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  348. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  349. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  350. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  351. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  352. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  353. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  354. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  355. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  356. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  357. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  358. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  359. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  360. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  361. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  362. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  363. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  364. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  365. 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