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,687 +0,0 @@
1
- """
2
- Link prediction algorithms.
3
- """
4
-
5
- from math import log
6
-
7
- import networkx as nx
8
- from networkx.utils import not_implemented_for
9
-
10
- __all__ = [
11
- "resource_allocation_index",
12
- "jaccard_coefficient",
13
- "adamic_adar_index",
14
- "preferential_attachment",
15
- "cn_soundarajan_hopcroft",
16
- "ra_index_soundarajan_hopcroft",
17
- "within_inter_cluster",
18
- "common_neighbor_centrality",
19
- ]
20
-
21
-
22
- def _apply_prediction(G, func, ebunch=None):
23
- """Applies the given function to each edge in the specified iterable
24
- of edges.
25
-
26
- `G` is an instance of :class:`networkx.Graph`.
27
-
28
- `func` is a function on two inputs, each of which is a node in the
29
- graph. The function can return anything, but it should return a
30
- value representing a prediction of the likelihood of a "link"
31
- joining the two nodes.
32
-
33
- `ebunch` is an iterable of pairs of nodes. If not specified, all
34
- non-edges in the graph `G` will be used.
35
-
36
- """
37
- if ebunch is None:
38
- ebunch = nx.non_edges(G)
39
- else:
40
- for u, v in ebunch:
41
- if u not in G:
42
- raise nx.NodeNotFound(f"Node {u} not in G.")
43
- if v not in G:
44
- raise nx.NodeNotFound(f"Node {v} not in G.")
45
- return ((u, v, func(u, v)) for u, v in ebunch)
46
-
47
-
48
- @not_implemented_for("directed")
49
- @not_implemented_for("multigraph")
50
- @nx._dispatchable
51
- def resource_allocation_index(G, ebunch=None):
52
- r"""Compute the resource allocation index of all node pairs in ebunch.
53
-
54
- Resource allocation index of `u` and `v` is defined as
55
-
56
- .. math::
57
-
58
- \sum_{w \in \Gamma(u) \cap \Gamma(v)} \frac{1}{|\Gamma(w)|}
59
-
60
- where $\Gamma(u)$ denotes the set of neighbors of $u$.
61
-
62
- Parameters
63
- ----------
64
- G : graph
65
- A NetworkX undirected graph.
66
-
67
- ebunch : iterable of node pairs, optional (default = None)
68
- Resource allocation index will be computed for each pair of
69
- nodes given in the iterable. The pairs must be given as
70
- 2-tuples (u, v) where u and v are nodes in the graph. If ebunch
71
- is None then all nonexistent edges in the graph will be used.
72
- Default value: None.
73
-
74
- Returns
75
- -------
76
- piter : iterator
77
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
78
- pair of nodes and p is their resource allocation index.
79
-
80
- Raises
81
- ------
82
- NetworkXNotImplemented
83
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
84
-
85
- NodeNotFound
86
- If `ebunch` has a node that is not in `G`.
87
-
88
- Examples
89
- --------
90
- >>> G = nx.complete_graph(5)
91
- >>> preds = nx.resource_allocation_index(G, [(0, 1), (2, 3)])
92
- >>> for u, v, p in preds:
93
- ... print(f"({u}, {v}) -> {p:.8f}")
94
- (0, 1) -> 0.75000000
95
- (2, 3) -> 0.75000000
96
-
97
- References
98
- ----------
99
- .. [1] T. Zhou, L. Lu, Y.-C. Zhang.
100
- Predicting missing links via local information.
101
- Eur. Phys. J. B 71 (2009) 623.
102
- https://arxiv.org/pdf/0901.0553.pdf
103
- """
104
-
105
- def predict(u, v):
106
- return sum(1 / G.degree(w) for w in nx.common_neighbors(G, u, v))
107
-
108
- return _apply_prediction(G, predict, ebunch)
109
-
110
-
111
- @not_implemented_for("directed")
112
- @not_implemented_for("multigraph")
113
- @nx._dispatchable
114
- def jaccard_coefficient(G, ebunch=None):
115
- r"""Compute the Jaccard coefficient of all node pairs in ebunch.
116
-
117
- Jaccard coefficient of nodes `u` and `v` is defined as
118
-
119
- .. math::
120
-
121
- \frac{|\Gamma(u) \cap \Gamma(v)|}{|\Gamma(u) \cup \Gamma(v)|}
122
-
123
- where $\Gamma(u)$ denotes the set of neighbors of $u$.
124
-
125
- Parameters
126
- ----------
127
- G : graph
128
- A NetworkX undirected graph.
129
-
130
- ebunch : iterable of node pairs, optional (default = None)
131
- Jaccard coefficient will be computed for each pair of nodes
132
- given in the iterable. The pairs must be given as 2-tuples
133
- (u, v) where u and v are nodes in the graph. If ebunch is None
134
- then all nonexistent edges in the graph will be used.
135
- Default value: None.
136
-
137
- Returns
138
- -------
139
- piter : iterator
140
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
141
- pair of nodes and p is their Jaccard coefficient.
142
-
143
- Raises
144
- ------
145
- NetworkXNotImplemented
146
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
147
-
148
- NodeNotFound
149
- If `ebunch` has a node that is not in `G`.
150
-
151
- Examples
152
- --------
153
- >>> G = nx.complete_graph(5)
154
- >>> preds = nx.jaccard_coefficient(G, [(0, 1), (2, 3)])
155
- >>> for u, v, p in preds:
156
- ... print(f"({u}, {v}) -> {p:.8f}")
157
- (0, 1) -> 0.60000000
158
- (2, 3) -> 0.60000000
159
-
160
- References
161
- ----------
162
- .. [1] D. Liben-Nowell, J. Kleinberg.
163
- The Link Prediction Problem for Social Networks (2004).
164
- http://www.cs.cornell.edu/home/kleinber/link-pred.pdf
165
- """
166
-
167
- def predict(u, v):
168
- union_size = len(set(G[u]) | set(G[v]))
169
- if union_size == 0:
170
- return 0
171
- return len(nx.common_neighbors(G, u, v)) / union_size
172
-
173
- return _apply_prediction(G, predict, ebunch)
174
-
175
-
176
- @not_implemented_for("directed")
177
- @not_implemented_for("multigraph")
178
- @nx._dispatchable
179
- def adamic_adar_index(G, ebunch=None):
180
- r"""Compute the Adamic-Adar index of all node pairs in ebunch.
181
-
182
- Adamic-Adar index of `u` and `v` is defined as
183
-
184
- .. math::
185
-
186
- \sum_{w \in \Gamma(u) \cap \Gamma(v)} \frac{1}{\log |\Gamma(w)|}
187
-
188
- where $\Gamma(u)$ denotes the set of neighbors of $u$.
189
- This index leads to zero-division for nodes only connected via self-loops.
190
- It is intended to be used when no self-loops are present.
191
-
192
- Parameters
193
- ----------
194
- G : graph
195
- NetworkX undirected graph.
196
-
197
- ebunch : iterable of node pairs, optional (default = None)
198
- Adamic-Adar index will be computed for each pair of nodes given
199
- in the iterable. The pairs must be given as 2-tuples (u, v)
200
- where u and v are nodes in the graph. If ebunch is None then all
201
- nonexistent edges in the graph will be used.
202
- Default value: None.
203
-
204
- Returns
205
- -------
206
- piter : iterator
207
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
208
- pair of nodes and p is their Adamic-Adar index.
209
-
210
- Raises
211
- ------
212
- NetworkXNotImplemented
213
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
214
-
215
- NodeNotFound
216
- If `ebunch` has a node that is not in `G`.
217
-
218
- Examples
219
- --------
220
- >>> G = nx.complete_graph(5)
221
- >>> preds = nx.adamic_adar_index(G, [(0, 1), (2, 3)])
222
- >>> for u, v, p in preds:
223
- ... print(f"({u}, {v}) -> {p:.8f}")
224
- (0, 1) -> 2.16404256
225
- (2, 3) -> 2.16404256
226
-
227
- References
228
- ----------
229
- .. [1] D. Liben-Nowell, J. Kleinberg.
230
- The Link Prediction Problem for Social Networks (2004).
231
- http://www.cs.cornell.edu/home/kleinber/link-pred.pdf
232
- """
233
-
234
- def predict(u, v):
235
- return sum(1 / log(G.degree(w)) for w in nx.common_neighbors(G, u, v))
236
-
237
- return _apply_prediction(G, predict, ebunch)
238
-
239
-
240
- @not_implemented_for("directed")
241
- @not_implemented_for("multigraph")
242
- @nx._dispatchable
243
- def common_neighbor_centrality(G, ebunch=None, alpha=0.8):
244
- r"""Return the CCPA score for each pair of nodes.
245
-
246
- Compute the Common Neighbor and Centrality based Parameterized Algorithm(CCPA)
247
- score of all node pairs in ebunch.
248
-
249
- CCPA score of `u` and `v` is defined as
250
-
251
- .. math::
252
-
253
- \alpha \cdot (|\Gamma (u){\cap }^{}\Gamma (v)|)+(1-\alpha )\cdot \frac{N}{{d}_{uv}}
254
-
255
- where $\Gamma(u)$ denotes the set of neighbors of $u$, $\Gamma(v)$ denotes the
256
- set of neighbors of $v$, $\alpha$ is parameter varies between [0,1], $N$ denotes
257
- total number of nodes in the Graph and ${d}_{uv}$ denotes shortest distance
258
- between $u$ and $v$.
259
-
260
- This algorithm is based on two vital properties of nodes, namely the number
261
- of common neighbors and their centrality. Common neighbor refers to the common
262
- nodes between two nodes. Centrality refers to the prestige that a node enjoys
263
- in a network.
264
-
265
- .. seealso::
266
-
267
- :func:`common_neighbors`
268
-
269
- Parameters
270
- ----------
271
- G : graph
272
- NetworkX undirected graph.
273
-
274
- ebunch : iterable of node pairs, optional (default = None)
275
- Preferential attachment score will be computed for each pair of
276
- nodes given in the iterable. The pairs must be given as
277
- 2-tuples (u, v) where u and v are nodes in the graph. If ebunch
278
- is None then all nonexistent edges in the graph will be used.
279
- Default value: None.
280
-
281
- alpha : Parameter defined for participation of Common Neighbor
282
- and Centrality Algorithm share. Values for alpha should
283
- normally be between 0 and 1. Default value set to 0.8
284
- because author found better performance at 0.8 for all the
285
- dataset.
286
- Default value: 0.8
287
-
288
-
289
- Returns
290
- -------
291
- piter : iterator
292
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
293
- pair of nodes and p is their Common Neighbor and Centrality based
294
- Parameterized Algorithm(CCPA) score.
295
-
296
- Raises
297
- ------
298
- NetworkXNotImplemented
299
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
300
-
301
- NetworkXAlgorithmError
302
- If self loops exist in `ebunch` or in `G` (if `ebunch` is `None`).
303
-
304
- NodeNotFound
305
- If `ebunch` has a node that is not in `G`.
306
-
307
- Examples
308
- --------
309
- >>> G = nx.complete_graph(5)
310
- >>> preds = nx.common_neighbor_centrality(G, [(0, 1), (2, 3)])
311
- >>> for u, v, p in preds:
312
- ... print(f"({u}, {v}) -> {p}")
313
- (0, 1) -> 3.4000000000000004
314
- (2, 3) -> 3.4000000000000004
315
-
316
- References
317
- ----------
318
- .. [1] Ahmad, I., Akhtar, M.U., Noor, S. et al.
319
- Missing Link Prediction using Common Neighbor and Centrality based Parameterized Algorithm.
320
- Sci Rep 10, 364 (2020).
321
- https://doi.org/10.1038/s41598-019-57304-y
322
- """
323
-
324
- # When alpha == 1, the CCPA score simplifies to the number of common neighbors.
325
- if alpha == 1:
326
-
327
- def predict(u, v):
328
- if u == v:
329
- raise nx.NetworkXAlgorithmError("Self loops are not supported")
330
-
331
- return len(nx.common_neighbors(G, u, v))
332
-
333
- else:
334
- spl = dict(nx.shortest_path_length(G))
335
- inf = float("inf")
336
-
337
- def predict(u, v):
338
- if u == v:
339
- raise nx.NetworkXAlgorithmError("Self loops are not supported")
340
- path_len = spl[u].get(v, inf)
341
-
342
- n_nbrs = len(nx.common_neighbors(G, u, v))
343
- return alpha * n_nbrs + (1 - alpha) * len(G) / path_len
344
-
345
- return _apply_prediction(G, predict, ebunch)
346
-
347
-
348
- @not_implemented_for("directed")
349
- @not_implemented_for("multigraph")
350
- @nx._dispatchable
351
- def preferential_attachment(G, ebunch=None):
352
- r"""Compute the preferential attachment score of all node pairs in ebunch.
353
-
354
- Preferential attachment score of `u` and `v` is defined as
355
-
356
- .. math::
357
-
358
- |\Gamma(u)| |\Gamma(v)|
359
-
360
- where $\Gamma(u)$ denotes the set of neighbors of $u$.
361
-
362
- Parameters
363
- ----------
364
- G : graph
365
- NetworkX undirected graph.
366
-
367
- ebunch : iterable of node pairs, optional (default = None)
368
- Preferential attachment score will be computed for each pair of
369
- nodes given in the iterable. The pairs must be given as
370
- 2-tuples (u, v) where u and v are nodes in the graph. If ebunch
371
- is None then all nonexistent edges in the graph will be used.
372
- Default value: None.
373
-
374
- Returns
375
- -------
376
- piter : iterator
377
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
378
- pair of nodes and p is their preferential attachment score.
379
-
380
- Raises
381
- ------
382
- NetworkXNotImplemented
383
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
384
-
385
- NodeNotFound
386
- If `ebunch` has a node that is not in `G`.
387
-
388
- Examples
389
- --------
390
- >>> G = nx.complete_graph(5)
391
- >>> preds = nx.preferential_attachment(G, [(0, 1), (2, 3)])
392
- >>> for u, v, p in preds:
393
- ... print(f"({u}, {v}) -> {p}")
394
- (0, 1) -> 16
395
- (2, 3) -> 16
396
-
397
- References
398
- ----------
399
- .. [1] D. Liben-Nowell, J. Kleinberg.
400
- The Link Prediction Problem for Social Networks (2004).
401
- http://www.cs.cornell.edu/home/kleinber/link-pred.pdf
402
- """
403
-
404
- def predict(u, v):
405
- return G.degree(u) * G.degree(v)
406
-
407
- return _apply_prediction(G, predict, ebunch)
408
-
409
-
410
- @not_implemented_for("directed")
411
- @not_implemented_for("multigraph")
412
- @nx._dispatchable(node_attrs="community")
413
- def cn_soundarajan_hopcroft(G, ebunch=None, community="community"):
414
- r"""Count the number of common neighbors of all node pairs in ebunch
415
- using community information.
416
-
417
- For two nodes $u$ and $v$, this function computes the number of
418
- common neighbors and bonus one for each common neighbor belonging to
419
- the same community as $u$ and $v$. Mathematically,
420
-
421
- .. math::
422
-
423
- |\Gamma(u) \cap \Gamma(v)| + \sum_{w \in \Gamma(u) \cap \Gamma(v)} f(w)
424
-
425
- where $f(w)$ equals 1 if $w$ belongs to the same community as $u$
426
- and $v$ or 0 otherwise and $\Gamma(u)$ denotes the set of
427
- neighbors of $u$.
428
-
429
- Parameters
430
- ----------
431
- G : graph
432
- A NetworkX undirected graph.
433
-
434
- ebunch : iterable of node pairs, optional (default = None)
435
- The score will be computed for each pair of nodes given in the
436
- iterable. The pairs must be given as 2-tuples (u, v) where u
437
- and v are nodes in the graph. If ebunch is None then all
438
- nonexistent edges in the graph will be used.
439
- Default value: None.
440
-
441
- community : string, optional (default = 'community')
442
- Nodes attribute name containing the community information.
443
- G[u][community] identifies which community u belongs to. Each
444
- node belongs to at most one community. Default value: 'community'.
445
-
446
- Returns
447
- -------
448
- piter : iterator
449
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
450
- pair of nodes and p is their score.
451
-
452
- Raises
453
- ------
454
- NetworkXNotImplemented
455
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
456
-
457
- NetworkXAlgorithmError
458
- If no community information is available for a node in `ebunch` or in `G` (if `ebunch` is `None`).
459
-
460
- NodeNotFound
461
- If `ebunch` has a node that is not in `G`.
462
-
463
- Examples
464
- --------
465
- >>> G = nx.path_graph(3)
466
- >>> G.nodes[0]["community"] = 0
467
- >>> G.nodes[1]["community"] = 0
468
- >>> G.nodes[2]["community"] = 0
469
- >>> preds = nx.cn_soundarajan_hopcroft(G, [(0, 2)])
470
- >>> for u, v, p in preds:
471
- ... print(f"({u}, {v}) -> {p}")
472
- (0, 2) -> 2
473
-
474
- References
475
- ----------
476
- .. [1] Sucheta Soundarajan and John Hopcroft.
477
- Using community information to improve the precision of link
478
- prediction methods.
479
- In Proceedings of the 21st international conference companion on
480
- World Wide Web (WWW '12 Companion). ACM, New York, NY, USA, 607-608.
481
- http://doi.acm.org/10.1145/2187980.2188150
482
- """
483
-
484
- def predict(u, v):
485
- Cu = _community(G, u, community)
486
- Cv = _community(G, v, community)
487
- cnbors = nx.common_neighbors(G, u, v)
488
- neighbors = (
489
- sum(_community(G, w, community) == Cu for w in cnbors) if Cu == Cv else 0
490
- )
491
- return len(cnbors) + neighbors
492
-
493
- return _apply_prediction(G, predict, ebunch)
494
-
495
-
496
- @not_implemented_for("directed")
497
- @not_implemented_for("multigraph")
498
- @nx._dispatchable(node_attrs="community")
499
- def ra_index_soundarajan_hopcroft(G, ebunch=None, community="community"):
500
- r"""Compute the resource allocation index of all node pairs in
501
- ebunch using community information.
502
-
503
- For two nodes $u$ and $v$, this function computes the resource
504
- allocation index considering only common neighbors belonging to the
505
- same community as $u$ and $v$. Mathematically,
506
-
507
- .. math::
508
-
509
- \sum_{w \in \Gamma(u) \cap \Gamma(v)} \frac{f(w)}{|\Gamma(w)|}
510
-
511
- where $f(w)$ equals 1 if $w$ belongs to the same community as $u$
512
- and $v$ or 0 otherwise and $\Gamma(u)$ denotes the set of
513
- neighbors of $u$.
514
-
515
- Parameters
516
- ----------
517
- G : graph
518
- A NetworkX undirected graph.
519
-
520
- ebunch : iterable of node pairs, optional (default = None)
521
- The score will be computed for each pair of nodes given in the
522
- iterable. The pairs must be given as 2-tuples (u, v) where u
523
- and v are nodes in the graph. If ebunch is None then all
524
- nonexistent edges in the graph will be used.
525
- Default value: None.
526
-
527
- community : string, optional (default = 'community')
528
- Nodes attribute name containing the community information.
529
- G[u][community] identifies which community u belongs to. Each
530
- node belongs to at most one community. Default value: 'community'.
531
-
532
- Returns
533
- -------
534
- piter : iterator
535
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
536
- pair of nodes and p is their score.
537
-
538
- Raises
539
- ------
540
- NetworkXNotImplemented
541
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
542
-
543
- NetworkXAlgorithmError
544
- If no community information is available for a node in `ebunch` or in `G` (if `ebunch` is `None`).
545
-
546
- NodeNotFound
547
- If `ebunch` has a node that is not in `G`.
548
-
549
- Examples
550
- --------
551
- >>> G = nx.Graph()
552
- >>> G.add_edges_from([(0, 1), (0, 2), (1, 3), (2, 3)])
553
- >>> G.nodes[0]["community"] = 0
554
- >>> G.nodes[1]["community"] = 0
555
- >>> G.nodes[2]["community"] = 1
556
- >>> G.nodes[3]["community"] = 0
557
- >>> preds = nx.ra_index_soundarajan_hopcroft(G, [(0, 3)])
558
- >>> for u, v, p in preds:
559
- ... print(f"({u}, {v}) -> {p:.8f}")
560
- (0, 3) -> 0.50000000
561
-
562
- References
563
- ----------
564
- .. [1] Sucheta Soundarajan and John Hopcroft.
565
- Using community information to improve the precision of link
566
- prediction methods.
567
- In Proceedings of the 21st international conference companion on
568
- World Wide Web (WWW '12 Companion). ACM, New York, NY, USA, 607-608.
569
- http://doi.acm.org/10.1145/2187980.2188150
570
- """
571
-
572
- def predict(u, v):
573
- Cu = _community(G, u, community)
574
- Cv = _community(G, v, community)
575
- if Cu != Cv:
576
- return 0
577
- cnbors = nx.common_neighbors(G, u, v)
578
- return sum(1 / G.degree(w) for w in cnbors if _community(G, w, community) == Cu)
579
-
580
- return _apply_prediction(G, predict, ebunch)
581
-
582
-
583
- @not_implemented_for("directed")
584
- @not_implemented_for("multigraph")
585
- @nx._dispatchable(node_attrs="community")
586
- def within_inter_cluster(G, ebunch=None, delta=0.001, community="community"):
587
- """Compute the ratio of within- and inter-cluster common neighbors
588
- of all node pairs in ebunch.
589
-
590
- For two nodes `u` and `v`, if a common neighbor `w` belongs to the
591
- same community as them, `w` is considered as within-cluster common
592
- neighbor of `u` and `v`. Otherwise, it is considered as
593
- inter-cluster common neighbor of `u` and `v`. The ratio between the
594
- size of the set of within- and inter-cluster common neighbors is
595
- defined as the WIC measure. [1]_
596
-
597
- Parameters
598
- ----------
599
- G : graph
600
- A NetworkX undirected graph.
601
-
602
- ebunch : iterable of node pairs, optional (default = None)
603
- The WIC measure will be computed for each pair of nodes given in
604
- the iterable. The pairs must be given as 2-tuples (u, v) where
605
- u and v are nodes in the graph. If ebunch is None then all
606
- nonexistent edges in the graph will be used.
607
- Default value: None.
608
-
609
- delta : float, optional (default = 0.001)
610
- Value to prevent division by zero in case there is no
611
- inter-cluster common neighbor between two nodes. See [1]_ for
612
- details. Default value: 0.001.
613
-
614
- community : string, optional (default = 'community')
615
- Nodes attribute name containing the community information.
616
- G[u][community] identifies which community u belongs to. Each
617
- node belongs to at most one community. Default value: 'community'.
618
-
619
- Returns
620
- -------
621
- piter : iterator
622
- An iterator of 3-tuples in the form (u, v, p) where (u, v) is a
623
- pair of nodes and p is their WIC measure.
624
-
625
- Raises
626
- ------
627
- NetworkXNotImplemented
628
- If `G` is a `DiGraph`, a `Multigraph` or a `MultiDiGraph`.
629
-
630
- NetworkXAlgorithmError
631
- - If `delta` is less than or equal to zero.
632
- - If no community information is available for a node in `ebunch` or in `G` (if `ebunch` is `None`).
633
-
634
- NodeNotFound
635
- If `ebunch` has a node that is not in `G`.
636
-
637
- Examples
638
- --------
639
- >>> G = nx.Graph()
640
- >>> G.add_edges_from([(0, 1), (0, 2), (0, 3), (1, 4), (2, 4), (3, 4)])
641
- >>> G.nodes[0]["community"] = 0
642
- >>> G.nodes[1]["community"] = 1
643
- >>> G.nodes[2]["community"] = 0
644
- >>> G.nodes[3]["community"] = 0
645
- >>> G.nodes[4]["community"] = 0
646
- >>> preds = nx.within_inter_cluster(G, [(0, 4)])
647
- >>> for u, v, p in preds:
648
- ... print(f"({u}, {v}) -> {p:.8f}")
649
- (0, 4) -> 1.99800200
650
- >>> preds = nx.within_inter_cluster(G, [(0, 4)], delta=0.5)
651
- >>> for u, v, p in preds:
652
- ... print(f"({u}, {v}) -> {p:.8f}")
653
- (0, 4) -> 1.33333333
654
-
655
- References
656
- ----------
657
- .. [1] Jorge Carlos Valverde-Rebaza and Alneu de Andrade Lopes.
658
- Link prediction in complex networks based on cluster information.
659
- In Proceedings of the 21st Brazilian conference on Advances in
660
- Artificial Intelligence (SBIA'12)
661
- https://doi.org/10.1007/978-3-642-34459-6_10
662
- """
663
- if delta <= 0:
664
- raise nx.NetworkXAlgorithmError("Delta must be greater than zero")
665
-
666
- def predict(u, v):
667
- Cu = _community(G, u, community)
668
- Cv = _community(G, v, community)
669
- if Cu != Cv:
670
- return 0
671
- cnbors = nx.common_neighbors(G, u, v)
672
- within = {w for w in cnbors if _community(G, w, community) == Cu}
673
- inter = cnbors - within
674
- return len(within) / (len(inter) + delta)
675
-
676
- return _apply_prediction(G, predict, ebunch)
677
-
678
-
679
- def _community(G, u, community):
680
- """Get the community of the given node."""
681
- node_u = G.nodes[u]
682
- try:
683
- return node_u[community]
684
- except KeyError as err:
685
- raise nx.NetworkXAlgorithmError(
686
- f"No community information available for Node {u}"
687
- ) from err