okstra 0.130.3 → 0.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +0 -1
  2. package/docs/architecture.md +2 -2
  3. package/docs/cli.md +1 -1
  4. package/docs/for-ai/README.md +0 -2
  5. package/docs/for-ai/skills/okstra-run.md +13 -2
  6. package/docs/for-ai/skills/okstra-setup.md +4 -1
  7. package/docs/project-structure-overview.md +5 -4
  8. package/docs/task-process/implementation-planning.md +13 -0
  9. package/docs/task-process/implementation.md +17 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +7 -0
  13. package/runtime/bin/lib/okstra/usage.sh +4 -4
  14. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  15. package/runtime/prompts/lead/plan-body-verification.md +26 -5
  16. package/runtime/prompts/lead/report-writer.md +6 -2
  17. package/runtime/prompts/profiles/_common-contract.md +2 -1
  18. package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
  19. package/runtime/prompts/profiles/_implementation-executor.md +2 -2
  20. package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
  21. package/runtime/prompts/profiles/final-verification.md +21 -6
  22. package/runtime/prompts/profiles/implementation-planning.md +21 -4
  23. package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
  24. package/runtime/python/okstra_ctl/conformance.py +49 -11
  25. package/runtime/python/okstra_ctl/report_finalize.py +52 -1
  26. package/runtime/python/okstra_ctl/report_views.py +32 -5
  27. package/runtime/python/okstra_ctl/run.py +15 -3
  28. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  29. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  30. package/runtime/python/okstra_vendor/__init__.py +0 -44
  31. package/runtime/schemas/final-report-v1.0.schema.json +101 -6
  32. package/runtime/skills/okstra-run/SKILL.md +11 -4
  33. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  34. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  35. package/runtime/templates/reports/final-report.template.md +18 -12
  36. package/runtime/templates/reports/i18n/en.json +1 -0
  37. package/runtime/templates/reports/i18n/ko.json +1 -0
  38. package/runtime/templates/reports/report.css +18 -0
  39. package/runtime/validators/lib/fixtures.sh +6 -0
  40. package/runtime/validators/validate-run.py +1722 -98
  41. package/src/cli-registry.mjs +0 -7
  42. package/src/commands/lifecycle/doctor.mjs +0 -9
  43. package/src/lib/skill-catalog.mjs +0 -1
  44. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  45. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  46. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  47. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  48. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  49. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  50. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  51. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  52. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  53. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  54. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  55. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  56. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  57. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  58. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  59. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  60. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  61. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  62. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  63. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  64. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  65. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  66. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  67. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  68. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  69. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  70. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  71. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  72. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  73. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  74. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  75. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  76. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  77. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  78. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  79. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  93. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  94. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  99. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  100. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  101. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  116. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  117. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  118. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  141. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  142. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  143. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  144. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  146. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  147. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  148. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  161. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  162. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  168. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  169. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  178. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  179. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  180. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  181. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  182. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  183. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  184. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  185. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  186. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  187. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  188. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  189. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  190. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  191. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  202. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  203. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  204. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  205. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  206. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  207. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  216. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  217. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  220. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  221. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  222. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  223. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  224. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  225. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  226. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  227. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  228. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  229. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  233. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  234. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  235. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  236. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  237. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  238. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  239. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  240. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  241. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  246. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  247. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  248. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  249. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  250. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  251. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  252. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  253. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  254. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  255. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  256. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  257. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  258. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  263. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  264. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  271. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  272. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  273. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  274. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  275. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  276. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  277. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  278. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  279. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  280. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  281. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  282. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  283. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  284. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  285. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  286. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  287. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  288. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  289. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  290. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  291. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  294. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  295. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  296. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  297. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  298. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  299. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  300. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  301. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  302. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  303. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  304. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  305. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  306. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  307. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  308. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  309. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  310. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  311. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  312. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  313. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  314. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  315. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  316. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  317. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  318. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  319. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  320. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  321. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  322. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  323. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  324. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  325. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  326. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  327. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  328. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  329. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  330. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  331. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  332. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  333. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  334. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  335. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  336. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  337. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  338. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  339. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  340. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  341. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  342. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  343. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  347. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  348. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  349. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  350. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  351. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  352. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  353. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  354. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  355. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  356. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  357. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  358. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  359. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  360. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  361. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  362. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  363. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  364. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  365. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  366. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  367. package/src/commands/graphify.mjs +0 -32
@@ -1,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())