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,650 +0,0 @@
1
- """
2
- Algebraic connectivity and Fiedler vectors of undirected graphs.
3
- """
4
-
5
- import networkx as nx
6
- from networkx.utils import (
7
- not_implemented_for,
8
- np_random_state,
9
- reverse_cuthill_mckee_ordering,
10
- )
11
-
12
- __all__ = [
13
- "algebraic_connectivity",
14
- "fiedler_vector",
15
- "spectral_ordering",
16
- "spectral_bisection",
17
- ]
18
-
19
-
20
- class _PCGSolver:
21
- """Preconditioned conjugate gradient method.
22
-
23
- To solve Ax = b:
24
- M = A.diagonal() # or some other preconditioner
25
- solver = _PCGSolver(lambda x: A * x, lambda x: M * x)
26
- x = solver.solve(b)
27
-
28
- The inputs A and M are functions which compute
29
- matrix multiplication on the argument.
30
- A - multiply by the matrix A in Ax=b
31
- M - multiply by M, the preconditioner surrogate for A
32
-
33
- Warning: There is no limit on number of iterations.
34
- """
35
-
36
- def __init__(self, A, M):
37
- self._A = A
38
- self._M = M
39
-
40
- def solve(self, B, tol):
41
- import numpy as np
42
-
43
- # Densifying step - can this be kept sparse?
44
- B = np.asarray(B)
45
- X = np.ndarray(B.shape, order="F")
46
- for j in range(B.shape[1]):
47
- X[:, j] = self._solve(B[:, j], tol)
48
- return X
49
-
50
- def _solve(self, b, tol):
51
- import numpy as np
52
- import scipy as sp
53
-
54
- A = self._A
55
- M = self._M
56
- tol *= sp.linalg.blas.dasum(b)
57
- # Initialize.
58
- x = np.zeros(b.shape)
59
- r = b.copy()
60
- z = M(r)
61
- rz = sp.linalg.blas.ddot(r, z)
62
- p = z.copy()
63
- # Iterate.
64
- while True:
65
- Ap = A(p)
66
- alpha = rz / sp.linalg.blas.ddot(p, Ap)
67
- x = sp.linalg.blas.daxpy(p, x, a=alpha)
68
- r = sp.linalg.blas.daxpy(Ap, r, a=-alpha)
69
- if sp.linalg.blas.dasum(r) < tol:
70
- return x
71
- z = M(r)
72
- beta = sp.linalg.blas.ddot(r, z)
73
- beta, rz = beta / rz, beta
74
- p = sp.linalg.blas.daxpy(p, z, a=beta)
75
-
76
-
77
- class _LUSolver:
78
- """LU factorization.
79
-
80
- To solve Ax = b:
81
- solver = _LUSolver(A)
82
- x = solver.solve(b)
83
-
84
- optional argument `tol` on solve method is ignored but included
85
- to match _PCGsolver API.
86
- """
87
-
88
- def __init__(self, A):
89
- import scipy as sp
90
-
91
- self._LU = sp.sparse.linalg.splu(
92
- A,
93
- permc_spec="MMD_AT_PLUS_A",
94
- diag_pivot_thresh=0.0,
95
- options={"Equil": True, "SymmetricMode": True},
96
- )
97
-
98
- def solve(self, B, tol=None):
99
- import numpy as np
100
-
101
- B = np.asarray(B)
102
- X = np.ndarray(B.shape, order="F")
103
- for j in range(B.shape[1]):
104
- X[:, j] = self._LU.solve(B[:, j])
105
- return X
106
-
107
-
108
- def _preprocess_graph(G, weight):
109
- """Compute edge weights and eliminate zero-weight edges."""
110
- if G.is_directed():
111
- H = nx.MultiGraph()
112
- H.add_nodes_from(G)
113
- H.add_weighted_edges_from(
114
- ((u, v, e.get(weight, 1.0)) for u, v, e in G.edges(data=True) if u != v),
115
- weight=weight,
116
- )
117
- G = H
118
- if not G.is_multigraph():
119
- edges = (
120
- (u, v, abs(e.get(weight, 1.0))) for u, v, e in G.edges(data=True) if u != v
121
- )
122
- else:
123
- edges = (
124
- (u, v, sum(abs(e.get(weight, 1.0)) for e in G[u][v].values()))
125
- for u, v in G.edges()
126
- if u != v
127
- )
128
- H = nx.Graph()
129
- H.add_nodes_from(G)
130
- H.add_weighted_edges_from((u, v, e) for u, v, e in edges if e != 0)
131
- return H
132
-
133
-
134
- def _rcm_estimate(G, nodelist):
135
- """Estimate the Fiedler vector using the reverse Cuthill-McKee ordering."""
136
- import numpy as np
137
-
138
- G = G.subgraph(nodelist)
139
- order = reverse_cuthill_mckee_ordering(G)
140
- n = len(nodelist)
141
- index = dict(zip(nodelist, range(n)))
142
- x = np.ndarray(n, dtype=float)
143
- for i, u in enumerate(order):
144
- x[index[u]] = i
145
- x -= (n - 1) / 2.0
146
- return x
147
-
148
-
149
- def _tracemin_fiedler(L, X, normalized, tol, method):
150
- """Compute the Fiedler vector of L using the TraceMIN-Fiedler algorithm.
151
-
152
- The Fiedler vector of a connected undirected graph is the eigenvector
153
- corresponding to the second smallest eigenvalue of the Laplacian matrix
154
- of the graph. This function starts with the Laplacian L, not the Graph.
155
-
156
- Parameters
157
- ----------
158
- L : Laplacian of a possibly weighted or normalized, but undirected graph
159
-
160
- X : Initial guess for a solution. Usually a matrix of random numbers.
161
- This function allows more than one column in X to identify more than
162
- one eigenvector if desired.
163
-
164
- normalized : bool
165
- Whether the normalized Laplacian matrix is used.
166
-
167
- tol : float
168
- Tolerance of relative residual in eigenvalue computation.
169
- Warning: There is no limit on number of iterations.
170
-
171
- method : string
172
- Should be 'tracemin_pcg' or 'tracemin_lu'.
173
- Otherwise exception is raised.
174
-
175
- Returns
176
- -------
177
- sigma, X : Two NumPy arrays of floats.
178
- The lowest eigenvalues and corresponding eigenvectors of L.
179
- The size of input X determines the size of these outputs.
180
- As this is for Fiedler vectors, the zero eigenvalue (and
181
- constant eigenvector) are avoided.
182
- """
183
- import numpy as np
184
- import scipy as sp
185
-
186
- n = X.shape[0]
187
-
188
- if normalized:
189
- # Form the normalized Laplacian matrix and determine the eigenvector of
190
- # its nullspace.
191
- e = np.sqrt(L.diagonal())
192
- D = sp.sparse.dia_array((1 / e, 0), shape=(n, n)).tocsr()
193
- L = D @ L @ D
194
- e *= 1.0 / np.linalg.norm(e, 2)
195
-
196
- if normalized:
197
-
198
- def project(X):
199
- """Make X orthogonal to the nullspace of L."""
200
- X = np.asarray(X)
201
- for j in range(X.shape[1]):
202
- X[:, j] -= (X[:, j] @ e) * e
203
-
204
- else:
205
-
206
- def project(X):
207
- """Make X orthogonal to the nullspace of L."""
208
- X = np.asarray(X)
209
- for j in range(X.shape[1]):
210
- X[:, j] -= X[:, j].sum() / n
211
-
212
- if method == "tracemin_pcg":
213
- D = L.diagonal().astype(float)
214
- solver = _PCGSolver(lambda x: L @ x, lambda x: D * x)
215
- elif method == "tracemin_lu":
216
- # Convert A to CSC to suppress SparseEfficiencyWarning.
217
- A = sp.sparse.csc_array(L, dtype=float, copy=True)
218
- # Force A to be nonsingular. Since A is the Laplacian matrix of a
219
- # connected graph, its rank deficiency is one, and thus one diagonal
220
- # element needs to modified. Changing to infinity forces a zero in the
221
- # corresponding element in the solution.
222
- i = (A.indptr[1:] - A.indptr[:-1]).argmax()
223
- A[i, i] = np.inf
224
- solver = _LUSolver(A)
225
- else:
226
- raise nx.NetworkXError(f"Unknown linear system solver: {method}")
227
-
228
- # Initialize.
229
- Lnorm = abs(L).sum(axis=1).flatten().max()
230
- project(X)
231
- W = np.ndarray(X.shape, order="F")
232
-
233
- while True:
234
- # Orthonormalize X.
235
- X = np.linalg.qr(X)[0]
236
- # Compute iteration matrix H.
237
- W[:, :] = L @ X
238
- H = X.T @ W
239
- sigma, Y = sp.linalg.eigh(H, overwrite_a=True)
240
- # Compute the Ritz vectors.
241
- X = X @ Y
242
- # Test for convergence exploiting the fact that L * X == W * Y.
243
- res = sp.linalg.blas.dasum(W @ Y[:, 0] - sigma[0] * X[:, 0]) / Lnorm
244
- if res < tol:
245
- break
246
- # Compute X = L \ X / (X' * (L \ X)).
247
- # L \ X can have an arbitrary projection on the nullspace of L,
248
- # which will be eliminated.
249
- W[:, :] = solver.solve(X, tol)
250
- X = (sp.linalg.inv(W.T @ X) @ W.T).T # Preserves Fortran storage order.
251
- project(X)
252
-
253
- return sigma, np.asarray(X)
254
-
255
-
256
- def _get_fiedler_func(method):
257
- """Returns a function that solves the Fiedler eigenvalue problem."""
258
- import numpy as np
259
-
260
- if method == "tracemin": # old style keyword <v2.1
261
- method = "tracemin_pcg"
262
- if method in ("tracemin_pcg", "tracemin_lu"):
263
-
264
- def find_fiedler(L, x, normalized, tol, seed):
265
- q = 1 if method == "tracemin_pcg" else min(4, L.shape[0] - 1)
266
- X = np.asarray(seed.normal(size=(q, L.shape[0]))).T
267
- sigma, X = _tracemin_fiedler(L, X, normalized, tol, method)
268
- return sigma[0], X[:, 0]
269
-
270
- elif method == "lanczos" or method == "lobpcg":
271
-
272
- def find_fiedler(L, x, normalized, tol, seed):
273
- import scipy as sp
274
-
275
- L = sp.sparse.csc_array(L, dtype=float)
276
- n = L.shape[0]
277
- if normalized:
278
- D = sp.sparse.dia_array(
279
- (1.0 / np.sqrt(L.diagonal()), 0), shape=(n, n)
280
- ).tocsc()
281
- L = D @ L @ D
282
- if method == "lanczos" or n < 10:
283
- # Avoid LOBPCG when n < 10 due to
284
- # https://github.com/scipy/scipy/issues/3592
285
- # https://github.com/scipy/scipy/pull/3594
286
- sigma, X = sp.sparse.linalg.eigsh(
287
- L, 2, which="SM", tol=tol, return_eigenvectors=True
288
- )
289
- return sigma[1], X[:, 1]
290
- else:
291
- X = np.asarray(np.atleast_2d(x).T)
292
- M = sp.sparse.dia_array((1.0 / L.diagonal(), 0), shape=(n, n)).tocsr()
293
- Y = np.ones(n)
294
- if normalized:
295
- Y /= D.diagonal()
296
- sigma, X = sp.sparse.linalg.lobpcg(
297
- L, X, M=M, Y=np.atleast_2d(Y).T, tol=tol, maxiter=n, largest=False
298
- )
299
- return sigma[0], X[:, 0]
300
-
301
- else:
302
- raise nx.NetworkXError(f"unknown method {method!r}.")
303
-
304
- return find_fiedler
305
-
306
-
307
- @not_implemented_for("directed")
308
- @np_random_state(5)
309
- @nx._dispatchable(edge_attrs="weight")
310
- def algebraic_connectivity(
311
- G, weight="weight", normalized=False, tol=1e-8, method="tracemin_pcg", seed=None
312
- ):
313
- r"""Returns the algebraic connectivity of an undirected graph.
314
-
315
- The algebraic connectivity of a connected undirected graph is the second
316
- smallest eigenvalue of its Laplacian matrix.
317
-
318
- Parameters
319
- ----------
320
- G : NetworkX graph
321
- An undirected graph.
322
-
323
- weight : object, optional (default: None)
324
- The data key used to determine the weight of each edge. If None, then
325
- each edge has unit weight.
326
-
327
- normalized : bool, optional (default: False)
328
- Whether the normalized Laplacian matrix is used.
329
-
330
- tol : float, optional (default: 1e-8)
331
- Tolerance of relative residual in eigenvalue computation.
332
-
333
- method : string, optional (default: 'tracemin_pcg')
334
- Method of eigenvalue computation. It must be one of the tracemin
335
- options shown below (TraceMIN), 'lanczos' (Lanczos iteration)
336
- or 'lobpcg' (LOBPCG).
337
-
338
- The TraceMIN algorithm uses a linear system solver. The following
339
- values allow specifying the solver to be used.
340
-
341
- =============== ========================================
342
- Value Solver
343
- =============== ========================================
344
- 'tracemin_pcg' Preconditioned conjugate gradient method
345
- 'tracemin_lu' LU factorization
346
- =============== ========================================
347
-
348
- seed : integer, random_state, or None (default)
349
- Indicator of random number generation state.
350
- See :ref:`Randomness<randomness>`.
351
-
352
- Returns
353
- -------
354
- algebraic_connectivity : float
355
- Algebraic connectivity.
356
-
357
- Raises
358
- ------
359
- NetworkXNotImplemented
360
- If G is directed.
361
-
362
- NetworkXError
363
- If G has less than two nodes.
364
-
365
- Notes
366
- -----
367
- Edge weights are interpreted by their absolute values. For MultiGraph's,
368
- weights of parallel edges are summed. Zero-weighted edges are ignored.
369
-
370
- See Also
371
- --------
372
- laplacian_matrix
373
-
374
- Examples
375
- --------
376
- For undirected graphs algebraic connectivity can tell us if a graph is connected or not
377
- `G` is connected iff ``algebraic_connectivity(G) > 0``:
378
-
379
- >>> G = nx.complete_graph(5)
380
- >>> nx.algebraic_connectivity(G) > 0
381
- True
382
- >>> G.add_node(10) # G is no longer connected
383
- >>> nx.algebraic_connectivity(G) > 0
384
- False
385
-
386
- """
387
- if len(G) < 2:
388
- raise nx.NetworkXError("graph has less than two nodes.")
389
- G = _preprocess_graph(G, weight)
390
- if not nx.is_connected(G):
391
- return 0.0
392
-
393
- L = nx.laplacian_matrix(G)
394
- if L.shape[0] == 2:
395
- return 2.0 * float(L[0, 0]) if not normalized else 2.0
396
-
397
- find_fiedler = _get_fiedler_func(method)
398
- x = None if method != "lobpcg" else _rcm_estimate(G, G)
399
- sigma, fiedler = find_fiedler(L, x, normalized, tol, seed)
400
- return float(sigma)
401
-
402
-
403
- @not_implemented_for("directed")
404
- @np_random_state(5)
405
- @nx._dispatchable(edge_attrs="weight")
406
- def fiedler_vector(
407
- G, weight="weight", normalized=False, tol=1e-8, method="tracemin_pcg", seed=None
408
- ):
409
- """Returns the Fiedler vector of a connected undirected graph.
410
-
411
- The Fiedler vector of a connected undirected graph is the eigenvector
412
- corresponding to the second smallest eigenvalue of the Laplacian matrix
413
- of the graph.
414
-
415
- Parameters
416
- ----------
417
- G : NetworkX graph
418
- An undirected graph.
419
-
420
- weight : object, optional (default: None)
421
- The data key used to determine the weight of each edge. If None, then
422
- each edge has unit weight.
423
-
424
- normalized : bool, optional (default: False)
425
- Whether the normalized Laplacian matrix is used.
426
-
427
- tol : float, optional (default: 1e-8)
428
- Tolerance of relative residual in eigenvalue computation.
429
-
430
- method : string, optional (default: 'tracemin_pcg')
431
- Method of eigenvalue computation. It must be one of the tracemin
432
- options shown below (TraceMIN), 'lanczos' (Lanczos iteration)
433
- or 'lobpcg' (LOBPCG).
434
-
435
- The TraceMIN algorithm uses a linear system solver. The following
436
- values allow specifying the solver to be used.
437
-
438
- =============== ========================================
439
- Value Solver
440
- =============== ========================================
441
- 'tracemin_pcg' Preconditioned conjugate gradient method
442
- 'tracemin_lu' LU factorization
443
- =============== ========================================
444
-
445
- seed : integer, random_state, or None (default)
446
- Indicator of random number generation state.
447
- See :ref:`Randomness<randomness>`.
448
-
449
- Returns
450
- -------
451
- fiedler_vector : NumPy array of floats.
452
- Fiedler vector.
453
-
454
- Raises
455
- ------
456
- NetworkXNotImplemented
457
- If G is directed.
458
-
459
- NetworkXError
460
- If G has less than two nodes or is not connected.
461
-
462
- Notes
463
- -----
464
- Edge weights are interpreted by their absolute values. For MultiGraph's,
465
- weights of parallel edges are summed. Zero-weighted edges are ignored.
466
-
467
- See Also
468
- --------
469
- laplacian_matrix
470
-
471
- Examples
472
- --------
473
- Given a connected graph the signs of the values in the Fiedler vector can be
474
- used to partition the graph into two components.
475
-
476
- >>> G = nx.barbell_graph(5, 0)
477
- >>> nx.fiedler_vector(G, normalized=True, seed=1)
478
- array([-0.32864129, -0.32864129, -0.32864129, -0.32864129, -0.26072899,
479
- 0.26072899, 0.32864129, 0.32864129, 0.32864129, 0.32864129])
480
-
481
- The connected components are the two 5-node cliques of the barbell graph.
482
- """
483
- import numpy as np
484
-
485
- if len(G) < 2:
486
- raise nx.NetworkXError("graph has less than two nodes.")
487
- G = _preprocess_graph(G, weight)
488
- if not nx.is_connected(G):
489
- raise nx.NetworkXError("graph is not connected.")
490
-
491
- if len(G) == 2:
492
- return np.array([1.0, -1.0])
493
-
494
- find_fiedler = _get_fiedler_func(method)
495
- L = nx.laplacian_matrix(G)
496
- x = None if method != "lobpcg" else _rcm_estimate(G, G)
497
- sigma, fiedler = find_fiedler(L, x, normalized, tol, seed)
498
- return fiedler
499
-
500
-
501
- @np_random_state(5)
502
- @nx._dispatchable(edge_attrs="weight")
503
- def spectral_ordering(
504
- G, weight="weight", normalized=False, tol=1e-8, method="tracemin_pcg", seed=None
505
- ):
506
- """Compute the spectral_ordering of a graph.
507
-
508
- The spectral ordering of a graph is an ordering of its nodes where nodes
509
- in the same weakly connected components appear contiguous and ordered by
510
- their corresponding elements in the Fiedler vector of the component.
511
-
512
- Parameters
513
- ----------
514
- G : NetworkX graph
515
- A graph.
516
-
517
- weight : object, optional (default: None)
518
- The data key used to determine the weight of each edge. If None, then
519
- each edge has unit weight.
520
-
521
- normalized : bool, optional (default: False)
522
- Whether the normalized Laplacian matrix is used.
523
-
524
- tol : float, optional (default: 1e-8)
525
- Tolerance of relative residual in eigenvalue computation.
526
-
527
- method : string, optional (default: 'tracemin_pcg')
528
- Method of eigenvalue computation. It must be one of the tracemin
529
- options shown below (TraceMIN), 'lanczos' (Lanczos iteration)
530
- or 'lobpcg' (LOBPCG).
531
-
532
- The TraceMIN algorithm uses a linear system solver. The following
533
- values allow specifying the solver to be used.
534
-
535
- =============== ========================================
536
- Value Solver
537
- =============== ========================================
538
- 'tracemin_pcg' Preconditioned conjugate gradient method
539
- 'tracemin_lu' LU factorization
540
- =============== ========================================
541
-
542
- seed : integer, random_state, or None (default)
543
- Indicator of random number generation state.
544
- See :ref:`Randomness<randomness>`.
545
-
546
- Returns
547
- -------
548
- spectral_ordering : NumPy array of floats.
549
- Spectral ordering of nodes.
550
-
551
- Raises
552
- ------
553
- NetworkXError
554
- If G is empty.
555
-
556
- Notes
557
- -----
558
- Edge weights are interpreted by their absolute values. For MultiGraph's,
559
- weights of parallel edges are summed. Zero-weighted edges are ignored.
560
-
561
- See Also
562
- --------
563
- laplacian_matrix
564
- """
565
- if len(G) == 0:
566
- raise nx.NetworkXError("graph is empty.")
567
- G = _preprocess_graph(G, weight)
568
-
569
- find_fiedler = _get_fiedler_func(method)
570
- order = []
571
- for component in nx.connected_components(G):
572
- size = len(component)
573
- if size > 2:
574
- L = nx.laplacian_matrix(G, component)
575
- x = None if method != "lobpcg" else _rcm_estimate(G, component)
576
- sigma, fiedler = find_fiedler(L, x, normalized, tol, seed)
577
- sort_info = zip(fiedler, range(size), component)
578
- order.extend(u for x, c, u in sorted(sort_info))
579
- else:
580
- order.extend(component)
581
-
582
- return order
583
-
584
-
585
- @nx._dispatchable(edge_attrs="weight")
586
- def spectral_bisection(
587
- G, weight="weight", normalized=False, tol=1e-8, method="tracemin_pcg", seed=None
588
- ):
589
- """Bisect the graph using the Fiedler vector.
590
-
591
- This method uses the Fiedler vector to bisect a graph.
592
- The partition is defined by the nodes which are associated with
593
- either positive or negative values in the vector.
594
-
595
- Parameters
596
- ----------
597
- G : NetworkX Graph
598
-
599
- weight : str, optional (default: weight)
600
- The data key used to determine the weight of each edge. If None, then
601
- each edge has unit weight.
602
-
603
- normalized : bool, optional (default: False)
604
- Whether the normalized Laplacian matrix is used.
605
-
606
- tol : float, optional (default: 1e-8)
607
- Tolerance of relative residual in eigenvalue computation.
608
-
609
- method : string, optional (default: 'tracemin_pcg')
610
- Method of eigenvalue computation. It must be one of the tracemin
611
- options shown below (TraceMIN), 'lanczos' (Lanczos iteration)
612
- or 'lobpcg' (LOBPCG).
613
-
614
- The TraceMIN algorithm uses a linear system solver. The following
615
- values allow specifying the solver to be used.
616
-
617
- =============== ========================================
618
- Value Solver
619
- =============== ========================================
620
- 'tracemin_pcg' Preconditioned conjugate gradient method
621
- 'tracemin_lu' LU factorization
622
- =============== ========================================
623
-
624
- seed : integer, random_state, or None (default)
625
- Indicator of random number generation state.
626
- See :ref:`Randomness<randomness>`.
627
-
628
- Returns
629
- -------
630
- bisection : tuple of sets
631
- Sets with the bisection of nodes
632
-
633
- Examples
634
- --------
635
- >>> G = nx.barbell_graph(3, 0)
636
- >>> nx.spectral_bisection(G)
637
- ({0, 1, 2}, {3, 4, 5})
638
-
639
- References
640
- ----------
641
- .. [1] M. E. J Newman 'Networks: An Introduction', pages 364-370
642
- Oxford University Press 2011.
643
- """
644
- import numpy as np
645
-
646
- v = nx.fiedler_vector(G, weight, normalized, tol, method, seed)
647
- nodes = np.array(list(G))
648
- pos_vals = v >= 0
649
-
650
- return set(nodes[~pos_vals].tolist()), set(nodes[pos_vals].tolist())