okstra 0.130.4 → 0.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/README.md +0 -1
  2. package/docs/architecture.md +2 -2
  3. package/docs/cli.md +1 -1
  4. package/docs/for-ai/README.md +0 -2
  5. package/docs/for-ai/skills/okstra-run.md +13 -2
  6. package/docs/for-ai/skills/okstra-setup.md +4 -1
  7. package/docs/project-structure-overview.md +5 -4
  8. package/docs/task-process/implementation-planning.md +13 -0
  9. package/docs/task-process/implementation.md +17 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +7 -0
  13. package/runtime/bin/lib/okstra/usage.sh +4 -4
  14. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  15. package/runtime/prompts/lead/plan-body-verification.md +26 -5
  16. package/runtime/prompts/lead/report-writer.md +6 -2
  17. package/runtime/prompts/profiles/_common-contract.md +2 -1
  18. package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
  19. package/runtime/prompts/profiles/_implementation-executor.md +2 -2
  20. package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
  21. package/runtime/prompts/profiles/final-verification.md +21 -6
  22. package/runtime/prompts/profiles/implementation-planning.md +16 -4
  23. package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
  24. package/runtime/python/okstra_ctl/conformance.py +49 -11
  25. package/runtime/python/okstra_ctl/report_finalize.py +52 -1
  26. package/runtime/python/okstra_ctl/run.py +15 -3
  27. package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
  28. package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
  29. package/runtime/python/okstra_vendor/__init__.py +0 -44
  30. package/runtime/schemas/final-report-v1.0.schema.json +99 -5
  31. package/runtime/skills/okstra-run/SKILL.md +11 -4
  32. package/runtime/skills/okstra-setup/SKILL.md +3 -2
  33. package/runtime/skills/okstra-setup/references/project-config.md +16 -7
  34. package/runtime/templates/reports/final-report.template.md +15 -9
  35. package/runtime/templates/reports/i18n/en.json +1 -0
  36. package/runtime/templates/reports/i18n/ko.json +1 -0
  37. package/runtime/validators/lib/fixtures.sh +6 -0
  38. package/runtime/validators/validate-run.py +1722 -98
  39. package/src/cli-registry.mjs +0 -7
  40. package/src/commands/lifecycle/doctor.mjs +0 -9
  41. package/src/lib/skill-catalog.mjs +0 -1
  42. package/docs/for-ai/skills/okstra-graphify.md +0 -64
  43. package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
  44. package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
  45. package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
  46. package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
  47. package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
  48. package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
  49. package/runtime/python/okstra_vendor/graphify/build.py +0 -107
  50. package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
  51. package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
  52. package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
  53. package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
  54. package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
  55. package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
  56. package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
  57. package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
  58. package/runtime/python/okstra_vendor/graphify/report.py +0 -175
  59. package/runtime/python/okstra_vendor/graphify/security.py +0 -203
  60. package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
  61. package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
  62. package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
  63. package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
  64. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
  65. package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
  66. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
  67. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
  68. package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
  69. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
  70. package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
  71. package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
  72. package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
  73. package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
  74. package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
  75. package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
  76. package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
  77. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
  78. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
  79. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
  80. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
  81. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
  82. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
  83. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
  84. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
  85. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
  86. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
  87. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
  88. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
  89. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
  90. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
  91. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
  92. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
  93. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
  94. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
  95. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
  96. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
  97. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
  98. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
  99. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
  100. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
  101. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
  114. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
  115. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
  116. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
  117. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
  118. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
  139. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
  140. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
  141. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
  142. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
  143. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
  144. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
  145. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
  146. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
  147. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
  148. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
  149. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
  150. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
  151. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
  152. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
  153. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
  154. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
  155. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
  156. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
  157. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
  158. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
  159. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
  160. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
  161. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
  162. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
  163. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
  164. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
  165. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
  166. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
  167. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
  168. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
  169. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
  170. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
  171. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
  172. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
  173. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
  174. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
  175. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
  176. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
  177. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
  178. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
  179. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
  180. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
  181. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
  182. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
  183. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
  184. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
  185. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
  186. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
  187. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
  188. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
  189. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
  190. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
  191. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
  192. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
  193. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
  194. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
  195. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
  196. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
  197. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
  198. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
  199. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
  200. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
  201. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
  202. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
  203. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
  204. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
  205. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
  206. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
  207. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
  208. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
  209. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
  210. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
  211. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
  212. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
  213. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
  214. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
  215. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
  216. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
  217. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
  218. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
  219. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
  220. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
  221. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
  222. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
  223. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
  224. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
  225. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
  226. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
  227. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
  228. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
  229. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
  230. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
  231. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
  232. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
  233. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
  234. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
  235. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
  236. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
  237. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
  238. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
  239. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
  240. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
  241. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
  242. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
  243. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
  244. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
  245. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
  246. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
  247. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
  248. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
  249. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
  250. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
  251. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
  252. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
  253. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
  254. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
  255. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
  256. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
  257. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
  258. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
  259. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
  260. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
  261. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
  262. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
  263. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
  264. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
  265. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
  266. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
  267. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
  268. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
  269. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
  270. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
  271. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
  272. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
  273. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
  274. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
  275. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
  276. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
  277. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
  278. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
  279. package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
  280. package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
  281. package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
  282. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
  283. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
  284. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
  285. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
  286. package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
  287. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
  288. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
  289. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
  290. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
  291. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
  292. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
  293. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
  294. package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
  295. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
  296. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  297. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
  298. package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
  299. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
  300. package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
  301. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
  302. package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
  303. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
  304. package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
  305. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
  306. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
  307. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
  308. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
  309. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
  310. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
  311. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
  312. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
  313. package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
  314. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
  315. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
  316. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
  317. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
  318. package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
  319. package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
  320. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
  321. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
  322. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
  323. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
  324. package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
  325. package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
  326. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
  327. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
  328. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
  329. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
  330. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
  331. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
  332. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
  333. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
  334. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
  335. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
  336. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
  337. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
  338. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
  339. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
  340. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
  341. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
  342. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
  343. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
  344. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
  345. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
  346. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
  347. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
  348. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
  349. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
  350. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
  351. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
  352. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
  353. package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
  354. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
  355. package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
  356. package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
  357. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
  358. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
  359. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
  360. package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
  361. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
  362. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
  363. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
  364. package/runtime/skills/okstra-graphify/SKILL.md +0 -169
  365. package/src/commands/graphify.mjs +0 -32
@@ -1,633 +0,0 @@
1
- """
2
- Graph products.
3
- """
4
-
5
- from itertools import product
6
-
7
- import networkx as nx
8
- from networkx.utils import not_implemented_for
9
-
10
- __all__ = [
11
- "tensor_product",
12
- "cartesian_product",
13
- "lexicographic_product",
14
- "strong_product",
15
- "power",
16
- "rooted_product",
17
- "corona_product",
18
- "modular_product",
19
- ]
20
- _G_H = {"G": 0, "H": 1}
21
-
22
-
23
- def _dict_product(d1, d2):
24
- return {k: (d1.get(k), d2.get(k)) for k in set(d1) | set(d2)}
25
-
26
-
27
- # Generators for producing graph products
28
- def _node_product(G, H):
29
- for u, v in product(G, H):
30
- yield ((u, v), _dict_product(G.nodes[u], H.nodes[v]))
31
-
32
-
33
- def _directed_edges_cross_edges(G, H):
34
- if not G.is_multigraph() and not H.is_multigraph():
35
- for u, v, c in G.edges(data=True):
36
- for x, y, d in H.edges(data=True):
37
- yield (u, x), (v, y), _dict_product(c, d)
38
- if not G.is_multigraph() and H.is_multigraph():
39
- for u, v, c in G.edges(data=True):
40
- for x, y, k, d in H.edges(data=True, keys=True):
41
- yield (u, x), (v, y), k, _dict_product(c, d)
42
- if G.is_multigraph() and not H.is_multigraph():
43
- for u, v, k, c in G.edges(data=True, keys=True):
44
- for x, y, d in H.edges(data=True):
45
- yield (u, x), (v, y), k, _dict_product(c, d)
46
- if G.is_multigraph() and H.is_multigraph():
47
- for u, v, j, c in G.edges(data=True, keys=True):
48
- for x, y, k, d in H.edges(data=True, keys=True):
49
- yield (u, x), (v, y), (j, k), _dict_product(c, d)
50
-
51
-
52
- def _undirected_edges_cross_edges(G, H):
53
- if not G.is_multigraph() and not H.is_multigraph():
54
- for u, v, c in G.edges(data=True):
55
- for x, y, d in H.edges(data=True):
56
- yield (v, x), (u, y), _dict_product(c, d)
57
- if not G.is_multigraph() and H.is_multigraph():
58
- for u, v, c in G.edges(data=True):
59
- for x, y, k, d in H.edges(data=True, keys=True):
60
- yield (v, x), (u, y), k, _dict_product(c, d)
61
- if G.is_multigraph() and not H.is_multigraph():
62
- for u, v, k, c in G.edges(data=True, keys=True):
63
- for x, y, d in H.edges(data=True):
64
- yield (v, x), (u, y), k, _dict_product(c, d)
65
- if G.is_multigraph() and H.is_multigraph():
66
- for u, v, j, c in G.edges(data=True, keys=True):
67
- for x, y, k, d in H.edges(data=True, keys=True):
68
- yield (v, x), (u, y), (j, k), _dict_product(c, d)
69
-
70
-
71
- def _edges_cross_nodes(G, H):
72
- if G.is_multigraph():
73
- for u, v, k, d in G.edges(data=True, keys=True):
74
- for x in H:
75
- yield (u, x), (v, x), k, d
76
- else:
77
- for u, v, d in G.edges(data=True):
78
- for x in H:
79
- if H.is_multigraph():
80
- yield (u, x), (v, x), None, d
81
- else:
82
- yield (u, x), (v, x), d
83
-
84
-
85
- def _nodes_cross_edges(G, H):
86
- if H.is_multigraph():
87
- for x in G:
88
- for u, v, k, d in H.edges(data=True, keys=True):
89
- yield (x, u), (x, v), k, d
90
- else:
91
- for x in G:
92
- for u, v, d in H.edges(data=True):
93
- if G.is_multigraph():
94
- yield (x, u), (x, v), None, d
95
- else:
96
- yield (x, u), (x, v), d
97
-
98
-
99
- def _edges_cross_nodes_and_nodes(G, H):
100
- if G.is_multigraph():
101
- for u, v, k, d in G.edges(data=True, keys=True):
102
- for x in H:
103
- for y in H:
104
- yield (u, x), (v, y), k, d
105
- else:
106
- for u, v, d in G.edges(data=True):
107
- for x in H:
108
- for y in H:
109
- if H.is_multigraph():
110
- yield (u, x), (v, y), None, d
111
- else:
112
- yield (u, x), (v, y), d
113
-
114
-
115
- def _init_product_graph(G, H):
116
- if G.is_directed() != H.is_directed():
117
- msg = "G and H must be both directed or both undirected"
118
- raise nx.NetworkXError(msg)
119
- if G.is_multigraph() or H.is_multigraph():
120
- GH = nx.MultiGraph()
121
- else:
122
- GH = nx.Graph()
123
- if G.is_directed():
124
- GH = GH.to_directed()
125
- return GH
126
-
127
-
128
- @nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
129
- def tensor_product(G, H):
130
- r"""Returns the tensor product of G and H.
131
-
132
- The tensor product $P$ of the graphs $G$ and $H$ has a node set that
133
- is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
134
- $P$ has an edge $((u,v), (x,y))$ if and only if $(u,x)$ is an edge in $G$
135
- and $(v,y)$ is an edge in $H$.
136
-
137
- Tensor product is sometimes also referred to as the categorical product,
138
- direct product, cardinal product or conjunction.
139
-
140
-
141
- Parameters
142
- ----------
143
- G, H: graphs
144
- Networkx graphs.
145
-
146
- Returns
147
- -------
148
- P: NetworkX graph
149
- The tensor product of G and H. P will be a multi-graph if either G
150
- or H is a multi-graph, will be a directed if G and H are directed,
151
- and undirected if G and H are undirected.
152
-
153
- Raises
154
- ------
155
- NetworkXError
156
- If G and H are not both directed or both undirected.
157
-
158
- Notes
159
- -----
160
- Node attributes in P are two-tuple of the G and H node attributes.
161
- Missing attributes are assigned None.
162
-
163
- Examples
164
- --------
165
- >>> G = nx.Graph()
166
- >>> H = nx.Graph()
167
- >>> G.add_node(0, a1=True)
168
- >>> H.add_node("a", a2="Spam")
169
- >>> P = nx.tensor_product(G, H)
170
- >>> list(P)
171
- [(0, 'a')]
172
-
173
- Edge attributes and edge keys (for multigraphs) are also copied to the
174
- new product graph
175
- """
176
- GH = _init_product_graph(G, H)
177
- GH.add_nodes_from(_node_product(G, H))
178
- GH.add_edges_from(_directed_edges_cross_edges(G, H))
179
- if not GH.is_directed():
180
- GH.add_edges_from(_undirected_edges_cross_edges(G, H))
181
- return GH
182
-
183
-
184
- @nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
185
- def cartesian_product(G, H):
186
- r"""Returns the Cartesian product of G and H.
187
-
188
- The Cartesian product $P$ of the graphs $G$ and $H$ has a node set that
189
- is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
190
- $P$ has an edge $((u,v),(x,y))$ if and only if either $u$ is equal to $x$
191
- and both $v$ and $y$ are adjacent in $H$ or if $v$ is equal to $y$ and
192
- both $u$ and $x$ are adjacent in $G$.
193
-
194
- Parameters
195
- ----------
196
- G, H: graphs
197
- Networkx graphs.
198
-
199
- Returns
200
- -------
201
- P: NetworkX graph
202
- The Cartesian product of G and H. P will be a multi-graph if either G
203
- or H is a multi-graph. Will be a directed if G and H are directed,
204
- and undirected if G and H are undirected.
205
-
206
- Raises
207
- ------
208
- NetworkXError
209
- If G and H are not both directed or both undirected.
210
-
211
- Notes
212
- -----
213
- Node attributes in P are two-tuple of the G and H node attributes.
214
- Missing attributes are assigned None.
215
-
216
- Examples
217
- --------
218
- >>> G = nx.Graph()
219
- >>> H = nx.Graph()
220
- >>> G.add_node(0, a1=True)
221
- >>> H.add_node("a", a2="Spam")
222
- >>> P = nx.cartesian_product(G, H)
223
- >>> list(P)
224
- [(0, 'a')]
225
-
226
- Edge attributes and edge keys (for multigraphs) are also copied to the
227
- new product graph
228
- """
229
- GH = _init_product_graph(G, H)
230
- GH.add_nodes_from(_node_product(G, H))
231
- GH.add_edges_from(_edges_cross_nodes(G, H))
232
- GH.add_edges_from(_nodes_cross_edges(G, H))
233
- return GH
234
-
235
-
236
- @nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
237
- def lexicographic_product(G, H):
238
- r"""Returns the lexicographic product of G and H.
239
-
240
- The lexicographical product $P$ of the graphs $G$ and $H$ has a node set
241
- that is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
242
- $P$ has an edge $((u,v), (x,y))$ if and only if $(u,v)$ is an edge in $G$
243
- or $u==v$ and $(x,y)$ is an edge in $H$.
244
-
245
- Parameters
246
- ----------
247
- G, H: graphs
248
- Networkx graphs.
249
-
250
- Returns
251
- -------
252
- P: NetworkX graph
253
- The Cartesian product of G and H. P will be a multi-graph if either G
254
- or H is a multi-graph. Will be a directed if G and H are directed,
255
- and undirected if G and H are undirected.
256
-
257
- Raises
258
- ------
259
- NetworkXError
260
- If G and H are not both directed or both undirected.
261
-
262
- Notes
263
- -----
264
- Node attributes in P are two-tuple of the G and H node attributes.
265
- Missing attributes are assigned None.
266
-
267
- Examples
268
- --------
269
- >>> G = nx.Graph()
270
- >>> H = nx.Graph()
271
- >>> G.add_node(0, a1=True)
272
- >>> H.add_node("a", a2="Spam")
273
- >>> P = nx.lexicographic_product(G, H)
274
- >>> list(P)
275
- [(0, 'a')]
276
-
277
- Edge attributes and edge keys (for multigraphs) are also copied to the
278
- new product graph
279
- """
280
- GH = _init_product_graph(G, H)
281
- GH.add_nodes_from(_node_product(G, H))
282
- # Edges in G regardless of H designation
283
- GH.add_edges_from(_edges_cross_nodes_and_nodes(G, H))
284
- # For each x in G, only if there is an edge in H
285
- GH.add_edges_from(_nodes_cross_edges(G, H))
286
- return GH
287
-
288
-
289
- @nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
290
- def strong_product(G, H):
291
- r"""Returns the strong product of G and H.
292
-
293
- The strong product $P$ of the graphs $G$ and $H$ has a node set that
294
- is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
295
- $P$ has an edge $((u,x), (v,y))$ if any of the following conditions
296
- are met:
297
-
298
- - $u=v$ and $(x,y)$ is an edge in $H$
299
- - $x=y$ and $(u,v)$ is an edge in $G$
300
- - $(u,v)$ is an edge in $G$ and $(x,y)$ is an edge in $H$
301
-
302
- Parameters
303
- ----------
304
- G, H: graphs
305
- Networkx graphs.
306
-
307
- Returns
308
- -------
309
- P: NetworkX graph
310
- The Cartesian product of G and H. P will be a multi-graph if either G
311
- or H is a multi-graph. Will be a directed if G and H are directed,
312
- and undirected if G and H are undirected.
313
-
314
- Raises
315
- ------
316
- NetworkXError
317
- If G and H are not both directed or both undirected.
318
-
319
- Notes
320
- -----
321
- Node attributes in P are two-tuple of the G and H node attributes.
322
- Missing attributes are assigned None.
323
-
324
- Examples
325
- --------
326
- >>> G = nx.Graph()
327
- >>> H = nx.Graph()
328
- >>> G.add_node(0, a1=True)
329
- >>> H.add_node("a", a2="Spam")
330
- >>> P = nx.strong_product(G, H)
331
- >>> list(P)
332
- [(0, 'a')]
333
-
334
- Edge attributes and edge keys (for multigraphs) are also copied to the
335
- new product graph
336
- """
337
- GH = _init_product_graph(G, H)
338
- GH.add_nodes_from(_node_product(G, H))
339
- GH.add_edges_from(_nodes_cross_edges(G, H))
340
- GH.add_edges_from(_edges_cross_nodes(G, H))
341
- GH.add_edges_from(_directed_edges_cross_edges(G, H))
342
- if not GH.is_directed():
343
- GH.add_edges_from(_undirected_edges_cross_edges(G, H))
344
- return GH
345
-
346
-
347
- @not_implemented_for("directed")
348
- @not_implemented_for("multigraph")
349
- @nx._dispatchable(returns_graph=True)
350
- def power(G, k):
351
- """Returns the specified power of a graph.
352
-
353
- The $k$th power of a simple graph $G$, denoted $G^k$, is a
354
- graph on the same set of nodes in which two distinct nodes $u$ and
355
- $v$ are adjacent in $G^k$ if and only if the shortest path
356
- distance between $u$ and $v$ in $G$ is at most $k$.
357
-
358
- Parameters
359
- ----------
360
- G : graph
361
- A NetworkX simple graph object.
362
-
363
- k : positive integer
364
- The power to which to raise the graph `G`.
365
-
366
- Returns
367
- -------
368
- NetworkX simple graph
369
- `G` to the power `k`.
370
-
371
- Raises
372
- ------
373
- ValueError
374
- If the exponent `k` is not positive.
375
-
376
- NetworkXNotImplemented
377
- If `G` is not a simple graph.
378
-
379
- Examples
380
- --------
381
- The number of edges will never decrease when taking successive
382
- powers:
383
-
384
- >>> G = nx.path_graph(4)
385
- >>> list(nx.power(G, 2).edges)
386
- [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3)]
387
- >>> list(nx.power(G, 3).edges)
388
- [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
389
-
390
- The `k` th power of a cycle graph on *n* nodes is the complete graph
391
- on *n* nodes, if `k` is at least ``n // 2``:
392
-
393
- >>> G = nx.cycle_graph(5)
394
- >>> H = nx.complete_graph(5)
395
- >>> nx.is_isomorphic(nx.power(G, 2), H)
396
- True
397
- >>> G = nx.cycle_graph(8)
398
- >>> H = nx.complete_graph(8)
399
- >>> nx.is_isomorphic(nx.power(G, 4), H)
400
- True
401
-
402
- References
403
- ----------
404
- .. [1] J. A. Bondy, U. S. R. Murty, *Graph Theory*. Springer, 2008.
405
-
406
- Notes
407
- -----
408
- This definition of "power graph" comes from Exercise 3.1.6 of
409
- *Graph Theory* by Bondy and Murty [1]_.
410
-
411
- """
412
- if k <= 0:
413
- raise ValueError("k must be a positive integer")
414
- H = nx.Graph()
415
- H.add_nodes_from(G)
416
- # update BFS code to ignore self loops.
417
- for n in G:
418
- seen = {} # level (number of hops) when seen in BFS
419
- level = 1 # the current level
420
- nextlevel = G[n]
421
- while nextlevel:
422
- thislevel = nextlevel # advance to next level
423
- nextlevel = {} # and start a new list (fringe)
424
- for v in thislevel:
425
- if v == n: # avoid self loop
426
- continue
427
- if v not in seen:
428
- seen[v] = level # set the level of vertex v
429
- nextlevel.update(G[v]) # add neighbors of v
430
- if k <= level:
431
- break
432
- level += 1
433
- H.add_edges_from((n, nbr) for nbr in seen)
434
- return H
435
-
436
-
437
- @not_implemented_for("multigraph")
438
- @nx._dispatchable(graphs=_G_H, returns_graph=True)
439
- def rooted_product(G, H, root):
440
- """Return the rooted product of graphs G and H rooted at root in H.
441
-
442
- A new graph is constructed representing the rooted product of
443
- the inputted graphs, G and H, with a root in H.
444
- A rooted product duplicates H for each nodes in G with the root
445
- of H corresponding to the node in G. Nodes are renamed as the direct
446
- product of G and H. The result is a subgraph of the cartesian product.
447
-
448
- Parameters
449
- ----------
450
- G,H : graph
451
- A NetworkX graph
452
- root : node
453
- A node in H
454
-
455
- Returns
456
- -------
457
- R : The rooted product of G and H with a specified root in H
458
-
459
- Notes
460
- -----
461
- The nodes of R are the Cartesian Product of the nodes of G and H.
462
- The nodes of G and H are not relabeled.
463
- """
464
- if root not in H:
465
- raise nx.NodeNotFound("root must be a vertex in H")
466
-
467
- R = nx.Graph()
468
- R.add_nodes_from(product(G, H))
469
-
470
- R.add_edges_from(((e[0], root), (e[1], root)) for e in G.edges())
471
- R.add_edges_from(((g, e[0]), (g, e[1])) for g in G for e in H.edges())
472
-
473
- return R
474
-
475
-
476
- @not_implemented_for("directed")
477
- @not_implemented_for("multigraph")
478
- @nx._dispatchable(graphs=_G_H, returns_graph=True)
479
- def corona_product(G, H):
480
- r"""Returns the Corona product of G and H.
481
-
482
- The corona product of $G$ and $H$ is the graph $C = G \circ H$ obtained by
483
- taking one copy of $G$, called the center graph, $|V(G)|$ copies of $H$,
484
- called the outer graph, and making the $i$-th vertex of $G$ adjacent to
485
- every vertex of the $i$-th copy of $H$, where $1 ≤ i ≤ |V(G)|$.
486
-
487
- Parameters
488
- ----------
489
- G, H: NetworkX graphs
490
- The graphs to take the carona product of.
491
- `G` is the center graph and `H` is the outer graph
492
-
493
- Returns
494
- -------
495
- C: NetworkX graph
496
- The Corona product of G and H.
497
-
498
- Raises
499
- ------
500
- NetworkXError
501
- If G and H are not both directed or both undirected.
502
-
503
- Examples
504
- --------
505
- >>> G = nx.cycle_graph(4)
506
- >>> H = nx.path_graph(2)
507
- >>> C = nx.corona_product(G, H)
508
- >>> list(C)
509
- [0, 1, 2, 3, (0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
510
- >>> print(C)
511
- Graph with 12 nodes and 16 edges
512
-
513
- References
514
- ----------
515
- [1] M. Tavakoli, F. Rahbarnia, and A. R. Ashrafi,
516
- "Studying the corona product of graphs under some graph invariants,"
517
- Transactions on Combinatorics, vol. 3, no. 3, pp. 43–49, Sep. 2014,
518
- doi: 10.22108/toc.2014.5542.
519
- [2] A. Faraji, "Corona Product in Graph Theory," Ali Faraji, May 11, 2021.
520
- https://blog.alifaraji.ir/math/graph-theory/corona-product.html (accessed Dec. 07, 2021).
521
- """
522
- GH = _init_product_graph(G, H)
523
- GH.add_nodes_from(G)
524
- GH.add_edges_from(G.edges)
525
-
526
- for G_node in G:
527
- # copy nodes of H in GH, call it H_i
528
- GH.add_nodes_from((G_node, v) for v in H)
529
-
530
- # copy edges of H_i based on H
531
- GH.add_edges_from(
532
- ((G_node, e0), (G_node, e1), d) for e0, e1, d in H.edges.data()
533
- )
534
-
535
- # creating new edges between H_i and a G's node
536
- GH.add_edges_from((G_node, (G_node, H_node)) for H_node in H)
537
-
538
- return GH
539
-
540
-
541
- @nx._dispatchable(
542
- graphs=_G_H, preserve_edge_attrs=True, preserve_node_attrs=True, returns_graph=True
543
- )
544
- def modular_product(G, H):
545
- r"""Returns the Modular product of G and H.
546
-
547
- The modular product of `G` and `H` is the graph $M = G \nabla H$,
548
- consisting of the node set $V(M) = V(G) \times V(H)$ that is the Cartesian
549
- product of the node sets of `G` and `H`. Further, M contains an edge ((u, v), (x, y)):
550
-
551
- - if u is adjacent to x in `G` and v is adjacent to y in `H`, or
552
- - if u is not adjacent to x in `G` and v is not adjacent to y in `H`.
553
-
554
- More formally::
555
-
556
- E(M) = {((u, v), (x, y)) | ((u, x) in E(G) and (v, y) in E(H)) or
557
- ((u, x) not in E(G) and (v, y) not in E(H))}
558
-
559
- Parameters
560
- ----------
561
- G, H: NetworkX graphs
562
- The graphs to take the modular product of.
563
-
564
- Returns
565
- -------
566
- M: NetworkX graph
567
- The Modular product of `G` and `H`.
568
-
569
- Raises
570
- ------
571
- NetworkXNotImplemented
572
- If `G` is not a simple graph.
573
-
574
- Examples
575
- --------
576
- >>> G = nx.cycle_graph(4)
577
- >>> H = nx.path_graph(2)
578
- >>> M = nx.modular_product(G, H)
579
- >>> list(M)
580
- [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
581
- >>> print(M)
582
- Graph with 8 nodes and 8 edges
583
-
584
- Notes
585
- -----
586
- The *modular product* is defined in [1]_ and was first
587
- introduced as the *weak modular product*.
588
-
589
- The modular product reduces the problem of counting isomorphic subgraphs
590
- in `G` and `H` to the problem of counting cliques in M. The subgraphs of
591
- `G` and `H` that are induced by the nodes of a clique in M are
592
- isomorphic [2]_ [3]_.
593
-
594
- References
595
- ----------
596
- .. [1] R. Hammack, W. Imrich, and S. Klavžar,
597
- "Handbook of Product Graphs", CRC Press, 2011.
598
-
599
- .. [2] H. G. Barrow and R. M. Burstall,
600
- "Subgraph isomorphism, matching relational structures and maximal
601
- cliques", Information Processing Letters, vol. 4, issue 4, pp. 83-84,
602
- 1976, https://doi.org/10.1016/0020-0190(76)90049-1.
603
-
604
- .. [3] V. G. Vizing, "Reduction of the problem of isomorphism and isomorphic
605
- entrance to the task of finding the nondensity of a graph." Proc. Third
606
- All-Union Conference on Problems of Theoretical Cybernetics. 1974.
607
- """
608
- if G.is_directed() or H.is_directed():
609
- raise nx.NetworkXNotImplemented(
610
- "Modular product not implemented for directed graphs"
611
- )
612
- if G.is_multigraph() or H.is_multigraph():
613
- raise nx.NetworkXNotImplemented(
614
- "Modular product not implemented for multigraphs"
615
- )
616
-
617
- GH = _init_product_graph(G, H)
618
- GH.add_nodes_from(_node_product(G, H))
619
-
620
- for u, v, c in G.edges(data=True):
621
- for x, y, d in H.edges(data=True):
622
- GH.add_edge((u, x), (v, y), **_dict_product(c, d))
623
- GH.add_edge((v, x), (u, y), **_dict_product(c, d))
624
-
625
- G = nx.complement(G)
626
- H = nx.complement(H)
627
-
628
- for u, v, c in G.edges(data=True):
629
- for x, y, d in H.edges(data=True):
630
- GH.add_edge((u, x), (v, y), **_dict_product(c, d))
631
- GH.add_edge((v, x), (u, y), **_dict_product(c, d))
632
-
633
- return GH
@@ -1,77 +0,0 @@
1
- """Unary operations on graphs"""
2
-
3
- import networkx as nx
4
-
5
- __all__ = ["complement", "reverse"]
6
-
7
-
8
- @nx._dispatchable(returns_graph=True)
9
- def complement(G):
10
- """Returns the graph complement of G.
11
-
12
- Parameters
13
- ----------
14
- G : graph
15
- A NetworkX graph
16
-
17
- Returns
18
- -------
19
- GC : A new graph.
20
-
21
- Notes
22
- -----
23
- Note that `complement` does not create self-loops and also
24
- does not produce parallel edges for MultiGraphs.
25
-
26
- Graph, node, and edge data are not propagated to the new graph.
27
-
28
- Examples
29
- --------
30
- >>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (3, 5)])
31
- >>> G_complement = nx.complement(G)
32
- >>> G_complement.edges() # This shows the edges of the complemented graph
33
- EdgeView([(1, 4), (1, 5), (2, 4), (2, 5), (4, 5)])
34
-
35
- """
36
- R = G.__class__()
37
- R.add_nodes_from(G)
38
- R.add_edges_from(
39
- ((n, n2) for n, nbrs in G.adjacency() for n2 in G if n2 not in nbrs if n != n2)
40
- )
41
- return R
42
-
43
-
44
- @nx._dispatchable(returns_graph=True)
45
- def reverse(G, copy=True):
46
- """Returns the reverse directed graph of G.
47
-
48
- Parameters
49
- ----------
50
- G : directed graph
51
- A NetworkX directed graph
52
- copy : bool
53
- If True, then a new graph is returned. If False, then the graph is
54
- reversed in place.
55
-
56
- Returns
57
- -------
58
- H : directed graph
59
- The reversed G.
60
-
61
- Raises
62
- ------
63
- NetworkXError
64
- If graph is undirected.
65
-
66
- Examples
67
- --------
68
- >>> G = nx.DiGraph([(1, 2), (1, 3), (2, 3), (3, 4), (3, 5)])
69
- >>> G_reversed = nx.reverse(G)
70
- >>> G_reversed.edges()
71
- OutEdgeView([(2, 1), (3, 1), (3, 2), (4, 3), (5, 3)])
72
-
73
- """
74
- if not G.is_directed():
75
- raise nx.NetworkXError("Cannot reverse an undirected graph.")
76
- else:
77
- return G.reverse(copy=copy)