okstra 0.130.3 → 0.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +0 -1
  2. package/docs/architecture.md +2 -2
  3. package/docs/cli.md +1 -1
  4. package/docs/for-ai/README.md +0 -2
  5. package/docs/for-ai/skills/okstra-run.md +13 -2
  6. package/docs/for-ai/skills/okstra-setup.md +4 -1
  7. package/docs/project-structure-overview.md +5 -4
  8. package/docs/task-process/implementation-planning.md +13 -0
  9. package/docs/task-process/implementation.md +17 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +7 -0
  13. package/runtime/bin/lib/okstra/usage.sh +4 -4
  14. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  15. package/runtime/prompts/lead/plan-body-verification.md +26 -5
  16. package/runtime/prompts/lead/report-writer.md +6 -2
  17. package/runtime/prompts/profiles/_common-contract.md +2 -1
  18. package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
  19. package/runtime/prompts/profiles/_implementation-executor.md +2 -2
  20. package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
  21. package/runtime/prompts/profiles/final-verification.md +21 -6
  22. package/runtime/prompts/profiles/implementation-planning.md +21 -4
  23. package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
  24. package/runtime/python/okstra_ctl/conformance.py +49 -11
  25. package/runtime/python/okstra_ctl/report_finalize.py +52 -1
  26. package/runtime/python/okstra_ctl/report_views.py +32 -5
  27. package/runtime/python/okstra_ctl/run.py +15 -3
  28. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  29. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  30. package/runtime/python/okstra_vendor/__init__.py +0 -44
  31. package/runtime/schemas/final-report-v1.0.schema.json +101 -6
  32. package/runtime/skills/okstra-run/SKILL.md +11 -4
  33. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  34. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  35. package/runtime/templates/reports/final-report.template.md +18 -12
  36. package/runtime/templates/reports/i18n/en.json +1 -0
  37. package/runtime/templates/reports/i18n/ko.json +1 -0
  38. package/runtime/templates/reports/report.css +18 -0
  39. package/runtime/validators/lib/fixtures.sh +6 -0
  40. package/runtime/validators/validate-run.py +1722 -98
  41. package/src/cli-registry.mjs +0 -7
  42. package/src/commands/lifecycle/doctor.mjs +0 -9
  43. package/src/lib/skill-catalog.mjs +0 -1
  44. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  45. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  46. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  47. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  48. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  49. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  50. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  51. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  52. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  53. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  54. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  55. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  56. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  57. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  58. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  59. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  60. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  61. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  62. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  63. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  64. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  65. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  66. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  67. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  68. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  69. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  70. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  71. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  72. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  73. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  74. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  75. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  76. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  77. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  78. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  79. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  93. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  94. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  99. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  100. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  101. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  116. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  118. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  141. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  142. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  143. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  144. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  146. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  147. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  148. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  161. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  162. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  168. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  169. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  178. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  179. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  180. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  181. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  182. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  183. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  184. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  185. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  186. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  187. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  188. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  189. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  190. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  191. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  202. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  203. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  204. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  205. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  206. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  207. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  216. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  217. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  220. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  221. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  222. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  223. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  224. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  225. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  226. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  227. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  228. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  229. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  233. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  234. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  235. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  236. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  237. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  238. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  239. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  240. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  241. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  246. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  247. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  248. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  249. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  250. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  251. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  252. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  253. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  254. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  255. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  256. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  257. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  258. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  263. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  264. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  271. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  272. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  273. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  274. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  275. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  276. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  277. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  278. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  279. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  280. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  281. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  282. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  283. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  284. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  285. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  286. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  287. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  288. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  289. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  290. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  291. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  294. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  295. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  296. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  297. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  298. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  299. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  300. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  301. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  302. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  303. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  304. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  305. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  306. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  307. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  308. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  309. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  310. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  311. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  312. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  313. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  314. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  315. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  316. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  317. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  318. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  319. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  320. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  321. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  322. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  323. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  324. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  325. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  326. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  327. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  328. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  329. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  330. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  331. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  332. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  333. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  334. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  335. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  336. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  337. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  338. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  339. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  340. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  341. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  342. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  343. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  347. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  348. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  349. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  350. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  351. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  352. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  353. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  354. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  355. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  356. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  357. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  358. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  359. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  360. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  361. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  362. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  363. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  364. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  365. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  366. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  367. package/src/commands/graphify.mjs +0 -32
@@ -1,192 +0,0 @@
1
- """
2
- Module to simplify the specification of user-defined equality functions for
3
- node and edge attributes during isomorphism checks.
4
-
5
- During the construction of an isomorphism, the algorithm considers two
6
- candidate nodes n1 in G1 and n2 in G2. The graphs G1 and G2 are then
7
- compared with respect to properties involving n1 and n2, and if the outcome
8
- is good, then the candidate nodes are considered isomorphic. NetworkX
9
- provides a simple mechanism for users to extend the comparisons to include
10
- node and edge attributes.
11
-
12
- Node attributes are handled by the node_match keyword. When considering
13
- n1 and n2, the algorithm passes their node attribute dictionaries to
14
- node_match, and if it returns False, then n1 and n2 cannot be
15
- considered to be isomorphic.
16
-
17
- Edge attributes are handled by the edge_match keyword. When considering
18
- n1 and n2, the algorithm must verify that outgoing edges from n1 are
19
- commensurate with the outgoing edges for n2. If the graph is directed,
20
- then a similar check is also performed for incoming edges.
21
-
22
- Focusing only on outgoing edges, we consider pairs of nodes (n1, v1) from
23
- G1 and (n2, v2) from G2. For graphs and digraphs, there is only one edge
24
- between (n1, v1) and only one edge between (n2, v2). Those edge attribute
25
- dictionaries are passed to edge_match, and if it returns False, then
26
- n1 and n2 cannot be considered isomorphic. For multigraphs and
27
- multidigraphs, there can be multiple edges between (n1, v1) and also
28
- multiple edges between (n2, v2). Now, there must exist an isomorphism
29
- from "all the edges between (n1, v1)" to "all the edges between (n2, v2)".
30
- So, all of the edge attribute dictionaries are passed to edge_match, and
31
- it must determine if there is an isomorphism between the two sets of edges.
32
- """
33
-
34
- from . import isomorphvf2 as vf2
35
-
36
- __all__ = ["GraphMatcher", "DiGraphMatcher", "MultiGraphMatcher", "MultiDiGraphMatcher"]
37
-
38
-
39
- def _semantic_feasibility(self, G1_node, G2_node):
40
- """Returns True if mapping G1_node to G2_node is semantically feasible."""
41
- # Make sure the nodes match
42
- if self.node_match is not None:
43
- nm = self.node_match(self.G1.nodes[G1_node], self.G2.nodes[G2_node])
44
- if not nm:
45
- return False
46
-
47
- # Make sure the edges match
48
- if self.edge_match is not None:
49
- # Cached lookups
50
- G1nbrs = self.G1_adj[G1_node]
51
- G2nbrs = self.G2_adj[G2_node]
52
- core_1 = self.core_1
53
- edge_match = self.edge_match
54
-
55
- for neighbor in G1nbrs:
56
- # G1_node is not in core_1, so we must handle R_self separately
57
- if neighbor == G1_node:
58
- if G2_node in G2nbrs and not edge_match(
59
- G1nbrs[G1_node], G2nbrs[G2_node]
60
- ):
61
- return False
62
- elif neighbor in core_1:
63
- G2_nbr = core_1[neighbor]
64
- if G2_nbr in G2nbrs and not edge_match(
65
- G1nbrs[neighbor], G2nbrs[G2_nbr]
66
- ):
67
- return False
68
- # syntactic check has already verified that neighbors are symmetric
69
-
70
- return True
71
-
72
-
73
- class GraphMatcher(vf2.GraphMatcher):
74
- """VF2 isomorphism checker for undirected graphs."""
75
-
76
- def __init__(self, G1, G2, node_match=None, edge_match=None):
77
- """Initialize graph matcher.
78
-
79
- Parameters
80
- ----------
81
- G1, G2: graph
82
- The graphs to be tested.
83
-
84
- node_match: callable
85
- A function that returns True iff node n1 in G1 and n2 in G2
86
- should be considered equal during the isomorphism test. The
87
- function will be called like::
88
-
89
- node_match(G1.nodes[n1], G2.nodes[n2])
90
-
91
- That is, the function will receive the node attribute dictionaries
92
- of the nodes under consideration. If None, then no attributes are
93
- considered when testing for an isomorphism.
94
-
95
- edge_match: callable
96
- A function that returns True iff the edge attribute dictionary for
97
- the pair of nodes (u1, v1) in G1 and (u2, v2) in G2 should be
98
- considered equal during the isomorphism test. The function will be
99
- called like::
100
-
101
- edge_match(G1[u1][v1], G2[u2][v2])
102
-
103
- That is, the function will receive the edge attribute dictionaries
104
- of the edges under consideration. If None, then no attributes are
105
- considered when testing for an isomorphism.
106
-
107
- """
108
- vf2.GraphMatcher.__init__(self, G1, G2)
109
-
110
- self.node_match = node_match
111
- self.edge_match = edge_match
112
-
113
- # These will be modified during checks to minimize code repeat.
114
- self.G1_adj = self.G1.adj
115
- self.G2_adj = self.G2.adj
116
-
117
- semantic_feasibility = _semantic_feasibility
118
-
119
-
120
- class DiGraphMatcher(vf2.DiGraphMatcher):
121
- """VF2 isomorphism checker for directed graphs."""
122
-
123
- def __init__(self, G1, G2, node_match=None, edge_match=None):
124
- """Initialize graph matcher.
125
-
126
- Parameters
127
- ----------
128
- G1, G2 : graph
129
- The graphs to be tested.
130
-
131
- node_match : callable
132
- A function that returns True iff node n1 in G1 and n2 in G2
133
- should be considered equal during the isomorphism test. The
134
- function will be called like::
135
-
136
- node_match(G1.nodes[n1], G2.nodes[n2])
137
-
138
- That is, the function will receive the node attribute dictionaries
139
- of the nodes under consideration. If None, then no attributes are
140
- considered when testing for an isomorphism.
141
-
142
- edge_match : callable
143
- A function that returns True iff the edge attribute dictionary for
144
- the pair of nodes (u1, v1) in G1 and (u2, v2) in G2 should be
145
- considered equal during the isomorphism test. The function will be
146
- called like::
147
-
148
- edge_match(G1[u1][v1], G2[u2][v2])
149
-
150
- That is, the function will receive the edge attribute dictionaries
151
- of the edges under consideration. If None, then no attributes are
152
- considered when testing for an isomorphism.
153
-
154
- """
155
- vf2.DiGraphMatcher.__init__(self, G1, G2)
156
-
157
- self.node_match = node_match
158
- self.edge_match = edge_match
159
-
160
- # These will be modified during checks to minimize code repeat.
161
- self.G1_adj = self.G1.adj
162
- self.G2_adj = self.G2.adj
163
-
164
- def semantic_feasibility(self, G1_node, G2_node):
165
- """Returns True if mapping G1_node to G2_node is semantically feasible."""
166
-
167
- # Test node_match and also test edge_match on successors
168
- feasible = _semantic_feasibility(self, G1_node, G2_node)
169
- if not feasible:
170
- return False
171
-
172
- # Test edge_match on predecessors
173
- self.G1_adj = self.G1.pred
174
- self.G2_adj = self.G2.pred
175
- feasible = _semantic_feasibility(self, G1_node, G2_node)
176
- self.G1_adj = self.G1.adj
177
- self.G2_adj = self.G2.adj
178
-
179
- return feasible
180
-
181
-
182
- # The "semantics" of edge_match are different for multi(di)graphs, but
183
- # the implementation is the same. So, technically we do not need to
184
- # provide "multi" versions, but we do so to match NetworkX's base classes.
185
-
186
-
187
- class MultiGraphMatcher(GraphMatcher):
188
- """VF2 isomorphism checker for undirected multigraphs."""
189
-
190
-
191
- class MultiDiGraphMatcher(DiGraphMatcher):
192
- """VF2 isomorphism checker for directed multigraphs."""
@@ -1,2 +0,0 @@
1
- from networkx.algorithms.link_analysis.hits_alg import *
2
- from networkx.algorithms.link_analysis.pagerank_alg import *
@@ -1,337 +0,0 @@
1
- """Hubs and authorities analysis of graph structure."""
2
-
3
- import networkx as nx
4
-
5
- __all__ = ["hits"]
6
-
7
-
8
- @nx._dispatchable(preserve_edge_attrs={"G": {"weight": 1}})
9
- def hits(G, max_iter=100, tol=1.0e-8, nstart=None, normalized=True):
10
- """Returns HITS hubs and authorities values for nodes.
11
-
12
- The HITS algorithm computes two numbers for a node.
13
- Authorities estimates the node value based on the incoming links.
14
- Hubs estimates the node value based on outgoing links.
15
-
16
- Parameters
17
- ----------
18
- G : graph
19
- A NetworkX graph
20
-
21
- max_iter : integer, optional
22
- Maximum number of iterations in power method.
23
-
24
- tol : float, optional
25
- Error tolerance used to check convergence in power method iteration.
26
-
27
- nstart : dictionary, optional
28
- Starting value of each node for power method iteration.
29
-
30
- normalized : bool (default=True)
31
- Normalize results by the sum of all of the values.
32
-
33
- Returns
34
- -------
35
- (hubs,authorities) : two-tuple of dictionaries
36
- Two dictionaries keyed by node containing the hub and authority
37
- values.
38
-
39
- Raises
40
- ------
41
- PowerIterationFailedConvergence
42
- If the algorithm fails to converge to the specified tolerance
43
- within the specified number of iterations of the power iteration
44
- method.
45
-
46
- Examples
47
- --------
48
- >>> G = nx.path_graph(4)
49
- >>> h, a = nx.hits(G)
50
-
51
- Notes
52
- -----
53
- The eigenvector calculation is done by the power iteration method
54
- and has no guarantee of convergence. The iteration will stop
55
- after max_iter iterations or an error tolerance of
56
- number_of_nodes(G)*tol has been reached.
57
-
58
- The HITS algorithm was designed for directed graphs but this
59
- algorithm does not check if the input graph is directed and will
60
- execute on undirected graphs.
61
-
62
- References
63
- ----------
64
- .. [1] A. Langville and C. Meyer,
65
- "A survey of eigenvector methods of web information retrieval."
66
- https://epubs.siam.org/doi/epdf/10.1137/S0036144503424786
67
- .. [2] Jon Kleinberg,
68
- Authoritative sources in a hyperlinked environment
69
- Journal of the ACM 46 (5): 604-32, 1999.
70
- https://www.cs.cornell.edu/home/kleinber/auth.pdf
71
- doi:10.1145/324133.324140.
72
- """
73
- import numpy as np
74
- import scipy as sp
75
-
76
- if len(G) == 0:
77
- return {}, {}
78
- A = nx.adjacency_matrix(G, nodelist=list(G), dtype=float)
79
-
80
- if nstart is not None:
81
- nstart = np.array(list(nstart.values()))
82
- if max_iter <= 0:
83
- raise nx.PowerIterationFailedConvergence(max_iter)
84
- try:
85
- _, _, vt = sp.sparse.linalg.svds(A, k=1, v0=nstart, maxiter=max_iter, tol=tol)
86
- except sp.sparse.linalg.ArpackNoConvergence as exc:
87
- raise nx.PowerIterationFailedConvergence(max_iter) from exc
88
-
89
- a = vt.flatten().real
90
- h = A @ a
91
- if normalized:
92
- h /= h.sum()
93
- a /= a.sum()
94
- hubs = dict(zip(G, map(float, h)))
95
- authorities = dict(zip(G, map(float, a)))
96
- return hubs, authorities
97
-
98
-
99
- def _hits_python(G, max_iter=100, tol=1.0e-8, nstart=None, normalized=True):
100
- if isinstance(G, nx.MultiGraph | nx.MultiDiGraph):
101
- raise Exception("hits() not defined for graphs with multiedges.")
102
- if len(G) == 0:
103
- return {}, {}
104
- # choose fixed starting vector if not given
105
- if nstart is None:
106
- h = dict.fromkeys(G, 1.0 / G.number_of_nodes())
107
- else:
108
- h = nstart
109
- # normalize starting vector
110
- s = 1.0 / sum(h.values())
111
- for k in h:
112
- h[k] *= s
113
- for _ in range(max_iter): # power iteration: make up to max_iter iterations
114
- hlast = h
115
- h = dict.fromkeys(hlast.keys(), 0)
116
- a = dict.fromkeys(hlast.keys(), 0)
117
- # this "matrix multiply" looks odd because it is
118
- # doing a left multiply a^T=hlast^T*G
119
- for n in h:
120
- for nbr in G[n]:
121
- a[nbr] += hlast[n] * G[n][nbr].get("weight", 1)
122
- # now multiply h=Ga
123
- for n in h:
124
- for nbr in G[n]:
125
- h[n] += a[nbr] * G[n][nbr].get("weight", 1)
126
- # normalize vector
127
- s = 1.0 / max(h.values())
128
- for n in h:
129
- h[n] *= s
130
- # normalize vector
131
- s = 1.0 / max(a.values())
132
- for n in a:
133
- a[n] *= s
134
- # check convergence, l1 norm
135
- err = sum(abs(h[n] - hlast[n]) for n in h)
136
- if err < tol:
137
- break
138
- else:
139
- raise nx.PowerIterationFailedConvergence(max_iter)
140
- if normalized:
141
- s = 1.0 / sum(a.values())
142
- for n in a:
143
- a[n] *= s
144
- s = 1.0 / sum(h.values())
145
- for n in h:
146
- h[n] *= s
147
- return h, a
148
-
149
-
150
- def _hits_numpy(G, normalized=True):
151
- """Returns HITS hubs and authorities values for nodes.
152
-
153
- The HITS algorithm computes two numbers for a node.
154
- Authorities estimates the node value based on the incoming links.
155
- Hubs estimates the node value based on outgoing links.
156
-
157
- Parameters
158
- ----------
159
- G : graph
160
- A NetworkX graph
161
-
162
- normalized : bool (default=True)
163
- Normalize results by the sum of all of the values.
164
-
165
- Returns
166
- -------
167
- (hubs,authorities) : two-tuple of dictionaries
168
- Two dictionaries keyed by node containing the hub and authority
169
- values.
170
-
171
- Examples
172
- --------
173
- >>> G = nx.path_graph(4)
174
-
175
- The `hubs` and `authorities` are given by the eigenvectors corresponding to the
176
- maximum eigenvalues of the hubs_matrix and the authority_matrix, respectively.
177
-
178
- The ``hubs`` and ``authority`` matrices are computed from the adjacency
179
- matrix:
180
-
181
- >>> adj_ary = nx.to_numpy_array(G)
182
- >>> hubs_matrix = adj_ary @ adj_ary.T
183
- >>> authority_matrix = adj_ary.T @ adj_ary
184
-
185
- `_hits_numpy` maps the eigenvector corresponding to the maximum eigenvalue
186
- of the respective matrices to the nodes in `G`:
187
-
188
- >>> from networkx.algorithms.link_analysis.hits_alg import _hits_numpy
189
- >>> hubs, authority = _hits_numpy(G)
190
-
191
- Notes
192
- -----
193
- The eigenvector calculation uses NumPy's interface to LAPACK.
194
-
195
- The HITS algorithm was designed for directed graphs but this
196
- algorithm does not check if the input graph is directed and will
197
- execute on undirected graphs.
198
-
199
- References
200
- ----------
201
- .. [1] A. Langville and C. Meyer,
202
- "A survey of eigenvector methods of web information retrieval."
203
- http://citeseer.ist.psu.edu/713792.html
204
- .. [2] Jon Kleinberg,
205
- Authoritative sources in a hyperlinked environment
206
- Journal of the ACM 46 (5): 604-32, 1999.
207
- doi:10.1145/324133.324140.
208
- http://www.cs.cornell.edu/home/kleinber/auth.pdf.
209
- """
210
- import numpy as np
211
-
212
- if len(G) == 0:
213
- return {}, {}
214
- adj_ary = nx.to_numpy_array(G)
215
- # Hub matrix
216
- H = adj_ary @ adj_ary.T
217
- e, ev = np.linalg.eig(H)
218
- h = ev[:, np.argmax(e)] # eigenvector corresponding to the maximum eigenvalue
219
- # Authority matrix
220
- A = adj_ary.T @ adj_ary
221
- e, ev = np.linalg.eig(A)
222
- a = ev[:, np.argmax(e)] # eigenvector corresponding to the maximum eigenvalue
223
- if normalized:
224
- h /= h.sum()
225
- a /= a.sum()
226
- else:
227
- h /= h.max()
228
- a /= a.max()
229
- hubs = dict(zip(G, map(float, h)))
230
- authorities = dict(zip(G, map(float, a)))
231
- return hubs, authorities
232
-
233
-
234
- def _hits_scipy(G, max_iter=100, tol=1.0e-6, nstart=None, normalized=True):
235
- """Returns HITS hubs and authorities values for nodes.
236
-
237
-
238
- The HITS algorithm computes two numbers for a node.
239
- Authorities estimates the node value based on the incoming links.
240
- Hubs estimates the node value based on outgoing links.
241
-
242
- Parameters
243
- ----------
244
- G : graph
245
- A NetworkX graph
246
-
247
- max_iter : integer, optional
248
- Maximum number of iterations in power method.
249
-
250
- tol : float, optional
251
- Error tolerance used to check convergence in power method iteration.
252
-
253
- nstart : dictionary, optional
254
- Starting value of each node for power method iteration.
255
-
256
- normalized : bool (default=True)
257
- Normalize results by the sum of all of the values.
258
-
259
- Returns
260
- -------
261
- (hubs,authorities) : two-tuple of dictionaries
262
- Two dictionaries keyed by node containing the hub and authority
263
- values.
264
-
265
- Examples
266
- --------
267
- >>> from networkx.algorithms.link_analysis.hits_alg import _hits_scipy
268
- >>> G = nx.path_graph(4)
269
- >>> h, a = _hits_scipy(G)
270
-
271
- Notes
272
- -----
273
- This implementation uses SciPy sparse matrices.
274
-
275
- The eigenvector calculation is done by the power iteration method
276
- and has no guarantee of convergence. The iteration will stop
277
- after max_iter iterations or an error tolerance of
278
- number_of_nodes(G)*tol has been reached.
279
-
280
- The HITS algorithm was designed for directed graphs but this
281
- algorithm does not check if the input graph is directed and will
282
- execute on undirected graphs.
283
-
284
- Raises
285
- ------
286
- PowerIterationFailedConvergence
287
- If the algorithm fails to converge to the specified tolerance
288
- within the specified number of iterations of the power iteration
289
- method.
290
-
291
- References
292
- ----------
293
- .. [1] A. Langville and C. Meyer,
294
- "A survey of eigenvector methods of web information retrieval."
295
- http://citeseer.ist.psu.edu/713792.html
296
- .. [2] Jon Kleinberg,
297
- Authoritative sources in a hyperlinked environment
298
- Journal of the ACM 46 (5): 604-632, 1999.
299
- doi:10.1145/324133.324140.
300
- http://www.cs.cornell.edu/home/kleinber/auth.pdf.
301
- """
302
- import numpy as np
303
-
304
- if len(G) == 0:
305
- return {}, {}
306
- A = nx.to_scipy_sparse_array(G, nodelist=list(G))
307
- (n, _) = A.shape # should be square
308
- ATA = A.T @ A # authority matrix
309
- # choose fixed starting vector if not given
310
- if nstart is None:
311
- x = np.ones((n, 1)) / n
312
- else:
313
- x = np.array([nstart.get(n, 0) for n in list(G)], dtype=float)
314
- x /= x.sum()
315
-
316
- # power iteration on authority matrix
317
- i = 0
318
- while True:
319
- xlast = x
320
- x = ATA @ x
321
- x /= x.max()
322
- # check convergence, l1 norm
323
- err = np.absolute(x - xlast).sum()
324
- if err < tol:
325
- break
326
- if i > max_iter:
327
- raise nx.PowerIterationFailedConvergence(max_iter)
328
- i += 1
329
-
330
- a = x.flatten()
331
- h = A @ a
332
- if normalized:
333
- h /= h.sum()
334
- a /= a.sum()
335
- hubs = dict(zip(G, map(float, h)))
336
- authorities = dict(zip(G, map(float, a)))
337
- return hubs, authorities