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,142 +0,0 @@
1
- """Time dependent algorithms."""
2
-
3
- import networkx as nx
4
- from networkx.utils import not_implemented_for
5
-
6
- __all__ = ["cd_index"]
7
-
8
-
9
- @not_implemented_for("undirected")
10
- @not_implemented_for("multigraph")
11
- @nx._dispatchable(node_attrs={"time": None, "weight": 1})
12
- def cd_index(G, node, time_delta, *, time="time", weight=None):
13
- r"""Compute the CD index for `node` within the graph `G`.
14
-
15
- Calculates the CD index for the given node of the graph,
16
- considering only its predecessors who have the `time` attribute
17
- smaller than or equal to the `time` attribute of the `node`
18
- plus `time_delta`.
19
-
20
- Parameters
21
- ----------
22
- G : graph
23
- A directed networkx graph whose nodes have `time` attributes and optionally
24
- `weight` attributes (if a weight is not given, it is considered 1).
25
- node : node
26
- The node for which the CD index is calculated.
27
- time_delta : numeric or timedelta
28
- Amount of time after the `time` attribute of the `node`. The value of
29
- `time_delta` must support comparison with the `time` node attribute. For
30
- example, if the `time` attribute of the nodes are `datetime.datetime`
31
- objects, then `time_delta` should be a `datetime.timedelta` object.
32
- time : string (Optional, default is "time")
33
- The name of the node attribute that will be used for the calculations.
34
- weight : string (Optional, default is None)
35
- The name of the node attribute used as weight.
36
-
37
- Returns
38
- -------
39
- float
40
- The CD index calculated for the node `node` within the graph `G`.
41
-
42
- Raises
43
- ------
44
- NetworkXError
45
- If not all nodes have a `time` attribute or
46
- `time_delta` and `time` attribute types are not compatible or
47
- `n` equals 0.
48
-
49
- NetworkXNotImplemented
50
- If `G` is a non-directed graph or a multigraph.
51
-
52
- Examples
53
- --------
54
- >>> from datetime import datetime, timedelta
55
- >>> G = nx.DiGraph()
56
- >>> nodes = {
57
- ... 1: {"time": datetime(2015, 1, 1)},
58
- ... 2: {"time": datetime(2012, 1, 1), "weight": 4},
59
- ... 3: {"time": datetime(2010, 1, 1)},
60
- ... 4: {"time": datetime(2008, 1, 1)},
61
- ... 5: {"time": datetime(2014, 1, 1)},
62
- ... }
63
- >>> G.add_nodes_from([(n, nodes[n]) for n in nodes])
64
- >>> edges = [(1, 3), (1, 4), (2, 3), (3, 4), (3, 5)]
65
- >>> G.add_edges_from(edges)
66
- >>> delta = timedelta(days=5 * 365)
67
- >>> nx.cd_index(G, 3, time_delta=delta, time="time")
68
- 0.5
69
- >>> nx.cd_index(G, 3, time_delta=delta, time="time", weight="weight")
70
- 0.12
71
-
72
- Integers can also be used for the time values:
73
- >>> node_times = {1: 2015, 2: 2012, 3: 2010, 4: 2008, 5: 2014}
74
- >>> nx.set_node_attributes(G, node_times, "new_time")
75
- >>> nx.cd_index(G, 3, time_delta=4, time="new_time")
76
- 0.5
77
- >>> nx.cd_index(G, 3, time_delta=4, time="new_time", weight="weight")
78
- 0.12
79
-
80
- Notes
81
- -----
82
- This method implements the algorithm for calculating the CD index,
83
- as described in the paper by Funk and Owen-Smith [1]_. The CD index
84
- is used in order to check how consolidating or destabilizing a patent
85
- is, hence the nodes of the graph represent patents and the edges show
86
- the citations between these patents. The mathematical model is given
87
- below:
88
-
89
- .. math::
90
- CD_{t}=\frac{1}{n_{t}}\sum_{i=1}^{n}\frac{-2f_{it}b_{it}+f_{it}}{w_{it}},
91
-
92
- where `f_{it}` equals 1 if `i` cites the focal patent else 0, `b_{it}` equals
93
- 1 if `i` cites any of the focal patents successors else 0, `n_{t}` is the number
94
- of forward citations in `i` and `w_{it}` is a matrix of weight for patent `i`
95
- at time `t`.
96
-
97
- The `datetime.timedelta` package can lead to off-by-one issues when converting
98
- from years to days. In the example above `timedelta(days=5 * 365)` looks like
99
- 5 years, but it isn't because of leap year days. So it gives the same result
100
- as `timedelta(days=4 * 365)`. But using `timedelta(days=5 * 365 + 1)` gives
101
- a 5 year delta **for this choice of years** but may not if the 5 year gap has
102
- more than 1 leap year. To avoid these issues, use integers to represent years,
103
- or be very careful when you convert units of time.
104
-
105
- References
106
- ----------
107
- .. [1] Funk, Russell J., and Jason Owen-Smith.
108
- "A dynamic network measure of technological change."
109
- Management science 63, no. 3 (2017): 791-817.
110
- http://russellfunk.org/cdindex/static/papers/funk_ms_2017.pdf
111
-
112
- """
113
- if not all(time in G.nodes[n] for n in G):
114
- raise nx.NetworkXError("Not all nodes have a 'time' attribute.")
115
-
116
- try:
117
- # get target_date
118
- target_date = G.nodes[node][time] + time_delta
119
- # keep the predecessors that existed before the target date
120
- pred = {i for i in G.pred[node] if G.nodes[i][time] <= target_date}
121
- except:
122
- raise nx.NetworkXError(
123
- "Addition and comparison are not supported between 'time_delta' "
124
- "and 'time' types."
125
- )
126
-
127
- # -1 if any edge between node's predecessors and node's successors, else 1
128
- b = [-1 if any(j in G[i] for j in G[node]) else 1 for i in pred]
129
-
130
- # n is size of the union of the focal node's predecessors and its successors' predecessors
131
- n = len(pred.union(*(G.pred[s].keys() - {node} for s in G[node])))
132
- if n == 0:
133
- raise nx.NetworkXError("The cd index cannot be defined.")
134
-
135
- # calculate cd index
136
- if weight is None:
137
- return round(sum(bi for bi in b) / n, 2)
138
- else:
139
- # If a node has the specified weight attribute, its weight is used in the calculation
140
- # otherwise, a weight of 1 is assumed for that node
141
- weights = [G.nodes[i].get(weight, 1) for i in pred]
142
- return round(sum(bi / wt for bi, wt in zip(b, weights)) / n, 2)
@@ -1,406 +0,0 @@
1
- """Functions concerning tournament graphs.
2
-
3
- A `tournament graph`_ is a complete oriented graph. In other words, it
4
- is a directed graph in which there is exactly one directed edge joining
5
- each pair of distinct nodes. For each function in this module that
6
- accepts a graph as input, you must provide a tournament graph. The
7
- responsibility is on the caller to ensure that the graph is a tournament
8
- graph:
9
-
10
- >>> G = nx.DiGraph([(0, 1), (1, 2), (2, 0)])
11
- >>> nx.is_tournament(G)
12
- True
13
-
14
- To access the functions in this module, you must access them through the
15
- :mod:`networkx.tournament` module::
16
-
17
- >>> nx.tournament.is_reachable(G, 0, 1)
18
- True
19
-
20
- .. _tournament graph: https://en.wikipedia.org/wiki/Tournament_%28graph_theory%29
21
-
22
- """
23
-
24
- from itertools import combinations
25
-
26
- import networkx as nx
27
- from networkx.utils import arbitrary_element, not_implemented_for, py_random_state
28
-
29
- __all__ = [
30
- "hamiltonian_path",
31
- "is_reachable",
32
- "is_strongly_connected",
33
- "is_tournament",
34
- "random_tournament",
35
- "score_sequence",
36
- "tournament_matrix",
37
- ]
38
-
39
-
40
- def index_satisfying(iterable, condition):
41
- """Returns the index of the first element in `iterable` that
42
- satisfies the given condition.
43
-
44
- If no such element is found (that is, when the iterable is
45
- exhausted), this returns the length of the iterable (that is, one
46
- greater than the last index of the iterable).
47
-
48
- `iterable` must not be empty. If `iterable` is empty, this
49
- function raises :exc:`ValueError`.
50
-
51
- """
52
- # Pre-condition: iterable must not be empty.
53
- for i, x in enumerate(iterable):
54
- if condition(x):
55
- return i
56
- # If we reach the end of the iterable without finding an element
57
- # that satisfies the condition, return the length of the iterable,
58
- # which is one greater than the index of its last element. If the
59
- # iterable was empty, `i` will not be defined, so we raise an
60
- # exception.
61
- try:
62
- return i + 1
63
- except NameError as err:
64
- raise ValueError("iterable must be non-empty") from err
65
-
66
-
67
- @not_implemented_for("undirected")
68
- @not_implemented_for("multigraph")
69
- @nx._dispatchable
70
- def is_tournament(G):
71
- """Returns True if and only if `G` is a tournament.
72
-
73
- A tournament is a directed graph, with neither self-loops nor
74
- multi-edges, in which there is exactly one directed edge joining
75
- each pair of distinct nodes.
76
-
77
- Parameters
78
- ----------
79
- G : NetworkX graph
80
- A directed graph representing a tournament.
81
-
82
- Returns
83
- -------
84
- bool
85
- Whether the given graph is a tournament graph.
86
-
87
- Examples
88
- --------
89
- >>> G = nx.DiGraph([(0, 1), (1, 2), (2, 0)])
90
- >>> nx.is_tournament(G)
91
- True
92
-
93
- Notes
94
- -----
95
- Some definitions require a self-loop on each node, but that is not
96
- the convention used here.
97
-
98
- """
99
- # In a tournament, there is exactly one directed edge joining each pair.
100
- return (
101
- all((v in G[u]) ^ (u in G[v]) for u, v in combinations(G, 2))
102
- and nx.number_of_selfloops(G) == 0
103
- )
104
-
105
-
106
- @not_implemented_for("undirected")
107
- @not_implemented_for("multigraph")
108
- @nx._dispatchable
109
- def hamiltonian_path(G):
110
- """Returns a Hamiltonian path in the given tournament graph.
111
-
112
- Each tournament has a Hamiltonian path. If furthermore, the
113
- tournament is strongly connected, then the returned Hamiltonian path
114
- is a Hamiltonian cycle (by joining the endpoints of the path).
115
-
116
- Parameters
117
- ----------
118
- G : NetworkX graph
119
- A directed graph representing a tournament.
120
-
121
- Returns
122
- -------
123
- path : list
124
- A list of nodes which form a Hamiltonian path in `G`.
125
-
126
- Examples
127
- --------
128
- >>> G = nx.DiGraph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)])
129
- >>> nx.is_tournament(G)
130
- True
131
- >>> nx.tournament.hamiltonian_path(G)
132
- [0, 1, 2, 3]
133
-
134
- Notes
135
- -----
136
- This is a recursive implementation with an asymptotic running time
137
- of $O(n^2)$, ignoring multiplicative polylogarithmic factors, where
138
- $n$ is the number of nodes in the graph.
139
-
140
- """
141
- if len(G) == 0:
142
- return []
143
- if len(G) == 1:
144
- return [arbitrary_element(G)]
145
- v = arbitrary_element(G)
146
- hampath = hamiltonian_path(G.subgraph(set(G) - {v}))
147
- # Get the index of the first node in the path that does *not* have
148
- # an edge to `v`, then insert `v` before that node.
149
- index = index_satisfying(hampath, lambda u: v not in G[u])
150
- hampath.insert(index, v)
151
- return hampath
152
-
153
-
154
- @py_random_state(1)
155
- @nx._dispatchable(graphs=None, returns_graph=True)
156
- def random_tournament(n, seed=None):
157
- r"""Returns a random tournament graph on `n` nodes.
158
-
159
- Parameters
160
- ----------
161
- n : int
162
- The number of nodes in the returned graph.
163
- seed : integer, random_state, or None (default)
164
- Indicator of random number generation state.
165
- See :ref:`Randomness<randomness>`.
166
-
167
- Returns
168
- -------
169
- G : DiGraph
170
- A tournament on `n` nodes, with exactly one directed edge joining
171
- each pair of distinct nodes.
172
-
173
- Notes
174
- -----
175
- This algorithm adds, for each pair of distinct nodes, an edge with
176
- uniformly random orientation. In other words, `\binom{n}{2}` flips
177
- of an unbiased coin decide the orientations of the edges in the
178
- graph.
179
-
180
- """
181
- # Flip an unbiased coin for each pair of distinct nodes.
182
- coins = (seed.random() for i in range((n * (n - 1)) // 2))
183
- pairs = combinations(range(n), 2)
184
- edges = ((u, v) if r < 0.5 else (v, u) for (u, v), r in zip(pairs, coins))
185
- return nx.DiGraph(edges)
186
-
187
-
188
- @not_implemented_for("undirected")
189
- @not_implemented_for("multigraph")
190
- @nx._dispatchable
191
- def score_sequence(G):
192
- """Returns the score sequence for the given tournament graph.
193
-
194
- The score sequence is the sorted list of the out-degrees of the
195
- nodes of the graph.
196
-
197
- Parameters
198
- ----------
199
- G : NetworkX graph
200
- A directed graph representing a tournament.
201
-
202
- Returns
203
- -------
204
- list
205
- A sorted list of the out-degrees of the nodes of `G`.
206
-
207
- Examples
208
- --------
209
- >>> G = nx.DiGraph([(1, 0), (1, 3), (0, 2), (0, 3), (2, 1), (3, 2)])
210
- >>> nx.is_tournament(G)
211
- True
212
- >>> nx.tournament.score_sequence(G)
213
- [1, 1, 2, 2]
214
-
215
- """
216
- return sorted(d for v, d in G.out_degree())
217
-
218
-
219
- @not_implemented_for("undirected")
220
- @not_implemented_for("multigraph")
221
- @nx._dispatchable(preserve_edge_attrs={"G": {"weight": 1}})
222
- def tournament_matrix(G):
223
- r"""Returns the tournament matrix for the given tournament graph.
224
-
225
- This function requires SciPy.
226
-
227
- The *tournament matrix* of a tournament graph with edge set *E* is
228
- the matrix *T* defined by
229
-
230
- .. math::
231
-
232
- T_{i j} =
233
- \begin{cases}
234
- +1 & \text{if } (i, j) \in E \\
235
- -1 & \text{if } (j, i) \in E \\
236
- 0 & \text{if } i == j.
237
- \end{cases}
238
-
239
- An equivalent definition is `T = A - A^T`, where *A* is the
240
- adjacency matrix of the graph `G`.
241
-
242
- Parameters
243
- ----------
244
- G : NetworkX graph
245
- A directed graph representing a tournament.
246
-
247
- Returns
248
- -------
249
- SciPy sparse array
250
- The tournament matrix of the tournament graph `G`.
251
-
252
- Raises
253
- ------
254
- ImportError
255
- If SciPy is not available.
256
-
257
- """
258
- A = nx.adjacency_matrix(G)
259
- return A - A.T
260
-
261
-
262
- @not_implemented_for("undirected")
263
- @not_implemented_for("multigraph")
264
- @nx._dispatchable
265
- def is_reachable(G, s, t):
266
- """Decides whether there is a path from `s` to `t` in the
267
- tournament.
268
-
269
- This function is more theoretically efficient than the reachability
270
- checks than the shortest path algorithms in
271
- :mod:`networkx.algorithms.shortest_paths`.
272
-
273
- The given graph **must** be a tournament, otherwise this function's
274
- behavior is undefined.
275
-
276
- Parameters
277
- ----------
278
- G : NetworkX graph
279
- A directed graph representing a tournament.
280
-
281
- s : node
282
- A node in the graph.
283
-
284
- t : node
285
- A node in the graph.
286
-
287
- Returns
288
- -------
289
- bool
290
- Whether there is a path from `s` to `t` in `G`.
291
-
292
- Examples
293
- --------
294
- >>> G = nx.DiGraph([(1, 0), (1, 3), (1, 2), (2, 3), (2, 0), (3, 0)])
295
- >>> nx.is_tournament(G)
296
- True
297
- >>> nx.tournament.is_reachable(G, 1, 3)
298
- True
299
- >>> nx.tournament.is_reachable(G, 3, 2)
300
- False
301
-
302
- Notes
303
- -----
304
- Although this function is more theoretically efficient than the
305
- generic shortest path functions, a speedup requires the use of
306
- parallelism. Though it may in the future, the current implementation
307
- does not use parallelism, thus you may not see much of a speedup.
308
-
309
- This algorithm comes from [1].
310
-
311
- References
312
- ----------
313
- .. [1] Tantau, Till.
314
- "A note on the complexity of the reachability problem for
315
- tournaments."
316
- *Electronic Colloquium on Computational Complexity*. 2001.
317
- <http://eccc.hpi-web.de/report/2001/092/>
318
- """
319
-
320
- def two_neighborhood(G, v):
321
- """Returns the set of nodes at distance at most two from `v`.
322
-
323
- `G` must be a graph and `v` a node in that graph.
324
-
325
- The returned set includes the nodes at distance zero (that is,
326
- the node `v` itself), the nodes at distance one (that is, the
327
- out-neighbors of `v`), and the nodes at distance two.
328
-
329
- """
330
- v_adj = G._adj[v]
331
- return {
332
- x
333
- for x, x_pred in G._pred.items()
334
- if x == v or x in v_adj or any(z in v_adj for z in x_pred)
335
- }
336
-
337
- def is_closed(G, S):
338
- """Decides whether the given set of nodes is closed.
339
-
340
- A set *S* of nodes is *closed* if for each node *u* in the graph
341
- not in *S* and for each node *v* in *S*, there is an edge from
342
- *u* to *v*.
343
-
344
- """
345
- return all(u in S or all(v in unbrs for v in S) for u, unbrs in G._adj.items())
346
-
347
- neighborhoods = (two_neighborhood(G, v) for v in G)
348
- return not any(s in S and t not in S and is_closed(G, S) for S in neighborhoods)
349
-
350
-
351
- @not_implemented_for("undirected")
352
- @not_implemented_for("multigraph")
353
- @nx._dispatchable(name="tournament_is_strongly_connected")
354
- def is_strongly_connected(G):
355
- """Decides whether the given tournament is strongly connected.
356
-
357
- This function is more theoretically efficient than the
358
- :func:`~networkx.algorithms.components.is_strongly_connected`
359
- function.
360
-
361
- The given graph **must** be a tournament, otherwise this function's
362
- behavior is undefined.
363
-
364
- Parameters
365
- ----------
366
- G : NetworkX graph
367
- A directed graph representing a tournament.
368
-
369
- Returns
370
- -------
371
- bool
372
- Whether the tournament is strongly connected.
373
-
374
- Examples
375
- --------
376
- >>> G = nx.DiGraph([(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 0)])
377
- >>> nx.is_tournament(G)
378
- True
379
- >>> nx.tournament.is_strongly_connected(G)
380
- True
381
- >>> G.remove_edge(3, 0)
382
- >>> G.add_edge(0, 3)
383
- >>> nx.is_tournament(G)
384
- True
385
- >>> nx.tournament.is_strongly_connected(G)
386
- False
387
-
388
- Notes
389
- -----
390
- Although this function is more theoretically efficient than the
391
- generic strong connectivity function, a speedup requires the use of
392
- parallelism. Though it may in the future, the current implementation
393
- does not use parallelism, thus you may not see much of a speedup.
394
-
395
- This algorithm comes from [1].
396
-
397
- References
398
- ----------
399
- .. [1] Tantau, Till.
400
- "A note on the complexity of the reachability problem for
401
- tournaments."
402
- *Electronic Colloquium on Computational Complexity*. 2001.
403
- <http://eccc.hpi-web.de/report/2001/092/>
404
-
405
- """
406
- return all(is_reachable(G, u, v) for u in G for v in G)
@@ -1,5 +0,0 @@
1
- from .beamsearch import *
2
- from .breadth_first_search import *
3
- from .depth_first_search import *
4
- from .edgedfs import *
5
- from .edgebfs import *
@@ -1,90 +0,0 @@
1
- """Basic algorithms for breadth-first searching the nodes of a graph."""
2
-
3
- import networkx as nx
4
-
5
- __all__ = ["bfs_beam_edges"]
6
-
7
-
8
- @nx._dispatchable
9
- def bfs_beam_edges(G, source, value, width=None):
10
- """Iterates over edges in a beam search.
11
-
12
- The beam search is a generalized breadth-first search in which only
13
- the "best" *w* neighbors of the current node are enqueued, where *w*
14
- is the beam width and "best" is an application-specific
15
- heuristic. In general, a beam search with a small beam width might
16
- not visit each node in the graph.
17
-
18
- .. note::
19
-
20
- With the default value of ``width=None`` or `width` greater than the
21
- maximum degree of the graph, this function equates to a slower
22
- version of `~networkx.algorithms.traversal.breadth_first_search.bfs_edges`.
23
- All nodes will be visited, though the order of the reported edges may
24
- vary. In such cases, `value` has no effect - consider using `bfs_edges`
25
- directly instead.
26
-
27
- Parameters
28
- ----------
29
- G : NetworkX graph
30
-
31
- source : node
32
- Starting node for the breadth-first search; this function
33
- iterates over only those edges in the component reachable from
34
- this node.
35
-
36
- value : function
37
- A function that takes a node of the graph as input and returns a
38
- real number indicating how "good" it is. A higher value means it
39
- is more likely to be visited sooner during the search. When
40
- visiting a new node, only the `width` neighbors with the highest
41
- `value` are enqueued (in decreasing order of `value`).
42
-
43
- width : int (default = None)
44
- The beam width for the search. This is the number of neighbors
45
- (ordered by `value`) to enqueue when visiting each new node.
46
-
47
- Yields
48
- ------
49
- edge
50
- Edges in the beam search starting from `source`, given as a pair
51
- of nodes.
52
-
53
- Examples
54
- --------
55
- To give nodes with, for example, a higher centrality precedence
56
- during the search, set the `value` function to return the centrality
57
- value of the node:
58
-
59
- >>> G = nx.karate_club_graph()
60
- >>> centrality = nx.eigenvector_centrality(G)
61
- >>> list(nx.bfs_beam_edges(G, source=0, value=centrality.get, width=3))
62
- [(0, 2), (0, 1), (0, 8), (2, 32), (1, 13), (8, 33)]
63
- """
64
-
65
- if width is None:
66
- width = len(G)
67
-
68
- def successors(v):
69
- """Returns a list of the best neighbors of a node.
70
-
71
- `v` is a node in the graph `G`.
72
-
73
- The "best" neighbors are chosen according to the `value`
74
- function (higher is better). Only the `width` best neighbors of
75
- `v` are returned.
76
- """
77
- # TODO The Python documentation states that for small values, it
78
- # is better to use `heapq.nlargest`. We should determine the
79
- # threshold at which its better to use `heapq.nlargest()`
80
- # instead of `sorted()[:]` and apply that optimization here.
81
- #
82
- # If `width` is greater than the number of neighbors of `v`, all
83
- # neighbors are returned by the semantics of slicing in
84
- # Python. This occurs in the special case that the user did not
85
- # specify a `width`: in this case all neighbors are always
86
- # returned, so this is just a (slower) implementation of
87
- # `bfs_edges(G, source)` but with a sorted enqueue step.
88
- return iter(sorted(G.neighbors(v), key=value, reverse=True)[:width])
89
-
90
- yield from nx.generic_bfs_edges(G, source, successors)