okstra 0.130.4 → 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 (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 +1722 -98
  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,88 +0,0 @@
1
- """Functions for computing the harmonic centrality of a graph."""
2
-
3
- from functools import partial
4
-
5
- import networkx as nx
6
-
7
- __all__ = ["harmonic_centrality"]
8
-
9
-
10
- @nx._dispatchable(edge_attrs="distance")
11
- def harmonic_centrality(G, nbunch=None, distance=None, sources=None):
12
- r"""Compute harmonic centrality for nodes.
13
-
14
- Harmonic centrality [1]_ of a node `u` is the sum of the reciprocal
15
- of the shortest path distances from all other nodes to `u`
16
-
17
- .. math::
18
-
19
- C(u) = \sum_{v \neq u} \frac{1}{d(v, u)}
20
-
21
- where `d(v, u)` is the shortest-path distance between `v` and `u`.
22
-
23
- If `sources` is given as an argument, the returned harmonic centrality
24
- values are calculated as the sum of the reciprocals of the shortest
25
- path distances from the nodes specified in `sources` to `u` instead
26
- of from all nodes to `u`.
27
-
28
- Notice that higher values indicate higher centrality.
29
-
30
- Parameters
31
- ----------
32
- G : graph
33
- A NetworkX graph
34
-
35
- nbunch : container (default: all nodes in G)
36
- Container of nodes for which harmonic centrality values are calculated.
37
-
38
- sources : container (default: all nodes in G)
39
- Container of nodes `v` over which reciprocal distances are computed.
40
- Nodes not in `G` are silently ignored.
41
-
42
- distance : edge attribute key, optional (default=None)
43
- Use the specified edge attribute as the edge distance in shortest
44
- path calculations. If `None`, then each edge will have distance equal to 1.
45
-
46
- Returns
47
- -------
48
- nodes : dictionary
49
- Dictionary of nodes with harmonic centrality as the value.
50
-
51
- See Also
52
- --------
53
- betweenness_centrality, load_centrality, eigenvector_centrality,
54
- degree_centrality, closeness_centrality
55
-
56
- Notes
57
- -----
58
- If the 'distance' keyword is set to an edge attribute key then the
59
- shortest-path length will be computed using Dijkstra's algorithm with
60
- that edge attribute as the edge weight.
61
-
62
- References
63
- ----------
64
- .. [1] Boldi, Paolo, and Sebastiano Vigna. "Axioms for centrality."
65
- Internet Mathematics 10.3-4 (2014): 222-262.
66
- """
67
-
68
- nbunch = set(G.nbunch_iter(nbunch) if nbunch is not None else G.nodes)
69
- sources = set(G.nbunch_iter(sources) if sources is not None else G.nodes)
70
-
71
- centrality = {u: 0 for u in nbunch}
72
-
73
- transposed = False
74
- if len(nbunch) < len(sources):
75
- transposed = True
76
- nbunch, sources = sources, nbunch
77
- if nx.is_directed(G):
78
- G = nx.reverse(G, copy=False)
79
-
80
- spl = partial(nx.shortest_path_length, G, weight=distance)
81
- for v in sources:
82
- dist = spl(v)
83
- for u, d_uv in dist.items():
84
- # Ignore self-loops and edges with 0 weight
85
- if d_uv != 0 and u in nbunch:
86
- centrality[v if transposed else u] += 1 / d_uv
87
-
88
- return centrality
@@ -1,331 +0,0 @@
1
- """Katz centrality."""
2
-
3
- import math
4
-
5
- import networkx as nx
6
- from networkx.utils import not_implemented_for
7
-
8
- __all__ = ["katz_centrality", "katz_centrality_numpy"]
9
-
10
-
11
- @not_implemented_for("multigraph")
12
- @nx._dispatchable(edge_attrs="weight")
13
- def katz_centrality(
14
- G,
15
- alpha=0.1,
16
- beta=1.0,
17
- max_iter=1000,
18
- tol=1.0e-6,
19
- nstart=None,
20
- normalized=True,
21
- weight=None,
22
- ):
23
- r"""Compute the Katz centrality for the nodes of the graph G.
24
-
25
- Katz centrality computes the centrality for a node based on the centrality
26
- of its neighbors. It is a generalization of the eigenvector centrality. The
27
- Katz centrality for node $i$ is
28
-
29
- .. math::
30
-
31
- x_i = \alpha \sum_{j} A_{ij} x_j + \beta,
32
-
33
- where $A$ is the adjacency matrix of graph G with eigenvalues $\lambda$.
34
-
35
- The parameter $\beta$ controls the initial centrality and
36
-
37
- .. math::
38
-
39
- \alpha < \frac{1}{\lambda_{\max}}.
40
-
41
- Katz centrality computes the relative influence of a node within a
42
- network by measuring the number of the immediate neighbors (first
43
- degree nodes) and also all other nodes in the network that connect
44
- to the node under consideration through these immediate neighbors.
45
-
46
- Extra weight can be provided to immediate neighbors through the
47
- parameter $\beta$. Connections made with distant neighbors
48
- are, however, penalized by an attenuation factor $\alpha$ which
49
- should be strictly less than the inverse largest eigenvalue of the
50
- adjacency matrix in order for the Katz centrality to be computed
51
- correctly. More information is provided in [1]_.
52
-
53
- Parameters
54
- ----------
55
- G : graph
56
- A NetworkX graph.
57
-
58
- alpha : float, optional (default=0.1)
59
- Attenuation factor
60
-
61
- beta : scalar or dictionary, optional (default=1.0)
62
- Weight attributed to the immediate neighborhood. If not a scalar, the
63
- dictionary must have a value for every node.
64
-
65
- max_iter : integer, optional (default=1000)
66
- Maximum number of iterations in power method.
67
-
68
- tol : float, optional (default=1.0e-6)
69
- Error tolerance used to check convergence in power method iteration.
70
-
71
- nstart : dictionary, optional
72
- Starting value of Katz iteration for each node.
73
-
74
- normalized : bool, optional (default=True)
75
- If True normalize the resulting values.
76
-
77
- weight : None or string, optional (default=None)
78
- If None, all edge weights are considered equal.
79
- Otherwise holds the name of the edge attribute used as weight.
80
- In this measure the weight is interpreted as the connection strength.
81
-
82
- Returns
83
- -------
84
- nodes : dictionary
85
- Dictionary of nodes with Katz centrality as the value.
86
-
87
- Raises
88
- ------
89
- NetworkXError
90
- If the parameter `beta` is not a scalar but lacks a value for at least
91
- one node
92
-
93
- PowerIterationFailedConvergence
94
- If the algorithm fails to converge to the specified tolerance
95
- within the specified number of iterations of the power iteration
96
- method.
97
-
98
- Examples
99
- --------
100
- >>> import math
101
- >>> G = nx.path_graph(4)
102
- >>> phi = (1 + math.sqrt(5)) / 2.0 # largest eigenvalue of adj matrix
103
- >>> centrality = nx.katz_centrality(G, 1 / phi - 0.01)
104
- >>> for n, c in sorted(centrality.items()):
105
- ... print(f"{n} {c:.2f}")
106
- 0 0.37
107
- 1 0.60
108
- 2 0.60
109
- 3 0.37
110
-
111
- See Also
112
- --------
113
- katz_centrality_numpy
114
- eigenvector_centrality
115
- eigenvector_centrality_numpy
116
- :func:`~networkx.algorithms.link_analysis.pagerank_alg.pagerank`
117
- :func:`~networkx.algorithms.link_analysis.hits_alg.hits`
118
-
119
- Notes
120
- -----
121
- Katz centrality was introduced by [2]_.
122
-
123
- This algorithm it uses the power method to find the eigenvector
124
- corresponding to the largest eigenvalue of the adjacency matrix of ``G``.
125
- The parameter ``alpha`` should be strictly less than the inverse of largest
126
- eigenvalue of the adjacency matrix for the algorithm to converge.
127
- You can use ``max(nx.adjacency_spectrum(G))`` to get $\lambda_{\max}$ the largest
128
- eigenvalue of the adjacency matrix.
129
- The iteration will stop after ``max_iter`` iterations or an error tolerance of
130
- ``number_of_nodes(G) * tol`` has been reached.
131
-
132
- For strongly connected graphs, as $\alpha \to 1/\lambda_{\max}$, and $\beta > 0$,
133
- Katz centrality approaches the results for eigenvector centrality.
134
-
135
- For directed graphs this finds "left" eigenvectors which corresponds
136
- to the in-edges in the graph. For out-edges Katz centrality,
137
- first reverse the graph with ``G.reverse()``.
138
-
139
- References
140
- ----------
141
- .. [1] Mark E. J. Newman:
142
- Networks: An Introduction.
143
- Oxford University Press, USA, 2010, p. 720.
144
- .. [2] Leo Katz:
145
- A New Status Index Derived from Sociometric Index.
146
- Psychometrika 18(1):39–43, 1953
147
- https://link.springer.com/content/pdf/10.1007/BF02289026.pdf
148
- """
149
- if len(G) == 0:
150
- return {}
151
-
152
- nnodes = G.number_of_nodes()
153
-
154
- if nstart is None:
155
- # choose starting vector with entries of 0
156
- x = {n: 0 for n in G}
157
- else:
158
- x = nstart
159
-
160
- try:
161
- b = dict.fromkeys(G, float(beta))
162
- except (TypeError, ValueError, AttributeError) as err:
163
- b = beta
164
- if set(beta) != set(G):
165
- raise nx.NetworkXError(
166
- "beta dictionary must have a value for every node"
167
- ) from err
168
-
169
- # make up to max_iter iterations
170
- for _ in range(max_iter):
171
- xlast = x
172
- x = dict.fromkeys(xlast, 0)
173
- # do the multiplication y^T = Alpha * x^T A + Beta
174
- for n in x:
175
- for nbr in G[n]:
176
- x[nbr] += xlast[n] * G[n][nbr].get(weight, 1)
177
- for n in x:
178
- x[n] = alpha * x[n] + b[n]
179
-
180
- # check convergence
181
- error = sum(abs(x[n] - xlast[n]) for n in x)
182
- if error < nnodes * tol:
183
- if normalized:
184
- # normalize vector
185
- try:
186
- s = 1.0 / math.hypot(*x.values())
187
- except ZeroDivisionError:
188
- s = 1.0
189
- else:
190
- s = 1
191
- for n in x:
192
- x[n] *= s
193
- return x
194
- raise nx.PowerIterationFailedConvergence(max_iter)
195
-
196
-
197
- @not_implemented_for("multigraph")
198
- @nx._dispatchable(edge_attrs="weight")
199
- def katz_centrality_numpy(G, alpha=0.1, beta=1.0, normalized=True, weight=None):
200
- r"""Compute the Katz centrality for the graph G.
201
-
202
- Katz centrality computes the centrality for a node based on the centrality
203
- of its neighbors. It is a generalization of the eigenvector centrality. The
204
- Katz centrality for node $i$ is
205
-
206
- .. math::
207
-
208
- x_i = \alpha \sum_{j} A_{ij} x_j + \beta,
209
-
210
- where $A$ is the adjacency matrix of graph G with eigenvalues $\lambda$.
211
-
212
- The parameter $\beta$ controls the initial centrality and
213
-
214
- .. math::
215
-
216
- \alpha < \frac{1}{\lambda_{\max}}.
217
-
218
- Katz centrality computes the relative influence of a node within a
219
- network by measuring the number of the immediate neighbors (first
220
- degree nodes) and also all other nodes in the network that connect
221
- to the node under consideration through these immediate neighbors.
222
-
223
- Extra weight can be provided to immediate neighbors through the
224
- parameter $\beta$. Connections made with distant neighbors
225
- are, however, penalized by an attenuation factor $\alpha$ which
226
- should be strictly less than the inverse largest eigenvalue of the
227
- adjacency matrix in order for the Katz centrality to be computed
228
- correctly. More information is provided in [1]_.
229
-
230
- Parameters
231
- ----------
232
- G : graph
233
- A NetworkX graph
234
-
235
- alpha : float
236
- Attenuation factor
237
-
238
- beta : scalar or dictionary, optional (default=1.0)
239
- Weight attributed to the immediate neighborhood. If not a scalar the
240
- dictionary must have an value for every node.
241
-
242
- normalized : bool
243
- If True normalize the resulting values.
244
-
245
- weight : None or string, optional
246
- If None, all edge weights are considered equal.
247
- Otherwise holds the name of the edge attribute used as weight.
248
- In this measure the weight is interpreted as the connection strength.
249
-
250
- Returns
251
- -------
252
- nodes : dictionary
253
- Dictionary of nodes with Katz centrality as the value.
254
-
255
- Raises
256
- ------
257
- NetworkXError
258
- If the parameter `beta` is not a scalar but lacks a value for at least
259
- one node
260
-
261
- Examples
262
- --------
263
- >>> import math
264
- >>> G = nx.path_graph(4)
265
- >>> phi = (1 + math.sqrt(5)) / 2.0 # largest eigenvalue of adj matrix
266
- >>> centrality = nx.katz_centrality_numpy(G, 1 / phi)
267
- >>> for n, c in sorted(centrality.items()):
268
- ... print(f"{n} {c:.2f}")
269
- 0 0.37
270
- 1 0.60
271
- 2 0.60
272
- 3 0.37
273
-
274
- See Also
275
- --------
276
- katz_centrality
277
- eigenvector_centrality_numpy
278
- eigenvector_centrality
279
- :func:`~networkx.algorithms.link_analysis.pagerank_alg.pagerank`
280
- :func:`~networkx.algorithms.link_analysis.hits_alg.hits`
281
-
282
- Notes
283
- -----
284
- Katz centrality was introduced by [2]_.
285
-
286
- This algorithm uses a direct linear solver to solve the above equation.
287
- The parameter ``alpha`` should be strictly less than the inverse of largest
288
- eigenvalue of the adjacency matrix for there to be a solution.
289
- You can use ``max(nx.adjacency_spectrum(G))`` to get $\lambda_{\max}$ the largest
290
- eigenvalue of the adjacency matrix.
291
-
292
- For strongly connected graphs, as $\alpha \to 1/\lambda_{\max}$, and $\beta > 0$,
293
- Katz centrality approaches the results for eigenvector centrality.
294
-
295
- For directed graphs this finds "left" eigenvectors which corresponds
296
- to the in-edges in the graph. For out-edges Katz centrality,
297
- first reverse the graph with ``G.reverse()``.
298
-
299
- References
300
- ----------
301
- .. [1] Mark E. J. Newman:
302
- Networks: An Introduction.
303
- Oxford University Press, USA, 2010, p. 173.
304
- .. [2] Leo Katz:
305
- A New Status Index Derived from Sociometric Index.
306
- Psychometrika 18(1):39–43, 1953
307
- https://link.springer.com/content/pdf/10.1007/BF02289026.pdf
308
- """
309
- import numpy as np
310
-
311
- if len(G) == 0:
312
- return {}
313
- try:
314
- nodelist = beta.keys()
315
- if set(nodelist) != set(G):
316
- raise nx.NetworkXError("beta dictionary must have a value for every node")
317
- b = np.array(list(beta.values()), dtype=float)
318
- except AttributeError:
319
- nodelist = list(G)
320
- try:
321
- b = np.ones((len(nodelist), 1)) * beta
322
- except (TypeError, ValueError, AttributeError) as err:
323
- raise nx.NetworkXError("beta must be a number") from err
324
-
325
- A = nx.adjacency_matrix(G, nodelist=nodelist, weight=weight).todense().T
326
- n = A.shape[0]
327
- centrality = np.linalg.solve(np.eye(n, n) - (alpha * A), b).squeeze()
328
-
329
- # Normalize: rely on truediv to cast to float, then tolist to make Python numbers
330
- norm = np.sign(sum(centrality)) * np.linalg.norm(centrality) if normalized else 1
331
- return dict(zip(nodelist, (centrality / norm).tolist()))
@@ -1,150 +0,0 @@
1
- """
2
- Laplacian centrality measures.
3
- """
4
-
5
- import networkx as nx
6
-
7
- __all__ = ["laplacian_centrality"]
8
-
9
-
10
- @nx._dispatchable(edge_attrs="weight")
11
- def laplacian_centrality(
12
- G, normalized=True, nodelist=None, weight="weight", walk_type=None, alpha=0.95
13
- ):
14
- r"""Compute the Laplacian centrality for nodes in the graph `G`.
15
-
16
- The Laplacian Centrality of a node ``i`` is measured by the drop in the
17
- Laplacian Energy after deleting node ``i`` from the graph. The Laplacian Energy
18
- is the sum of the squared eigenvalues of a graph's Laplacian matrix.
19
-
20
- .. math::
21
-
22
- C_L(u_i,G) = \frac{(\Delta E)_i}{E_L (G)} = \frac{E_L (G)-E_L (G_i)}{E_L (G)}
23
-
24
- E_L (G) = \sum_{i=0}^n \lambda_i^2
25
-
26
- Where $E_L (G)$ is the Laplacian energy of graph `G`,
27
- E_L (G_i) is the Laplacian energy of graph `G` after deleting node ``i``
28
- and $\lambda_i$ are the eigenvalues of `G`'s Laplacian matrix.
29
- This formula shows the normalized value. Without normalization,
30
- the numerator on the right side is returned.
31
-
32
- Parameters
33
- ----------
34
- G : graph
35
- A networkx graph
36
-
37
- normalized : bool (default = True)
38
- If True the centrality score is scaled so the sum over all nodes is 1.
39
- If False the centrality score for each node is the drop in Laplacian
40
- energy when that node is removed.
41
-
42
- nodelist : list, optional (default = None)
43
- The rows and columns are ordered according to the nodes in nodelist.
44
- If nodelist is None, then the ordering is produced by G.nodes().
45
-
46
- weight: string or None, optional (default=`weight`)
47
- Optional parameter `weight` to compute the Laplacian matrix.
48
- The edge data key used to compute each value in the matrix.
49
- If None, then each edge has weight 1.
50
-
51
- walk_type : string or None, optional (default=None)
52
- Optional parameter `walk_type` used when calling
53
- :func:`directed_laplacian_matrix <networkx.directed_laplacian_matrix>`.
54
- One of ``"random"``, ``"lazy"``, or ``"pagerank"``. If ``walk_type=None``
55
- (the default), then a value is selected according to the properties of `G`:
56
- - ``walk_type="random"`` if `G` is strongly connected and aperiodic
57
- - ``walk_type="lazy"`` if `G` is strongly connected but not aperiodic
58
- - ``walk_type="pagerank"`` for all other cases.
59
-
60
- alpha : real (default = 0.95)
61
- Optional parameter `alpha` used when calling
62
- :func:`directed_laplacian_matrix <networkx.directed_laplacian_matrix>`.
63
- (1 - alpha) is the teleportation probability used with pagerank.
64
-
65
- Returns
66
- -------
67
- nodes : dictionary
68
- Dictionary of nodes with Laplacian centrality as the value.
69
-
70
- Examples
71
- --------
72
- >>> G = nx.Graph()
73
- >>> edges = [(0, 1, 4), (0, 2, 2), (2, 1, 1), (1, 3, 2), (1, 4, 2), (4, 5, 1)]
74
- >>> G.add_weighted_edges_from(edges)
75
- >>> sorted((v, f"{c:0.2f}") for v, c in laplacian_centrality(G).items())
76
- [(0, '0.70'), (1, '0.90'), (2, '0.28'), (3, '0.22'), (4, '0.26'), (5, '0.04')]
77
-
78
- Notes
79
- -----
80
- The algorithm is implemented based on [1]_ with an extension to directed graphs
81
- using the ``directed_laplacian_matrix`` function.
82
-
83
- Raises
84
- ------
85
- NetworkXPointlessConcept
86
- If the graph `G` is the null graph.
87
- ZeroDivisionError
88
- If the graph `G` has no edges (is empty) and normalization is requested.
89
-
90
- References
91
- ----------
92
- .. [1] Qi, X., Fuller, E., Wu, Q., Wu, Y., and Zhang, C.-Q. (2012).
93
- Laplacian centrality: A new centrality measure for weighted networks.
94
- Information Sciences, 194:240-253.
95
- https://math.wvu.edu/~cqzhang/Publication-files/my-paper/INS-2012-Laplacian-W.pdf
96
-
97
- See Also
98
- --------
99
- :func:`~networkx.linalg.laplacianmatrix.directed_laplacian_matrix`
100
- :func:`~networkx.linalg.laplacianmatrix.laplacian_matrix`
101
- """
102
- import numpy as np
103
- import scipy as sp
104
-
105
- if len(G) == 0:
106
- raise nx.NetworkXPointlessConcept("null graph has no centrality defined")
107
- if G.size(weight=weight) == 0:
108
- if normalized:
109
- raise ZeroDivisionError("graph with no edges has zero full energy")
110
- return {n: 0 for n in G}
111
-
112
- if nodelist is not None:
113
- nodeset = set(G.nbunch_iter(nodelist))
114
- if len(nodeset) != len(nodelist):
115
- raise nx.NetworkXError("nodelist has duplicate nodes or nodes not in G")
116
- nodes = nodelist + [n for n in G if n not in nodeset]
117
- else:
118
- nodelist = nodes = list(G)
119
-
120
- if G.is_directed():
121
- lap_matrix = nx.directed_laplacian_matrix(G, nodes, weight, walk_type, alpha)
122
- else:
123
- lap_matrix = nx.laplacian_matrix(G, nodes, weight).toarray()
124
-
125
- full_energy = np.sum(lap_matrix**2)
126
-
127
- # calculate laplacian centrality
128
- laplace_centralities_dict = {}
129
- for i, node in enumerate(nodelist):
130
- # remove row and col i from lap_matrix
131
- all_but_i = list(np.arange(lap_matrix.shape[0]))
132
- all_but_i.remove(i)
133
- A_2 = lap_matrix[all_but_i, :][:, all_but_i]
134
-
135
- # Adjust diagonal for removed row
136
- new_diag = lap_matrix.diagonal() - abs(lap_matrix[:, i])
137
- np.fill_diagonal(A_2, new_diag[all_but_i])
138
-
139
- if len(all_but_i) > 0: # catches degenerate case of single node
140
- new_energy = np.sum(A_2**2)
141
- else:
142
- new_energy = 0.0
143
-
144
- lapl_cent = full_energy - new_energy
145
- if normalized:
146
- lapl_cent = lapl_cent / full_energy
147
-
148
- laplace_centralities_dict[node] = float(lapl_cent)
149
-
150
- return laplace_centralities_dict